vortex_compressor/builtins/constant/
mod.rs1use vortex_array::ArrayRef;
7use vortex_array::IntoArray;
8use vortex_array::arrays::ConstantArray;
9use vortex_array::arrays::MaskedArray;
10use vortex_array::scalar::Scalar;
11use vortex_error::VortexExpect;
12use vortex_error::VortexResult;
13
14use super::is_float_primitive;
15use super::is_integer_primitive;
16use super::is_utf8_string;
17
18#[derive(Debug, Copy, Clone, PartialEq, Eq)]
20pub struct BoolConstantScheme;
21
22#[derive(Debug, Copy, Clone, PartialEq, Eq)]
24pub struct IntConstantScheme;
25
26#[derive(Debug, Copy, Clone, PartialEq, Eq)]
28pub struct FloatConstantScheme;
29
30#[derive(Debug, Copy, Clone, PartialEq, Eq)]
32pub struct StringConstantScheme;
33
34mod bool;
35mod float;
36mod integer;
37mod string;
38
39fn compress_constant_array_with_validity(source: &ArrayRef) -> VortexResult<ArrayRef> {
46 if source.all_invalid()? {
47 return Ok(
48 ConstantArray::new(Scalar::null(source.dtype().clone()), source.len()).into_array(),
49 );
50 }
51
52 let scalar_idx = (0..source.len())
53 .position(|idx| source.is_valid(idx).unwrap_or(false))
54 .vortex_expect("We checked that there exists a scalar that is not invalid");
55
56 let scalar = source.scalar_at(scalar_idx)?;
57 let const_arr = ConstantArray::new(scalar, source.len()).into_array();
58
59 if !source.all_valid()? {
60 Ok(MaskedArray::try_new(const_arr, source.validity()?)?.into_array())
61 } else {
62 Ok(const_arr)
63 }
64}