vortex_compressor/builtins/constant/
bool.rs1use vortex_array::ArrayRef;
7use vortex_array::Canonical;
8use vortex_array::ExecutionCtx;
9use vortex_error::VortexResult;
10
11use crate::CascadingCompressor;
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
19#[derive(Debug, Copy, Clone, PartialEq, Eq)]
21pub struct BoolConstantScheme;
22
23impl Scheme for BoolConstantScheme {
24 fn scheme_name(&self) -> &'static str {
25 "vortex.bool.constant"
26 }
27
28 fn matches(&self, canonical: &Canonical) -> bool {
29 matches!(canonical, Canonical::Bool(_))
30 }
31
32 fn expected_compression_ratio(
33 &self,
34 data: &ArrayAndStats,
35 compress_ctx: CompressorContext,
36 exec_ctx: &mut ExecutionCtx,
37 ) -> CompressionEstimate {
38 if compress_ctx.is_sample() {
41 return CompressionEstimate::Verdict(EstimateVerdict::Skip);
42 }
43
44 let array_len = data.array().len();
45 let stats = data.bool_stats(exec_ctx);
46
47 if stats.value_count() == 0 {
49 debug_assert_eq!(stats.null_count() as usize, array_len);
50 return CompressionEstimate::Verdict(EstimateVerdict::AlwaysUse);
51 }
52
53 if stats.is_constant() {
54 return CompressionEstimate::Verdict(EstimateVerdict::AlwaysUse);
55 }
56
57 CompressionEstimate::Verdict(EstimateVerdict::Skip)
58 }
59
60 fn compress(
61 &self,
62 _compressor: &CascadingCompressor,
63 data: &ArrayAndStats,
64 _compress_ctx: CompressorContext,
65 exec_ctx: &mut ExecutionCtx,
66 ) -> VortexResult<ArrayRef> {
67 compress_constant_array_with_validity(data.array(), exec_ctx)
68 }
69}