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::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        // If the shredded value is null OR we shredded an object we want to merge back together.
31        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}