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