use std::fmt::Formatter;
use vortex_error::VortexResult;
use vortex_error::vortex_bail;
use vortex_session::VortexSession;
use crate::ArrayRef;
use crate::ExecutionCtx;
use crate::dtype::DType;
use crate::dtype::FieldPath;
use crate::expr::StatsCatalog;
use crate::expr::expression::Expression;
use crate::expr::stats::Stat;
use crate::scalar_fn::Arity;
use crate::scalar_fn::ChildName;
use crate::scalar_fn::EmptyOptions;
use crate::scalar_fn::ExecutionArgs;
use crate::scalar_fn::ScalarFnId;
use crate::scalar_fn::ScalarFnVTable;
#[derive(Clone)]
pub struct Root;
impl ScalarFnVTable for Root {
type Options = EmptyOptions;
fn id(&self) -> ScalarFnId {
ScalarFnId::from("vortex.root")
}
fn serialize(&self, _instance: &Self::Options) -> VortexResult<Option<Vec<u8>>> {
Ok(Some(vec![]))
}
fn deserialize(
&self,
_metadata: &[u8],
_session: &VortexSession,
) -> VortexResult<Self::Options> {
Ok(EmptyOptions)
}
fn arity(&self, _options: &Self::Options) -> Arity {
Arity::Exact(0)
}
fn child_name(&self, _instance: &Self::Options, child_idx: usize) -> ChildName {
unreachable!(
"Root expression does not have children, got index {}",
child_idx
)
}
fn fmt_sql(
&self,
_options: &Self::Options,
_expr: &Expression,
f: &mut Formatter<'_>,
) -> std::fmt::Result {
write!(f, "$")
}
fn return_dtype(&self, _options: &Self::Options, _arg_dtypes: &[DType]) -> VortexResult<DType> {
vortex_bail!("Root expression does not support return_dtype")
}
fn execute(
&self,
_data: &Self::Options,
_args: &dyn ExecutionArgs,
_ctx: &mut ExecutionCtx,
) -> VortexResult<ArrayRef> {
vortex_bail!("Root expression is not executable")
}
fn stat_expression(
&self,
_options: &Self::Options,
_expr: &Expression,
stat: Stat,
catalog: &dyn StatsCatalog,
) -> Option<Expression> {
catalog.stats_ref(&FieldPath::root(), stat)
}
fn is_null_sensitive(&self, _options: &Self::Options) -> bool {
false
}
fn is_fallible(&self, _options: &Self::Options) -> bool {
false
}
}