use arrow_array::ArrayRef;
use arrow_schema::Field;
use datafusion::logical_expr::Volatility;
use datafusion::scalar::ScalarValue;
use crate::errors::FnError;
use crate::traits::scalar::ArgType;
pub trait AggregatePluginFn: Send + Sync {
fn signature(&self) -> &AggSignature;
fn create_accumulator(&self) -> Box<dyn PluginAccumulator>;
}
pub trait PluginAccumulator: Send {
fn update_batch(&mut self, values: &[ArrayRef]) -> Result<(), FnError>;
fn merge_batch(&mut self, states: &[ArrayRef]) -> Result<(), FnError>;
fn state(&self) -> Result<Vec<ScalarValue>, FnError>;
fn evaluate(&self) -> Result<ScalarValue, FnError>;
fn size(&self) -> usize;
}
#[derive(Clone, Debug)]
pub struct AggSignature {
pub args: Vec<ArgType>,
pub returns: ArgType,
pub state_fields: Vec<Field>,
pub volatility: Volatility,
pub supports_partial: bool,
}
impl AggSignature {
#[must_use]
pub fn new(
args: Vec<ArgType>,
returns: ArgType,
state_fields: Vec<Field>,
volatility: Volatility,
) -> Self {
Self {
args,
returns,
state_fields,
volatility,
supports_partial: true,
}
}
}