vortex_array/arrays/constant/vtable/
operations.rs1use 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}