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

View File

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