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