Resume firstGeq search from within tree

This commit is contained in:
2024-02-13 12:08:13 -08:00
parent 3aa081a9ce
commit 961fb18066

View File

@@ -628,9 +628,6 @@ struct FirstGeqStepwise {
}
}
}
[[fallthrough]];
case Init:
phase = Search;
if (n->partialKeyLen > 0) {
int commonLen = std::min<int>(n->partialKeyLen, remaining.size());
for (int i = 0; i < commonLen; ++i) {
@@ -655,6 +652,9 @@ struct FirstGeqStepwise {
return downLeftSpine();
}
}
[[fallthrough]];
case Init:
phase = Search;
if (remaining.size() == 0 && n->entryPresent) {
cmp = 0;
return true;
@@ -954,7 +954,16 @@ bool checkRangeRead(Node *n, const std::span<const uint8_t> begin,
begin.subspan(0, lcp - search.remaining.size()) ==
0);
auto left = firstGeq(n, begin);
// Check that we can start FirstGeq where Search left off
int consumed = lcp - search.remaining.size();
assert(consumed >= 0);
auto left =
firstGeq(search.n, begin.subspan(consumed, int(begin.size()) - consumed));
#ifndef NDEBUG
auto iter = firstGeq(n, begin);
assert(left.cmp == iter.cmp);
assert(left.n == iter.n);
#endif
#if DEBUG_VERBOSE && !defined(NDEBUG)
fprintf(stderr, "firstGeq for `%s' got `%s'\n", printable(begin).c_str(),