Skip to main content

gluesql_core/planner/expr/plan_expr/
aggregate.rs

1use 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}