diff --git a/crates/query-ops/README.md b/crates/query-ops/README.md index edcd325..583cc52 100644 --- a/crates/query-ops/README.md +++ b/crates/query-ops/README.md @@ -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):