https://github.com/simmsb/bad-datalog
Some sort of datalog database
https://github.com/simmsb/bad-datalog
Last synced: about 1 year ago
JSON representation
Some sort of datalog database
- Host: GitHub
- URL: https://github.com/simmsb/bad-datalog
- Owner: simmsb
- License: other
- Created: 2021-06-21T04:28:55.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2024-06-05T11:43:19.000Z (about 2 years ago)
- Last Synced: 2024-06-05T13:24:09.717Z (about 2 years ago)
- Language: Rust
- Homepage:
- Size: 27.3 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Simple datalog database and query planner
Something I've been messing around with: Trying to implement a datalog database
with a query api similar to datomic.
The datalog implementation is pretty much the same as
[datafrog](https://github.com/rust-lang/datafrog)'s implementation, but with
support for file-backed databases.
## Example
```rust
use dlog::{Database, QueryBuilder, RHS, object};
use tempfile::tempdir;
let tmp = tempdir().unwrap();
let sled_db = sled::open(tmp.path()).unwrap();
let mut db = Database::from_sled(sled_db.clone());
let book_foo = db.add_object(&object!(
book_name: "foo",
book_price: 100,
));
let book_bar = db.add_object(&object!(
book_name: "bar",
book_price: 101,
));
let _book_baz = db.add_object(&object!(
book_name: "baz",
book_price: 102,
));
let book_blah = db.add_object(&object!(
book_name: "blah",
book_price: 103,
));
db.add_object(&object!(
review_book: book_foo,
review_user: "reviewer_0",
review_score: 10,
));
db.add_object(&object!(
review_book: book_foo,
review_user: "reviewer_1",
review_score: 100,
));
db.add_object(&object!(
review_book: book_bar,
review_user: "reviewer_0",
review_score: 102,
));
db.add_object(&object!(
review_book: book_blah,
review_user: "reviewer_1",
review_score: 99,
));
let mut builder = QueryBuilder::default();
let b = builder.binding();
let p = builder.binding();
let t = builder.binding();
let r = builder.binding();
let s = builder.binding();
builder
.pattern(r, "review_book", RHS::Bnd(b))
.pattern(r, "review_user", RHS::Str("reviewer_0"))
.pattern(r, "review_score", RHS::Bnd(s))
.pattern(b, "book_name", RHS::Bnd(t))
.pattern(b, "book_price", RHS::Bnd(p))
.filter(p, |p_v| p_v.i().unwrap() > 100)
;
let plan = builder.plan();
for row in results {
println!(
"b: {}, p: {}, t: {}, r: {}, s: {}",
row.fetch(b),
row.fetch(p),
row.fetch(t),
row.fetch(r),
row.fetch(s),
)
}
// b: 1, p: 101, t: bar, r: 6, s: 102
```