storage/v2: Reduce the (In|Out)Edges tuple to only EdgeAccessor

Summary:
The first 2 tuple elements are redundant as they are available through
EdgeAccessor and they needlessly complicate the usage of the API.

Reviewers: mtomic, mferencevic

Reviewed By: mtomic

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D2200
This commit is contained in:
Teon Banek 2019-07-12 13:29:06 +02:00
parent d4df7d9d60
commit bf4f69f2e5
4 changed files with 255 additions and 670 deletions

View File

@ -304,7 +304,7 @@ Result<std::unordered_map<uint64_t, PropertyValue>> VertexAccessor::Properties(
std::move(properties)};
}
Result<std::vector<std::tuple<uint64_t, VertexAccessor, EdgeAccessor>>>
Result<std::vector<EdgeAccessor>>
VertexAccessor::InEdges(const std::vector<uint64_t> &edge_types, View view) {
std::vector<std::tuple<uint64_t, Vertex *, Edge *>> in_edges;
bool deleted = false;
@ -356,27 +356,21 @@ VertexAccessor::InEdges(const std::vector<uint64_t> &edge_types, View view) {
}
});
if (deleted) {
return Result<
std::vector<std::tuple<uint64_t, VertexAccessor, EdgeAccessor>>>{
Error::DELETED_OBJECT};
return Result<std::vector<EdgeAccessor>>(Error::DELETED_OBJECT);
}
std::vector<std::tuple<uint64_t, VertexAccessor, EdgeAccessor>> ret;
std::vector<EdgeAccessor> ret;
ret.reserve(in_edges.size());
for (const auto &item : in_edges) {
auto [edge_type, from_vertex, edge] = item;
if (edge_types.empty() || std::find(edge_types.begin(), edge_types.end(),
edge_type) != edge_types.end()) {
ret.emplace_back(
edge_type, VertexAccessor{from_vertex, transaction_},
EdgeAccessor{edge, edge_type, from_vertex, vertex_, transaction_});
ret.emplace_back(edge, edge_type, from_vertex, vertex_, transaction_);
}
}
return Result<
std::vector<std::tuple<uint64_t, VertexAccessor, EdgeAccessor>>>{
std::move(ret)};
return Result<decltype(ret)>(std::move(ret));
}
Result<std::vector<std::tuple<uint64_t, VertexAccessor, EdgeAccessor>>>
Result<std::vector<EdgeAccessor>>
VertexAccessor::OutEdges(const std::vector<uint64_t> &edge_types, View view) {
std::vector<std::tuple<uint64_t, Vertex *, Edge *>> out_edges;
bool deleted = false;
@ -428,24 +422,18 @@ VertexAccessor::OutEdges(const std::vector<uint64_t> &edge_types, View view) {
}
});
if (deleted) {
return Result<
std::vector<std::tuple<uint64_t, VertexAccessor, EdgeAccessor>>>{
Error::DELETED_OBJECT};
return Result<std::vector<EdgeAccessor>>(Error::DELETED_OBJECT);
}
std::vector<std::tuple<uint64_t, VertexAccessor, EdgeAccessor>> ret;
std::vector<EdgeAccessor> ret;
ret.reserve(out_edges.size());
for (const auto &item : out_edges) {
auto [edge_type, to_vertex, edge] = item;
if (edge_types.empty() || std::find(edge_types.begin(), edge_types.end(),
edge_type) != edge_types.end()) {
ret.emplace_back(
edge_type, VertexAccessor{to_vertex, transaction_},
EdgeAccessor{edge, edge_type, vertex_, to_vertex, transaction_});
ret.emplace_back(edge, edge_type, vertex_, to_vertex, transaction_);
}
}
return Result<
std::vector<std::tuple<uint64_t, VertexAccessor, EdgeAccessor>>>{
std::move(ret)};
return Result<decltype(ret)>(std::move(ret));
}
} // namespace storage

View File

@ -39,10 +39,10 @@ class VertexAccessor final {
Result<std::unordered_map<uint64_t, PropertyValue>> Properties(View view);
Result<std::vector<std::tuple<uint64_t, VertexAccessor, EdgeAccessor>>>
Result<std::vector<EdgeAccessor>>
InEdges(const std::vector<uint64_t> &edge_types, View view);
Result<std::vector<std::tuple<uint64_t, VertexAccessor, EdgeAccessor>>>
Result<std::vector<EdgeAccessor>>
OutEdges(const std::vector<uint64_t> &edge_types, View view);
Gid Gid() const { return vertex_->gid; }

File diff suppressed because it is too large Load Diff

View File

@ -124,7 +124,7 @@ TEST(StorageV2Gc, Sanity) {
vertex->OutEdges(std::vector<uint64_t>{}, storage::View::NEW);
if (i % 5 != 4 && i % 3 != 2) {
EXPECT_EQ(out_edges.GetReturn().size(), 1);
EXPECT_EQ(std::get<2>(out_edges.GetReturn().at(0)).EdgeType(), i);
EXPECT_EQ(out_edges.GetReturn().at(0).EdgeType(), i);
} else {
EXPECT_TRUE(out_edges.GetReturn().empty());
}
@ -133,7 +133,7 @@ TEST(StorageV2Gc, Sanity) {
vertex->InEdges(std::vector<uint64_t>{}, storage::View::NEW);
if (i % 5 != 1 && i % 3 != 1) {
EXPECT_EQ(in_edges.GetReturn().size(), 1);
EXPECT_EQ(std::get<2>(in_edges.GetReturn().at(0)).EdgeType(),
EXPECT_EQ(in_edges.GetReturn().at(0).EdgeType(),
(i + 999) % 1000);
} else {
EXPECT_TRUE(in_edges.GetReturn().empty());