crustydb / src / common / src / physical / tuple_conv3.rs
tuple_conv3.rs
Raw
use crate::{CrustyError, TableSchema, Tuple};

use super::tuple_writer::TupleConverterTrait;

pub struct TupleConverter3 {
    _table_schema: TableSchema,
}

impl TupleConverterTrait for TupleConverter3 {
    fn new(schema: TableSchema) -> Self {
        TupleConverter3 {
            _table_schema: schema,
        }
    }

    fn write_tuple(&self, tuple: &Tuple, buf: &mut [u8], offset: usize) -> Option<usize> {
        let bytes = tuple.to_bytes();
        if bytes.len() > buf.len() - offset {
            return None;
        }
        buf[offset..offset + bytes.len()].copy_from_slice(&bytes);
        Some(bytes.len())
    }

    fn read_tuple(&self, buf: &[u8], offset: usize, len: usize) -> Result<Tuple, CrustyError> {
        let t = Tuple::from_bytes(buf[offset..offset + len].as_ref());
        Ok(t)
    }
}

#[cfg(test)]
mod tests {
    use crate::testutil::init;

    use super::*;
    use crate::testutil::{gen_random_tuples_fixed, gen_random_tuples_var_and_null, get_rng};

    const BUF_SIZE: usize = 100_000;
    const N: usize = 100;
    const NULL_PROB: f64 = 0.1;

    #[test]
    fn test_conv3() {
        init();
        let mut rng = get_rng();
        let attrs = 10;
        let (schema, tuples) = gen_random_tuples_fixed(&mut rng, N, attrs - 1);
        let mut buf = [0u8; BUF_SIZE];
        let tuple_conv0 = TupleConverter3::new(schema.clone());
        for t in tuples.iter() {
            let len = tuple_conv0.write_tuple(t, &mut buf, 0).unwrap();
            let tuple2 = tuple_conv0.read_tuple(&buf, 0, len).unwrap();
            assert_eq!(t, &tuple2);
        }
        let mut offset = 0;
        for t in tuples.iter() {
            let len = tuple_conv0.write_tuple(t, &mut buf, offset).unwrap();
            let tuple2 = tuple_conv0.read_tuple(&buf, offset, len).unwrap();
            assert_eq!(t, &tuple2);
            offset += len;
        }
    }

    #[test]
    fn test_var_conv3() {
        init();
        let mut rng = get_rng();
        let attrs = 10;
        let (schema, tuples) = gen_random_tuples_var_and_null(&mut rng, N, attrs - 1, NULL_PROB);
        let mut buf = [0u8; BUF_SIZE];
        let tuple_conv3 = TupleConverter3::new(schema.clone());
        for t in tuples.iter() {
            let len = tuple_conv3.write_tuple(t, &mut buf, 0).unwrap();
            let tuple2 = tuple_conv3.read_tuple(&buf, 0, len).unwrap();
            assert_eq!(t, &tuple2);
        }
        let mut offset = 0;
        for t in tuples.iter() {
            let len = tuple_conv3.write_tuple(t, &mut buf, offset).unwrap();
            let tuple2 = tuple_conv3.read_tuple(&buf, offset, len).unwrap();
            assert_eq!(t, &tuple2);
            offset += len;
        }
    }
}