Improve performance of move mapping when there are a lot of deletions

This commit is contained in:
Thomas Goyne 2016-03-29 16:56:38 -07:00
parent ae9516dbb7
commit 2e80716629
1 changed files with 11 additions and 18 deletions

View File

@ -40,17 +40,6 @@ void ResultsNotifier::release_data() noexcept
m_query = nullptr;
}
static bool map_moves(size_t& idx, CollectionChangeIndices const& changes)
{
for (auto&& move : changes.moves) {
if (move.from == idx) {
idx = move.to;
return true;
}
}
return false;
}
// Most of the inter-thread synchronization for run(), prepare_handover(),
// attach_to(), detach(), release_data() and deliver() is done by
// RealmCoordinator external to this code, which has some potentially
@ -117,14 +106,18 @@ void ResultsNotifier::run()
next_rows.push_back(m_tv[i].get_index());
if (changes) {
auto move_map = changes->moves;
std::sort(begin(move_map), end(move_map),
[](auto const& a, auto const& b) { return a.from < b.from; });
for (auto& idx : m_previous_rows) {
if (!map_moves(idx, *changes)) {
if (changes->deletions.contains(idx))
idx = npos;
else {
REALM_ASSERT_DEBUG(!changes->insertions.contains(idx));
}
}
auto it = lower_bound(begin(move_map), end(move_map), idx,
[](auto const& a, auto b) { return a.from < b; });
if (it != move_map.end() && it->from == idx)
idx = it->to;
else if (changes->deletions.contains(idx))
idx = npos;
else
REALM_ASSERT_DEBUG(!changes->insertions.contains(idx));
}
}