gluesql_core/planner/expr/plan_expr/
aggregate.rs1use crate::plan::{AggregateExprPlan, AggregateFunctionPlan, CountArgExprPlan, ExprPlan};
2
3impl AggregateExprPlan {
4 pub fn as_expr(&self) -> Option<&ExprPlan> {
5 match &self.func {
6 AggregateFunctionPlan::Count(CountArgExprPlan::Wildcard) => None,
7 AggregateFunctionPlan::Count(CountArgExprPlan::Expr(expr))
8 | AggregateFunctionPlan::Sum(expr)
9 | AggregateFunctionPlan::Max(expr)
10 | AggregateFunctionPlan::Min(expr)
11 | AggregateFunctionPlan::Avg(expr)
12 | AggregateFunctionPlan::Variance(expr)
13 | AggregateFunctionPlan::Stdev(expr) => Some(expr),
14 }
15 }
16}
17
18#[cfg(test)]
19mod tests {
20 use crate::{
21 parse_sql::parse_expr,
22 plan::ExprPlan,
23 translate::{NO_PARAMS, translate_expr},
24 };
25
26 #[test]
27 fn as_expr() {
28 macro_rules! test {
29 ($input: literal, $expected: expr) => {
30 let parsed = parse_expr($input).expect($input);
31 let expr = ExprPlan::from(translate_expr(&parsed, NO_PARAMS).expect($input));
32 let actual = match expr {
33 ExprPlan::Aggregate(aggregate) => Some(aggregate.as_expr().cloned()),
34 _ => None,
35 };
36 let expected: Option<&str> = $expected;
37 let expected = expected.map(|expected| {
38 let parsed = parse_expr(expected).expect(expected);
39
40 ExprPlan::from(translate_expr(&parsed, NO_PARAMS).expect(expected))
41 });
42 let expected = Some(expected);
43
44 assert_eq!(actual, expected, "input: {}", $input);
45 };
46 }
47
48 test!("COUNT(*)", None);
49 test!("COUNT(id)", Some("id"));
50 test!("SUM(id)", Some("id"));
51 test!("MAX(id)", Some("id"));
52 test!("MIN(id)", Some("id"));
53 test!("AVG(id)", Some("id"));
54 test!("VARIANCE(id)", Some("id"));
55 test!("STDEV(id)", Some("id"));
56 }
57}