jasondb 0.2.7

A Blazingly-Fast, JSON-Based, Log-Structured Database.
Documentation
use crate::error::JasonError;
use crate::sources::InMemory;
use crate::Database;

use crate::tests::mock::Person;

use humphrey_json::Value;

use std::collections::{BTreeSet, HashMap};

#[test]
fn test_add_new() -> Result<(), JasonError> {
    let mut database: Database<Person, InMemory> = Database::new_in_memory()
        .with_index("name")?
        .with_index("year_of_birth")?;

    let person_1 = Person::new("A", 2000);
    let person_2 = Person::new("B", 2000);
    let person_3 = Person::new("C", 2001);
    let person_4 = Person::new("D", 2002);

    database.set("a", &person_1)?;
    database.set("b", &person_2)?;
    database.set("c", &person_3)?;
    database.set("d", &person_4)?;

    let index_1 = *database.primary_indexes.get("a").unwrap();
    let index_2 = *database.primary_indexes.get("b").unwrap();
    let index_3 = *database.primary_indexes.get("c").unwrap();
    let index_4 = *database.primary_indexes.get("d").unwrap();

    let name_index = database.secondary_indexes.get("name").unwrap();
    let year_of_birth_index = database.secondary_indexes.get("year_of_birth").unwrap();

    let expected_name_index: HashMap<Value, BTreeSet<u64>> = [
        (
            Value::String("A".to_string()),
            [index_1].iter().cloned().collect(),
        ),
        (
            Value::String("B".to_string()),
            [index_2].iter().cloned().collect(),
        ),
        (
            Value::String("C".to_string()),
            [index_3].iter().cloned().collect(),
        ),
        (
            Value::String("D".to_string()),
            [index_4].iter().cloned().collect(),
        ),
    ]
    .into();

    let expected_year_of_birth_index: HashMap<Value, BTreeSet<u64>> = [
        (
            Value::Number(2000.0),
            [index_1, index_2].iter().cloned().collect(),
        ),
        (Value::Number(2001.0), [index_3].iter().cloned().collect()),
        (Value::Number(2002.0), [index_4].iter().cloned().collect()),
    ]
    .into();

    assert_eq!(*name_index, expected_name_index);
    assert_eq!(*year_of_birth_index, expected_year_of_birth_index);

    Ok(())
}

#[test]
fn test_update() -> Result<(), JasonError> {
    let mut database: Database<Person, InMemory> = Database::new_in_memory()
        .with_index("name")?
        .with_index("year_of_birth")?;

    let person_1 = Person::new("A", 2000);
    let person_2 = Person::new("B", 2000);
    let person_3 = Person::new("C", 2001);
    let person_4 = Person::new("D", 2002);

    database.set("a", &person_1)?;
    database.set("b", &person_2)?;
    database.set("c", &person_3)?;
    database.set("d", &person_4)?;

    let updated_person_1 = Person::new("A", 2001);
    database.set("a", &updated_person_1)?;

    let index_1 = *database.primary_indexes.get("a").unwrap();
    let index_2 = *database.primary_indexes.get("b").unwrap();
    let index_3 = *database.primary_indexes.get("c").unwrap();
    let index_4 = *database.primary_indexes.get("d").unwrap();

    let name_index = database.secondary_indexes.get("name").unwrap();
    let year_of_birth_index = database.secondary_indexes.get("year_of_birth").unwrap();

    let expected_name_index: HashMap<Value, BTreeSet<u64>> = [
        (
            Value::String("A".to_string()),
            [index_1].iter().cloned().collect(),
        ),
        (
            Value::String("B".to_string()),
            [index_2].iter().cloned().collect(),
        ),
        (
            Value::String("C".to_string()),
            [index_3].iter().cloned().collect(),
        ),
        (
            Value::String("D".to_string()),
            [index_4].iter().cloned().collect(),
        ),
    ]
    .into();

    let expected_year_of_birth_index: HashMap<Value, BTreeSet<u64>> = [
        (Value::Number(2000.0), [index_2].iter().cloned().collect()),
        (
            Value::Number(2001.0),
            [index_3, index_1].iter().cloned().collect(),
        ),
        (Value::Number(2002.0), [index_4].iter().cloned().collect()),
    ]
    .into();

    assert_eq!(*name_index, expected_name_index);
    assert_eq!(*year_of_birth_index, expected_year_of_birth_index);

    Ok(())
}