vortex_sampling_compressor/compressors/
constant.rs1use vortex_array::aliases::hash_set::HashSet;
2use vortex_array::array::{ConstantArray, ConstantEncoding};
3use vortex_array::{Array, Encoding, EncodingId, IntoArray};
4use vortex_error::{VortexExpect, VortexResult};
5
6use crate::compressors::{CompressedArray, CompressionTree, EncodingCompressor};
7use crate::{constants, SamplingCompressor};
8
9#[derive(Debug)]
10pub struct ConstantCompressor;
11
12impl EncodingCompressor for ConstantCompressor {
13 fn id(&self) -> &str {
14 ConstantEncoding::ID.as_ref()
15 }
16
17 fn cost(&self) -> u8 {
18 constants::CONSTANT_COST
19 }
20
21 fn can_compress(&self, array: &Array) -> Option<&dyn EncodingCompressor> {
22 array
23 .statistics()
24 .compute_is_constant()?
25 .then_some(self as &dyn EncodingCompressor)
26 }
27
28 fn compress<'a>(
29 &'a self,
30 array: &Array,
31 _like: Option<CompressionTree<'a>>,
32 _ctx: SamplingCompressor<'a>,
33 ) -> VortexResult<CompressedArray<'a>> {
34 Ok(CompressedArray::compressed(
35 ConstantArray::new(
36 array
37 .as_constant()
38 .vortex_expect("ConstantCompressor expects constant array"),
39 array.len(),
40 )
41 .into_array(),
42 Some(CompressionTree::flat(self)),
43 array,
44 ))
45 }
46
47 fn used_encodings(&self) -> HashSet<EncodingId> {
48 HashSet::from([ConstantEncoding::ID])
49 }
50}