vecdb/variants/compressed/zstd/
strategy.rs

1use std::marker::PhantomData;
2
3use zstd::{decode_all, encode_all};
4
5use crate::{RawStrategy, Result};
6
7use super::{super::inner::CompressionStrategy, value::ZstdVecValue};
8
9/// Zstd compression level (1-22). Level 3 provides a good balance
10/// between compression ratio and speed for most workloads.
11const ZSTD_COMPRESSION_LEVEL: i32 = 3;
12
13/// Zstd compression strategy for high compression ratios.
14#[derive(Debug, Clone, Copy)]
15pub struct ZstdStrategy<T>(PhantomData<T>);
16
17impl<T> RawStrategy<T> for ZstdStrategy<T>
18where
19    T: ZstdVecValue,
20{
21    #[inline(always)]
22    fn read(bytes: &[u8]) -> Result<T> {
23        T::from_bytes(bytes)
24    }
25
26    #[inline(always)]
27    fn write_to_vec(value: &T, buf: &mut Vec<u8>) {
28        buf.extend_from_slice(value.to_bytes().as_ref());
29    }
30
31    #[inline(always)]
32    fn write_to_slice(value: &T, dst: &mut [u8]) {
33        dst.copy_from_slice(value.to_bytes().as_ref());
34    }
35}
36
37impl<T> CompressionStrategy<T> for ZstdStrategy<T>
38where
39    T: ZstdVecValue,
40{
41    fn compress(values: &[T]) -> Result<Vec<u8>> {
42        let bytes = Self::values_to_bytes(values);
43        Ok(encode_all(bytes.as_slice(), ZSTD_COMPRESSION_LEVEL)?)
44    }
45
46    fn decompress(bytes: &[u8], expected_len: usize) -> Result<Vec<T>> {
47        let decompressed = decode_all(bytes)?;
48        Self::bytes_to_values(&decompressed, expected_len)
49    }
50}