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