use vortex_error::VortexResult;
use vortex_error::vortex_bail;
use crate::ExecutionCtx;
use crate::array::ArrayView;
use crate::array::VTable;
use crate::array::probe::ProbeState;
use crate::scalar::Scalar;
use crate::vtable::NotSupported;
pub trait OperationsVTable<V: VTable> {
type ProbeState: Default + 'static;
fn probe_scalar(
state: &mut ProbeState<'_, V>,
index: usize,
ctx: &mut ExecutionCtx,
) -> VortexResult<Scalar> {
if !state.is_valid(index, ctx)? {
return Ok(Scalar::null(state.array().dtype().clone()));
}
Self::scalar_at(state.array(), index, ctx)
}
fn scalar_at(
array: ArrayView<'_, V>,
index: usize,
ctx: &mut ExecutionCtx,
) -> VortexResult<Scalar>;
}
impl<V: VTable> OperationsVTable<V> for NotSupported {
type ProbeState = ();
fn probe_scalar(
state: &mut ProbeState<'_, V>,
index: usize,
ctx: &mut ExecutionCtx,
) -> VortexResult<Scalar> {
Self::scalar_at(state.array(), index, ctx)
}
fn scalar_at(
array: ArrayView<'_, V>,
_index: usize,
_ctx: &mut ExecutionCtx,
) -> VortexResult<Scalar> {
vortex_bail!(
"Legacy scalar_at operation is not supported for {} arrays",
array.encoding_id()
)
}
}