RosettaCodeData/Task/Hash-join/Bracmat/hash-join.bracmat

58 lines
1.2 KiB
Plaintext

( (27.Jonah)
(18.Alan)
(28.Glory)
(18.Popeye)
(28.Alan)
: ?table-A
& (Jonah.Whales)
(Jonah.Spiders)
(Alan.Ghosts)
(Alan.Zombies)
(Glory.Buffy)
: ?table-B
& new$hash:?H
& !table-A:? [?lenA
& !table-B:? [?lenB
& ( join
= smalltab bigtab smallschema bigschema joinschema
, key val val2 keyval2
. !arg
: (?smalltab.?bigtab.(=?smallschema.?bigschema.?joinschema))
& :?rel
& !(
' ( whl
' ( !smalltab:$smallschema ?smalltab
& (H..insert)$(!key.!val)
)
& whl
' ( !bigtab:$bigschema ?bigtab
& ( (H..find)$!key:?keyval2
& whl
' ( !keyval2:(?key.?val2) ?keyval2
& $joinschema !rel:?rel
)
|
)
)
)
)
& !rel
)
& out
$ ( join
$ ( !lenA:~<!lenB
& ( !table-B
. !table-A
. (
= (?key.?val).(?val.?key).!val.!key.!val2
)
)
| ( !table-A
. !table-B
. (=(?val.?key).(?key.?val).!val2.!key.!val)
)
)
)
&
);