WIP on spatial indexes
parent
c1d0ec0139
commit
32a996285b
|
@ -0,0 +1,77 @@
|
||||||
|
package org.mimirdb.pip.lib
|
||||||
|
|
||||||
|
class KDTree[I: Ordered, V](dimensions: Int)
|
||||||
|
{
|
||||||
|
type Key = Array[I]
|
||||||
|
var root: Option[Node] = None
|
||||||
|
|
||||||
|
def insert(position: Key, value: V): Unit =
|
||||||
|
{
|
||||||
|
assert(position.size == dimensions)
|
||||||
|
root = root match {
|
||||||
|
case Some(node) => node.insert(position, value)
|
||||||
|
case None => Leaf(position, value, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sealed trait Node
|
||||||
|
{
|
||||||
|
def insert(position: Key, value: V): Node
|
||||||
|
}
|
||||||
|
|
||||||
|
class Inner(
|
||||||
|
split: I,
|
||||||
|
idx: Int,
|
||||||
|
var left: Option[Node] = None,
|
||||||
|
var right: Option[Node] = None
|
||||||
|
)
|
||||||
|
{
|
||||||
|
|
||||||
|
def insert(position: Key, value: V): Node =
|
||||||
|
{
|
||||||
|
if(position(idx).compare(split) >= 0){
|
||||||
|
// position(idx) >= split
|
||||||
|
if(right.isEmpty){
|
||||||
|
right = Some(Leaf(position, value, idx+1 % dimensions))
|
||||||
|
} else {
|
||||||
|
right = Some(right.get.insert(position, value))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// position(idx) < split
|
||||||
|
if(left.isEmpty){
|
||||||
|
left = Some(Leaf(position, value, idx+1 % dimensions))
|
||||||
|
} else {
|
||||||
|
left = Some(left.get.insert(position, value))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Leaf(position: Key, value: V, idx: Int)
|
||||||
|
{
|
||||||
|
def insert(otherPosition: Key, otherValue: V): Node =
|
||||||
|
{
|
||||||
|
if(position(idx).compare(otherPosition(idx)) >= 0){
|
||||||
|
Inner(
|
||||||
|
split = position(idx),
|
||||||
|
idx = idx,
|
||||||
|
left = Some(Leaf(otherPosition, otherValue, idx+1 % dimensions)),
|
||||||
|
right = Some(copy(idx = idx+1 % dimensions)),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
Inner(
|
||||||
|
split = otherPosition(idx),
|
||||||
|
idx = idx,
|
||||||
|
left = Some(copy(idx = idx+1 % dimensions)),
|
||||||
|
right = Some(Leaf(otherPosition, otherValue, idx+1 % dimensions)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue