Skip to main content

vortex_array/arrays/struct_/vtable/
operations.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4use vortex_error::VortexResult;
5
6use crate::ExecutionCtx;
7use crate::array::ArrayView;
8use crate::array::OperationsVTable;
9use crate::arrays::Struct;
10use crate::arrays::struct_::StructArrayExt;
11use crate::scalar::Scalar;
12
13impl OperationsVTable<Struct> for Struct {
14    fn scalar_at(
15        array: ArrayView<'_, Struct>,
16        index: usize,
17        _ctx: &mut ExecutionCtx,
18    ) -> VortexResult<Scalar> {
19        let field_scalars: VortexResult<Vec<Scalar>> = array
20            .iter_unmasked_fields()
21            .map(|field| field.scalar_at(index))
22            .collect();
23        // SAFETY: The vtable guarantees index is in-bounds and non-null before this is called.
24        // Each field's scalar_at returns a scalar with the field's own dtype.
25        Ok(unsafe { Scalar::struct_unchecked(array.dtype().clone(), field_scalars?) })
26    }
27}