pancake_db_core/compression/
q_codec.rs

1use q_compress::Compressor as RawQCompressor;
2use q_compress::Decompressor as RawQDecompressor;
3use q_compress::CompressorConfig;
4use q_compress::data_types::{NumberLike, TimestampMicros};
5
6use crate::compression::Codec;
7use crate::errors::CoreResult;
8use crate::primitives::Primitive;
9
10const Q_COMPRESSION_LEVEL: usize = 7;
11
12pub trait QCodec {
13  type T: Primitive + NumberLike;
14}
15
16macro_rules! qcompressor {
17  ($struct_name:ident, $primitive_type:ty) => {
18    #[derive(Clone, Debug)]
19    pub struct $struct_name {}
20
21    impl Codec for $struct_name {
22      type P = $primitive_type;
23
24      fn compress_atoms(&self, primitives: &[$primitive_type]) -> CoreResult<Vec<u8>> {
25        let compressor = RawQCompressor::<$primitive_type>::from_config(CompressorConfig {
26          compression_level: Q_COMPRESSION_LEVEL,
27          ..Default::default()
28        });
29        Ok(compressor.simple_compress(primitives))
30      }
31
32      fn decompress_atoms(&self, bytes: &[u8]) -> CoreResult<Vec<$primitive_type>> {
33        let decompressor = RawQDecompressor::<$primitive_type>::default();
34        Ok(decompressor.simple_decompress(bytes)?)
35      }
36    }
37  }
38}
39
40qcompressor!(I64QCodec, i64);
41qcompressor!(BoolQCodec, bool);
42qcompressor!(F32QCodec, f32);
43qcompressor!(F64QCodec, f64);
44qcompressor!(TimestampMicrosQCodec, TimestampMicros);