mirror of
https://github.com/MarginaliaSearch/MarginaliaSearch.git
synced 2025-02-24 05:18:58 +00:00
Refactoring BTreeReader and binary search code
This commit is contained in:
parent
8139ab0d1d
commit
1068694db6
@ -5,6 +5,8 @@ import nu.marginalia.util.btree.model.BTreeHeader;
|
|||||||
import nu.marginalia.util.multimap.MultimapFileLong;
|
import nu.marginalia.util.multimap.MultimapFileLong;
|
||||||
import nu.marginalia.util.multimap.MultimapSearcher;
|
import nu.marginalia.util.multimap.MultimapSearcher;
|
||||||
|
|
||||||
|
import javax.annotation.CheckReturnValue;
|
||||||
|
|
||||||
import static java.lang.Math.min;
|
import static java.lang.Math.min;
|
||||||
|
|
||||||
public class BTreeReader {
|
public class BTreeReader {
|
||||||
@ -37,19 +39,22 @@ public class BTreeReader {
|
|||||||
final long key = keyRaw & ctx.equalityMask();
|
final long key = keyRaw & ctx.equalityMask();
|
||||||
final long dataAddress = header.dataOffsetLongs();
|
final long dataAddress = header.dataOffsetLongs();
|
||||||
|
|
||||||
if (header.layers() == 0) { // For small data, we only have a data block
|
final long searchStart;
|
||||||
return dataSearcher.binarySearch(key, dataAddress, header.numEntries());
|
final long numEntries;
|
||||||
}
|
|
||||||
|
|
||||||
// Search index layers
|
if (header.layers() == 0) { // For small data, there is no index block, only a flat data block
|
||||||
|
searchStart = dataAddress;
|
||||||
|
numEntries = header.numEntries();
|
||||||
|
}
|
||||||
|
else {
|
||||||
long dataLayerOffset = searchIndex(header, key);
|
long dataLayerOffset = searchIndex(header, key);
|
||||||
if (dataLayerOffset < 0) {
|
if (dataLayerOffset < 0) {
|
||||||
return dataLayerOffset;
|
return dataLayerOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Search the corresponding data block
|
searchStart = dataAddress + dataLayerOffset * ctx.entrySize();
|
||||||
final long searchStart = dataAddress + dataLayerOffset * ctx.entrySize();
|
numEntries = min(header.numEntries() - dataLayerOffset, blockSize);
|
||||||
final long numEntries = min(header.numEntries() - dataLayerOffset, blockSize);
|
}
|
||||||
|
|
||||||
return dataSearcher.binarySearch(key, searchStart, numEntries);
|
return dataSearcher.binarySearch(key, searchStart, numEntries);
|
||||||
}
|
}
|
||||||
@ -61,14 +66,15 @@ public class BTreeReader {
|
|||||||
long layerOffset = 0;
|
long layerOffset = 0;
|
||||||
|
|
||||||
for (int i = header.layers() - 1; i >= 0; --i) {
|
for (int i = header.layers() - 1; i >= 0; --i) {
|
||||||
final long layerBlockOffset = header.relativeIndexLayerOffset(ctx, i) + layerOffset;
|
final long indexLayerBlockOffset = header.relativeIndexLayerOffset(ctx, i) + layerOffset;
|
||||||
|
|
||||||
final long nextLayerOffset = indexSearch(key, indexAddress + layerBlockOffset, blockSize);
|
final long nextLayerOffset = indexSearch(key, indexAddress + indexLayerBlockOffset, blockSize);
|
||||||
if (nextLayerOffset < 0)
|
if (nextLayerOffset < 0)
|
||||||
return -1;
|
return nextLayerOffset;
|
||||||
|
|
||||||
layerOffset = blockSize *(nextLayerOffset + layerOffset);
|
layerOffset = blockSize * (nextLayerOffset + layerOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
return layerOffset;
|
return layerOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user