Skip to main content

vortex_array/arrays/variant/vtable/
operations.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use 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        // If the shredded value is null OR we shredded an object we want to merge back together.
33        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}