Improve the example

This commit is contained in:
Hassan Abedi 2026-06-03 12:30:41 +02:00
parent cb07245bd9
commit a8041d32c9
2 changed files with 42 additions and 23 deletions

View File

@ -34,9 +34,12 @@ It uses all three operators:
- and `natural_join` to attach each book's price.
```prolog
% Datalog rule/query
Q(name, book, dollars) :- author(name, book), bestseller(book), price(book, dollars).
```
The code below implements the rule (also available [here](tests/hand_plan.rs)):
```rust
use query_ops::atom::{AtomPattern, Term, scan_atom};
use query_ops::join::{natural_join, semijoin};
@ -54,20 +57,26 @@ fn main() {
let author = Table::from_rows(
2,
vec![
vec![s("Alice"), s("Foo")],
vec![s("Bob"), s("Bar")],
vec![s("Alice"), s("Baz")],
vec![s("Carol"), s("Qux")],
vec![s("Ursula K. Le Guin"), s("A Wizard of Earthsea")],
vec![s("Toni Morrison"), s("Beloved")],
vec![s("Ursula K. Le Guin"), s("The Left Hand of Darkness")],
vec![s("Terry Pratchett"), s("Mort")],
],
);
let bestseller = Table::from_rows(
1,
vec![
vec![s("A Wizard of Earthsea")],
vec![s("The Left Hand of Darkness")],
],
);
let bestseller = Table::from_rows(1, vec![vec![s("Foo")], vec![s("Baz")]]);
let price = Table::from_rows(
2,
vec![
vec![s("Foo"), i(25)],
vec![s("Bar"), i(15)],
vec![s("Baz"), i(30)],
vec![s("Qux"), i(20)],
vec![s("A Wizard of Earthsea"), i(14)],
vec![s("Beloved"), i(17)],
vec![s("The Left Hand of Darkness"), i(15)],
vec![s("Mort"), i(12)],
],
);
@ -100,14 +109,14 @@ fn main() {
assert_eq!(
result.rows,
vec![
vec![s("Alice"), s("Foo"), i(25)],
vec![s("Alice"), s("Baz"), i(30)],
vec![s("Ursula K. Le Guin"), s("A Wizard of Earthsea"), i(14)],
vec![s("Ursula K. Le Guin"), s("The Left Hand of Darkness"), i(15)],
],
);
}
```
How it works:
How it works (logically):
<div align="center">
<picture>

View File

@ -31,20 +31,26 @@ fn authors_of_bestsellers_with_price() {
let author = Table::from_rows(
2,
vec![
vec![s("Alice"), s("Foo")],
vec![s("Bob"), s("Bar")],
vec![s("Alice"), s("Baz")],
vec![s("Carol"), s("Qux")],
vec![s("Ursula K. Le Guin"), s("A Wizard of Earthsea")],
vec![s("Toni Morrison"), s("Beloved")],
vec![s("Ursula K. Le Guin"), s("The Left Hand of Darkness")],
vec![s("Terry Pratchett"), s("Mort")],
],
);
let bestseller = Table::from_rows(
1,
vec![
vec![s("A Wizard of Earthsea")],
vec![s("The Left Hand of Darkness")],
],
);
let bestseller = Table::from_rows(1, vec![vec![s("Foo")], vec![s("Baz")]]);
let price = Table::from_rows(
2,
vec![
vec![s("Foo"), i(25)],
vec![s("Bar"), i(15)],
vec![s("Baz"), i(30)],
vec![s("Qux"), i(20)],
vec![s("A Wizard of Earthsea"), i(14)],
vec![s("Beloved"), i(17)],
vec![s("The Left Hand of Darkness"), i(15)],
vec![s("Mort"), i(12)],
],
);
@ -84,8 +90,12 @@ fn authors_of_bestsellers_with_price() {
assert_eq!(
result.rows,
vec![
vec![s("Alice"), s("Foo"), i(25)],
vec![s("Alice"), s("Baz"), i(30)],
vec![s("Ursula K. Le Guin"), s("A Wizard of Earthsea"), i(14)],
vec![
s("Ursula K. Le Guin"),
s("The Left Hand of Darkness"),
i(15)
],
],
);
}