Improve the example
This commit is contained in:
parent
cb07245bd9
commit
a8041d32c9
@ -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>
|
||||
|
||||
@ -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)
|
||||
],
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user