Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
78
Task/Hash-join/M2000-Interpreter/hash-join.m2000
Normal file
78
Task/Hash-join/M2000-Interpreter/hash-join.m2000
Normal file
|
|
@ -0,0 +1,78 @@
|
|||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue