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::LEGACY_SESSION;
9use vortex_array::VortexSessionExecute;
10use vortex_array::arrays::ConstantArray;
11use vortex_array::arrays::MaskedArray;
12use vortex_array::scalar::Scalar;
13use vortex_error::VortexExpect;
14use vortex_error::VortexResult;
15
16use super::is_float_primitive;
17use super::is_integer_primitive;
18use super::is_utf8_string;
19
20/// Constant encoding for bool arrays where all valid values are the same.
21#[derive(Debug, Copy, Clone, PartialEq, Eq)]
22pub struct BoolConstantScheme;
23
24/// Constant encoding for integer arrays with a single distinct value.
25#[derive(Debug, Copy, Clone, PartialEq, Eq)]
26pub struct IntConstantScheme;
27
28/// Constant encoding for float arrays with a single distinct value.
29#[derive(Debug, Copy, Clone, PartialEq, Eq)]
30pub struct FloatConstantScheme;
31
32/// Constant encoding for string arrays with a single distinct value.
33#[derive(Debug, Copy, Clone, PartialEq, Eq)]
34pub struct StringConstantScheme;
35
36mod bool;
37mod float;
38mod integer;
39mod string;
40
41/// Shared helper for compressing a constant array (bool, int, float, string) into a
42/// [`ConstantArray`].
43///
44/// Assumes that the source array has constant valid scalars.
45///
46/// If the array has any nulls, returns a [`MaskedArray`] with a [`ConstantArray`] child.`
47fn compress_constant_array_with_validity(source: &ArrayRef) -> VortexResult<ArrayRef> {
48    let mut ctx = LEGACY_SESSION.create_execution_ctx();
49    if source.all_invalid(&mut ctx)? {
50        return Ok(
51            ConstantArray::new(Scalar::null(source.dtype().clone()), source.len()).into_array(),
52        );
53    }
54
55    let scalar_idx = (0..source.len())
56        .position(|idx| source.is_valid(idx, &mut ctx).unwrap_or(false))
57        .vortex_expect("We checked that there exists a scalar that is not invalid");
58
59    let scalar = source.execute_scalar(scalar_idx, &mut ctx)?;
60    let const_arr = ConstantArray::new(scalar, source.len()).into_array();
61
62    if !source.all_valid(&mut ctx)? {
63        Ok(MaskedArray::try_new(const_arr, source.validity()?)?.into_array())
64    } else {
65        Ok(const_arr)
66    }
67}