use crate::window::window_expr::BuiltinWindowState;
use crate::window::WindowAggState;
use arrow::array::ArrayRef;
use datafusion_common::Result;
use datafusion_common::{DataFusionError, ScalarValue};
use std::fmt::Debug;
use std::ops::Range;
pub trait PartitionEvaluator: Debug + Send {
fn include_rank(&self) -> bool {
false
}
fn state(&self) -> Result<BuiltinWindowState> {
Ok(BuiltinWindowState::Default)
}
fn update_state(
&mut self,
_state: &WindowAggState,
_range_columns: &[ArrayRef],
_sort_partition_points: &[Range<usize>],
) -> Result<()> {
Ok(())
}
fn set_state(&mut self, _state: &BuiltinWindowState) -> Result<()> {
Err(DataFusionError::NotImplemented(
"set_state is not implemented for this window function".to_string(),
))
}
fn get_range(&self, _state: &WindowAggState, _n_rows: usize) -> Result<Range<usize>> {
Err(DataFusionError::NotImplemented(
"get_range is not implemented for this window function".to_string(),
))
}
fn evaluate(&self, _values: &[ArrayRef], _num_rows: usize) -> Result<ArrayRef> {
Err(DataFusionError::NotImplemented(
"evaluate is not implemented by default".into(),
))
}
fn evaluate_stateful(&mut self, _values: &[ArrayRef]) -> Result<ScalarValue> {
Err(DataFusionError::NotImplemented(
"evaluate_stateful is not implemented by default".into(),
))
}
fn evaluate_with_rank(
&self,
_num_rows: usize,
_ranks_in_partition: &[Range<usize>],
) -> Result<ArrayRef> {
Err(DataFusionError::NotImplemented(
"evaluate_partition_with_rank is not implemented by default".into(),
))
}
fn evaluate_inside_range(
&self,
_values: &[ArrayRef],
_range: &Range<usize>,
) -> Result<ScalarValue> {
Err(DataFusionError::NotImplemented(
"evaluate_inside_range is not implemented by default".into(),
))
}
}