use arrow::datatypes::{DataType, FieldRef, Schema};
use datafusion_common::Result;
use datafusion_expr_common::accumulator::Accumulator;
use datafusion_physical_expr_common::physical_expr::PhysicalExpr;
use datafusion_physical_expr_common::sort_expr::LexOrdering;
use std::sync::Arc;
#[derive(Debug)]
pub struct AccumulatorArgs<'a> {
pub return_field: FieldRef,
pub schema: &'a Schema,
pub ignore_nulls: bool,
pub ordering_req: &'a LexOrdering,
pub is_reversed: bool,
pub name: &'a str,
pub is_distinct: bool,
pub exprs: &'a [Arc<dyn PhysicalExpr>],
}
impl AccumulatorArgs<'_> {
pub fn return_type(&self) -> &DataType {
self.return_field.data_type()
}
}
pub type AccumulatorFactoryFunction =
Arc<dyn Fn(AccumulatorArgs) -> Result<Box<dyn Accumulator>> + Send + Sync>;
pub struct StateFieldsArgs<'a> {
pub name: &'a str,
pub input_fields: &'a [FieldRef],
pub return_field: FieldRef,
pub ordering_fields: &'a [FieldRef],
pub is_distinct: bool,
}
impl StateFieldsArgs<'_> {
pub fn return_type(&self) -> &DataType {
self.return_field.data_type()
}
}