serde_columnar/column/
rle.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{
4    strategy::{AnyRleDecoder, AnyRleEncoder},
5    ColumnAttr, ColumnarError, Strategy,
6};
7
8use super::ColumnTrait;
9
10pub trait Rleable: Clone + PartialEq + Serialize + for<'de> Deserialize<'de> {}
11impl<T> Rleable for T where T: Clone + PartialEq + Serialize + for<'de> Deserialize<'de> {}
12
13/// The Column that is scheduled to be compressed using [AnyRleEncoder]
14#[derive(Debug)]
15pub struct RleColumn<T> {
16    pub data: Vec<T>,
17    pub attr: ColumnAttr,
18}
19
20impl<T: Rleable> RleColumn<T> {
21    pub fn new(data: Vec<T>, attr: ColumnAttr) -> Self {
22        Self { data, attr }
23    }
24}
25
26impl<T> ColumnTrait for RleColumn<T>
27where
28    T: Rleable,
29{
30    const STRATEGY: Strategy = Strategy::Rle;
31
32    fn len(&self) -> usize {
33        self.data.len()
34    }
35
36    fn attr(&self) -> ColumnAttr {
37        self.attr
38    }
39
40    fn encode(&self) -> Result<Vec<u8>, ColumnarError> {
41        let mut rle_encoder = AnyRleEncoder::<T>::new();
42        for data in self.data.iter() {
43            rle_encoder.append(data)?
44        }
45        rle_encoder.finish()
46    }
47
48    fn decode(bytes: &[u8]) -> Result<Self, ColumnarError>
49    where
50        Self: Sized,
51    {
52        let mut rle_decoder = AnyRleDecoder::new(bytes);
53        Ok(Self {
54            data: rle_decoder.decode()?,
55            attr: ColumnAttr::empty(),
56        })
57    }
58}