Skip to main content

vortex_compressor/builtins/constant/
bool.rs

1// SPDX-License-Identifier: Apache-2.0
2// SPDX-FileCopyrightText: Copyright the Vortex contributors
3
4//! Constant encoding for bool arrays.
5
6use vortex_array::ArrayRef;
7use vortex_array::Canonical;
8use vortex_error::VortexResult;
9
10use crate::CascadingCompressor;
11use crate::builtins::BoolConstantScheme;
12use crate::builtins::constant::compress_constant_array_with_validity;
13use crate::ctx::CompressorContext;
14use crate::estimate::CompressionEstimate;
15use crate::estimate::EstimateVerdict;
16use crate::scheme::Scheme;
17use crate::stats::ArrayAndStats;
18
19impl Scheme for BoolConstantScheme {
20    fn scheme_name(&self) -> &'static str {
21        "vortex.bool.constant"
22    }
23
24    fn matches(&self, canonical: &Canonical) -> bool {
25        matches!(canonical, Canonical::Bool(_))
26    }
27
28    fn expected_compression_ratio(
29        &self,
30        data: &mut ArrayAndStats,
31        ctx: CompressorContext,
32    ) -> CompressionEstimate {
33        // Constant detection on a sample is a false positive, since the sample being constant does
34        // not mean the full array is constant.
35        if ctx.is_sample() {
36            return CompressionEstimate::Verdict(EstimateVerdict::Skip);
37        }
38
39        let array_len = data.array().len();
40        let stats = data.bool_stats();
41
42        // We want to use `Constant` if there are only nulls in the array.
43        if stats.value_count() == 0 {
44            debug_assert_eq!(stats.null_count() as usize, array_len);
45            return CompressionEstimate::Verdict(EstimateVerdict::AlwaysUse);
46        }
47
48        if stats.is_constant() {
49            return CompressionEstimate::Verdict(EstimateVerdict::AlwaysUse);
50        }
51
52        CompressionEstimate::Verdict(EstimateVerdict::Skip)
53    }
54
55    fn compress(
56        &self,
57        _compressor: &CascadingCompressor,
58        data: &mut ArrayAndStats,
59        _ctx: CompressorContext,
60    ) -> VortexResult<ArrayRef> {
61        compress_constant_array_with_validity(data.array())
62    }
63}