diff --git a/src/query/procedure/mg_procedure_impl.cpp b/src/query/procedure/mg_procedure_impl.cpp index dff9d054f..648f1d463 100644 --- a/src/query/procedure/mg_procedure_impl.cpp +++ b/src/query/procedure/mg_procedure_impl.cpp @@ -1996,19 +1996,20 @@ mgp_error mgp_vertex_iter_in_edges(mgp_vertex *v, mgp_memory *memory, mgp_edges_ #endif if (*it->in_it != it->in->end()) { - std::visit(memgraph::utils::Overloaded{ - [&](memgraph::query::DbAccessor *) { - it->current_e.emplace(**it->in_it, (**it->in_it).From(), (**it->in_it).To(), v->graph, - it->GetMemoryResource()); - }, - [&](memgraph::query::SubgraphDbAccessor *impl) { - it->current_e.emplace( - **it->in_it, - memgraph::query::SubgraphVertexAccessor((**it->in_it).From(), impl->getGraph()), - memgraph::query::SubgraphVertexAccessor((**it->in_it).To(), impl->getGraph()), v->graph, - it->GetMemoryResource()); - }}, - v->graph->impl); + std::visit( + memgraph::utils::Overloaded{ + [&](memgraph::query::DbAccessor *) { + auto edgeAcc = **it->in_it; + it->current_e.emplace(edgeAcc, edgeAcc.From(), edgeAcc.To(), v->graph, it->GetMemoryResource()); + }, + [&](memgraph::query::SubgraphDbAccessor *impl) { + auto edgeAcc = **it->in_it; + it->current_e.emplace(edgeAcc, + memgraph::query::SubgraphVertexAccessor(edgeAcc.From(), impl->getGraph()), + memgraph::query::SubgraphVertexAccessor(edgeAcc.To(), impl->getGraph()), + v->graph, it->GetMemoryResource()); + }}, + v->graph->impl); } return it.release(); @@ -2056,6 +2057,7 @@ mgp_error mgp_vertex_iter_out_edges(mgp_vertex *v, mgp_memory *memory, mgp_edges it->current_e.emplace(edgeAcc, edgeAcc.From(), edgeAcc.To(), v->graph, it->GetMemoryResource()); }, [&](memgraph::query::SubgraphDbAccessor *impl) { + // Dereference iterator implicitly call MakeEdgeAccessor which moves EdgeAccessor. auto edgeAcc = **it->out_it; it->current_e.emplace(edgeAcc, memgraph::query::SubgraphVertexAccessor(edgeAcc.From(), impl->getGraph()), @@ -2113,13 +2115,17 @@ mgp_error mgp_edges_iterator_next(mgp_edges_iterator *it, mgp_edge **result) { } std::visit(memgraph::utils::Overloaded{ [&](memgraph::query::DbAccessor *) { - it->current_e.emplace(**impl_it, (**impl_it).From(), (**impl_it).To(), - it->source_vertex.graph, it->GetMemoryResource()); + // Dereference iterator implicitly call MakeEdgeAccessor which moves EdgeAccessor. + auto edgeAcc = **impl_it; + it->current_e.emplace(edgeAcc, edgeAcc.From(), edgeAcc.To(), it->source_vertex.graph, + it->GetMemoryResource()); }, [&](memgraph::query::SubgraphDbAccessor *impl) { + // Dereference iterator implicitly call MakeEdgeAccessor which moves EdgeAccessor. + auto edgeAcc = **impl_it; it->current_e.emplace( - **impl_it, memgraph::query::SubgraphVertexAccessor((**impl_it).From(), impl->getGraph()), - memgraph::query::SubgraphVertexAccessor((**impl_it).To(), impl->getGraph()), + edgeAcc, memgraph::query::SubgraphVertexAccessor(edgeAcc.From(), impl->getGraph()), + memgraph::query::SubgraphVertexAccessor(edgeAcc.To(), impl->getGraph()), it->source_vertex.graph, it->GetMemoryResource()); }}, it->source_vertex.graph->impl); diff --git a/tests/unit/cpp_api.cpp b/tests/unit/cpp_api.cpp index f2e47f03e..95f63e820 100644 --- a/tests/unit/cpp_api.cpp +++ b/tests/unit/cpp_api.cpp @@ -18,6 +18,7 @@ #include "mgp.hpp" #include "query/procedure/mg_procedure_impl.hpp" +#include "storage/v2/inmemory/storage.hpp" #include "storage/v2/view.hpp" struct CppApiTestFixture : public ::testing::Test { @@ -30,16 +31,16 @@ struct CppApiTestFixture : public ::testing::Test { } memgraph::query::DbAccessor &CreateDbAccessor(const memgraph::storage::IsolationLevel isolationLevel) { - accessors_.push_back(storage.Access(isolationLevel)); - db_accessors_.emplace_back(&accessors_.back()); + accessors_.push_back(storage->Access(isolationLevel)); + db_accessors_.emplace_back(accessors_.back().get()); return db_accessors_.back(); } - memgraph::storage::Storage storage; + std::unique_ptr storage{new memgraph::storage::InMemoryStorage()}; mgp_memory memory{memgraph::utils::NewDeleteResource()}; private: - std::list accessors_; + std::list> accessors_; std::list db_accessors_; std::unique_ptr ctx_ = std::make_unique(); };