datafusion_functions_extra/
macros.rs1macro_rules! make_udaf_expr {
20 ($EXPR_FN:ident, $($arg:ident)*, $DOC:expr, $AGGREGATE_UDF_FN:ident) => {
21 #[doc = $DOC]
23 pub fn $EXPR_FN(
24 $($arg: datafusion::logical_expr::Expr,)*
25 ) -> datafusion::logical_expr::Expr {
26 datafusion::logical_expr::Expr::AggregateFunction(datafusion::logical_expr::expr::AggregateFunction::new_udf(
27 $AGGREGATE_UDF_FN(),
28 vec![$($arg),*],
29 false,
30 None,
31 None,
32 None,
33 ))
34 }
35 };
36}
37
38macro_rules! make_udaf_expr_and_func {
39 ($UDAF:ty, $EXPR_FN:ident, $($arg:ident)*, $DOC:expr, $AGGREGATE_UDF_FN:ident) => {
40 make_udaf_expr!($EXPR_FN, $($arg)*, $DOC, $AGGREGATE_UDF_FN);
41 create_func!($UDAF, $AGGREGATE_UDF_FN);
42 };
43 ($UDAF:ty, $EXPR_FN:ident, $DOC:expr, $AGGREGATE_UDF_FN:ident) => {
44 #[doc = $DOC]
46 pub fn $EXPR_FN(
47 args: Vec<datafusion::logical_expr::Expr>,
48 ) -> datafusion::logical_expr::Expr {
49 datafusion::logical_expr::Expr::AggregateFunction(datafusion::logical_expr::expr::AggregateFunction::new_udf(
50 $AGGREGATE_UDF_FN(),
51 args,
52 false,
53 None,
54 None,
55 None,
56 ))
57 }
58
59 create_func!($UDAF, $AGGREGATE_UDF_FN);
60 };
61}
62
63macro_rules! create_func {
64 ($UDAF:ty, $AGGREGATE_UDF_FN:ident) => {
65 create_func!($UDAF, $AGGREGATE_UDF_FN, <$UDAF>::default());
66 };
67 ($UDAF:ty, $AGGREGATE_UDF_FN:ident, $CREATE:expr) => {
68 paste::paste! {
69 #[allow(non_upper_case_globals)]
72 static [< STATIC_ $UDAF >]: std::sync::OnceLock<std::sync::Arc<datafusion::logical_expr::AggregateUDF>> =
73 std::sync::OnceLock::new();
74
75 #[doc = concat!("AggregateFunction that returns a [`AggregateUDF`](datafusion_expr::AggregateUDF) for [`", stringify!($UDAF), "`]")]
76 pub fn $AGGREGATE_UDF_FN() -> std::sync::Arc<datafusion::logical_expr::AggregateUDF> {
77 [< STATIC_ $UDAF >]
78 .get_or_init(|| {
79 std::sync::Arc::new(datafusion::logical_expr::AggregateUDF::from($CREATE))
80 })
81 .clone()
82 }
83 }
84 }
85}