diff --git a/src/storage/v3/indices.cpp b/src/storage/v3/indices.cpp index 84097a26a..93573d275 100644 --- a/src/storage/v3/indices.cpp +++ b/src/storage/v3/indices.cpp @@ -11,6 +11,7 @@ #include "indices.hpp" +#include <algorithm> #include <cstddef> #include <cstdint> #include <functional> @@ -398,7 +399,7 @@ void LabelPropertyIndex::UpdateOnAddLabel(LabelId label, Vertex *vertex, const T } auto prop_value = vertex->second.properties.GetProperty(label_prop.second); if (!prop_value.IsNull()) { - index.emplace(prop_value, Entry{prop_value, vertex, tx.start_timestamp.logical_id}); + index.emplace(Entry{prop_value, vertex, tx.start_timestamp.logical_id}); } } } @@ -413,7 +414,7 @@ void LabelPropertyIndex::UpdateOnSetProperty(PropertyId property, const Property continue; } if (VertexHasLabel(*vertex, label_prop.first)) { - index.emplace(value, Entry{value, vertex, tx.start_timestamp.logical_id}); + index.emplace(Entry{value, vertex, tx.start_timestamp.logical_id}); } } } @@ -435,7 +436,7 @@ bool LabelPropertyIndex::CreateIndex(LabelId label, PropertyId property, VertexC if (value.IsNull()) { continue; } - it->second.emplace(value, Entry{value, &vertex, 0}); + it->second.emplace(Entry{value, &vertex, 0}); } } catch (const utils::OutOfMemoryException &) { utils::MemoryTracker::OutOfMemoryExceptionBlocker oom_exception_blocker; @@ -460,16 +461,15 @@ void LabelPropertyIndex::RemoveObsoleteEntries(const uint64_t clean_up_before_ti auto next_it = it; ++next_it; - if (it->second.timestamp >= clean_up_before_timestamp) { + if (it->timestamp >= clean_up_before_timestamp) { it = next_it; continue; } - if (auto &entry = it->second, &next_entry = next_it->second; - (next_it != index.end() && entry.vertex == next_entry.vertex && entry.value == next_entry.value) || - !AnyVersionHasLabelProperty(*entry.vertex, label_property.first, label_property.second, entry.value, + if ((next_it != index.end() && it->vertex == next_it->vertex && it->value == next_it->value) || + !AnyVersionHasLabelProperty(*it->vertex, label_property.first, label_property.second, it->value, clean_up_before_timestamp)) { - index.erase(it->first); + index.erase(it); } it = next_it; } @@ -492,32 +492,32 @@ LabelPropertyIndex::Iterable::Iterator &LabelPropertyIndex::Iterable::Iterator:: void LabelPropertyIndex::Iterable::Iterator::AdvanceUntilValid() { for (; index_iterator_ != self_->index_accessor_->end(); ++index_iterator_) { - if (index_iterator_->second.vertex == current_vertex_) { + if (index_iterator_->vertex == current_vertex_) { continue; } if (self_->lower_bound_) { - if (index_iterator_->second.value < self_->lower_bound_->value()) { + if (index_iterator_->value < self_->lower_bound_->value()) { continue; } - if (!self_->lower_bound_->IsInclusive() && index_iterator_->second.value == self_->lower_bound_->value()) { + if (!self_->lower_bound_->IsInclusive() && index_iterator_->value == self_->lower_bound_->value()) { continue; } } if (self_->upper_bound_) { - if (self_->upper_bound_->value() < index_iterator_->second.value) { + if (self_->upper_bound_->value() < index_iterator_->value) { index_iterator_ = self_->index_accessor_->end(); break; } - if (!self_->upper_bound_->IsInclusive() && index_iterator_->second.value == self_->upper_bound_->value()) { + if (!self_->upper_bound_->IsInclusive() && index_iterator_->value == self_->upper_bound_->value()) { index_iterator_ = self_->index_accessor_->end(); break; } } - if (CurrentVersionHasLabelProperty(*index_iterator_->second.vertex, self_->label_, self_->property_, - index_iterator_->second.value, self_->transaction_, self_->view_)) { - current_vertex_ = index_iterator_->second.vertex; + if (CurrentVersionHasLabelProperty(*index_iterator_->vertex, self_->label_, self_->property_, + index_iterator_->value, self_->transaction_, self_->view_)) { + current_vertex_ = index_iterator_->vertex; current_vertex_accessor_ = VertexAccessor(current_vertex_, self_->transaction_, self_->indices_, self_->config_, *self_->vertex_validator_); break; @@ -655,7 +655,7 @@ LabelPropertyIndex::Iterable::Iterator LabelPropertyIndex::Iterable::begin() { auto index_iterator = index_accessor_->begin(); if (lower_bound_) { index_iterator = std::ranges::find_if(*index_accessor_, [lower_bound = lower_bound_->value()](const auto &pair) { - return pair.second.value >= lower_bound; + return pair.value >= lower_bound; }); } return {this, index_iterator}; @@ -667,9 +667,12 @@ int64_t LabelPropertyIndex::VertexCount(LabelId label, PropertyId property, cons auto it = index_.find({label, property}); MG_ASSERT(it != index_.end(), "Index for label {} and property {} doesn't exist", label.AsUint(), property.AsUint()); if (!value.IsNull()) { - return static_cast<int64_t>(it->second.count(value)); + return static_cast<int64_t>( + std::ranges::count_if(it->second, [&value](const auto &elem) { return elem.value == value; })); } - return static_cast<int64_t>(it->second.count(value)); + // TODO Do check this + return static_cast<int64_t>( + std::ranges::count_if(it->second, [&value](const auto &elem) { return elem.value == value; })); } int64_t LabelPropertyIndex::VertexCount(LabelId label, PropertyId property, @@ -681,9 +684,11 @@ int64_t LabelPropertyIndex::VertexCount(LabelId label, PropertyId property, [&index = it->second](const auto value, const auto def) { if (value) { if (value->IsInclusive()) { - return index.lower_bound(value->value()); + return std::lower_bound(index.begin(), index.end(), value->value(), + [](const Entry &elem, const PropertyValue &val) { return elem.value < val; }); } - return index.upper_bound(value->value()); + return std::upper_bound(index.begin(), index.end(), value->value(), + [](const PropertyValue &val, const Entry &elem) { return val < elem.value; }); } return def; }, @@ -692,9 +697,11 @@ int64_t LabelPropertyIndex::VertexCount(LabelId label, PropertyId property, [&index = it->second](const auto value, const auto def) { if (value) { if (value->IsInclusive()) { - return index.upper_bound(value->value()); + return std::upper_bound(index.begin(), index.end(), value->value(), + [](const PropertyValue &val, const Entry &elem) { return val < elem.value; }); } - return index.lower_bound(value->value()); + return std::lower_bound(index.begin(), index.end(), value->value(), + [](const Entry &elem, const PropertyValue &val) { return elem.value < val; }); } return def; }, diff --git a/src/storage/v3/indices.hpp b/src/storage/v3/indices.hpp index 425c9da13..4dfacabc2 100644 --- a/src/storage/v3/indices.hpp +++ b/src/storage/v3/indices.hpp @@ -12,8 +12,8 @@ #pragma once #include <cstdint> -#include <map> #include <optional> +#include <set> #include <tuple> #include <utility> @@ -146,7 +146,7 @@ class LabelPropertyIndex { }; public: - using LabelPropertyIndexContainer = std::multimap<PropertyValue, Entry>; + using LabelPropertyIndexContainer = std::set<Entry>; LabelPropertyIndex(Indices *indices, Config::Items config, const VertexValidator &vertex_validator) : indices_(indices), config_(config), vertex_validator_{&vertex_validator} {}