semilattice-database

Example

```rust use versatiledata::prelude::*; use semilatticedatabase::{ Database ,TransactionRecord ,TransactionOperation ,CollectionRow ,UpdateParent };

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![ TransactionRecord::new( collectionperson ,TransactionOperation::New{ activity:Activity::Active ,termbegin:UpdateTerm::Inherit ,termend:UpdateTerm::Inherit ,fields:vec![ ("name","Joe".tostring().intobytes()) ,("birthday","1972-08-02".tostring().intobytes()) ] ,parents:UpdateParent::Overwrite(vec![]) ,childs:vec![("history",vec![ TransactionRecord::new( collectionhistory ,TransactionOperation::New{ activity:Activity::Active ,termbegin:UpdateTerm::Inherit ,termend:UpdateTerm::Inherit ,fields:vec![ ("date","1972-08-02".tostring().intobytes()) ,("event","Birth".tostring().intobytes()) ] ,parents:UpdateParent::Overwrite(vec![]) ,childs:vec![] }

                )
                ,TransactionRecord::new(
                    collection_history
                    ,TransactionOperation::New{
                        activity:Activity::Active
                        ,term_begin:UpdateTerm::Inherit
                        ,term_end:UpdateTerm::Inherit
                        ,fields:vec![
                            ("date","1999-12-31".as_bytes().to_vec())
                            ,("event","Mariage".as_bytes().to_vec())
                        ]
                        ,parents:UpdateParent::Overwrite(vec![])
                        ,childs:vec![]
                    }
                )
            ])]
        }
    )
    ,TransactionRecord::new(
        collection_person
        ,TransactionOperation::New{
            activity:Activity::Active
            ,term_begin:UpdateTerm::Inherit
            ,term_end:UpdateTerm::Inherit
            ,fields:vec![
                ("name","Tom".as_bytes().to_vec())
                ,("birthday","2000-12-12".as_bytes().to_vec())
            ]
            ,parents:UpdateParent::Overwrite(vec![])
            ,childs:vec![("history",vec![
                TransactionRecord::new(
                    collection_history
                    ,TransactionOperation::New{
                        activity:Activity::Active
                        ,term_begin:UpdateTerm::Inherit
                        ,term_end:UpdateTerm::Inherit
                        ,fields:vec![
                            ("date","2000-12-12".as_bytes().to_vec())
                            ,("event","Birth".as_bytes().to_vec())
                        ]
                        ,parents:UpdateParent::Overwrite(vec![])
                        ,childs:vec![]
                    }

                )
            ])]
        }
    )
    ,TransactionRecord::new(
        collection_person
        ,TransactionOperation::New{
            activity:Activity::Active
            ,term_begin:UpdateTerm::Inherit
            ,term_end:UpdateTerm::Inherit
            ,fields:vec![
                ("name","Billy".as_bytes().to_vec())
                ,("birthday","1982-03-03".as_bytes().to_vec())
            ]
            ,parents:UpdateParent::Overwrite(vec![])
            ,childs:vec![]
        }
    )
]);
sess.public();

}

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.childs("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") );

        }
    }
}

} let test1=database.collection_id("test1").unwrap();

let mut t=database.begintransaction(); let range=1..=10; for i in range.clone(){ t.update(&mut vec![ TransactionRecord::new( test1 ,TransactionOperation::New{ activity:Activity::Active ,termbegin:UpdateTerm::Inherit ,termend:UpdateTerm::Inherit ,fields:vec![ ("num",i.tostring().intobytes()) ,("numby3",(i*3).tostring().intobytes()) ] ,parents:UpdateParent::Overwrite(vec![]) ,childs:vec![] }

    )
]);

} t.update(&mut vec![ TransactionRecord::new( test1 ,TransactionOperation::Update{ row:3 ,activity:Activity::Inactive ,termbegin:UpdateTerm::Inherit ,termend:UpdateTerm::Inherit ,fields:vec![] ,parents:UpdateParent::Overwrite(vec![]) ,childs:vec![] }

)

]); t.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);

} ```