Use longestCommonPrefixPartialKey in insert

This commit is contained in:
2024-02-22 14:46:52 -08:00
parent 608b4fb6c7
commit 505c060a28

View File

@@ -1389,28 +1389,26 @@ bool checkRangeRead(Node *n, std::span<const uint8_t> begin,
for (;;) { for (;;) {
auto &self = *self_; auto &self = *self_;
// Handle an existing partial key // Handle an existing partial key
int partialKeyIndex = 0; int commonLen = std::min<int>(self->partialKeyLen, key.size());
for (; partialKeyIndex < self->partialKeyLen; ++partialKeyIndex) { int partialKeyIndex =
if (partialKeyIndex == int(key.size()) || longestCommonPrefixPartialKey(self->partialKey, key.data(), commonLen);
self->partialKey[partialKeyIndex] != key[partialKeyIndex]) { if (partialKeyIndex < self->partialKeyLen) {
auto *old = self; auto *old = self;
self = allocators->node4.allocate(); self = allocators->node4.allocate();
self->maxVersion = old->maxVersion; self->maxVersion = old->maxVersion;
self->partialKeyLen = partialKeyIndex; self->partialKeyLen = partialKeyIndex;
self->parent = old->parent; self->parent = old->parent;
self->parentsIndex = old->parentsIndex; self->parentsIndex = old->parentsIndex;
memcpy(self->partialKey, old->partialKey, partialKeyIndex); memcpy(self->partialKey, old->partialKey, partialKeyIndex);
getOrCreateChild(self, old->partialKey[partialKeyIndex], allocators) = getOrCreateChild(self, old->partialKey[partialKeyIndex], allocators) =
old; old;
old->parent = self; old->parent = self;
old->parentsIndex = old->partialKey[partialKeyIndex]; old->parentsIndex = old->partialKey[partialKeyIndex];
memmove(old->partialKey, old->partialKey + partialKeyIndex + 1, memmove(old->partialKey, old->partialKey + partialKeyIndex + 1,
old->partialKeyLen - (partialKeyIndex + 1)); old->partialKeyLen - (partialKeyIndex + 1));
old->partialKeyLen -= partialKeyIndex + 1; old->partialKeyLen -= partialKeyIndex + 1;
break;
}
} }
key = key.subspan(partialKeyIndex, key.size() - partialKeyIndex); key = key.subspan(partialKeyIndex, key.size() - partialKeyIndex);