1use crate::{
2 intermediate_ast::{
3 AggregationOperator, AliasedResultExpr, BinaryOperator, Expression, Literal, OrderBy,
4 OrderByDirection, SelectResultExpr, SetExpression, Slice, TableExpression, UnaryOperator,
5 },
6 Identifier, SelectStatement,
7};
8use alloc::{boxed::Box, vec, vec::Vec};
9
10#[must_use]
16pub fn ident(name: &str) -> Identifier {
17 name.parse().unwrap()
18}
19
20#[must_use]
22pub fn equal(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
23 Box::new(Expression::Binary {
24 op: BinaryOperator::Equal,
25 left,
26 right,
27 })
28}
29
30#[must_use]
32pub fn ge(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
33 not(Box::new(Expression::Binary {
34 op: BinaryOperator::LessThan,
35 left,
36 right,
37 }))
38}
39
40#[must_use]
42pub fn gt(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
43 Box::new(Expression::Binary {
44 op: BinaryOperator::GreaterThan,
45 left,
46 right,
47 })
48}
49
50#[must_use]
52pub fn le(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
53 not(Box::new(Expression::Binary {
54 op: BinaryOperator::GreaterThan,
55 left,
56 right,
57 }))
58}
59
60#[must_use]
62pub fn lt(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
63 Box::new(Expression::Binary {
64 op: BinaryOperator::LessThan,
65 left,
66 right,
67 })
68}
69
70#[must_use]
72pub fn not(expr: Box<Expression>) -> Box<Expression> {
73 Box::new(Expression::Unary {
74 op: UnaryOperator::Not,
75 expr,
76 })
77}
78
79#[must_use]
81pub fn and(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
82 Box::new(Expression::Binary {
83 op: BinaryOperator::And,
84 left,
85 right,
86 })
87}
88
89#[must_use]
91pub fn or(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
92 Box::new(Expression::Binary {
93 op: BinaryOperator::Or,
94 left,
95 right,
96 })
97}
98
99#[must_use]
101pub fn add(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
102 Box::new(Expression::Binary {
103 op: BinaryOperator::Add,
104 left,
105 right,
106 })
107}
108
109#[must_use]
111pub fn sub(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
112 Box::new(Expression::Binary {
113 op: BinaryOperator::Subtract,
114 left,
115 right,
116 })
117}
118
119#[must_use]
121pub fn mul(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
122 Box::new(Expression::Binary {
123 op: BinaryOperator::Multiply,
124 left,
125 right,
126 })
127}
128
129#[must_use]
131pub fn div(left: Box<Expression>, right: Box<Expression>) -> Box<Expression> {
132 Box::new(Expression::Binary {
133 op: BinaryOperator::Division,
134 left,
135 right,
136 })
137}
138
139#[must_use]
146pub fn tab(schema: Option<&str>, name: &str) -> Box<TableExpression> {
147 Box::new(TableExpression::Named {
148 table: name.parse().unwrap(),
149 schema: schema.map(|schema| schema.parse().unwrap()),
150 })
151}
152
153#[must_use]
159pub fn col(name: &str) -> Box<Expression> {
160 Box::new(Expression::Column(name.parse().unwrap()))
161}
162
163pub fn lit<L: Into<Literal>>(literal: L) -> Box<Expression> {
165 Box::new(Expression::Literal(literal.into()))
166}
167
168#[must_use]
170pub fn sum(expr: Box<Expression>) -> Box<Expression> {
171 Box::new(Expression::Aggregation {
172 op: AggregationOperator::Sum,
173 expr,
174 })
175}
176
177#[must_use]
179pub fn min(expr: Box<Expression>) -> Box<Expression> {
180 Box::new(Expression::Aggregation {
181 op: AggregationOperator::Min,
182 expr,
183 })
184}
185
186#[must_use]
188pub fn max(expr: Box<Expression>) -> Box<Expression> {
189 Box::new(Expression::Aggregation {
190 op: AggregationOperator::Max,
191 expr,
192 })
193}
194
195#[must_use]
197pub fn count(expr: Box<Expression>) -> Box<Expression> {
198 Box::new(Expression::Aggregation {
199 op: AggregationOperator::Count,
200 expr,
201 })
202}
203
204#[must_use]
206pub fn count_all() -> Box<Expression> {
207 count(Box::new(Expression::Wildcard))
208}
209
210#[must_use]
216pub fn aliased_expr(expr: Box<Expression>, alias: &str) -> AliasedResultExpr {
217 AliasedResultExpr {
218 expr,
219 alias: alias.parse().unwrap(),
220 }
221}
222
223#[must_use]
225pub fn col_res_all() -> SelectResultExpr {
226 SelectResultExpr::ALL
227}
228
229#[must_use]
235pub fn col_res(col_val: Box<Expression>, alias: &str) -> SelectResultExpr {
236 SelectResultExpr::AliasedResultExpr(AliasedResultExpr {
237 expr: col_val,
238 alias: alias.parse().unwrap(),
239 })
240}
241
242#[must_use]
244pub fn cols_res(names: &[&str]) -> Vec<SelectResultExpr> {
245 names.iter().map(|name| col_res(col(name), name)).collect()
246}
247
248#[must_use]
254pub fn min_res(expr: Box<Expression>, alias: &str) -> SelectResultExpr {
255 SelectResultExpr::AliasedResultExpr(AliasedResultExpr {
256 expr: min(expr),
257 alias: alias.parse().unwrap(),
258 })
259}
260
261#[must_use]
267pub fn max_res(expr: Box<Expression>, alias: &str) -> SelectResultExpr {
268 SelectResultExpr::AliasedResultExpr(AliasedResultExpr {
269 expr: max(expr),
270 alias: alias.parse().unwrap(),
271 })
272}
273
274#[must_use]
280pub fn sum_res(expr: Box<Expression>, alias: &str) -> SelectResultExpr {
281 SelectResultExpr::AliasedResultExpr(AliasedResultExpr {
282 expr: sum(expr),
283 alias: alias.parse().unwrap(),
284 })
285}
286
287#[must_use]
293pub fn count_res(expr: Box<Expression>, alias: &str) -> SelectResultExpr {
294 SelectResultExpr::AliasedResultExpr(AliasedResultExpr {
295 expr: count(expr),
296 alias: alias.parse().unwrap(),
297 })
298}
299
300#[must_use]
306pub fn count_all_res(alias: &str) -> SelectResultExpr {
307 SelectResultExpr::AliasedResultExpr(AliasedResultExpr {
308 expr: Box::new(Expression::Aggregation {
309 op: AggregationOperator::Count,
310 expr: Box::new(Expression::Wildcard),
311 }),
312 alias: alias.parse().unwrap(),
313 })
314}
315
316#[must_use]
318pub fn query(
319 result_exprs: Vec<SelectResultExpr>,
320 tab: Box<TableExpression>,
321 where_expr: Box<Expression>,
322 group_by: Vec<Identifier>,
323) -> Box<SetExpression> {
324 Box::new(SetExpression::Query {
325 result_exprs,
326 from: vec![tab],
327 where_expr: Some(where_expr),
328 group_by,
329 })
330}
331
332#[must_use]
336pub fn query_all(
337 result_exprs: Vec<SelectResultExpr>,
338 tab: Box<TableExpression>,
339 group_by: Vec<Identifier>,
340) -> Box<SetExpression> {
341 Box::new(SetExpression::Query {
342 result_exprs,
343 from: vec![tab],
344 where_expr: None,
345 group_by,
346 })
347}
348
349#[must_use]
353pub fn select(
354 expr: Box<SetExpression>,
355 order_by: Vec<OrderBy>,
356 slice: Option<Slice>,
357) -> SelectStatement {
358 SelectStatement {
359 expr,
360 order_by,
361 slice,
362 }
363}
364
365#[must_use]
371pub fn order(id: &str, direction: OrderByDirection) -> Vec<OrderBy> {
372 vec![OrderBy {
373 expr: id.parse().unwrap(),
374 direction,
375 }]
376}
377
378#[must_use]
385pub fn orders(ids: &[&str], directions: &[OrderByDirection]) -> Vec<OrderBy> {
386 ids.iter()
387 .zip(directions.iter())
388 .map(|(id, dir)| OrderBy {
389 expr: id.parse().unwrap(),
390 direction: *dir,
391 })
392 .collect::<Vec<_>>()
393}
394
395#[must_use]
397pub fn slice(number_rows: u64, offset_value: i64) -> Option<Slice> {
398 Some(Slice {
399 number_rows,
400 offset_value,
401 })
402}
403
404#[must_use]
411pub fn group_by(ids: &[&str]) -> Vec<Identifier> {
412 ids.iter().map(|id| id.parse().unwrap()).collect()
413}