vortex_array/arrays/constant/
variants.rs

1use vortex_dtype::FieldName;
2use vortex_error::VortexResult;
3
4use crate::arrays::constant::ConstantArray;
5use crate::variants::{
6    BinaryArrayTrait, BoolArrayTrait, DecimalArrayTrait, ExtensionArrayTrait, ListArrayTrait,
7    NullArrayTrait, PrimitiveArrayTrait, StructArrayTrait, Utf8ArrayTrait,
8};
9use crate::{Array, ArrayRef, ArrayVariantsImpl};
10
11/// Constant arrays support all DTypes
12impl ArrayVariantsImpl for ConstantArray {
13    fn _as_null_typed(&self) -> Option<&dyn NullArrayTrait> {
14        Some(self)
15    }
16
17    fn _as_bool_typed(&self) -> Option<&dyn BoolArrayTrait> {
18        Some(self)
19    }
20
21    fn _as_primitive_typed(&self) -> Option<&dyn PrimitiveArrayTrait> {
22        Some(self)
23    }
24
25    fn _as_utf8_typed(&self) -> Option<&dyn Utf8ArrayTrait> {
26        Some(self)
27    }
28
29    fn _as_binary_typed(&self) -> Option<&dyn BinaryArrayTrait> {
30        Some(self)
31    }
32
33    fn _as_struct_typed(&self) -> Option<&dyn StructArrayTrait> {
34        Some(self)
35    }
36
37    fn _as_list_typed(&self) -> Option<&dyn ListArrayTrait> {
38        Some(self)
39    }
40
41    fn _as_extension_typed(&self) -> Option<&dyn ExtensionArrayTrait> {
42        Some(self)
43    }
44
45    fn _as_decimal_typed(&self) -> Option<&dyn DecimalArrayTrait> {
46        Some(self)
47    }
48}
49
50impl NullArrayTrait for ConstantArray {}
51
52impl BoolArrayTrait for ConstantArray {}
53
54impl PrimitiveArrayTrait for ConstantArray {}
55
56impl Utf8ArrayTrait for ConstantArray {}
57
58impl BinaryArrayTrait for ConstantArray {}
59
60impl DecimalArrayTrait for ConstantArray {}
61
62impl StructArrayTrait for ConstantArray {
63    fn maybe_null_field_by_idx(&self, idx: usize) -> VortexResult<ArrayRef> {
64        self.scalar()
65            .as_struct()
66            .field_by_idx(idx)
67            .map(|scalar| ConstantArray::new(scalar, self.len()).into_array())
68    }
69
70    fn project(&self, projection: &[FieldName]) -> VortexResult<ArrayRef> {
71        Ok(
72            ConstantArray::new(self.scalar().as_struct().project(projection)?, self.len())
73                .into_array(),
74        )
75    }
76}
77
78impl ListArrayTrait for ConstantArray {}
79
80impl ExtensionArrayTrait for ConstantArray {
81    fn storage_data(&self) -> ArrayRef {
82        ConstantArray::new(self.scalar().as_extension().storage(), self.len()).into_array()
83    }
84}