semilattice-database

Example

```rust use semilattice_database::prelude::*;

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=Database::new(dir).unwrap();

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

if let Ok(mut sess)=database.session("test"){ sess.update(vec![ Record::New{ collectionid:collectionperson ,activity:Activity::Active ,termbegin:Term::Defalut ,termend:Term::Defalut ,fields:vec![ KeyValue::new("name","Joe") ,KeyValue::new("birthday","1972-08-02") ] ,depends:Depends::Overwrite(vec![]) ,pends:vec![("history",vec![ Record::New{ collectionid:collectionhistory ,activity:Activity::Active ,termbegin:Term::Defalut ,termend:Term::Defalut ,fields:vec![ KeyValue::new("date","1972-08-02") ,KeyValue::new("event","Birth") ] ,depends:Depends::Overwrite(vec![]) ,pends:vec![] } ,Record::New{ collectionid:collectionhistory ,activity:Activity::Active ,termbegin:Term::Defalut ,termend:Term::Defalut ,fields:vec![ KeyValue::new("date","1999-12-31") ,KeyValue::new("event","Mariage") ] ,depends:Depends::Overwrite(vec![]) ,pends:vec![] } ])] } ,Record::New{ collectionid:collectionperson ,activity:Activity::Active ,termbegin:Term::Defalut ,termend:Term::Defalut ,fields:vec![ KeyValue::new("name","Tom") ,KeyValue::new("birthday","2000-12-12") ] ,depends:Depends::Overwrite(vec![]) ,pends:vec![("history",vec![ Record::New{ collectionid:collectionhistory ,activity:Activity::Active ,termbegin:Term::Defalut ,termend:Term::Defalut ,fields:vec![ KeyValue::new("date","2000-12-12") ,KeyValue::new("event","Birth") ] ,depends:Depends::Overwrite(vec![]) ,pends:vec![] } ])] } ,Record::New{ collectionid:collectionperson ,activity:Activity::Active ,termbegin:Term::Defalut ,termend:Term::Defalut ,fields:vec![ KeyValue::new("name","Billy") ,KeyValue::new("birthday","1982-03-03") ] ,depends:Depends::Overwrite(vec![]) ,pends:vec![] } ]); sess.commit(); }

let relation=database.relation(); if let Some(p)=database.collection(collectionperson){ for i in 1..=3{ println!( "{},{}" ,p.fieldstr(i,"name") ,p.fieldstr(i,"birthday") ); for h in relation.pends("history",&CollectionRow::new(collectionperson,i)){ if let Some(col)=database.collection(h.collectionid()){ let row=h.row(); println!( " {} : {}" ,col.fieldstr(row,"date") ,col.field_str(row,"event") );

        }
    }
}

} if let Ok(mut sess)=database.session("test"){ sess.update(vec![ Record::Update{ collectionid:collectionperson ,row:1 ,activity:Activity::Active ,termbegin:Term::Defalut ,termend:Term::Defalut ,fields:vec![KeyValue::new("name","Renamed Joe")] ,depends:Depends::Inherit ,pends:vec![] } ]); } if let Ok(mut sess)=database.session("test"){ let search=sess.beginsearch(collectionperson).searchactivity(Activity::Active); for r in search.result(){ println!( "{},{}" ,sess.fieldstr(collectionperson,r,"name") ,sess.fieldstr(collection_person,r,"birthday") ); } sess.commit(); }

let test1=database.collectionid("test1").unwrap(); let range=1..=10; if let Ok(mut sess)=database.session("test"){ for i in range.clone(){ sess.update(vec![ Record::New{ collectionid:test1 ,activity:Activity::Active ,termbegin:Term::Defalut ,termend:Term::Defalut ,fields:vec![ KeyValue::new("num",i.tostring()) ,KeyValue::new("numby3",(i*3).to_string()) ] ,depends:Depends::Overwrite(vec![]) ,pends:vec![] } ]); } sess.commit(); }

if let Ok(mut sess)=database.session("test"){ sess.update(vec![ Record::Update{ collectionid:test1 ,row:3 ,activity:Activity::Inactive ,termbegin:Term::Defalut ,term_end:Term::Defalut ,fields:vec![] ,depends:Depends::Overwrite(vec![]) ,pends:vec![] } ]); sess.commit(); }

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 t1.activity(i)==Activity::Active{ "Active" }else{ "Inactive" } ,t1.uuidstr(i) ,t1.lastupdated(i) ,t1.termbegin(i) ,t1.termend(i) ,t1.fieldstr(i,"num") ,t1.fieldstr(i,"numby3") ); } assert_eq!(sum,55.0);

let r=t1
    .search_field("num",Field::Range(b"3".to_vec(),b"8".to_vec()))
    .search_default()   //Automatic execution of the following two lines
    //.search_term(Term::In(chrono::Local::now().timestamp()))
    //.search_activity(Activity::Active)
    .result()
;
println!("{:?}",r);

} ```