persy 1.8.0

Transactional Persistence Engine
Documentation
use crate::{
    id::{PersyId, RecRef},
    index::{
        bytevec::ByteVec,
        config::{IndexTypeInternal, ValueMode},
        serialization::{deserialize, serialize},
        string_wrapper::StringWrapper,
        tree::nodes::{Leaf, Node, TreeNode, TreeNodeRef, Value, compare},
    },
    util::io::ArcSliceRead,
};
use rand::random;
use std::{cmp::Ordering, fmt::Debug, sync::Arc};

fn random_pointer() -> TreeNodeRef {
    RecRef::new(random::<u64>(), random::<u32>())
}

#[test]
fn test_serialization_deserialization_nodes() {
    let val1 = random_pointer();
    let val2 = random_pointer();
    let val3 = random_pointer();
    let mut node = Node::new_from_split(val1, &[(0, val2)]);
    let pos = node.find(&2).pos;
    node.add(pos, &2, val3);
    let value = serialize::<u8, u8>(&TreeNode::Node(node));
    let vl = value.len();
    let read = deserialize::<u8, u8>(ArcSliceRead::new(Arc::new(value), 0, vl));
    match read {
        TreeNode::Node(n) => {
            assert_eq!(n.keys.len(), 2);
            assert_eq!(n.pointers.len(), 3);
        }
        _ => panic!("expected a node"),
    }
}

fn single_type_leaf_test<K: IndexTypeInternal + Debug, V: IndexTypeInternal + Debug>(key: K, value: V, value1: V) {
    let mut leaf = Leaf::new();
    leaf.insert_or_update(&key, &value, ValueMode::Replace, "deserialization error")
        .expect("insert work");
    let binary = serialize::<K, V>(&TreeNode::Leaf(leaf));
    let bl = binary.len();
    let read = deserialize::<K, V>(ArcSliceRead::new(Arc::new(binary), 0, bl));
    match read {
        TreeNode::Leaf(n) => {
            assert_eq!(n.entries.len(), 1);
            match n.entries[0].value {
                Value::Single(ref iv) => assert_eq!(compare(iv, &value), Ordering::Equal),
                _ => panic!("expected SINGLE"),
            }
        }
        _ => panic!("expected a leaf"),
    }
    let mut leaf_many = Leaf::new();
    leaf_many
        .insert_or_update(&key, &value, ValueMode::Cluster, "deserialization error")
        .expect("insert work");
    leaf_many
        .insert_or_update(&key, &value1, ValueMode::Cluster, "deserialization error")
        .expect("insert work");
    let binary = serialize::<K, V>(&TreeNode::Leaf(leaf_many));
    let bl = binary.len();
    let read = deserialize::<K, V>(ArcSliceRead::new(Arc::new(binary), 0, bl));
    match read {
        TreeNode::Leaf(n) => {
            assert_eq!(n.entries.len(), 1);
            match n.entries[0].value {
                Value::Cluster(ref iv) => {
                    assert_eq!(compare(&iv[0], &value), Ordering::Equal);
                    assert_eq!(compare(&iv[1], &value1), Ordering::Equal);
                }
                _ => panic!("expected CLUSTER"),
            }
        }
        _ => panic!("expected a leaf"),
    }
}

#[test]
fn test_serialization_deserialization_leaves() {
    single_type_leaf_test::<u8, u8>(20, 10, 20);
    single_type_leaf_test::<u16, u16>(20, 10, 20);
    single_type_leaf_test::<u32, u32>(20, 10, 20);
    single_type_leaf_test::<u64, u64>(20, 10, 20);
    single_type_leaf_test::<u128, u128>(20, 10, 20);
    single_type_leaf_test::<i8, i8>(20, 10, 20);
    single_type_leaf_test::<i16, i16>(20, 10, 20);
    single_type_leaf_test::<i32, i32>(20, 10, 20);
    single_type_leaf_test::<i64, i64>(20, 10, 20);
    single_type_leaf_test::<i128, i128>(20, 10, 20);
    single_type_leaf_test::<f32, f32>(20.0, 10.0, 20.0);
    single_type_leaf_test::<f64, f64>(20.0, 10.0, 20.0);
    single_type_leaf_test::<i32, StringWrapper>(
        10,
        StringWrapper::new("a".to_string()),
        StringWrapper::new("b".to_string()),
    );
    single_type_leaf_test::<StringWrapper, i32>(StringWrapper::new("a".to_string()), 10, 20);
    single_type_leaf_test::<StringWrapper, ByteVec>(
        StringWrapper::new("a".to_string()),
        vec![0, 1].into(),
        vec![2, 10].into(),
    );
    single_type_leaf_test::<ByteVec, ByteVec>(vec![11, 12].into(), vec![0, 1].into(), vec![2, 10].into());
    single_type_leaf_test::<StringWrapper, StringWrapper>(
        StringWrapper::new("o".to_string()),
        StringWrapper::new("a".to_string()),
        StringWrapper::new("b".to_string()),
    );
    let id = PersyId(RecRef::new(10, 20));
    let id1 = PersyId(RecRef::new(20, 20));
    let id2 = PersyId(RecRef::new(30, 20));
    single_type_leaf_test::<PersyId, PersyId>(id, id1, id2);
}