semilattice-database-session

Example

```rust use std::sync::Arc;

use semilatticedatabasesession::*;

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

if std::path::Path::new(dir).exists() { std::fs::removedirall(dir).unwrap(); std::fs::createdirall(dir).unwrap(); } else { std::fs::createdirall(dir).unwrap(); } let mut database = SessionDatabase::new(dir.into(), None);

let collectionadmin = database.collectionidorcreate("admin");

let mut sess = database.session("creatreaccount1st", None); database.update( &mut sess, vec![SessionRecord::New { collectionid: collectionadmin, record: Record { fields: vec![ KeyValue::new("id", "test".toowned()), KeyValue::new("password", "test".toowned()), ], ..Record::default() }, depends: Depends::Overwrite(vec![]), pends: vec![], }], ); database.commit(&mut sess);

let collectionlogin = database.collectionidorcreate("login"); let mut sess = database.session("login", None); let search = sess .beginsearch(collectionadmin) .searchfield("id", search::Field::Match(Arc::new(b"test".tovec()))) .searchfield("password", search::Field::Match(Arc::new(b"test".tovec()))); for row in search.result(&database, &vec![]).unwrap() { assert!(row >= 0); database.update( &mut sess, vec![SessionRecord::New { collectionid: collectionlogin, record: Record { fields: vec![], ..Record::default() }, depends: Depends::Overwrite(vec![( "admin".toowned(), CollectionRow::new(collectionadmin, row as u32), )]), pends: vec![], }], ); }

let sess = database.session("login", None); let search = sess.beginsearch(collectionlogin); for row in search.result(&database, &vec![]).unwrap() { let depends = database.dependswithsession(Some("admin"), collectionlogin, row as u32, Some(&sess)); for d in depends { let collectionid = d.collectionid(); if let Some(collection) = database.collection(collectionid) { let search = sess .beginsearch(collectionid) .searchrow(search::Number::In(vec![d.row() as isize])); for row in search.result(&database, &vec![]).unwrap() { println!( "login id : {}", std::str::fromutf8(collection.field_bytes(row as u32, "id")).unwrap() ); } } } }

let collectionperson = database.collectionidorcreate("person"); let collectionhistory = database.collectionidorcreate("history");

let mut sess = database.session("test", None); database.update( &mut sess, vec![ SessionRecord::New { collectionid: collectionperson, record: Record { fields: vec![ KeyValue::new("name", "Joe"), KeyValue::new("birthday", "1972-08-02"), ], ..Record::default() }, depends: Depends::Overwrite(vec![]), pends: vec![Pend::new( "history", vec![ SessionRecord::New { collectionid: collectionhistory, record: Record { fields: vec![ KeyValue::new("date", "1972-08-02"), KeyValue::new("event", "Birth"), ], ..Record::default() }, depends: Depends::Default, pends: vec![], }, SessionRecord::New { collectionid: collectionhistory, record: Record { fields: vec![ KeyValue::new("date", "1999-12-31"), KeyValue::new("event", "Mariage"), ], ..Record::default() }, depends: Depends::Default, pends: vec![], }, ], )], }, SessionRecord::New { collectionid: collectionperson, record: Record { fields: vec![ KeyValue::new("name", "Tom"), KeyValue::new("birthday", "2000-12-12"), ], ..Record::default() }, depends: Depends::Default, pends: vec![Pend::new( "history", vec![SessionRecord::New { collectionid: collectionhistory, record: Record { fields: vec![ KeyValue::new("date", "2000-12-12"), KeyValue::new("event", "Birth"), ], ..Record::default() }, depends: Depends::Default, pends: vec![], }], )], }, SessionRecord::New { collectionid: collectionperson, record: Record { fields: vec![ KeyValue::new("name", "Billy"), KeyValue::new("birthday", "1982-03-03"), ], ..Record::default() }, depends: Depends::Default, pends: vec![], }, ], ); database.commit(&mut sess);

if let (Some(person), Some(history)) = ( database.collection(collectionperson), database.collection(collectionhistory), ) { let mut search = database.search(collectionperson); let result = search.result(&database).unwrap(); let personrows = if let Some(r) = result.read().unwrap().asref() { r.sort( &database, &vec![Order::Asc(OrderKey::Field("birthday".toowned()))], ) } else { vec![] }; for i in personrows { println!( "{},{}", std::str::fromutf8(person.fieldbytes(i, "name")).unwrap(), std::str::fromutf8(person.fieldbytes(i, "birthday")).unwrap() ); let mut seach = database.search(collectionhistory); seach.search(Condition::Depend( Some("history".toowned()), CollectionRow::new(collectionperson, i), )); let result = search.result(&database).unwrap(); if let Some(result) = Arc::clone(&result).read().unwrap().asref() { for h in result.rows() { println!( " {} : {}", std::str::fromutf8(history.fieldbytes(*h, "date")).unwrap(), std::str::fromutf8(history.fieldbytes(*h, "event")).unwrap() ); } } } } let mut sess = database.session("test", None); database.update( &mut sess, vec![SessionRecord::Update { collectionid: collection_person, row: 1, record: Record { fields: vec![KeyValue::new("name", "Renamed Joe")], ..Record::default() }, depends: Depends::Default, pends: vec![], }], );

let mut sess = database.session("test", None); let search = sess .beginsearch(collectionperson) .searchactivity(Activity::Active); for r in search.result(&database, &vec![]).unwrap() { println!( "sessionsearch : {},{}", std::str::fromutf8(sess.fieldbytes(&database, collectionperson, r, "name")).unwrap(), std::str::fromutf8(sess.fieldbytes(&database, collectionperson, r, "birthday")) .unwrap() ); } database.commit(&mut sess);

let test1 = database.collectionidorcreate("test1"); let range = 1u32..=10; let mut sess = database.session("test", None); for i in range.clone() { database.update( &mut sess, vec![SessionRecord::New { collectionid: test1, record: Record { fields: vec![ KeyValue::new("num", i.tostring()), KeyValue::new("numby3", (i * 3).to_string()), ], ..Record::default() }, depends: Depends::Overwrite(vec![]), pends: vec![], }], ); } database.commit(&mut sess);

let mut sess = database.session("test", None); database.update( &mut sess, vec![SessionRecord::Update { collection_id: test1, row: 3, record: Record { fields: vec![], ..Record::default() }, depends: Depends::Overwrite(vec![]), pends: vec![], }], ); database.commit(&mut sess);

if let Some(t1) = database.collection(test1) { let mut sum = 0.0; for i in range.clone() { sum += t1.fieldnum(i, "num"); println!( "{},{},{},{},{},{},{},{}", t1.serial(i), if let Some(Activity::Active) = t1.activity(i) { "Active" } else { "Inactive" }, t1.uuidstring(i).unwrapor("".tostring()), t1.lastupdated(i).unwrapor(0), t1.termbegin(i).unwrapor(0), t1.termend(i).unwrapor(0), std::str::fromutf8(t1.fieldbytes(i, "num")).unwrap(), std::str::fromutf8(t1.fieldbytes(i, "numby3")).unwrap() ); } asserteq!(sum, 55.0); } ```