FindEdge by edge_id and vertex_id

This commit is contained in:
niko4299 2022-10-31 15:42:35 +01:00
parent 45d9cd1656
commit d294760550
4 changed files with 27 additions and 16 deletions

View File

@ -314,8 +314,8 @@ class DbAccessor final {
return std::nullopt;
}
std::optional<EdgeAccessor> FindEdge(storage::Gid gid) {
auto maybe_edge = accessor_->FindEdge(gid);
std::optional<EdgeAccessor> FindEdge(storage::Gid edge_id, storage::Gid vertex_id) {
auto maybe_edge = accessor_->FindEdge(edge_id, vertex_id);
if (maybe_edge) return EdgeAccessor(*maybe_edge);
return std::nullopt;
}

View File

@ -651,12 +651,13 @@ TypedValue Labels(const TypedValue *args, int64_t nargs, const FunctionContext &
}
TypedValue GetEdgeById(const TypedValue *args, int64_t nargs, const FunctionContext &ctx) {
FType<Or<Null, Integer>>("edge_id", args, nargs);
FType<Or<Null, Integer>, Or<Null, Integer>>("edge_id", args, nargs);
auto *dba = ctx.db_accessor;
if (args[0].IsNull()) return TypedValue(ctx.memory);
auto id = args[0].ValueInt();
auto maybe_edge = dba->FindEdge(storage::Gid::FromUint(id));
if (args[0].IsNull() || args[1].IsNull()) return TypedValue(ctx.memory);
auto edge_id = args[0].ValueInt();
auto vertex_id = args[1].ValueInt();
auto maybe_edge = dba->FindEdge(storage::Gid::FromUint(edge_id), storage::Gid::FromUint(vertex_id));
if (!maybe_edge) throw query::QueryRuntimeException("Edge doesn't exist.");
return TypedValue(*maybe_edge, ctx.memory);

View File

@ -15,6 +15,7 @@
#include <memory>
#include <mutex>
#include <optional>
#include <ranges>
#include <variant>
#include <gflags/gflags.h>
@ -526,19 +527,28 @@ std::optional<VertexAccessor> Storage::Accessor::FindVertex(Gid gid, View view)
return VertexAccessor::Create(&*it, &transaction_, &storage_->indices_, &storage_->constraints_, config_, view);
}
std::optional<EdgeAccessor> Storage::Accessor::FindEdge(Gid gid) {
auto edge_acc = storage_->edges_.access();
std::optional<EdgeAccessor> Storage::Accessor::FindEdge(Gid edge_id, Gid vertex_id) {
auto vertex_acc = storage_->vertices_.access();
auto vertex = &*vertex_acc.find(vertex_id);
auto it_in_edges =
std::ranges::find_if(vertex->in_edges.begin(), vertex->in_edges.end(), [edge_id](const auto &item) {
return (get<2>(item).ptr && get<2>(item).ptr->gid == edge_id) || get<2>(item).gid == edge_id;
});
auto maybe_edge = edge_acc.find(gid);
if (maybe_edge == edge_acc.end()) return std::nullopt;
if (it_in_edges != vertex->in_edges.end())
return EdgeAccessor{get<2>(*it_in_edges), get<0>(*it_in_edges), get<1>(*it_in_edges), vertex,
&transaction_, &storage_->indices_, &storage_->constraints_, config_};
auto edge = &*maybe_edge;
auto vertex_from = vertex_acc.find(edge->vertex_gid_from);
auto vertex_to = vertex_acc.find(edge->vertex_gid_to);
auto it_out_edges =
std::ranges::find_if(vertex->out_edges.begin(), vertex->out_edges.end(), [edge_id](const auto &item) {
return (get<2>(item).ptr && get<2>(item).ptr->gid == edge_id) || get<2>(item).gid == edge_id;
});
return EdgeAccessor{EdgeRef{edge}, edge->edge_type_id, &*vertex_from, &*vertex_to,
&transaction_, &storage_->indices_, &storage_->constraints_, config_};
if (it_out_edges != vertex->out_edges.end())
return EdgeAccessor{get<2>(*it_out_edges), get<0>(*it_out_edges), vertex, get<1>(*it_out_edges), &transaction_,
&storage_->indices_, &storage_->constraints_, config_};
return std::nullopt;
}
Result<std::optional<VertexAccessor>> Storage::Accessor::DeleteVertex(VertexAccessor *vertex) {

View File

@ -216,7 +216,7 @@ class Storage final {
std::optional<VertexAccessor> FindVertex(Gid gid, View view);
std::optional<EdgeAccessor> FindEdge(Gid gid);
std::optional<EdgeAccessor> FindEdge(Gid edge_id, Gid vertex_id);
VerticesIterable Vertices(View view) {
return VerticesIterable(AllVerticesIterable(storage_->vertices_.access(), &transaction_, view,