79 lines
2.9 KiB
Plaintext
79 lines
2.9 KiB
Plaintext
Module HashJoin {
|
|
\\ normally we define variables when we put values to names
|
|
\\ so we can remove these two lines
|
|
Def Name$, Nemesis$
|
|
Def Long m, mc, items_size, A
|
|
|
|
\\ Lets make a container which use keys with hash function
|
|
Inventory A
|
|
\\ A now is a pointer to an Inventory, with Len(A)=0
|
|
\\ Print Type$(A)="Inventory"
|
|
|
|
\\ empty stack. We use current stack to place data
|
|
Flush
|
|
\Input B
|
|
data "Jonah", "Whales"
|
|
data "Jonah", "Spiders"
|
|
data "Alan", "Ghosts"
|
|
data "Alan", "Zombies"
|
|
data "Glory", "Buffy"
|
|
\\ Keys are unique, This is the HASH PHASE
|
|
While not empty {
|
|
Read Name$, Nemesis$
|
|
If Exist(A, Name$) Then {
|
|
m=Eval(A) ' get a pointer to array
|
|
Stack m {Data Nemesis$}
|
|
} Else Append A, Name$:=Stack:=Nemesis$ ' a stack object with one item
|
|
}
|
|
\\ Input A, this is the Long Table
|
|
data 27, "Jonah"
|
|
data 18, "Alan"
|
|
data 28, "Glory"
|
|
data 18, "Popeye"
|
|
data 28, "Alan"
|
|
|
|
\\ This is the JOIN PHASE
|
|
|
|
items_size=stack.size/2
|
|
\\ using items_size we can append data (using data) to stack
|
|
\\ $(0) is the default handler for columns.
|
|
\\ Letters justify to left, numbers to right.
|
|
\\ Letters can use more columns, and maybe wrap to more lines.
|
|
|
|
Print $(0), "Output during join"
|
|
Print "A.Age", "A.Name","B.Character", "B.Nemesis"
|
|
While items_size>0 {
|
|
Read Age, Name$
|
|
If exist(A, Name$) Then {
|
|
m=Eval(A) ' extract a pointer, this is for a stack object
|
|
mc=Each(m) ' make an iterator
|
|
While mc {
|
|
\\ we use $(1) for left justify numbers too
|
|
\\ normal StackItem$(stackobject) return top only
|
|
\\ we have to use StackItem$(stackobject, 3) to get 3rd
|
|
\\ or StackItem(stackobject, 3) if it is numeric.
|
|
\\ but here mc is iterator, and place the cursor value to it
|
|
Print $(1), Age, Name$,Name$, StackItem$(mc)
|
|
\\ so now we place at the end of current stack the same output
|
|
Data Age, Name$,Name$, StackItem$(mc)
|
|
}
|
|
}
|
|
items_size--
|
|
}
|
|
\\ split rem line after : to use second way
|
|
rem : goto secondway
|
|
Print $(0), "Output after join"
|
|
Print "A.Age", "A.Name","B.Character", "B.Nemesis"
|
|
While not Empty {
|
|
Print $(1), Number, Letter$, Letter$, Letter$
|
|
}
|
|
Exit
|
|
secondway:
|
|
Print $(0), "Output after join using format$()"
|
|
Print Format$("{0:5} {1:10} {2:10} {3:20}","A.Age", "A.Name","B.Character", "B.Nemesis")
|
|
While not Empty {
|
|
Print format$("{0::5} {1:10} {2:10} {3:20}", Number, Letter$, Letter$, Letter$)
|
|
}
|
|
}
|
|
HashJoin
|