Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
23
Task/Hash-join/Lua/hash-join-1.lua
Normal file
23
Task/Hash-join/Lua/hash-join-1.lua
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
local function recA(age, name) return { Age=age, Name=name } end
|
||||
local tabA = { recA(27,"Jonah"), recA(18,"Alan"), recA(28,"Glory"), recA(18,"Popeye"), recA(28,"Alan") }
|
||||
|
||||
local function recB(character, nemesis) return { Character=character, Nemesis=nemesis } end
|
||||
local tabB = { recB("Jonah","Whales"), recB("Jonah","Spiders"), recB("Alan","Ghosts"), recB("Alan","Zombies"), recB("Glory","Buffy") }
|
||||
|
||||
local function hashjoin(taba, cola, tabb, colb)
|
||||
local hash, join = {}, {}
|
||||
for _,rowa in pairs(taba) do
|
||||
if (not hash[rowa[cola]]) then hash[rowa[cola]] = {} end
|
||||
table.insert(hash[rowa[cola]], rowa)
|
||||
end
|
||||
for _,rowb in pairs(tabb) do
|
||||
for _,rowa in pairs(hash[rowb[colb]]) do
|
||||
join[#join+1] = { A=rowa, B=rowb }
|
||||
end
|
||||
end
|
||||
return join
|
||||
end
|
||||
|
||||
for _,row in pairs(hashjoin(tabA, "Name", tabB, "Character")) do
|
||||
print(row.A.Age, row.A.Name, row.B.Character, row.B.Nemesis)
|
||||
end
|
||||
46
Task/Hash-join/Lua/hash-join-2.lua
Normal file
46
Task/Hash-join/Lua/hash-join-2.lua
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
local hashlist = {
|
||||
new = function(self,key)
|
||||
return setmetatable({key=key, hash={}, list={}}, {__index=self})
|
||||
end,
|
||||
insert = function(self,row)
|
||||
self.list[#self.list+1] = row
|
||||
if not self.hash[row[self.key]] then self.hash[row[self.key]]={} end
|
||||
table.insert(self.hash[row[self.key]], row)
|
||||
return self
|
||||
end,
|
||||
join = function(self,tabb)
|
||||
local result = {}
|
||||
for _,rowb in pairs(tabb.list) do
|
||||
if (self.hash[rowb[tabb.key]]) then
|
||||
for _,rowa in pairs(self.hash[rowb[tabb.key]]) do
|
||||
result[#result+1] = { A=rowa, B=rowb }
|
||||
end
|
||||
end
|
||||
end
|
||||
return result
|
||||
end
|
||||
}
|
||||
|
||||
local function recA(age, name) return { Age=age, Name=name } end
|
||||
tabA = hashlist:new("Name")
|
||||
:insert(recA(27,"Jonah"))
|
||||
:insert(recA(18,"Alan"))
|
||||
:insert(recA(28,"Glory"))
|
||||
:insert(recA(18,"Popeye"))
|
||||
:insert(recA(28,"Alan"))
|
||||
|
||||
local function recB(character, nemesis) return { Character=character, Nemesis=nemesis } end
|
||||
local tabB = hashlist:new("Character")
|
||||
:insert(recB("Jonah","Whales"))
|
||||
:insert(recB("Jonah","Spiders"))
|
||||
:insert(recB("Alan","Ghosts"))
|
||||
:insert(recB("Alan","Zombies"))
|
||||
:insert(recB("Glory","Buffy"))
|
||||
|
||||
for _,row in pairs(tabA:join(tabB)) do
|
||||
print(row.A.Age, row.A.Name, row.B.Character, row.B.Nemesis)
|
||||
end
|
||||
print("or vice versa:")
|
||||
for _,row in pairs(tabB:join(tabA)) do
|
||||
print(row.B.Age, row.B.Name, row.A.Character, row.A.Nemesis)
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue