|
1 | 1 | use expression::*; |
2 | 2 | use expression::aliased::Aliased; |
3 | 3 | use query_builder::{Query, SelectStatement}; |
| 4 | +use query_builder::group_by_clause::*; |
4 | 5 | use query_builder::limit_clause::*; |
5 | 6 | use query_builder::offset_clause::*; |
6 | 7 | use query_builder::order_clause::*; |
7 | 8 | use query_builder::where_clause::*; |
8 | 9 | use query_dsl::*; |
9 | 10 | use types::{self, Bool}; |
10 | 11 |
|
11 | | -impl<ST, S, F, W, O, L, Of, Selection, Type> SelectDsl<Selection, Type> |
12 | | - for SelectStatement<ST, S, F, W, O, L, Of> where |
| 12 | +impl<ST, S, F, W, O, L, Of, G, Selection, Type> SelectDsl<Selection, Type> |
| 13 | + for SelectStatement<ST, S, F, W, O, L, Of, G> where |
13 | 14 | Selection: Expression, |
14 | | - SelectStatement<Type, Selection, F, W, O, L, Of>: Query<SqlType=Type>, |
| 15 | + SelectStatement<Type, Selection, F, W, O, L, Of, G>: Query<SqlType=Type>, |
15 | 16 | { |
16 | | - type Output = SelectStatement<Type, Selection, F, W, O, L, Of>; |
| 17 | + type Output = SelectStatement<Type, Selection, F, W, O, L, Of, G>; |
17 | 18 |
|
18 | 19 | fn select(self, selection: Selection) -> Self::Output { |
19 | 20 | SelectStatement::new(selection, self.from, self.where_clause, self.order, |
20 | | - self.limit, self.offset) |
| 21 | + self.limit, self.offset, self.group_by) |
21 | 22 | } |
22 | 23 | } |
23 | 24 |
|
24 | | -impl<ST, S, F, W, O, L, Of, Predicate> FilterDsl<Predicate> |
25 | | - for SelectStatement<ST, S, F, W, O, L, Of> where |
| 25 | +impl<ST, S, F, W, O, L, Of, G, Predicate> FilterDsl<Predicate> |
| 26 | + for SelectStatement<ST, S, F, W, O, L, Of, G> where |
26 | 27 | Predicate: SelectableExpression<F, SqlType=Bool> + NonAggregate, |
27 | 28 | W: WhereAnd<Predicate>, |
28 | | - SelectStatement<ST, S, F, W::Output, O, L, Of>: Query, |
| 29 | + SelectStatement<ST, S, F, W::Output, O, L, Of, G>: Query, |
29 | 30 | { |
30 | | - type Output = SelectStatement<ST, S, F, W::Output, O, L, Of>; |
| 31 | + type Output = SelectStatement<ST, S, F, W::Output, O, L, Of, G>; |
31 | 32 |
|
32 | 33 | fn filter(self, predicate: Predicate) -> Self::Output { |
33 | 34 | SelectStatement::new(self.select, self.from, self.where_clause.and(predicate), |
34 | | - self.order, self.limit, self.offset) |
| 35 | + self.order, self.limit, self.offset, self.group_by) |
35 | 36 | } |
36 | 37 | } |
37 | 38 |
|
38 | | -impl<ST, S, F, W, O, L, Of, Expr> OrderDsl<Expr> |
39 | | - for SelectStatement<ST, S, F, W, O, L, Of> where |
| 39 | +impl<ST, S, F, W, O, L, Of, G, Expr> OrderDsl<Expr> |
| 40 | + for SelectStatement<ST, S, F, W, O, L, Of, G> where |
40 | 41 | Expr: SelectableExpression<F>, |
41 | | - SelectStatement<ST, S, F, W, OrderClause<Expr>, L, Of>: Query<SqlType=ST>, |
| 42 | + SelectStatement<ST, S, F, W, OrderClause<Expr>, L, Of, G>: Query<SqlType=ST>, |
42 | 43 | { |
43 | | - type Output = SelectStatement<ST, S, F, W, OrderClause<Expr>, L, Of>; |
| 44 | + type Output = SelectStatement<ST, S, F, W, OrderClause<Expr>, L, Of, G>; |
44 | 45 |
|
45 | 46 | fn order(self, expr: Expr) -> Self::Output { |
46 | 47 | let order = OrderClause(expr); |
47 | 48 | SelectStatement::new(self.select, self.from, self.where_clause, order, |
48 | | - self.limit, self.offset) |
| 49 | + self.limit, self.offset, self.group_by) |
49 | 50 | } |
50 | 51 | } |
51 | 52 |
|
52 | 53 | #[doc(hidden)] |
53 | 54 | pub type Limit = <i64 as AsExpression<types::BigInt>>::Expression; |
54 | 55 |
|
55 | | -impl<ST, S, F, W, O, L, Of> LimitDsl for SelectStatement<ST, S, F, W, O, L, Of> where |
56 | | - SelectStatement<ST, S, F, W, O, LimitClause<Limit>, Of>: Query<SqlType=ST>, |
| 56 | +impl<ST, S, F, W, O, L, Of, G> LimitDsl for SelectStatement<ST, S, F, W, O, L, Of, G> where |
| 57 | + SelectStatement<ST, S, F, W, O, LimitClause<Limit>, Of, G>: Query<SqlType=ST>, |
57 | 58 | { |
58 | | - type Output = SelectStatement<ST, S, F, W, O, LimitClause<Limit>, Of>; |
| 59 | + type Output = SelectStatement<ST, S, F, W, O, LimitClause<Limit>, Of, G>; |
59 | 60 |
|
60 | 61 | fn limit(self, limit: i64) -> Self::Output { |
61 | 62 | let limit_clause = LimitClause(AsExpression::<types::BigInt>::as_expression(limit)); |
62 | 63 | SelectStatement::new(self.select, self.from, self.where_clause, |
63 | | - self.order, limit_clause, self.offset) |
| 64 | + self.order, limit_clause, self.offset, self.group_by) |
64 | 65 | } |
65 | 66 | } |
66 | 67 |
|
67 | 68 | #[doc(hidden)] |
68 | 69 | pub type Offset = Limit; |
69 | 70 |
|
70 | | -impl<ST, S, F, W, O, L, Of> OffsetDsl for SelectStatement<ST, S, F, W, O, L, Of> where |
71 | | - SelectStatement<ST, S, F, W, O, L, OffsetClause<Offset>>: Query<SqlType=ST>, |
| 71 | +impl<ST, S, F, W, O, L, Of, G> OffsetDsl for SelectStatement<ST, S, F, W, O, L, Of, G> where |
| 72 | + SelectStatement<ST, S, F, W, O, L, OffsetClause<Offset>, G>: Query<SqlType=ST>, |
72 | 73 | { |
73 | | - type Output = SelectStatement<ST, S, F, W, O, L, OffsetClause<Offset>>; |
| 74 | + type Output = SelectStatement<ST, S, F, W, O, L, OffsetClause<Offset>, G>; |
74 | 75 |
|
75 | 76 | fn offset(self, offset: i64) -> Self::Output { |
76 | 77 | let offset_clause = OffsetClause(AsExpression::<types::BigInt>::as_expression(offset)); |
77 | 78 | SelectStatement::new(self.select, self.from, self.where_clause, |
78 | | - self.order, self.limit, offset_clause) |
| 79 | + self.order, self.limit, offset_clause, self.group_by) |
79 | 80 | } |
80 | 81 | } |
81 | 82 |
|
82 | | -impl<'a, ST, S, F, W, O, L, Of, Expr> WithDsl<'a, Expr> |
83 | | -for SelectStatement<ST, S, F, W, O, L, Of> where |
84 | | - SelectStatement<ST, S, WithQuerySource<'a, F, Expr>, W, O, L, Of>: Query, |
| 83 | +impl<'a, ST, S, F, W, O, L, Of, G, Expr> WithDsl<'a, Expr> |
| 84 | +for SelectStatement<ST, S, F, W, O, L, Of, G> where |
| 85 | + SelectStatement<ST, S, WithQuerySource<'a, F, Expr>, W, O, L, Of, G>: Query, |
85 | 86 | { |
86 | | - type Output = SelectStatement<ST, S, WithQuerySource<'a, F, Expr>, W, O, L, Of>; |
| 87 | + type Output = SelectStatement<ST, S, WithQuerySource<'a, F, Expr>, W, O, L, Of, G>; |
87 | 88 |
|
88 | 89 | fn with(self, expr: Aliased<'a, Expr>) -> Self::Output { |
89 | 90 | let source = WithQuerySource::new(self.from, expr); |
90 | 91 | SelectStatement::new(self.select, source, self.where_clause, |
91 | | - self.order, self.limit, self.offset) |
| 92 | + self.order, self.limit, self.offset, self.group_by) |
| 93 | + } |
| 94 | +} |
| 95 | + |
| 96 | +impl<ST, S, F, W, O, L, Of, G, Expr> GroupByDsl<Expr> |
| 97 | +for SelectStatement<ST, S, F, W, O, L, Of, G> where |
| 98 | + SelectStatement<ST, S, F, W, O, L, Of, GroupByClause<Expr>>: Query, |
| 99 | + Expr: Expression, |
| 100 | +{ |
| 101 | + type Output = SelectStatement<ST, S, F, W, O, L, Of, GroupByClause<Expr>>; |
| 102 | + |
| 103 | + fn group_by(self, expr: Expr) -> Self::Output { |
| 104 | + let group_by = GroupByClause(expr); |
| 105 | + SelectStatement::new(self.select, self.from, self.where_clause, |
| 106 | + self.order, self.limit, self.offset, group_by) |
92 | 107 | } |
93 | 108 | } |
0 commit comments