datafusion_python/expr/
aggregate_expr.rs1use crate::expr::PyExpr;
19use datafusion::logical_expr::expr::AggregateFunction;
20use pyo3::prelude::*;
21use std::fmt::{Display, Formatter};
22
23#[pyclass(name = "AggregateFunction", module = "datafusion.expr", subclass)]
24#[derive(Clone)]
25pub struct PyAggregateFunction {
26 aggr: AggregateFunction,
27}
28
29impl From<PyAggregateFunction> for AggregateFunction {
30 fn from(aggr: PyAggregateFunction) -> Self {
31 aggr.aggr
32 }
33}
34
35impl From<AggregateFunction> for PyAggregateFunction {
36 fn from(aggr: AggregateFunction) -> PyAggregateFunction {
37 PyAggregateFunction { aggr }
38 }
39}
40
41impl Display for PyAggregateFunction {
42 fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
43 let args: Vec<String> = self
44 .aggr
45 .params
46 .args
47 .iter()
48 .map(|expr| expr.to_string())
49 .collect();
50 write!(f, "{}({})", self.aggr.func.name(), args.join(", "))
51 }
52}
53
54#[pymethods]
55impl PyAggregateFunction {
56 fn aggregate_type(&self) -> String {
58 self.aggr.func.name().to_string()
59 }
60
61 fn is_distinct(&self) -> bool {
63 self.aggr.params.distinct
64 }
65
66 fn args(&self) -> Vec<PyExpr> {
68 self.aggr
69 .params
70 .args
71 .iter()
72 .map(|expr| PyExpr::from(expr.clone()))
73 .collect()
74 }
75
76 fn __repr__(&self) -> String {
78 format!("{}", self)
79 }
80}