vortex_compressor/builtins/constant/
integer.rs1use vortex_array::ArrayRef;
7use vortex_array::Canonical;
8use vortex_error::VortexResult;
9
10use super::is_integer_primitive;
11use crate::CascadingCompressor;
12use crate::builtins::IntConstantScheme;
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 IntConstantScheme {
21 fn scheme_name(&self) -> &'static str {
22 "vortex.int.constant"
23 }
24
25 fn matches(&self, canonical: &Canonical) -> bool {
26 is_integer_primitive(canonical)
27 }
28
29 fn expected_compression_ratio(
30 &self,
31 data: &mut ArrayAndStats,
32 ctx: CompressorContext,
33 ) -> CompressionEstimate {
34 if ctx.is_sample() {
37 return CompressionEstimate::Verdict(EstimateVerdict::Skip);
38 }
39
40 let array_len = data.array().len();
41 let stats = data.integer_stats();
42
43 if let Some(distinct_count) = stats.distinct_count() {
45 if distinct_count > 1 {
46 return CompressionEstimate::Verdict(EstimateVerdict::Skip);
47 } else {
48 debug_assert_eq!(distinct_count, 1);
49 return CompressionEstimate::Verdict(EstimateVerdict::AlwaysUse);
50 }
51 }
52
53 if stats.value_count() == 0 {
55 debug_assert_eq!(stats.null_count() as usize, array_len);
56 return CompressionEstimate::Verdict(EstimateVerdict::AlwaysUse);
57 }
58
59 match stats.erased().max_minus_min().checked_ilog2() {
61 Some(_) => CompressionEstimate::Verdict(EstimateVerdict::Skip),
62 None => CompressionEstimate::Verdict(EstimateVerdict::AlwaysUse),
64 }
65 }
66
67 fn compress(
68 &self,
69 _compressor: &CascadingCompressor,
70 data: &mut ArrayAndStats,
71 _ctx: CompressorContext,
72 ) -> VortexResult<ArrayRef> {
73 compress_constant_array_with_validity(data.array())
74 }
75}