Hash join: Difference between revisions

Content added Content deleted
No edit summary
Line 440: Line 440:
{28 Alan} {Alan Zombies}
{28 Alan} {Alan Zombies}
{28 Glory} {Glory Buffy}
{28 Glory} {Glory Buffy}
</pre>

=={{header|Groovy}}==

<lang Groovy>
def hashJoin(s, r) {

def hashed = s.groupBy { sItem -> sItem.name }

def q = [] as Set

r.each { rItem ->
def join = hashed[rItem.name]
join.each { sItem ->
q << sItem.plus(rItem)
}
}

q
}
</lang>

Sample run:
<pre>
def s = [[age: 27, name: 'Jonah'],
[age: 18, name: 'Alan'],
[age: 28, name: 'Glory'],
[age: 18, name: 'Popeye'],
[age: 28, name: 'Alan']]

def r = [[name: 'Jonah', nemesis: 'Whales'],
[name: 'Jonah', nemesis: 'Spiders'],
[name: 'Alan', nemesis: 'Ghosts'],
[name: 'Alan', nemesis: 'Zombies'],
[name: 'Glory', nemesis: 'Buffy']]

hashJoin(s, r).sort {it.name}.each { println it }
</pre>

produces:

<pre>
[age:18, name:Alan, nemesis:Ghosts]
[age:28, name:Alan, nemesis:Ghosts]
[age:18, name:Alan, nemesis:Zombies]
[age:28, name:Alan, nemesis:Zombies]
[age:28, name:Glory, nemesis:Buffy]
[age:27, name:Jonah, nemesis:Whales]
[age:27, name:Jonah, nemesis:Spiders]
</pre>
</pre>