pancake_db_core/compression/
q_codec.rs1use 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);