semilattice-database

Crates.iosemilattice-database
lib.rssemilattice-database
version0.110.0
sourcesrc
created_at2022-09-26 11:15:45.103271
updated_at2024-02-13 11:11:10.597703
descriptionData is connected by a directed graph, and each node has an arbitrarily defined key-value.A database is not a tree.
homepage
repositoryhttps://github.com/OdenShirataki/semilattice-database
max_upload_size
id674176
size54,377
OdenShirataki (OdenShirataki)

documentation

README

semilattice-database

Example

use std::sync::Arc;

use semilattice_database::*;
use versatile_data::FieldName;

let dir = "./sl-test/";

if std::path::Path::new(dir).exists() {
    std::fs::remove_dir_all(dir).unwrap();
    std::fs::create_dir_all(dir).unwrap();
} else {
    std::fs::create_dir_all(dir).unwrap();
}
futures::executor::block_on(async {
    let mut database = Database::new(dir.into(), None, 10);

    let collection_person_id = database.collection_id_or_create("person");
    let collection_history_id = database.collection_id_or_create("history");
    let collection_person = database.collection_mut(collection_person_id).unwrap();

    let id_name = FieldName::new("name".into());
    let id_birthday = FieldName::new("birthday".into());

    let row = collection_person
        .insert(
            Activity::Active,
            Term::Default,
            Term::Default,
            [
                (id_name.clone(), "Joe".into()),
                (id_birthday.clone(), "1972-08-02".into()),
            ]
            .into(),
        )
        .await;

    let depend = CollectionRow::new(collection_person_id, row);
    let mut pends = vec![];

    let collection_history = database.collection_mut(collection_history_id).unwrap();

    let id_date = FieldName::new("date".into());
    let id_event = FieldName::new("event".into());

    let history_row = collection_history
        .insert(
            Activity::Active,
            Term::Default,
            Term::Default,
            [
                (id_date.clone(), "1972-08-02".into()),
                (id_event.clone(), "Birth".into()),
            ]
            .into(),
        )
        .await;
    pends.push((
        Arc::new("history".to_owned()),
        CollectionRow::new(collection_history_id, history_row),
    ));
    let history_row = collection_history
        .insert(
            Activity::Active,
            Term::Default,
            Term::Default,
            [
                (id_date.clone(), "1999-12-31".into()),
                (id_event.clone(), "Mariage".into()),
            ]
            .into(),
        )
        .await;
    pends.push((
        Arc::new("history".to_owned()),
        CollectionRow::new(collection_history_id, history_row),
    ));
    database.register_relations(&depend, pends).await;

    if let (Some(person), Some(history)) = (
        database.collection(collection_person_id),
        database.collection(collection_history_id),
    ) {
        let result = database
            .search(collection_person_id)
            .result(&database)
            .await;
        for row in result.rows().into_iter() {
            println!(
                "{},{}",
                std::str::from_utf8(person.field_bytes(*row, &id_name)).unwrap(),
                std::str::from_utf8(person.field_bytes(*row, &id_birthday)).unwrap()
            );
            for h in database
                .search(collection_history_id)
                .search(Condition::Depend(
                    Some(Arc::new("history".into())),
                    CollectionRow::new(collection_person_id, *row),
                ))
                .result(&database)
                .await
                .rows()
                .into_iter()
            {
                println!(
                    " {} : {}",
                    std::str::from_utf8(history.field_bytes(*h, &id_date)).unwrap(),
                    std::str::from_utf8(history.field_bytes(*h, &id_event)).unwrap()
                );
            }
        }
    }
});
Commit count: 275

cargo fmt