BTreeDB.hasKey
This commit is contained in:
parent
0f91102e6b
commit
a0c63d3aaf
@ -2,7 +2,7 @@ kotlin.code.style=official
|
|||||||
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m
|
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m
|
||||||
|
|
||||||
kotlinVersion=1.9.0
|
kotlinVersion=1.9.0
|
||||||
kommonsVersion=2.3.1
|
kommonsVersion=2.3.2
|
||||||
|
|
||||||
ffiVersion=2.2.13
|
ffiVersion=2.2.13
|
||||||
lwjglVersion=3.3.0
|
lwjglVersion=3.3.0
|
||||||
|
@ -33,7 +33,9 @@ fun main() {
|
|||||||
val db = BTreeDB6(File("testdb.bdb"), Starbound.BTREEDB_IO_POOL)
|
val db = BTreeDB6(File("testdb.bdb"), Starbound.BTREEDB_IO_POOL)
|
||||||
//val db = BTreeDB(File("world.world"))
|
//val db = BTreeDB(File("world.world"))
|
||||||
|
|
||||||
|
val t = System.nanoTime()
|
||||||
val meta = DataInputStream(BufferedInputStream(InflaterInputStream(ByteArrayInputStream(db.read(ByteKey(0, 0, 0, 0, 0)).get().get()), Inflater())))
|
val meta = DataInputStream(BufferedInputStream(InflaterInputStream(ByteArrayInputStream(db.read(ByteKey(0, 0, 0, 0, 0)).get().get()), Inflater())))
|
||||||
|
println(System.nanoTime() - t)
|
||||||
|
|
||||||
println(meta.readInt())
|
println(meta.readInt())
|
||||||
println(meta.readInt())
|
println(meta.readInt())
|
||||||
|
@ -162,6 +162,74 @@ class BTreeDB5(override val file: File) : ByteDataBTreeDB<ByteKey>() {
|
|||||||
}, carrier)
|
}, carrier)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun doHasKey(key: ByteKey): Boolean {
|
||||||
|
seekBlock(rootNodeIndex)
|
||||||
|
var blockStream = BlockInputStream()
|
||||||
|
|
||||||
|
while (blockStream.type != TreeBlockType.LEAF) {
|
||||||
|
if (blockStream.type == TreeBlockType.FREE) {
|
||||||
|
throw IllegalStateException("Hit free block while scanning index for $key")
|
||||||
|
}
|
||||||
|
|
||||||
|
blockStream.skip(1)
|
||||||
|
val keyCount = blockStream.data.readInt()
|
||||||
|
|
||||||
|
var found = false
|
||||||
|
|
||||||
|
// B a
|
||||||
|
// B b
|
||||||
|
// B c
|
||||||
|
// B d
|
||||||
|
for (keyIndex in 0 until keyCount) {
|
||||||
|
// указатель на левый блок
|
||||||
|
val pointer = blockStream.data.readInt()
|
||||||
|
|
||||||
|
// левый ключ, всё что меньше него находится в левом блоке
|
||||||
|
val seekKey = blockStream.data.readByteKeyRaw(keySize)
|
||||||
|
|
||||||
|
// нужный ключ меньше самого первого ключа, поэтому он находится где то в левом блоке
|
||||||
|
if (key < seekKey) {
|
||||||
|
seekBlock(pointer)
|
||||||
|
blockStream = BlockInputStream()
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found) {
|
||||||
|
// ... B
|
||||||
|
seekBlock(blockStream.data.readInt())
|
||||||
|
blockStream = BlockInputStream()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// мы пришли в лепесток, теперь прямолинейно ищем в linked list
|
||||||
|
val keyCount = blockStream.data.readInt()
|
||||||
|
|
||||||
|
for (keyIndex in 0 until keyCount) {
|
||||||
|
// читаем ключ
|
||||||
|
val seekKey = blockStream.data.readByteKeyRaw(keySize)
|
||||||
|
|
||||||
|
// читаем размер данных
|
||||||
|
val dataLength = blockStream.data.readVarInt()
|
||||||
|
|
||||||
|
// это наш блок
|
||||||
|
if (seekKey == key) {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
blockStream.data.skipBytes(dataLength)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hasKey(key: ByteKey): CompletableFuture<Boolean> {
|
||||||
|
return CompletableFuture.supplyAsync(Supplier {
|
||||||
|
doHasKey(key)
|
||||||
|
}, carrier)
|
||||||
|
}
|
||||||
|
|
||||||
private fun doRead(key: ByteKey): KOptional<ByteArray> {
|
private fun doRead(key: ByteKey): KOptional<ByteArray> {
|
||||||
seekBlock(rootNodeIndex)
|
seekBlock(rootNodeIndex)
|
||||||
var blockStream = BlockInputStream()
|
var blockStream = BlockInputStream()
|
||||||
|
Loading…
Reference in New Issue
Block a user