vortex_array/arrays/variant/vtable/
operations.rs1use vortex_error::VortexResult;
5
6use super::merge_typed_scalar_as_variant;
7use crate::ExecutionCtx;
8use crate::array::ArrayView;
9use crate::array::OperationsVTable;
10use crate::arrays::Variant;
11use crate::arrays::variant::VariantArraySlotsExt;
12use crate::scalar::Scalar;
13
14impl OperationsVTable<Variant> for Variant {
15 type ProbeState = ();
16
17 fn scalar_at(
18 array: ArrayView<'_, Variant>,
19 index: usize,
20 ctx: &mut ExecutionCtx,
21 ) -> VortexResult<Scalar> {
22 let core_storage = array.core_storage();
23 if core_storage.is_invalid(index, ctx)? {
24 return Ok(Scalar::null(array.dtype().clone()));
25 }
26
27 let Some(shredded) = array.shredded() else {
28 return core_storage.execute_scalar(index, ctx);
29 };
30
31 let typed = shredded.execute_scalar(index, ctx)?;
32 let fallback = (typed.is_null() || typed.dtype().is_struct())
34 .then(|| core_storage.execute_scalar(index, ctx))
35 .transpose()?;
36 merge_typed_scalar_as_variant(typed, fallback, array.dtype())
37 }
38}