Skip to main content

vortex_array/arrays/constant/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::Constant;
10use crate::scalar::Scalar;
11
12impl OperationsVTable<Constant> for Constant {
13    fn scalar_at(
14        array: ArrayView<'_, Constant>,
15        _index: usize,
16        _ctx: &mut ExecutionCtx,
17    ) -> VortexResult<Scalar> {
18        Ok(array.scalar.clone())
19    }
20}
21
22#[cfg(test)]
23mod tests {
24    use vortex_error::VortexResult;
25
26    use crate::IntoArray;
27    use crate::VortexSessionExecute;
28    use crate::arrays::ConstantArray;
29    use crate::dtype::DType;
30    use crate::dtype::Nullability;
31    use crate::dtype::PType;
32    use crate::dtype::UnionVariants;
33    use crate::scalar::Scalar;
34
35    #[test]
36    fn scalar_at_preserves_union_scalar() -> VortexResult<()> {
37        let variants = UnionVariants::try_new(
38            ["int", "string"].into(),
39            vec![
40                DType::Primitive(PType::I32, Nullability::Nullable),
41                DType::Utf8(Nullability::NonNullable),
42            ],
43            vec![5, 9],
44        )?;
45
46        let scalar = Scalar::union(
47            variants.clone(),
48            5,
49            Scalar::primitive(42_i32, Nullability::Nullable),
50            Nullability::Nullable,
51        )?;
52        let array = ConstantArray::new(scalar.clone(), 3).into_array();
53        let mut ctx = crate::array_session().create_execution_ctx();
54
55        assert_eq!(array.execute_scalar(1, &mut ctx)?, scalar);
56
57        let null = Scalar::null(DType::Union(variants, Nullability::Nullable));
58        let array = ConstantArray::new(null.clone(), 3).into_array();
59
60        assert_eq!(array.execute_scalar(1, &mut ctx)?, null);
61
62        Ok(())
63    }
64}