Hash join: Difference between revisions
Content added Content deleted
Line 219: | Line 219: | ||
Age: 28, Name: Alan, Nemesis: Ghosts |
Age: 28, Name: Alan, Nemesis: Ghosts |
||
Age: 28, Name: Alan, Nemesis: Zombies |
Age: 28, Name: Alan, Nemesis: Zombies |
||
</pre> |
|||
=={{header|Clojure}}== |
|||
<lang clojure> |
|||
(defn hash-join [table1 col1 table2 col2] |
|||
(let [hashed (group-by col1 table1)] |
|||
(flatten |
|||
(for [r table2] |
|||
(for [s (hashed (col2 r))] |
|||
(merge s r)))))) |
|||
</lang> |
|||
Sample run: |
|||
<lang clojure> |
|||
(def s '({:age 27 :name "Jonah"} |
|||
{:age 18 :name "Alan"} |
|||
{:age 28 :name "Glory"} |
|||
{:age 18 :name "Popeye"} |
|||
{:age 28 :name "Alan"})) |
|||
(def r '({:nemesis "Whales" :name "Jonah"} |
|||
{:nemesis "Spiders" :name "Jonah"} |
|||
{:nemesis "Ghosts" :name "Alan"} |
|||
{:nemesis "Zombies" :name "Alan"} |
|||
{:nemesis "Buffy" :name "Glory"})) |
|||
(pprint (sort-by :name (hash-join s :name r :name))) |
|||
</lang> |
|||
Produces: |
|||
<pre> |
|||
({:nemesis "Ghosts", :age 18, :name "Alan"} |
|||
{:nemesis "Ghosts", :age 28, :name "Alan"} |
|||
{:nemesis "Zombies", :age 18, :name "Alan"} |
|||
{:nemesis "Zombies", :age 28, :name "Alan"} |
|||
{:nemesis "Buffy", :age 28, :name "Glory"} |
|||
{:nemesis "Whales", :age 27, :name "Jonah"} |
|||
{:nemesis "Spiders", :age 27, :name "Jonah"}) |
|||
</pre> |
</pre> |
||