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