1use std::sync::Arc;
16
17use datafusion_expr::ReturnTypeFunction as DfReturnTypeFunction;
18use datatypes::arrow::datatypes::DataType as ArrowDataType;
19use datatypes::prelude::{ConcreteDataType, DataType};
20
21use crate::error::Result;
22use crate::logical_plan::Accumulator;
23
24pub type ReturnTypeFunction =
26 Arc<dyn Fn(&[ConcreteDataType]) -> Result<Arc<ConcreteDataType>> + Send + Sync>;
27
28pub type AccumulatorFunctionImpl = Arc<dyn Fn() -> Result<Box<dyn Accumulator>> + Send + Sync>;
30
31pub type AccumulatorCreatorFunction =
33 Arc<dyn Fn(&[ConcreteDataType]) -> Result<Box<dyn Accumulator>> + Sync + Send>;
34
35pub type StateTypeFunction =
38 Arc<dyn Fn(&ConcreteDataType) -> Result<Arc<Vec<ConcreteDataType>>> + Send + Sync>;
39
40pub fn to_df_return_type(func: ReturnTypeFunction) -> DfReturnTypeFunction {
41 let df_func = move |data_types: &[ArrowDataType]| {
42 let concrete_data_types = data_types
44 .iter()
45 .map(ConcreteDataType::from_arrow_type)
46 .collect::<Vec<_>>();
47
48 let eval_result = (func)(&concrete_data_types);
50
51 eval_result
53 .map(|t| Arc::new(t.as_arrow_type()))
54 .map_err(|e| e.into())
55 };
56 Arc::new(df_func)
57}