Logically revert 0071600
Return mutation intersecting query key if it exists
This commit is contained in:
40
Facade.h
40
Facade.h
@@ -35,6 +35,14 @@ struct Facade {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Make sure versionedIter[1] param1 is >= `end`
|
||||||
|
if (versionedIter[1] != facade->versioned.end(version)) {
|
||||||
|
auto m = *versionedIter[1];
|
||||||
|
if (String(m.param1, m.param1Len) < end) {
|
||||||
|
++versionedIter[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static const uint8_t zero_[] = {0};
|
static const uint8_t zero_[] = {0};
|
||||||
static const String zero{zero_, 1};
|
static const String zero{zero_, 1};
|
||||||
|
|
||||||
@@ -43,11 +51,10 @@ struct Facade {
|
|||||||
weaselab::VersionedMap::Iterator endIter = versionedIter[0];
|
weaselab::VersionedMap::Iterator endIter = versionedIter[0];
|
||||||
String readUntil = end;
|
String readUntil = end;
|
||||||
|
|
||||||
// Make *iter intersect [begin, end)
|
do {
|
||||||
--iter;
|
--iter;
|
||||||
|
|
||||||
for (;; --iter) {
|
|
||||||
auto m = *iter;
|
auto m = *iter;
|
||||||
|
const auto mBegin = String(m.param1, m.param1Len);
|
||||||
const auto mEnd =
|
const auto mEnd =
|
||||||
m.type == weaselab::VersionedMap::Set || m.param2Len == 0
|
m.type == weaselab::VersionedMap::Set || m.param2Len == 0
|
||||||
? String(m.param1, m.param1Len) + zero
|
? String(m.param1, m.param1Len) + zero
|
||||||
@@ -58,31 +65,31 @@ struct Facade {
|
|||||||
}
|
}
|
||||||
switch (m.type) {
|
switch (m.type) {
|
||||||
case weaselab::VersionedMap::Set: {
|
case weaselab::VersionedMap::Set: {
|
||||||
result.emplace_back(String(m.param1, m.param1Len),
|
result.emplace_back(mBegin, String(m.param2, m.param2Len));
|
||||||
String(m.param2, m.param2Len));
|
|
||||||
--limit;
|
--limit;
|
||||||
if (limit == 0) {
|
if (limit == 0) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
readUntil = String(m.param1, m.param1Len);
|
readUntil = mBegin;
|
||||||
} break;
|
} break;
|
||||||
case weaselab::VersionedMap::Clear:
|
case weaselab::VersionedMap::Clear:
|
||||||
readUntil = String(m.param1, m.param1Len);
|
readUntil = mBegin;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (iter == endIter) {
|
} while (iter != endIter);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
facade->unversionedRead(begin, readUntil, limit, true, result);
|
facade->unversionedRead(begin, readUntil, limit, true, result);
|
||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
weaselab::VersionedMap::Iterator iter = versionedIter[0];
|
|
||||||
weaselab::VersionedMap::Iterator endIter = versionedIter[1];
|
|
||||||
String readFrom = begin;
|
String readFrom = begin;
|
||||||
for (; iter != endIter; ++iter) {
|
|
||||||
|
for (auto iter = versionedIter[0]; iter != versionedIter[1]; ++iter) {
|
||||||
auto m = *iter;
|
auto m = *iter;
|
||||||
const auto mBegin = String(m.param1, m.param1Len);
|
const auto mBegin = String(m.param1, m.param1Len);
|
||||||
|
const auto mEnd =
|
||||||
|
m.type == weaselab::VersionedMap::Set || m.param2Len == 0
|
||||||
|
? String(m.param1, m.param1Len) + zero
|
||||||
|
: String(m.param2, m.param2Len);
|
||||||
facade->unversionedRead(readFrom, mBegin, limit, false, result);
|
facade->unversionedRead(readFrom, mBegin, limit, false, result);
|
||||||
if (limit == 0) {
|
if (limit == 0) {
|
||||||
return result;
|
return result;
|
||||||
@@ -94,13 +101,14 @@ struct Facade {
|
|||||||
if (limit == 0) {
|
if (limit == 0) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
readFrom = mBegin + zero;
|
readFrom = mEnd;
|
||||||
} break;
|
} break;
|
||||||
case weaselab::VersionedMap::Clear:
|
case weaselab::VersionedMap::Clear:
|
||||||
readFrom = String(m.param2, m.param2Len);
|
readFrom = mEnd;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
facade->unversionedRead(readFrom, end, limit, false, result);
|
facade->unversionedRead(readFrom, end, limit, false, result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@@ -1169,13 +1169,6 @@ void VersionedMap::Impl::firstGeq(const Key *key, const int64_t *version,
|
|||||||
} else {
|
} else {
|
||||||
iterator[i].impl->mutationIndex = 0;
|
iterator[i].impl->mutationIndex = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO Interposable call
|
|
||||||
auto m = *iterator[i];
|
|
||||||
if (Key{m.param1, m.param1Len} < key[i]) {
|
|
||||||
// TODO Interposable call
|
|
||||||
++iterator[i];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -150,9 +150,12 @@ struct __attribute__((__visibility__("default"))) VersionedMap {
|
|||||||
Impl *impl = nullptr;
|
Impl *impl = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Perform `count` "first greater than or equal to" queries, comparing to
|
/** Perform `count` "first greater than or equal to" queries. If there's a
|
||||||
* mutations' `param1`. `version[i]` must be >= `getOldestVersion()` and <=
|
* mutation intersecting `key[i]` at `version[i]` then `iterator[i]` will
|
||||||
* `getVersion()`.
|
* point to that mutation. Otherwise it points to the first mutation greater
|
||||||
|
* or `end()` if none exists. `version[i]` must be >= `getOldestVersion()`
|
||||||
|
* and
|
||||||
|
* <= `getVersion()`.
|
||||||
*
|
*
|
||||||
* Thread-safe as long as a version is not concurrently invalidated by
|
* Thread-safe as long as a version is not concurrently invalidated by
|
||||||
* `setOldestVersion`. There's a performance benefit if you pass iterator[i]
|
* `setOldestVersion`. There's a performance benefit if you pass iterator[i]
|
||||||
|
Reference in New Issue
Block a user