Skip to main content

vortex_compressor/builtins/constant/
mod.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4//! Constant encoding schemes for bool, float, integer, and string arrays.
5
6use 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/// Constant encoding for bool arrays where all valid values are the same.
19#[derive(Debug, Copy, Clone, PartialEq, Eq)]
20pub struct BoolConstantScheme;
21
22/// Constant encoding for integer arrays with a single distinct value.
23#[derive(Debug, Copy, Clone, PartialEq, Eq)]
24pub struct IntConstantScheme;
25
26/// Constant encoding for float arrays with a single distinct value.
27#[derive(Debug, Copy, Clone, PartialEq, Eq)]
28pub struct FloatConstantScheme;
29
30/// Constant encoding for string arrays with a single distinct value.
31#[derive(Debug, Copy, Clone, PartialEq, Eq)]
32pub struct StringConstantScheme;
33
34mod bool;
35mod float;
36mod integer;
37mod string;
38
39/// Shared helper for compressing a constant array (bool, int, float, string) into a
40/// [`ConstantArray`].
41///
42/// Assumes that the source array has constant valid scalars.
43///
44/// If the array has any nulls, returns a [`MaskedArray`] with a [`ConstantArray`] child.`
45fn 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}