use vortex_error::VortexResult;
use vortex_mask::Mask;
use super::RowFnExecutionArgs;
use super::RowPolicy;
use super::args::BorrowedRowFnArgs;
use crate::ArrayRef;
use crate::ExecutionCtx;
use crate::arrays::Constant;
use crate::scalar_fn::unstable::row::types::batch_const;
use crate::validity::Validity;
mod constant;
mod dense;
mod valid_only;
mod output;
pub(crate) use output::finalize_kernel_output;
impl RowFnExecutionArgs {
pub(crate) fn execute(
&self,
kernel: impl Fn(BorrowedRowFnArgs<'_>, &mut ExecutionCtx) -> VortexResult<ArrayRef>,
try_valid_rows: impl FnOnce(
BorrowedRowFnArgs<'_>,
&Mask,
&mut ExecutionCtx,
) -> VortexResult<Option<ArrayRef>>,
ctx: &mut ExecutionCtx,
) -> VortexResult<ArrayRef> {
if matches!(self.validity, Validity::AllInvalid)
|| self.inputs.iter().any(|input| {
input
.as_opt::<Constant>()
.is_some_and(|constant| constant.scalar().is_null())
})
{
return Ok(self.all_null());
}
if self.row_count > 0
&& self.validity.definitely_no_nulls()
&& self.inputs.iter().all(|input| batch_const(input).is_some())
{
return self.execute_all_constant(kernel, ctx);
}
if self.validity.definitely_no_nulls() {
return self.execute_dense(kernel, ctx);
}
match self.policy {
RowPolicy::Dense => self.execute_dense(kernel, ctx),
RowPolicy::ValidOnly => self.execute_valid_only(kernel, try_valid_rows, ctx),
}
}
}