vortex_sampling_compressor/compressors/
sparse.rs1use vortex_array::aliases::hash_set::HashSet;
2use vortex_array::{Array, Encoding, EncodingId, IntoArray};
3use vortex_error::VortexResult;
4use vortex_sparse::{SparseArray, SparseEncoding};
5
6use crate::compressors::{CompressedArray, CompressionTree, EncodingCompressor};
7use crate::{constants, SamplingCompressor};
8
9#[derive(Debug)]
10pub struct SparseCompressor;
11
12impl EncodingCompressor for SparseCompressor {
13 fn id(&self) -> &str {
14 SparseEncoding::ID.as_ref()
15 }
16
17 fn cost(&self) -> u8 {
18 constants::SPARSE_COST
19 }
20
21 fn can_compress(&self, array: &Array) -> Option<&dyn EncodingCompressor> {
22 array.is_encoding(SparseEncoding::ID).then_some(self)
23 }
24
25 fn compress<'a>(
26 &'a self,
27 array: &Array,
28 _: Option<CompressionTree<'a>>,
29 ctx: SamplingCompressor<'a>,
30 ) -> VortexResult<CompressedArray<'a>> {
31 let sparse_array = SparseArray::try_from(array.clone())?;
32 let compressed_patches = ctx
33 .auxiliary("patches")
34 .compress_patches(sparse_array.patches())?;
35 Ok(CompressedArray::compressed(
36 SparseArray::try_new_from_patches(
37 compressed_patches,
38 sparse_array.len(),
39 sparse_array.indices_offset(),
40 sparse_array.fill_scalar(),
41 )?
42 .into_array(),
43 Some(CompressionTree::new(self, vec![])),
44 array,
45 ))
46 }
47
48 fn used_encodings(&self) -> HashSet<EncodingId> {
49 HashSet::from([SparseEncoding::ID])
50 }
51}