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::VariantArrayExt;
12use crate::scalar::Scalar;
13
14impl OperationsVTable<Variant> for Variant {
15 fn scalar_at(
16 array: ArrayView<'_, Variant>,
17 index: usize,
18 ctx: &mut ExecutionCtx,
19 ) -> VortexResult<Scalar> {
20 let core_storage = array.core_storage();
21 if core_storage.is_invalid(index, ctx)? {
22 return Ok(Scalar::null(array.dtype().clone()));
23 }
24
25 let Some(shredded) = array.shredded() else {
26 return core_storage.execute_scalar(index, ctx);
27 };
28
29 let typed = shredded.execute_scalar(index, ctx)?;
30 let fallback = (typed.is_null() || typed.dtype().is_struct())
32 .then(|| core_storage.execute_scalar(index, ctx))
33 .transpose()?;
34 merge_typed_scalar_as_variant(typed, fallback, array.dtype())
35 }
36}