use vortex_error::VortexResult;
use vortex_mask::MaskValuesRef;
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::execute::DenseAttempt;
use crate::scalar_fn::unstable::row::types::batch_const;
use crate::validity::Validity;
mod constant;
mod dense;
mod filtered;
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>,
execute_dense_attempt: impl FnOnce(
BorrowedRowFnArgs<'_>,
&mut ExecutionCtx,
) -> VortexResult<DenseAttempt>,
try_valid_rows: impl FnOnce(
BorrowedRowFnArgs<'_>,
MaskValuesRef,
&mut ExecutionCtx,
) -> VortexResult<Option<ArrayRef>>,
execute_filtered_rows: impl FnOnce(
BorrowedRowFnArgs<'_>,
MaskValuesRef,
&mut ExecutionCtx,
) -> VortexResult<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.plan.policy() {
RowPolicy::Dense => self.execute_dense(kernel, ctx),
RowPolicy::DenseWithRetry => self.execute_dense_with_retry(
execute_dense_attempt,
try_valid_rows,
execute_filtered_rows,
ctx,
),
RowPolicy::ValidOnly => {
self.execute_valid_only(kernel, try_valid_rows, execute_filtered_rows, ctx)
}
}
}
}