mirror of
https://github.com/hoytech/strfry.git
synced 2025-06-18 17:27:11 +00:00
wip
This commit is contained in:
10
src/xor.h
10
src/xor.h
@ -58,9 +58,7 @@ struct XorView {
|
|||||||
|
|
||||||
void finalise() {
|
void finalise() {
|
||||||
std::reverse(elems.begin(), elems.end()); // typically pushed in approximately descending order so this may speed up the sort
|
std::reverse(elems.begin(), elems.end()); // typically pushed in approximately descending order so this may speed up the sort
|
||||||
|
|
||||||
std::sort(elems.begin(), elems.end());
|
std::sort(elems.begin(), elems.end());
|
||||||
|
|
||||||
ready = true;
|
ready = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,11 +75,12 @@ struct XorView {
|
|||||||
if (!ready) throw herr("xor view not ready");
|
if (!ready) throw herr("xor view not ready");
|
||||||
|
|
||||||
std::string output;
|
std::string output;
|
||||||
|
auto prevUpper = elems.begin();
|
||||||
|
|
||||||
while (query.size()) {
|
while (query.size()) {
|
||||||
uint64_t lowerTimestamp = decodeVarInt(query);
|
uint64_t lowerTimestamp = decodeVarInt(query);
|
||||||
uint64_t lowerLength = decodeVarInt(query);
|
uint64_t lowerLength = decodeVarInt(query);
|
||||||
if (lowerLength > idSize) throw herr("lower too long: ", lowerLength);
|
if (lowerLength > idSize) throw herr("lower too long");
|
||||||
auto lowerKeyRaw = getBytes(query, lowerLength);
|
auto lowerKeyRaw = getBytes(query, lowerLength);
|
||||||
XorElem lowerKey(lowerTimestamp, lowerKeyRaw);
|
XorElem lowerKey(lowerTimestamp, lowerKeyRaw);
|
||||||
|
|
||||||
@ -91,8 +90,9 @@ struct XorView {
|
|||||||
auto upperKeyRaw = getBytes(query, upperLength);
|
auto upperKeyRaw = getBytes(query, upperLength);
|
||||||
XorElem upperKey(upperTimestamp, upperKeyRaw);
|
XorElem upperKey(upperTimestamp, upperKeyRaw);
|
||||||
|
|
||||||
auto lower = std::lower_bound(elems.begin(), elems.end(), lowerKey); // FIXME: start at prev upper?
|
auto lower = std::lower_bound(prevUpper, elems.end(), lowerKey);
|
||||||
auto upper = std::upper_bound(elems.begin(), elems.end(), upperKey); // FIXME: start at lower?
|
auto upper = std::upper_bound(lower, elems.end(), upperKey);
|
||||||
|
prevUpper = upper;
|
||||||
|
|
||||||
uint64_t mode = decodeVarInt(query); // 0 = range, 8 and above = n-8 inline IDs
|
uint64_t mode = decodeVarInt(query); // 0 = range, 8 and above = n-8 inline IDs
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user