diff --git a/src/storage/record_accessor.hpp b/src/storage/record_accessor.hpp index a2cee9cb8..2e62a4326 100644 --- a/src/storage/record_accessor.hpp +++ b/src/storage/record_accessor.hpp @@ -87,6 +87,16 @@ class RecordAccessor { handler, std::function<void()> finish = {}) const; + /** + * This should be used with care as it's comparing vlist_ pointer records and + * not actual values inside RecordAccessors. + */ + friend bool operator<(const RecordAccessor& a, const RecordAccessor& b) { + assert(&a.db_accessor_ == + &b.db_accessor_); // assume the same db_accessor / transaction + return &a.vlist_ < &b.vlist_; + } + friend bool operator==(const RecordAccessor& a, const RecordAccessor& b) { assert(&a.db_accessor_ == &b.db_accessor_); // assume the same db_accessor / transaction diff --git a/tests/unit/record_edge_vertex_accessor.cpp b/tests/unit/record_edge_vertex_accessor.cpp index 3c82d6787..1827aef58 100644 --- a/tests/unit/record_edge_vertex_accessor.cpp +++ b/tests/unit/record_edge_vertex_accessor.cpp @@ -58,6 +58,41 @@ TEST(RecordAccessor, RecordEquality) { EXPECT_NE(e1, e2); } +TEST(RecordAccessor, RecordLessThan) { + Dbms dbms; + GraphDbAccessor dba = dbms.active(); + + auto v1 = dba.insert_vertex(); + auto v2 = dba.insert_vertex(); + EXPECT_NE(v1, v2); + EXPECT_TRUE(v1 < v2 || v2 < v1); + EXPECT_FALSE(v1 < v1); + EXPECT_FALSE(v2 < v2); + auto e1 = dba.insert_edge(v1, v2, dba.edge_type("type")); + auto e2 = dba.insert_edge(v1, v2, dba.edge_type("type")); + EXPECT_NE(e1, e2); + EXPECT_TRUE(e1 < e2 || e2 < e1); + EXPECT_FALSE(e1 < e1); + EXPECT_FALSE(e2 < e2); + + std::vector<VertexAccessor> vertices = dba.vertices(); + std::vector<VertexAccessor*> A; + for (int i = 0; i < vertices.size(); ++i) A.push_back(&vertices[i]); + std::sort(A.begin(), A.end(), + [](const VertexAccessor* a, const VertexAccessor* b) -> bool { + return *a < *b; + }); + + std::vector<VertexAccessor*> B; + for (int i = 0; i < vertices.size(); ++i) B.push_back(&vertices[i]); + std::sort(B.begin(), B.end(), + [](const VertexAccessor* a, const VertexAccessor* b) -> bool { + return *a < *b; + }); + + for (int i = 0; i < A.size(); ++i) EXPECT_EQ(*A[i], *B[i]); +} + TEST(RecordAccessor, VertexLabels) { Dbms dbms; GraphDbAccessor dba = dbms.active();