Make Gid a full on class wrapper around uint64_t
Summary: This makes Gid the same as the one in storage/v2. Before they can be merge into one implementation, we probably want to have a similar transition for remaining ID types. Depends on D2346 Reviewers: mferencevic, ipaljak Reviewed By: mferencevic Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D2347
This commit is contained in:
parent
cdfaf0d4a6
commit
7213bec886
@ -102,7 +102,7 @@ VertexAccessor GraphDbAccessor::InsertVertex(
|
|||||||
bool success =
|
bool success =
|
||||||
db_->storage().vertices_.access().insert(gid, vertex_vlist).second;
|
db_->storage().vertices_.access().insert(gid, vertex_vlist).second;
|
||||||
CHECK(success) << "Attempting to insert a vertex with an existing GID: "
|
CHECK(success) << "Attempting to insert a vertex with an existing GID: "
|
||||||
<< gid;
|
<< gid.AsUint();
|
||||||
wal().Emplace(
|
wal().Emplace(
|
||||||
database::StateDelta::CreateVertex(transaction_->id_, vertex_vlist->gid_));
|
database::StateDelta::CreateVertex(transaction_->id_, vertex_vlist->gid_));
|
||||||
auto va = VertexAccessor(vertex_vlist, *this);
|
auto va = VertexAccessor(vertex_vlist, *this);
|
||||||
@ -121,7 +121,7 @@ std::optional<VertexAccessor> GraphDbAccessor::FindVertexOptional(
|
|||||||
VertexAccessor GraphDbAccessor::FindVertex(storage::Gid gid,
|
VertexAccessor GraphDbAccessor::FindVertex(storage::Gid gid,
|
||||||
bool current_state) {
|
bool current_state) {
|
||||||
auto found = FindVertexOptional(gid, current_state);
|
auto found = FindVertexOptional(gid, current_state);
|
||||||
CHECK(found) << "Unable to find vertex for id: " << gid;
|
CHECK(found) << "Unable to find vertex for id: " << gid.AsUint();
|
||||||
return *found;
|
return *found;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ std::optional<EdgeAccessor> GraphDbAccessor::FindEdgeOptional(
|
|||||||
|
|
||||||
EdgeAccessor GraphDbAccessor::FindEdge(storage::Gid gid, bool current_state) {
|
EdgeAccessor GraphDbAccessor::FindEdge(storage::Gid gid, bool current_state) {
|
||||||
auto found = FindEdgeOptional(gid, current_state);
|
auto found = FindEdgeOptional(gid, current_state);
|
||||||
CHECK(found) << "Unable to find edge for id: " << gid;
|
CHECK(found) << "Unable to find edge for id: " << gid.AsUint();
|
||||||
return *found;
|
return *found;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -461,7 +461,7 @@ EdgeAccessor GraphDbAccessor::InsertEdge(
|
|||||||
// edges_ skiplist.
|
// edges_ skiplist.
|
||||||
bool success = db_->storage().edges_.access().insert(gid, edge_vlist).second;
|
bool success = db_->storage().edges_.access().insert(gid, edge_vlist).second;
|
||||||
CHECK(success) << "Attempting to insert an edge with an existing GID: "
|
CHECK(success) << "Attempting to insert an edge with an existing GID: "
|
||||||
<< gid;
|
<< gid.AsUint();
|
||||||
|
|
||||||
// ensure that the "from" accessor has the latest version
|
// ensure that the "from" accessor has the latest version
|
||||||
from.SwitchNew();
|
from.SwitchNew();
|
||||||
|
@ -102,7 +102,7 @@ VertexAccessor GraphDbAccessor::InsertVertex(
|
|||||||
bool success =
|
bool success =
|
||||||
db_->storage().vertices_.access().insert(gid, vertex_vlist).second;
|
db_->storage().vertices_.access().insert(gid, vertex_vlist).second;
|
||||||
CHECK(success) << "Attempting to insert a vertex with an existing GID: "
|
CHECK(success) << "Attempting to insert a vertex with an existing GID: "
|
||||||
<< gid;
|
<< gid.AsUint();
|
||||||
raft()->Emplace(
|
raft()->Emplace(
|
||||||
database::StateDelta::CreateVertex(transaction_->id_, vertex_vlist->gid_));
|
database::StateDelta::CreateVertex(transaction_->id_, vertex_vlist->gid_));
|
||||||
auto va = VertexAccessor(vertex_vlist, *this);
|
auto va = VertexAccessor(vertex_vlist, *this);
|
||||||
@ -121,7 +121,7 @@ std::optional<VertexAccessor> GraphDbAccessor::FindVertexOptional(
|
|||||||
VertexAccessor GraphDbAccessor::FindVertex(storage::Gid gid,
|
VertexAccessor GraphDbAccessor::FindVertex(storage::Gid gid,
|
||||||
bool current_state) {
|
bool current_state) {
|
||||||
auto found = FindVertexOptional(gid, current_state);
|
auto found = FindVertexOptional(gid, current_state);
|
||||||
CHECK(found) << "Unable to find vertex for id: " << gid;
|
CHECK(found) << "Unable to find vertex for id: " << gid.AsUint();
|
||||||
return *found;
|
return *found;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,7 +135,7 @@ std::optional<EdgeAccessor> GraphDbAccessor::FindEdgeOptional(
|
|||||||
|
|
||||||
EdgeAccessor GraphDbAccessor::FindEdge(storage::Gid gid, bool current_state) {
|
EdgeAccessor GraphDbAccessor::FindEdge(storage::Gid gid, bool current_state) {
|
||||||
auto found = FindEdgeOptional(gid, current_state);
|
auto found = FindEdgeOptional(gid, current_state);
|
||||||
CHECK(found) << "Unable to find edge for id: " << gid;
|
CHECK(found) << "Unable to find edge for id: " << gid.AsUint();
|
||||||
return *found;
|
return *found;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,7 +455,7 @@ EdgeAccessor GraphDbAccessor::InsertEdge(
|
|||||||
// edges_ skiplist.
|
// edges_ skiplist.
|
||||||
bool success = db_->storage().edges_.access().insert(gid, edge_vlist).second;
|
bool success = db_->storage().edges_.access().insert(gid, edge_vlist).second;
|
||||||
CHECK(success) << "Attempting to insert an edge with an existing GID: "
|
CHECK(success) << "Attempting to insert an edge with an existing GID: "
|
||||||
<< gid;
|
<< gid.AsUint();
|
||||||
|
|
||||||
// ensure that the "from" accessor has the latest version
|
// ensure that the "from" accessor has the latest version
|
||||||
from.SwitchNew();
|
from.SwitchNew();
|
||||||
|
@ -179,7 +179,8 @@ bool RecoverSnapshot(const fs::path &snapshot_file, database::GraphDb *db,
|
|||||||
Value vertex_dv;
|
Value vertex_dv;
|
||||||
RETURN_IF_NOT(decoder.ReadValue(&vertex_dv, Value::Type::Vertex));
|
RETURN_IF_NOT(decoder.ReadValue(&vertex_dv, Value::Type::Vertex));
|
||||||
auto &vertex = vertex_dv.ValueVertex();
|
auto &vertex = vertex_dv.ValueVertex();
|
||||||
auto vertex_accessor = dba.InsertVertex(vertex.id.AsUint());
|
auto vertex_accessor =
|
||||||
|
dba.InsertVertex(storage::Gid::FromUint(vertex.id.AsUint()));
|
||||||
|
|
||||||
for (const auto &label : vertex.labels) {
|
for (const auto &label : vertex.labels) {
|
||||||
vertex_accessor.add_label(dba.Label(label));
|
vertex_accessor.add_label(dba.Label(label));
|
||||||
@ -199,8 +200,8 @@ bool RecoverSnapshot(const fs::path &snapshot_file, database::GraphDb *db,
|
|||||||
auto it_to = vertices.find(edge.to.AsUint());
|
auto it_to = vertices.find(edge.to.AsUint());
|
||||||
RETURN_IF_NOT(it_from != vertices.end() && it_to != vertices.end());
|
RETURN_IF_NOT(it_from != vertices.end() && it_to != vertices.end());
|
||||||
auto edge_accessor =
|
auto edge_accessor =
|
||||||
dba.InsertEdge(it_from->second, it_to->second,
|
dba.InsertEdge(it_from->second, it_to->second, dba.EdgeType(edge.type),
|
||||||
dba.EdgeType(edge.type), edge.id.AsUint());
|
storage::Gid::FromUint(edge.id.AsUint()));
|
||||||
|
|
||||||
for (const auto &property_pair : edge.properties)
|
for (const auto &property_pair : edge.properties)
|
||||||
edge_accessor.PropsSet(dba.Property(property_pair.first),
|
edge_accessor.PropsSet(dba.Property(property_pair.first),
|
||||||
|
@ -164,38 +164,38 @@ void StateDelta::Encode(
|
|||||||
case Type::TRANSACTION_ABORT:
|
case Type::TRANSACTION_ABORT:
|
||||||
break;
|
break;
|
||||||
case Type::CREATE_VERTEX:
|
case Type::CREATE_VERTEX:
|
||||||
encoder.WriteInt(vertex_id);
|
encoder.WriteInt(vertex_id.AsInt());
|
||||||
break;
|
break;
|
||||||
case Type::CREATE_EDGE:
|
case Type::CREATE_EDGE:
|
||||||
encoder.WriteInt(edge_id);
|
encoder.WriteInt(edge_id.AsInt());
|
||||||
encoder.WriteInt(vertex_from_id);
|
encoder.WriteInt(vertex_from_id.AsInt());
|
||||||
encoder.WriteInt(vertex_to_id);
|
encoder.WriteInt(vertex_to_id.AsInt());
|
||||||
encoder.WriteInt(edge_type.Id());
|
encoder.WriteInt(edge_type.Id());
|
||||||
encoder.WriteString(edge_type_name);
|
encoder.WriteString(edge_type_name);
|
||||||
break;
|
break;
|
||||||
case Type::SET_PROPERTY_VERTEX:
|
case Type::SET_PROPERTY_VERTEX:
|
||||||
encoder.WriteInt(vertex_id);
|
encoder.WriteInt(vertex_id.AsInt());
|
||||||
encoder.WriteInt(property.Id());
|
encoder.WriteInt(property.Id());
|
||||||
encoder.WriteString(property_name);
|
encoder.WriteString(property_name);
|
||||||
encoder.WriteValue(glue::ToBoltValue(value));
|
encoder.WriteValue(glue::ToBoltValue(value));
|
||||||
break;
|
break;
|
||||||
case Type::SET_PROPERTY_EDGE:
|
case Type::SET_PROPERTY_EDGE:
|
||||||
encoder.WriteInt(edge_id);
|
encoder.WriteInt(edge_id.AsInt());
|
||||||
encoder.WriteInt(property.Id());
|
encoder.WriteInt(property.Id());
|
||||||
encoder.WriteString(property_name);
|
encoder.WriteString(property_name);
|
||||||
encoder.WriteValue(glue::ToBoltValue(value));
|
encoder.WriteValue(glue::ToBoltValue(value));
|
||||||
break;
|
break;
|
||||||
case Type::ADD_LABEL:
|
case Type::ADD_LABEL:
|
||||||
case Type::REMOVE_LABEL:
|
case Type::REMOVE_LABEL:
|
||||||
encoder.WriteInt(vertex_id);
|
encoder.WriteInt(vertex_id.AsInt());
|
||||||
encoder.WriteInt(label.Id());
|
encoder.WriteInt(label.Id());
|
||||||
encoder.WriteString(label_name);
|
encoder.WriteString(label_name);
|
||||||
break;
|
break;
|
||||||
case Type::REMOVE_VERTEX:
|
case Type::REMOVE_VERTEX:
|
||||||
encoder.WriteInt(vertex_id);
|
encoder.WriteInt(vertex_id.AsInt());
|
||||||
break;
|
break;
|
||||||
case Type::REMOVE_EDGE:
|
case Type::REMOVE_EDGE:
|
||||||
encoder.WriteInt(edge_id);
|
encoder.WriteInt(edge_id.AsInt());
|
||||||
break;
|
break;
|
||||||
case Type::BUILD_INDEX:
|
case Type::BUILD_INDEX:
|
||||||
encoder.WriteInt(label.Id());
|
encoder.WriteInt(label.Id());
|
||||||
@ -240,6 +240,10 @@ void StateDelta::Encode(
|
|||||||
if (!decoder.ReadValue(&dv)) return nullopt; \
|
if (!decoder.ReadValue(&dv)) return nullopt; \
|
||||||
r_val.member = dv.value_f();
|
r_val.member = dv.value_f();
|
||||||
|
|
||||||
|
#define DECODE_GID_MEMBER(member) \
|
||||||
|
if (!decoder.ReadValue(&dv)) return nullopt; \
|
||||||
|
r_val.member = storage::Gid::FromInt(dv.ValueInt());
|
||||||
|
|
||||||
#define DECODE_MEMBER_CAST(member, value_f, type) \
|
#define DECODE_MEMBER_CAST(member, value_f, type) \
|
||||||
if (!decoder.ReadValue(&dv)) return nullopt; \
|
if (!decoder.ReadValue(&dv)) return nullopt; \
|
||||||
r_val.member = static_cast<type>(dv.value_f());
|
r_val.member = static_cast<type>(dv.value_f());
|
||||||
@ -264,24 +268,24 @@ std::optional<StateDelta> StateDelta::Decode(
|
|||||||
case Type::TRANSACTION_ABORT:
|
case Type::TRANSACTION_ABORT:
|
||||||
break;
|
break;
|
||||||
case Type::CREATE_VERTEX:
|
case Type::CREATE_VERTEX:
|
||||||
DECODE_MEMBER(vertex_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_id)
|
||||||
break;
|
break;
|
||||||
case Type::CREATE_EDGE:
|
case Type::CREATE_EDGE:
|
||||||
DECODE_MEMBER(edge_id, ValueInt)
|
DECODE_GID_MEMBER(edge_id)
|
||||||
DECODE_MEMBER(vertex_from_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_from_id)
|
||||||
DECODE_MEMBER(vertex_to_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_to_id)
|
||||||
DECODE_MEMBER_CAST(edge_type, ValueInt, storage::EdgeType)
|
DECODE_MEMBER_CAST(edge_type, ValueInt, storage::EdgeType)
|
||||||
DECODE_MEMBER(edge_type_name, ValueString)
|
DECODE_MEMBER(edge_type_name, ValueString)
|
||||||
break;
|
break;
|
||||||
case Type::SET_PROPERTY_VERTEX:
|
case Type::SET_PROPERTY_VERTEX:
|
||||||
DECODE_MEMBER(vertex_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_id)
|
||||||
DECODE_MEMBER_CAST(property, ValueInt, storage::Property)
|
DECODE_MEMBER_CAST(property, ValueInt, storage::Property)
|
||||||
DECODE_MEMBER(property_name, ValueString)
|
DECODE_MEMBER(property_name, ValueString)
|
||||||
if (!decoder.ReadValue(&dv)) return nullopt;
|
if (!decoder.ReadValue(&dv)) return nullopt;
|
||||||
r_val.value = glue::ToPropertyValue(dv);
|
r_val.value = glue::ToPropertyValue(dv);
|
||||||
break;
|
break;
|
||||||
case Type::SET_PROPERTY_EDGE:
|
case Type::SET_PROPERTY_EDGE:
|
||||||
DECODE_MEMBER(edge_id, ValueInt)
|
DECODE_GID_MEMBER(edge_id)
|
||||||
DECODE_MEMBER_CAST(property, ValueInt, storage::Property)
|
DECODE_MEMBER_CAST(property, ValueInt, storage::Property)
|
||||||
DECODE_MEMBER(property_name, ValueString)
|
DECODE_MEMBER(property_name, ValueString)
|
||||||
if (!decoder.ReadValue(&dv)) return nullopt;
|
if (!decoder.ReadValue(&dv)) return nullopt;
|
||||||
@ -289,15 +293,15 @@ std::optional<StateDelta> StateDelta::Decode(
|
|||||||
break;
|
break;
|
||||||
case Type::ADD_LABEL:
|
case Type::ADD_LABEL:
|
||||||
case Type::REMOVE_LABEL:
|
case Type::REMOVE_LABEL:
|
||||||
DECODE_MEMBER(vertex_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_id)
|
||||||
DECODE_MEMBER_CAST(label, ValueInt, storage::Label)
|
DECODE_MEMBER_CAST(label, ValueInt, storage::Label)
|
||||||
DECODE_MEMBER(label_name, ValueString)
|
DECODE_MEMBER(label_name, ValueString)
|
||||||
break;
|
break;
|
||||||
case Type::REMOVE_VERTEX:
|
case Type::REMOVE_VERTEX:
|
||||||
DECODE_MEMBER(vertex_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_id)
|
||||||
break;
|
break;
|
||||||
case Type::REMOVE_EDGE:
|
case Type::REMOVE_EDGE:
|
||||||
DECODE_MEMBER(edge_id, ValueInt)
|
DECODE_GID_MEMBER(edge_id)
|
||||||
break;
|
break;
|
||||||
case Type::BUILD_INDEX:
|
case Type::BUILD_INDEX:
|
||||||
DECODE_MEMBER_CAST(label, ValueInt, storage::Label)
|
DECODE_MEMBER_CAST(label, ValueInt, storage::Label)
|
||||||
|
@ -83,7 +83,8 @@ bool RecoverSnapshot(const fs::path &snapshot_file, database::GraphDb *db,
|
|||||||
Value vertex_dv;
|
Value vertex_dv;
|
||||||
RETURN_IF_NOT(decoder.ReadValue(&vertex_dv, Value::Type::Vertex));
|
RETURN_IF_NOT(decoder.ReadValue(&vertex_dv, Value::Type::Vertex));
|
||||||
auto &vertex = vertex_dv.ValueVertex();
|
auto &vertex = vertex_dv.ValueVertex();
|
||||||
auto vertex_accessor = dba.InsertVertex(vertex.id.AsUint());
|
auto vertex_accessor =
|
||||||
|
dba.InsertVertex(storage::Gid::FromUint(vertex.id.AsUint()));
|
||||||
|
|
||||||
for (const auto &label : vertex.labels) {
|
for (const auto &label : vertex.labels) {
|
||||||
vertex_accessor.add_label(dba.Label(label));
|
vertex_accessor.add_label(dba.Label(label));
|
||||||
@ -103,8 +104,8 @@ bool RecoverSnapshot(const fs::path &snapshot_file, database::GraphDb *db,
|
|||||||
auto it_to = vertices.find(edge.to.AsUint());
|
auto it_to = vertices.find(edge.to.AsUint());
|
||||||
RETURN_IF_NOT(it_from != vertices.end() && it_to != vertices.end());
|
RETURN_IF_NOT(it_from != vertices.end() && it_to != vertices.end());
|
||||||
auto edge_accessor =
|
auto edge_accessor =
|
||||||
dba.InsertEdge(it_from->second, it_to->second,
|
dba.InsertEdge(it_from->second, it_to->second, dba.EdgeType(edge.type),
|
||||||
dba.EdgeType(edge.type), edge.id.AsUint());
|
storage::Gid::FromUint(edge.id.AsUint()));
|
||||||
|
|
||||||
for (const auto &property_pair : edge.properties)
|
for (const auto &property_pair : edge.properties)
|
||||||
edge_accessor.PropsSet(dba.Property(property_pair.first),
|
edge_accessor.PropsSet(dba.Property(property_pair.first),
|
||||||
|
@ -170,38 +170,38 @@ void StateDelta::Encode(
|
|||||||
case Type::NO_OP:
|
case Type::NO_OP:
|
||||||
break;
|
break;
|
||||||
case Type::CREATE_VERTEX:
|
case Type::CREATE_VERTEX:
|
||||||
encoder.WriteInt(vertex_id);
|
encoder.WriteInt(vertex_id.AsInt());
|
||||||
break;
|
break;
|
||||||
case Type::CREATE_EDGE:
|
case Type::CREATE_EDGE:
|
||||||
encoder.WriteInt(edge_id);
|
encoder.WriteInt(edge_id.AsInt());
|
||||||
encoder.WriteInt(vertex_from_id);
|
encoder.WriteInt(vertex_from_id.AsInt());
|
||||||
encoder.WriteInt(vertex_to_id);
|
encoder.WriteInt(vertex_to_id.AsInt());
|
||||||
encoder.WriteInt(edge_type.Id());
|
encoder.WriteInt(edge_type.Id());
|
||||||
encoder.WriteString(edge_type_name);
|
encoder.WriteString(edge_type_name);
|
||||||
break;
|
break;
|
||||||
case Type::SET_PROPERTY_VERTEX:
|
case Type::SET_PROPERTY_VERTEX:
|
||||||
encoder.WriteInt(vertex_id);
|
encoder.WriteInt(vertex_id.AsInt());
|
||||||
encoder.WriteInt(property.Id());
|
encoder.WriteInt(property.Id());
|
||||||
encoder.WriteString(property_name);
|
encoder.WriteString(property_name);
|
||||||
encoder.WriteValue(glue::ToBoltValue(value));
|
encoder.WriteValue(glue::ToBoltValue(value));
|
||||||
break;
|
break;
|
||||||
case Type::SET_PROPERTY_EDGE:
|
case Type::SET_PROPERTY_EDGE:
|
||||||
encoder.WriteInt(edge_id);
|
encoder.WriteInt(edge_id.AsInt());
|
||||||
encoder.WriteInt(property.Id());
|
encoder.WriteInt(property.Id());
|
||||||
encoder.WriteString(property_name);
|
encoder.WriteString(property_name);
|
||||||
encoder.WriteValue(glue::ToBoltValue(value));
|
encoder.WriteValue(glue::ToBoltValue(value));
|
||||||
break;
|
break;
|
||||||
case Type::ADD_LABEL:
|
case Type::ADD_LABEL:
|
||||||
case Type::REMOVE_LABEL:
|
case Type::REMOVE_LABEL:
|
||||||
encoder.WriteInt(vertex_id);
|
encoder.WriteInt(vertex_id.AsInt());
|
||||||
encoder.WriteInt(label.Id());
|
encoder.WriteInt(label.Id());
|
||||||
encoder.WriteString(label_name);
|
encoder.WriteString(label_name);
|
||||||
break;
|
break;
|
||||||
case Type::REMOVE_VERTEX:
|
case Type::REMOVE_VERTEX:
|
||||||
encoder.WriteInt(vertex_id);
|
encoder.WriteInt(vertex_id.AsInt());
|
||||||
break;
|
break;
|
||||||
case Type::REMOVE_EDGE:
|
case Type::REMOVE_EDGE:
|
||||||
encoder.WriteInt(edge_id);
|
encoder.WriteInt(edge_id.AsInt());
|
||||||
break;
|
break;
|
||||||
case Type::BUILD_INDEX:
|
case Type::BUILD_INDEX:
|
||||||
encoder.WriteInt(label.Id());
|
encoder.WriteInt(label.Id());
|
||||||
@ -246,6 +246,10 @@ void StateDelta::Encode(
|
|||||||
if (!decoder.ReadValue(&dv)) return nullopt; \
|
if (!decoder.ReadValue(&dv)) return nullopt; \
|
||||||
r_val.member = dv.value_f();
|
r_val.member = dv.value_f();
|
||||||
|
|
||||||
|
#define DECODE_GID_MEMBER(member) \
|
||||||
|
if (!decoder.ReadValue(&dv)) return nullopt; \
|
||||||
|
r_val.member = storage::Gid::FromInt(dv.ValueInt());
|
||||||
|
|
||||||
#define DECODE_MEMBER_CAST(member, value_f, type) \
|
#define DECODE_MEMBER_CAST(member, value_f, type) \
|
||||||
if (!decoder.ReadValue(&dv)) return nullopt; \
|
if (!decoder.ReadValue(&dv)) return nullopt; \
|
||||||
r_val.member = static_cast<type>(dv.value_f());
|
r_val.member = static_cast<type>(dv.value_f());
|
||||||
@ -271,24 +275,24 @@ std::optional<StateDelta> StateDelta::Decode(
|
|||||||
case Type::NO_OP:
|
case Type::NO_OP:
|
||||||
break;
|
break;
|
||||||
case Type::CREATE_VERTEX:
|
case Type::CREATE_VERTEX:
|
||||||
DECODE_MEMBER(vertex_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_id)
|
||||||
break;
|
break;
|
||||||
case Type::CREATE_EDGE:
|
case Type::CREATE_EDGE:
|
||||||
DECODE_MEMBER(edge_id, ValueInt)
|
DECODE_GID_MEMBER(edge_id)
|
||||||
DECODE_MEMBER(vertex_from_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_from_id)
|
||||||
DECODE_MEMBER(vertex_to_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_to_id)
|
||||||
DECODE_MEMBER_CAST(edge_type, ValueInt, storage::EdgeType)
|
DECODE_MEMBER_CAST(edge_type, ValueInt, storage::EdgeType)
|
||||||
DECODE_MEMBER(edge_type_name, ValueString)
|
DECODE_MEMBER(edge_type_name, ValueString)
|
||||||
break;
|
break;
|
||||||
case Type::SET_PROPERTY_VERTEX:
|
case Type::SET_PROPERTY_VERTEX:
|
||||||
DECODE_MEMBER(vertex_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_id)
|
||||||
DECODE_MEMBER_CAST(property, ValueInt, storage::Property)
|
DECODE_MEMBER_CAST(property, ValueInt, storage::Property)
|
||||||
DECODE_MEMBER(property_name, ValueString)
|
DECODE_MEMBER(property_name, ValueString)
|
||||||
if (!decoder.ReadValue(&dv)) return nullopt;
|
if (!decoder.ReadValue(&dv)) return nullopt;
|
||||||
r_val.value = glue::ToPropertyValue(dv);
|
r_val.value = glue::ToPropertyValue(dv);
|
||||||
break;
|
break;
|
||||||
case Type::SET_PROPERTY_EDGE:
|
case Type::SET_PROPERTY_EDGE:
|
||||||
DECODE_MEMBER(edge_id, ValueInt)
|
DECODE_GID_MEMBER(edge_id)
|
||||||
DECODE_MEMBER_CAST(property, ValueInt, storage::Property)
|
DECODE_MEMBER_CAST(property, ValueInt, storage::Property)
|
||||||
DECODE_MEMBER(property_name, ValueString)
|
DECODE_MEMBER(property_name, ValueString)
|
||||||
if (!decoder.ReadValue(&dv)) return nullopt;
|
if (!decoder.ReadValue(&dv)) return nullopt;
|
||||||
@ -296,15 +300,15 @@ std::optional<StateDelta> StateDelta::Decode(
|
|||||||
break;
|
break;
|
||||||
case Type::ADD_LABEL:
|
case Type::ADD_LABEL:
|
||||||
case Type::REMOVE_LABEL:
|
case Type::REMOVE_LABEL:
|
||||||
DECODE_MEMBER(vertex_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_id)
|
||||||
DECODE_MEMBER_CAST(label, ValueInt, storage::Label)
|
DECODE_MEMBER_CAST(label, ValueInt, storage::Label)
|
||||||
DECODE_MEMBER(label_name, ValueString)
|
DECODE_MEMBER(label_name, ValueString)
|
||||||
break;
|
break;
|
||||||
case Type::REMOVE_VERTEX:
|
case Type::REMOVE_VERTEX:
|
||||||
DECODE_MEMBER(vertex_id, ValueInt)
|
DECODE_GID_MEMBER(vertex_id)
|
||||||
break;
|
break;
|
||||||
case Type::REMOVE_EDGE:
|
case Type::REMOVE_EDGE:
|
||||||
DECODE_MEMBER(edge_id, ValueInt)
|
DECODE_GID_MEMBER(edge_id)
|
||||||
break;
|
break;
|
||||||
case Type::BUILD_INDEX:
|
case Type::BUILD_INDEX:
|
||||||
DECODE_MEMBER_CAST(label, ValueInt, storage::Label)
|
DECODE_MEMBER_CAST(label, ValueInt, storage::Label)
|
||||||
|
@ -80,7 +80,7 @@ Value ToBoltValue(const query::TypedValue &value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
communication::bolt::Vertex ToBoltVertex(const VertexAccessor &vertex) {
|
communication::bolt::Vertex ToBoltVertex(const VertexAccessor &vertex) {
|
||||||
auto id = communication::bolt::Id::FromUint(vertex.gid());
|
auto id = communication::bolt::Id::FromUint(vertex.gid().AsUint());
|
||||||
std::vector<std::string> labels;
|
std::vector<std::string> labels;
|
||||||
labels.reserve(vertex.labels().size());
|
labels.reserve(vertex.labels().size());
|
||||||
for (const auto &label : vertex.labels()) {
|
for (const auto &label : vertex.labels()) {
|
||||||
@ -96,9 +96,9 @@ communication::bolt::Vertex ToBoltVertex(const VertexAccessor &vertex) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
communication::bolt::Edge ToBoltEdge(const EdgeAccessor &edge) {
|
communication::bolt::Edge ToBoltEdge(const EdgeAccessor &edge) {
|
||||||
auto id = communication::bolt::Id::FromUint(edge.gid());
|
auto id = communication::bolt::Id::FromUint(edge.gid().AsUint());
|
||||||
auto from = communication::bolt::Id::FromUint(edge.from().gid());
|
auto from = communication::bolt::Id::FromUint(edge.from().gid().AsUint());
|
||||||
auto to = communication::bolt::Id::FromUint(edge.to().gid());
|
auto to = communication::bolt::Id::FromUint(edge.to().gid().AsUint());
|
||||||
auto type = edge.db_accessor().EdgeTypeName(edge.EdgeType());
|
auto type = edge.db_accessor().EdgeTypeName(edge.EdgeType());
|
||||||
std::map<std::string, Value> properties;
|
std::map<std::string, Value> properties;
|
||||||
for (const auto &prop : edge.Properties()) {
|
for (const auto &prop : edge.Properties()) {
|
||||||
|
@ -904,9 +904,9 @@ size_t TypedValue::Hash::operator()(const TypedValue &value) const {
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
case TypedValue::Type::Vertex:
|
case TypedValue::Type::Vertex:
|
||||||
return value.ValueVertex().gid();
|
return value.ValueVertex().gid().AsUint();
|
||||||
case TypedValue::Type::Edge:
|
case TypedValue::Type::Edge:
|
||||||
return value.ValueEdge().gid();
|
return value.ValueEdge().gid().AsUint();
|
||||||
case TypedValue::Type::Path: {
|
case TypedValue::Type::Path: {
|
||||||
const auto &vertices = value.ValuePath().vertices();
|
const auto &vertices = value.ValuePath().vertices();
|
||||||
const auto &edges = value.ValuePath().edges();
|
const auto &edges = value.ValuePath().edges();
|
||||||
|
@ -22,6 +22,7 @@ inline void Save(const storage::EdgeType &common, slk::Builder *builder) {
|
|||||||
inline void Load(storage::EdgeType *common, slk::Reader *reader) {
|
inline void Load(storage::EdgeType *common, slk::Reader *reader) {
|
||||||
slk::Load(&common->id_, reader);
|
slk::Load(&common->id_, reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void Save(const storage::Property &common, slk::Builder *builder) {
|
inline void Save(const storage::Property &common, slk::Builder *builder) {
|
||||||
slk::Save(common.id_, builder);
|
slk::Save(common.id_, builder);
|
||||||
}
|
}
|
||||||
@ -30,6 +31,16 @@ inline void Load(storage::Property *common, slk::Reader *reader) {
|
|||||||
slk::Load(&common->id_, reader);
|
slk::Load(&common->id_, reader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void Save(const storage::Gid &gid, slk::Builder *builder) {
|
||||||
|
slk::Save(gid.AsUint(), builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void Load(storage::Gid *gid, slk::Reader *reader) {
|
||||||
|
uint64_t id;
|
||||||
|
slk::Load(&id, reader);
|
||||||
|
*gid = storage::Gid::FromUint(id);
|
||||||
|
}
|
||||||
|
|
||||||
void Save(const PropertyValue &value, slk::Builder *builder);
|
void Save(const PropertyValue &value, slk::Builder *builder);
|
||||||
|
|
||||||
void Load(PropertyValue *value, slk::Reader *reader);
|
void Load(PropertyValue *value, slk::Reader *reader);
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include <glog/logging.h>
|
#include <glog/logging.h>
|
||||||
|
|
||||||
#include "utils/atomic.hpp"
|
#include "utils/atomic.hpp"
|
||||||
|
#include "utils/cast.hpp"
|
||||||
|
|
||||||
namespace storage {
|
namespace storage {
|
||||||
|
|
||||||
@ -151,7 +152,47 @@ class Property final {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/** Global ID of a record in the database. */
|
/** Global ID of a record in the database. */
|
||||||
using Gid = uint64_t;
|
class Gid final {
|
||||||
|
private:
|
||||||
|
explicit Gid(uint64_t id) : id_(id) {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
Gid() = default;
|
||||||
|
|
||||||
|
static Gid FromUint(uint64_t id) { return Gid{id}; }
|
||||||
|
static Gid FromInt(int64_t id) {
|
||||||
|
return Gid{utils::MemcpyCast<uint64_t>(id)};
|
||||||
|
}
|
||||||
|
uint64_t AsUint() const { return id_; }
|
||||||
|
int64_t AsInt() const { return utils::MemcpyCast<int64_t>(id_); }
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint64_t id_;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool operator==(const Gid &first, const Gid &second) {
|
||||||
|
return first.AsUint() == second.AsUint();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator!=(const Gid &first, const Gid &second) {
|
||||||
|
return first.AsUint() != second.AsUint();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator<(const Gid &first, const Gid &second) {
|
||||||
|
return first.AsUint() < second.AsUint();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator>(const Gid &first, const Gid &second) {
|
||||||
|
return first.AsUint() > second.AsUint();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator<=(const Gid &first, const Gid &second) {
|
||||||
|
return first.AsUint() <= second.AsUint();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator>=(const Gid &first, const Gid &second) {
|
||||||
|
return first.AsUint() >= second.AsUint();
|
||||||
|
}
|
||||||
|
|
||||||
/** Threadsafe generation of new global IDs. */
|
/** Threadsafe generation of new global IDs. */
|
||||||
class GidGenerator {
|
class GidGenerator {
|
||||||
@ -164,10 +205,10 @@ class GidGenerator {
|
|||||||
*/
|
*/
|
||||||
Gid Next(std::optional<Gid> requested_gid = std::nullopt) {
|
Gid Next(std::optional<Gid> requested_gid = std::nullopt) {
|
||||||
if (requested_gid) {
|
if (requested_gid) {
|
||||||
utils::EnsureAtomicGe(next_local_id_, *requested_gid + 1);
|
utils::EnsureAtomicGe(next_local_id_, requested_gid->AsUint() + 1U);
|
||||||
return *requested_gid;
|
return *requested_gid;
|
||||||
} else {
|
} else {
|
||||||
return next_local_id_++;
|
return Gid::FromUint(next_local_id_++);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,4 +239,11 @@ struct hash<storage::Property> {
|
|||||||
return hash<storage::IdT>()(k.Id());
|
return hash<storage::IdT>()(k.Id());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct hash<storage::Gid> {
|
||||||
|
size_t operator()(const storage::Gid &gid) const {
|
||||||
|
return hash<uint64_t>()(gid.AsUint());
|
||||||
|
}
|
||||||
|
};
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
@ -72,6 +72,6 @@ std::ostream &operator<<(std::ostream &, const EdgeAccessor &);
|
|||||||
namespace std {
|
namespace std {
|
||||||
template <>
|
template <>
|
||||||
struct hash<EdgeAccessor> {
|
struct hash<EdgeAccessor> {
|
||||||
size_t operator()(const EdgeAccessor &e) const { return e.gid(); };
|
size_t operator()(const EdgeAccessor &e) const { return e.gid().AsUint(); };
|
||||||
};
|
};
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include "storage/common/mvcc/exceptions.hpp"
|
#include "storage/common/mvcc/exceptions.hpp"
|
||||||
#include "storage/common/types/types.hpp"
|
#include "storage/common/types/types.hpp"
|
||||||
#include "transactions/transaction.hpp"
|
#include "transactions/transaction.hpp"
|
||||||
#include "utils/cast.hpp"
|
|
||||||
#include "utils/exceptions.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
namespace mvcc {
|
namespace mvcc {
|
||||||
@ -223,7 +222,7 @@ class VersionList {
|
|||||||
|
|
||||||
const storage::Gid gid_;
|
const storage::Gid gid_;
|
||||||
|
|
||||||
int64_t cypher_id() { return utils::MemcpyCast<int64_t>(gid_); }
|
int64_t cypher_id() { return gid_.AsInt(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// @throw utils::LockTimeoutException
|
/// @throw utils::LockTimeoutException
|
||||||
|
@ -52,7 +52,7 @@ class Storage {
|
|||||||
CHECK(found != access.end())
|
CHECK(found != access.end())
|
||||||
<< "Failed to find "
|
<< "Failed to find "
|
||||||
<< (std::is_same<TRecord, Vertex>::value ? "vertex" : "edge")
|
<< (std::is_same<TRecord, Vertex>::value ? "vertex" : "edge")
|
||||||
<< " for gid: " << gid;
|
<< " for gid: " << gid.AsUint();
|
||||||
return found->second;
|
return found->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,6 +172,6 @@ std::ostream &operator<<(std::ostream &, const VertexAccessor &);
|
|||||||
namespace std {
|
namespace std {
|
||||||
template <>
|
template <>
|
||||||
struct hash<VertexAccessor> {
|
struct hash<VertexAccessor> {
|
||||||
size_t operator()(const VertexAccessor &v) const { return v.gid(); };
|
size_t operator()(const VertexAccessor &v) const { return v.gid().AsUint(); };
|
||||||
};
|
};
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
@ -72,6 +72,6 @@ std::ostream &operator<<(std::ostream &, const EdgeAccessor &);
|
|||||||
namespace std {
|
namespace std {
|
||||||
template <>
|
template <>
|
||||||
struct hash<EdgeAccessor> {
|
struct hash<EdgeAccessor> {
|
||||||
size_t operator()(const EdgeAccessor &e) const { return e.gid(); };
|
size_t operator()(const EdgeAccessor &e) const { return e.gid().AsUint(); };
|
||||||
};
|
};
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
#include "storage/common/mvcc/exceptions.hpp"
|
#include "storage/common/mvcc/exceptions.hpp"
|
||||||
#include "storage/common/types/types.hpp"
|
#include "storage/common/types/types.hpp"
|
||||||
#include "transactions/transaction.hpp"
|
#include "transactions/transaction.hpp"
|
||||||
#include "utils/cast.hpp"
|
|
||||||
#include "utils/exceptions.hpp"
|
#include "utils/exceptions.hpp"
|
||||||
|
|
||||||
namespace mvcc {
|
namespace mvcc {
|
||||||
@ -217,7 +216,7 @@ class VersionList {
|
|||||||
|
|
||||||
const storage::Gid gid_;
|
const storage::Gid gid_;
|
||||||
|
|
||||||
int64_t cypher_id() { return utils::MemcpyCast<int64_t>(gid_); }
|
int64_t cypher_id() { return gid_.AsInt(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void lock_and_validate(T *record, const tx::Transaction &t) {
|
void lock_and_validate(T *record, const tx::Transaction &t) {
|
||||||
|
@ -52,7 +52,7 @@ class Storage {
|
|||||||
CHECK(found != access.end())
|
CHECK(found != access.end())
|
||||||
<< "Failed to find "
|
<< "Failed to find "
|
||||||
<< (std::is_same<TRecord, Vertex>::value ? "vertex" : "edge")
|
<< (std::is_same<TRecord, Vertex>::value ? "vertex" : "edge")
|
||||||
<< " for gid: " << gid;
|
<< " for gid: " << gid.AsUint();
|
||||||
return found->second;
|
return found->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -153,6 +153,6 @@ std::ostream &operator<<(std::ostream &, const VertexAccessor &);
|
|||||||
namespace std {
|
namespace std {
|
||||||
template <>
|
template <>
|
||||||
struct hash<VertexAccessor> {
|
struct hash<VertexAccessor> {
|
||||||
size_t operator()(const VertexAccessor &v) const { return v.gid(); };
|
size_t operator()(const VertexAccessor &v) const { return v.gid().AsUint(); };
|
||||||
};
|
};
|
||||||
} // namespace std
|
} // namespace std
|
||||||
|
@ -21,7 +21,7 @@ void MvccMix(benchmark::State &state) {
|
|||||||
state.PauseTiming();
|
state.PauseTiming();
|
||||||
tx::Engine engine;
|
tx::Engine engine;
|
||||||
auto t1 = engine.Begin();
|
auto t1 = engine.Begin();
|
||||||
mvcc::VersionList<Prop> version_list(*t1, 0);
|
mvcc::VersionList<Prop> version_list(*t1, storage::Gid::FromInt(0));
|
||||||
|
|
||||||
engine.Commit(*t1);
|
engine.Commit(*t1);
|
||||||
auto t2 = engine.Begin();
|
auto t2 = engine.Begin();
|
||||||
|
@ -198,13 +198,13 @@ TEST(BoltEncoder, VertexAndEdge) {
|
|||||||
// and Memgraph now encodes IDs so we need to check the output
|
// and Memgraph now encodes IDs so we need to check the output
|
||||||
// part by part.
|
// part by part.
|
||||||
CheckOutput(output, vertexedge_encoded, 5, false);
|
CheckOutput(output, vertexedge_encoded, 5, false);
|
||||||
CheckInt(output, va1.gid());
|
CheckInt(output, va1.gid().AsInt());
|
||||||
CheckOutput(output, vertexedge_encoded + 6, 34, false);
|
CheckOutput(output, vertexedge_encoded + 6, 34, false);
|
||||||
CheckInt(output, va2.gid());
|
CheckInt(output, va2.gid().AsInt());
|
||||||
CheckOutput(output, vertexedge_encoded + 41, 4, false);
|
CheckOutput(output, vertexedge_encoded + 41, 4, false);
|
||||||
CheckInt(output, ea.gid());
|
CheckInt(output, ea.gid().AsInt());
|
||||||
CheckInt(output, va1.gid());
|
CheckInt(output, va1.gid().AsInt());
|
||||||
CheckInt(output, va2.gid());
|
CheckInt(output, va2.gid().AsInt());
|
||||||
CheckOutput(output, vertexedge_encoded + 48, 26);
|
CheckOutput(output, vertexedge_encoded + 48, 26);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ VertexAccessor CreateVertex(GraphDbAccessor *dba,
|
|||||||
}
|
}
|
||||||
if (add_property_id) {
|
if (add_property_id) {
|
||||||
vertex.PropsSet(dba->Property(kPropertyId),
|
vertex.PropsSet(dba->Property(kPropertyId),
|
||||||
PropertyValue(static_cast<int64_t>(vertex.gid())));
|
PropertyValue(vertex.gid().AsInt()));
|
||||||
}
|
}
|
||||||
return vertex;
|
return vertex;
|
||||||
}
|
}
|
||||||
@ -218,7 +218,7 @@ EdgeAccessor CreateEdge(GraphDbAccessor *dba, VertexAccessor from,
|
|||||||
}
|
}
|
||||||
if (add_property_id) {
|
if (add_property_id) {
|
||||||
edge.PropsSet(dba->Property(kPropertyId),
|
edge.PropsSet(dba->Property(kPropertyId),
|
||||||
PropertyValue(static_cast<int64_t>(edge.gid())));
|
PropertyValue(edge.gid().AsInt()));
|
||||||
}
|
}
|
||||||
return edge;
|
return edge;
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ TEST(LabelsIndex, UniqueInsert) {
|
|||||||
tx::Engine engine;
|
tx::Engine engine;
|
||||||
|
|
||||||
auto t1 = engine.Begin();
|
auto t1 = engine.Begin();
|
||||||
mvcc::VersionList<Vertex> vlist(*t1, 0);
|
mvcc::VersionList<Vertex> vlist(*t1, storage::Gid::FromInt(0));
|
||||||
engine.Commit(*t1);
|
engine.Commit(*t1);
|
||||||
auto t2 = engine.Begin();
|
auto t2 = engine.Begin();
|
||||||
|
|
||||||
@ -48,8 +48,8 @@ TEST(LabelsIndex, UniqueFilter) {
|
|||||||
tx::Engine engine;
|
tx::Engine engine;
|
||||||
|
|
||||||
auto t1 = engine.Begin();
|
auto t1 = engine.Begin();
|
||||||
mvcc::VersionList<Vertex> vlist1(*t1, 0);
|
mvcc::VersionList<Vertex> vlist1(*t1, storage::Gid::FromInt(0));
|
||||||
mvcc::VersionList<Vertex> vlist2(*t1, 1);
|
mvcc::VersionList<Vertex> vlist2(*t1, storage::Gid::FromInt(1));
|
||||||
engine.Advance(t1->id_);
|
engine.Advance(t1->id_);
|
||||||
auto r1v1 = vlist1.find(*t1);
|
auto r1v1 = vlist1.find(*t1);
|
||||||
auto r1v2 = vlist2.find(*t1);
|
auto r1v2 = vlist2.find(*t1);
|
||||||
@ -89,8 +89,8 @@ TEST(LabelsIndex, Refresh) {
|
|||||||
|
|
||||||
// add two vertices to database
|
// add two vertices to database
|
||||||
auto t1 = engine.Begin();
|
auto t1 = engine.Begin();
|
||||||
mvcc::VersionList<Vertex> vlist1(*t1, 0);
|
mvcc::VersionList<Vertex> vlist1(*t1, storage::Gid::FromInt(0));
|
||||||
mvcc::VersionList<Vertex> vlist2(*t1, 1);
|
mvcc::VersionList<Vertex> vlist2(*t1, storage::Gid::FromInt(1));
|
||||||
engine.Advance(t1->id_);
|
engine.Advance(t1->id_);
|
||||||
|
|
||||||
auto v1r1 = vlist1.find(*t1);
|
auto v1r1 = vlist1.find(*t1);
|
||||||
|
@ -24,7 +24,7 @@ class LabelPropertyIndexComplexTest : public ::testing::Test {
|
|||||||
EXPECT_EQ(index.CreateIndex(*key), true);
|
EXPECT_EQ(index.CreateIndex(*key), true);
|
||||||
|
|
||||||
t = engine.Begin();
|
t = engine.Begin();
|
||||||
vlist = new mvcc::VersionList<Vertex>(*t, 0);
|
vlist = new mvcc::VersionList<Vertex>(*t, storage::Gid::FromInt(0));
|
||||||
engine.Advance(t->id_);
|
engine.Advance(t->id_);
|
||||||
|
|
||||||
vertex = vlist->find(*t);
|
vertex = vlist->find(*t);
|
||||||
|
@ -54,16 +54,19 @@ class DbGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EdgeAccessor RandomEdge(bool remove_from_ids = false) {
|
EdgeAccessor RandomEdge(bool remove_from_ids = false) {
|
||||||
return dba_.FindEdge(RandomElement(edge_ids_, remove_from_ids), true);
|
return dba_.FindEdge(
|
||||||
|
storage::Gid::FromInt(RandomElement(edge_ids_, remove_from_ids)), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
VertexAccessor RandomVertex(bool remove_from_ids = false) {
|
VertexAccessor RandomVertex(bool remove_from_ids = false) {
|
||||||
return dba_.FindVertex(RandomElement(vertex_ids_, remove_from_ids), true);
|
return dba_.FindVertex(
|
||||||
|
storage::Gid::FromInt(RandomElement(vertex_ids_, remove_from_ids)),
|
||||||
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
VertexAccessor InsertVertex() {
|
VertexAccessor InsertVertex() {
|
||||||
auto vertex = dba_.InsertVertex();
|
auto vertex = dba_.InsertVertex();
|
||||||
vertex_ids_.emplace_back(vertex.gid());
|
vertex_ids_.emplace_back(vertex.gid().AsInt());
|
||||||
return vertex;
|
return vertex;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,7 +79,7 @@ class DbGenerator {
|
|||||||
auto from = RandomVertex();
|
auto from = RandomVertex();
|
||||||
auto to = RandomVertex();
|
auto to = RandomVertex();
|
||||||
auto edge = dba_.InsertEdge(from, to, EdgeType(RandomInt(kEdgeTypeCount)));
|
auto edge = dba_.InsertEdge(from, to, EdgeType(RandomInt(kEdgeTypeCount)));
|
||||||
edge_ids_.emplace_back(edge.gid());
|
edge_ids_.emplace_back(edge.gid().AsInt());
|
||||||
return edge;
|
return edge;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +87,7 @@ class DbGenerator {
|
|||||||
auto vertex = RandomVertex();
|
auto vertex = RandomVertex();
|
||||||
auto edge =
|
auto edge =
|
||||||
dba_.InsertEdge(vertex, vertex, EdgeType(RandomInt(kEdgeTypeCount)));
|
dba_.InsertEdge(vertex, vertex, EdgeType(RandomInt(kEdgeTypeCount)));
|
||||||
edge_ids_.emplace_back(edge.gid());
|
edge_ids_.emplace_back(edge.gid().AsInt());
|
||||||
return edge;
|
return edge;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,7 +229,7 @@ void CompareDbs(database::GraphDb &a, database::GraphDb &b) {
|
|||||||
for (auto v_a : dba_a.Vertices(false)) {
|
for (auto v_a : dba_a.Vertices(false)) {
|
||||||
vertices_a_count++;
|
vertices_a_count++;
|
||||||
auto v_b = dba_b.FindVertexOptional(v_a.gid(), false);
|
auto v_b = dba_b.FindVertexOptional(v_a.gid(), false);
|
||||||
ASSERT_TRUE(v_b) << "Vertex not found, id: " << v_a.gid();
|
ASSERT_TRUE(v_b) << "Vertex not found, id: " << v_a.gid().AsUint();
|
||||||
ASSERT_EQ(v_a.labels().size(), v_b->labels().size());
|
ASSERT_EQ(v_a.labels().size(), v_b->labels().size());
|
||||||
std::vector<std::string> v_a_labels;
|
std::vector<std::string> v_a_labels;
|
||||||
std::vector<std::string> v_b_labels;
|
std::vector<std::string> v_b_labels;
|
||||||
@ -246,7 +249,7 @@ void CompareDbs(database::GraphDb &a, database::GraphDb &b) {
|
|||||||
edges_a_count++;
|
edges_a_count++;
|
||||||
auto e_b = dba_b.FindEdgeOptional(e_a.gid(), false);
|
auto e_b = dba_b.FindEdgeOptional(e_a.gid(), false);
|
||||||
ASSERT_TRUE(e_b);
|
ASSERT_TRUE(e_b);
|
||||||
ASSERT_TRUE(e_b) << "Edge not found, id: " << e_a.gid();
|
ASSERT_TRUE(e_b) << "Edge not found, id: " << e_a.gid().AsUint();
|
||||||
EXPECT_EQ(dba_a.EdgeTypeName(e_a.EdgeType()),
|
EXPECT_EQ(dba_a.EdgeTypeName(e_a.EdgeType()),
|
||||||
dba_b.EdgeTypeName(e_b->EdgeType()));
|
dba_b.EdgeTypeName(e_b->EdgeType()));
|
||||||
EXPECT_EQ(e_a.from().gid(), e_b->from().gid());
|
EXPECT_EQ(e_a.from().gid(), e_b->from().gid());
|
||||||
@ -518,7 +521,8 @@ TEST_F(Durability, SnapshotEncoding) {
|
|||||||
ASSERT_TRUE(
|
ASSERT_TRUE(
|
||||||
decoder.ReadValue(&dv, communication::bolt::Value::Type::Vertex));
|
decoder.ReadValue(&dv, communication::bolt::Value::Type::Vertex));
|
||||||
auto &vertex = dv.ValueVertex();
|
auto &vertex = dv.ValueVertex();
|
||||||
decoded_vertices.emplace(vertex.id.AsUint(), vertex);
|
decoded_vertices.emplace(storage::Gid::FromUint(vertex.id.AsUint()),
|
||||||
|
vertex);
|
||||||
}
|
}
|
||||||
ASSERT_EQ(decoded_vertices.size(), 3);
|
ASSERT_EQ(decoded_vertices.size(), 3);
|
||||||
ASSERT_EQ(decoded_vertices[gid0].labels.size(), 1);
|
ASSERT_EQ(decoded_vertices[gid0].labels.size(), 1);
|
||||||
@ -536,15 +540,15 @@ TEST_F(Durability, SnapshotEncoding) {
|
|||||||
for (int i = 0; i < edge_count; ++i) {
|
for (int i = 0; i < edge_count; ++i) {
|
||||||
ASSERT_TRUE(decoder.ReadValue(&dv, communication::bolt::Value::Type::Edge));
|
ASSERT_TRUE(decoder.ReadValue(&dv, communication::bolt::Value::Type::Edge));
|
||||||
auto &edge = dv.ValueEdge();
|
auto &edge = dv.ValueEdge();
|
||||||
decoded_edges.emplace(edge.id.AsUint(), edge);
|
decoded_edges.emplace(storage::Gid::FromUint(edge.id.AsUint()), edge);
|
||||||
}
|
}
|
||||||
EXPECT_EQ(decoded_edges.size(), 2);
|
EXPECT_EQ(decoded_edges.size(), 2);
|
||||||
EXPECT_EQ(decoded_edges[gid0].from.AsUint(), gid0);
|
EXPECT_EQ(decoded_edges[gid0].from.AsUint(), gid0.AsUint());
|
||||||
EXPECT_EQ(decoded_edges[gid0].to.AsUint(), gid1);
|
EXPECT_EQ(decoded_edges[gid0].to.AsUint(), gid1.AsUint());
|
||||||
EXPECT_EQ(decoded_edges[gid0].type, "et0");
|
EXPECT_EQ(decoded_edges[gid0].type, "et0");
|
||||||
EXPECT_EQ(decoded_edges[gid0].properties.size(), 1);
|
EXPECT_EQ(decoded_edges[gid0].properties.size(), 1);
|
||||||
EXPECT_EQ(decoded_edges[gid1].from.AsUint(), gid2);
|
EXPECT_EQ(decoded_edges[gid1].from.AsUint(), gid2.AsUint());
|
||||||
EXPECT_EQ(decoded_edges[gid1].to.AsUint(), gid1);
|
EXPECT_EQ(decoded_edges[gid1].to.AsUint(), gid1.AsUint());
|
||||||
EXPECT_EQ(decoded_edges[gid1].type, "et1");
|
EXPECT_EQ(decoded_edges[gid1].type, "et1");
|
||||||
EXPECT_EQ(decoded_edges[gid1].properties.size(), 0);
|
EXPECT_EQ(decoded_edges[gid1].properties.size(), 0);
|
||||||
|
|
||||||
@ -812,7 +816,8 @@ TEST_F(Durability, SequentialRecovery) {
|
|||||||
|
|
||||||
auto init_db = [](database::GraphDb &db) {
|
auto init_db = [](database::GraphDb &db) {
|
||||||
auto dba = db.Access();
|
auto dba = db.Access();
|
||||||
for (int i = 0; i < kNumVertices; ++i) dba.InsertVertex(i);
|
for (int i = 0; i < kNumVertices; ++i)
|
||||||
|
dba.InsertVertex(storage::Gid::FromInt(i));
|
||||||
dba.Commit();
|
dba.Commit();
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -823,7 +828,8 @@ TEST_F(Durability, SequentialRecovery) {
|
|||||||
threads.emplace_back([&random_int, &db, &keep_running]() {
|
threads.emplace_back([&random_int, &db, &keep_running]() {
|
||||||
while (keep_running) {
|
while (keep_running) {
|
||||||
auto dba = db.Access();
|
auto dba = db.Access();
|
||||||
auto v = dba.FindVertex(random_int(kNumVertices), false);
|
auto v = dba.FindVertex(
|
||||||
|
storage::Gid::FromInt(random_int(kNumVertices)), false);
|
||||||
try {
|
try {
|
||||||
v.PropsSet(dba.Property("prop"), PropertyValue(random_int(100)));
|
v.PropsSet(dba.Property("prop"), PropertyValue(random_int(100)));
|
||||||
} catch (utils::LockTimeoutException &) {
|
} catch (utils::LockTimeoutException &) {
|
||||||
|
@ -15,31 +15,37 @@ TEST(Edges, Filtering) {
|
|||||||
auto tx = tx_engine.Begin();
|
auto tx = tx_engine.Begin();
|
||||||
|
|
||||||
int64_t vertex_gid = 0;
|
int64_t vertex_gid = 0;
|
||||||
mvcc::VersionList<Vertex> v0(*tx, vertex_gid++);
|
mvcc::VersionList<Vertex> v0(*tx, storage::Gid::FromInt(vertex_gid++));
|
||||||
mvcc::VersionList<Vertex> v1(*tx, vertex_gid++);
|
mvcc::VersionList<Vertex> v1(*tx, storage::Gid::FromInt(vertex_gid++));
|
||||||
mvcc::VersionList<Vertex> v2(*tx, vertex_gid++);
|
mvcc::VersionList<Vertex> v2(*tx, storage::Gid::FromInt(vertex_gid++));
|
||||||
mvcc::VersionList<Vertex> v3(*tx, vertex_gid++);
|
mvcc::VersionList<Vertex> v3(*tx, storage::Gid::FromInt(vertex_gid++));
|
||||||
|
|
||||||
storage::EdgeType t1{1};
|
storage::EdgeType t1{1};
|
||||||
storage::EdgeType t2{2};
|
storage::EdgeType t2{2};
|
||||||
|
|
||||||
int64_t edge_gid = 0;
|
int64_t edge_gid = 0;
|
||||||
mvcc::VersionList<Edge> e1(*tx, edge_gid++, &v0, &v1, t1);
|
mvcc::VersionList<Edge> e1(*tx, storage::Gid::FromInt(edge_gid++), &v0, &v1,
|
||||||
|
t1);
|
||||||
edges.emplace(&v1, &e1, t1);
|
edges.emplace(&v1, &e1, t1);
|
||||||
|
|
||||||
mvcc::VersionList<Edge> e2(*tx, edge_gid++, &v0, &v2, t2);
|
mvcc::VersionList<Edge> e2(*tx, storage::Gid::FromInt(edge_gid++), &v0, &v2,
|
||||||
|
t2);
|
||||||
edges.emplace(&v2, &e2, t2);
|
edges.emplace(&v2, &e2, t2);
|
||||||
|
|
||||||
mvcc::VersionList<Edge> e3(*tx, edge_gid++, &v0, &v3, t1);
|
mvcc::VersionList<Edge> e3(*tx, storage::Gid::FromInt(edge_gid++), &v0, &v3,
|
||||||
|
t1);
|
||||||
edges.emplace(&v3, &e3, t1);
|
edges.emplace(&v3, &e3, t1);
|
||||||
|
|
||||||
mvcc::VersionList<Edge> e4(*tx, edge_gid++, &v0, &v1, t2);
|
mvcc::VersionList<Edge> e4(*tx, storage::Gid::FromInt(edge_gid++), &v0, &v1,
|
||||||
|
t2);
|
||||||
edges.emplace(&v1, &e4, t2);
|
edges.emplace(&v1, &e4, t2);
|
||||||
|
|
||||||
mvcc::VersionList<Edge> e5(*tx, edge_gid++, &v0, &v2, t1);
|
mvcc::VersionList<Edge> e5(*tx, storage::Gid::FromInt(edge_gid++), &v0, &v2,
|
||||||
|
t1);
|
||||||
edges.emplace(&v2, &e5, t1);
|
edges.emplace(&v2, &e5, t1);
|
||||||
|
|
||||||
mvcc::VersionList<Edge> e6(*tx, edge_gid++, &v0, &v3, t2);
|
mvcc::VersionList<Edge> e6(*tx, storage::Gid::FromInt(edge_gid++), &v0, &v3,
|
||||||
|
t2);
|
||||||
edges.emplace(&v3, &e6, t2);
|
edges.emplace(&v3, &e6, t2);
|
||||||
|
|
||||||
auto edge_addresses = [edges](mvcc::VersionList<Vertex> *dest,
|
auto edge_addresses = [edges](mvcc::VersionList<Vertex> *dest,
|
||||||
|
@ -38,7 +38,7 @@ TEST(GraphDbAccessorTest, InsertVertex) {
|
|||||||
|
|
||||||
TEST(GraphDbAccessorTest, UniqueVertexId) {
|
TEST(GraphDbAccessorTest, UniqueVertexId) {
|
||||||
GraphDb db;
|
GraphDb db;
|
||||||
SkipList<int64_t> ids;
|
SkipList<storage::Gid> ids;
|
||||||
|
|
||||||
std::vector<std::thread> threads;
|
std::vector<std::thread> threads;
|
||||||
for (int i = 0; i < 50; i++) {
|
for (int i = 0; i < 50; i++) {
|
||||||
@ -140,7 +140,7 @@ TEST(GraphDbAccessorTest, InsertEdge) {
|
|||||||
|
|
||||||
TEST(GraphDbAccessorTest, UniqueEdgeId) {
|
TEST(GraphDbAccessorTest, UniqueEdgeId) {
|
||||||
GraphDb db;
|
GraphDb db;
|
||||||
SkipList<int64_t> ids;
|
SkipList<storage::Gid> ids;
|
||||||
|
|
||||||
std::vector<std::thread> threads;
|
std::vector<std::thread> threads;
|
||||||
for (int i = 0; i < 50; i++) {
|
for (int i = 0; i < 50; i++) {
|
||||||
|
@ -15,8 +15,8 @@ TEST(MVCC, Deadlock) {
|
|||||||
tx::Engine engine;
|
tx::Engine engine;
|
||||||
|
|
||||||
auto t0 = engine.Begin();
|
auto t0 = engine.Begin();
|
||||||
mvcc::VersionList<Prop> version_list1(*t0, 0);
|
mvcc::VersionList<Prop> version_list1(*t0, storage::Gid::FromInt(0));
|
||||||
mvcc::VersionList<Prop> version_list2(*t0, 1);
|
mvcc::VersionList<Prop> version_list2(*t0, storage::Gid::FromInt(1));
|
||||||
engine.Commit(*t0);
|
engine.Commit(*t0);
|
||||||
|
|
||||||
auto t1 = engine.Begin();
|
auto t1 = engine.Begin();
|
||||||
@ -34,7 +34,8 @@ TEST(MVCC, UpdateDontDelete) {
|
|||||||
{
|
{
|
||||||
tx::Engine engine;
|
tx::Engine engine;
|
||||||
auto t1 = engine.Begin();
|
auto t1 = engine.Begin();
|
||||||
mvcc::VersionList<DestrCountRec> version_list(*t1, 0, count);
|
mvcc::VersionList<DestrCountRec> version_list(*t1, storage::Gid::FromInt(0),
|
||||||
|
count);
|
||||||
engine.Commit(*t1);
|
engine.Commit(*t1);
|
||||||
|
|
||||||
auto t2 = engine.Begin();
|
auto t2 = engine.Begin();
|
||||||
@ -58,7 +59,7 @@ TEST(MVCC, UpdateDontDelete) {
|
|||||||
TEST(MVCC, Oldest) {
|
TEST(MVCC, Oldest) {
|
||||||
tx::Engine engine;
|
tx::Engine engine;
|
||||||
auto t1 = engine.Begin();
|
auto t1 = engine.Begin();
|
||||||
mvcc::VersionList<Prop> version_list(*t1, 0);
|
mvcc::VersionList<Prop> version_list(*t1, storage::Gid::FromInt(0));
|
||||||
auto first = version_list.Oldest();
|
auto first = version_list.Oldest();
|
||||||
EXPECT_NE(first, nullptr);
|
EXPECT_NE(first, nullptr);
|
||||||
// TODO Gleich: no need to do 10 checks of the same thing
|
// TODO Gleich: no need to do 10 checks of the same thing
|
||||||
|
@ -60,7 +60,8 @@ class Mvcc : public ::testing::Test {
|
|||||||
int version_list_size = 0;
|
int version_list_size = 0;
|
||||||
tx::Engine engine;
|
tx::Engine engine;
|
||||||
tx::Transaction *t1 = engine.Begin();
|
tx::Transaction *t1 = engine.Begin();
|
||||||
mvcc::VersionList<TestClass> version_list{*t1, 0, version_list_size};
|
mvcc::VersionList<TestClass> version_list{*t1, storage::Gid::FromInt(0),
|
||||||
|
version_list_size};
|
||||||
TestClass *v1 = nullptr;
|
TestClass *v1 = nullptr;
|
||||||
tx::Transaction *t2 = nullptr;
|
tx::Transaction *t2 = nullptr;
|
||||||
tx::TransactionId id0, id1, id2;
|
tx::TransactionId id0, id1, id2;
|
||||||
|
@ -24,7 +24,7 @@ class MvccGcTest : public ::testing::Test {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::atomic<int> record_destruction_count{0};
|
std::atomic<int> record_destruction_count{0};
|
||||||
mvcc::VersionList<DestrCountRec> version_list{*t0, 0,
|
mvcc::VersionList<DestrCountRec> version_list{*t0, storage::Gid::FromInt(0),
|
||||||
record_destruction_count};
|
record_destruction_count};
|
||||||
std::vector<tx::Transaction *> transactions{t0};
|
std::vector<tx::Transaction *> transactions{t0};
|
||||||
|
|
||||||
@ -124,8 +124,8 @@ TEST(GarbageCollector, GcClean) {
|
|||||||
// create a version list in transaction t1
|
// create a version list in transaction t1
|
||||||
auto t1 = engine.Begin();
|
auto t1 = engine.Begin();
|
||||||
std::atomic<int> record_destruction_count{0};
|
std::atomic<int> record_destruction_count{0};
|
||||||
auto vl =
|
auto vl = new mvcc::VersionList<DestrCountRec>(*t1, storage::Gid::FromInt(0),
|
||||||
new mvcc::VersionList<DestrCountRec>(*t1, 0, record_destruction_count);
|
record_destruction_count);
|
||||||
auto access = collection.access();
|
auto access = collection.access();
|
||||||
access.insert(0, vl);
|
access.insert(0, vl);
|
||||||
engine.Commit(*t1);
|
engine.Commit(*t1);
|
||||||
|
@ -154,7 +154,7 @@ TEST_F(UniqueConstraintsTest, InsertAbortInsert) {
|
|||||||
|
|
||||||
// NOLINTNEXTLINE(hicpp-special-member-functions)
|
// NOLINTNEXTLINE(hicpp-special-member-functions)
|
||||||
TEST_F(UniqueConstraintsTest, InsertRemoveAbortInsert) {
|
TEST_F(UniqueConstraintsTest, InsertRemoveAbortInsert) {
|
||||||
storage::Gid gid = 0;
|
auto gid = storage::Gid::FromInt(0);
|
||||||
{
|
{
|
||||||
auto dba = db_.Access();
|
auto dba = db_.Access();
|
||||||
auto v = dba.InsertVertex();
|
auto v = dba.InsertVertex();
|
||||||
@ -224,7 +224,7 @@ TEST_F(UniqueConstraintsTest, InsertInsertReversed) {
|
|||||||
|
|
||||||
// NOLINTNEXTLINE(hicpp-special-member-functions)
|
// NOLINTNEXTLINE(hicpp-special-member-functions)
|
||||||
TEST_F(UniqueConstraintsTest, InsertRemoveInsert) {
|
TEST_F(UniqueConstraintsTest, InsertRemoveInsert) {
|
||||||
storage::Gid gid = 0;
|
auto gid = storage::Gid::FromInt(0);
|
||||||
{
|
{
|
||||||
auto dba = db_.Access();
|
auto dba = db_.Access();
|
||||||
auto v = dba.InsertVertex();
|
auto v = dba.InsertVertex();
|
||||||
|
@ -145,13 +145,13 @@ struct hash<NodeId> {
|
|||||||
|
|
||||||
class MemgraphNodeIdMap {
|
class MemgraphNodeIdMap {
|
||||||
public:
|
public:
|
||||||
std::optional<int64_t> Get(const NodeId &node_id) const {
|
std::optional<storage::Gid> Get(const NodeId &node_id) const {
|
||||||
auto found_it = node_id_to_mg_.find(node_id);
|
auto found_it = node_id_to_mg_.find(node_id);
|
||||||
if (found_it == node_id_to_mg_.end()) return std::nullopt;
|
if (found_it == node_id_to_mg_.end()) return std::nullopt;
|
||||||
return found_it->second;
|
return found_it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t Insert(const NodeId &node_id) {
|
storage::Gid Insert(const NodeId &node_id) {
|
||||||
auto gid = generator_.Next();
|
auto gid = generator_.Next();
|
||||||
node_id_to_mg_[node_id] = gid;
|
node_id_to_mg_[node_id] = gid;
|
||||||
return gid;
|
return gid;
|
||||||
@ -159,7 +159,7 @@ class MemgraphNodeIdMap {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
storage::GidGenerator generator_;
|
storage::GidGenerator generator_;
|
||||||
std::unordered_map<NodeId, int64_t> node_id_to_mg_;
|
std::unordered_map<NodeId, storage::Gid> node_id_to_mg_;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<std::string> ReadRow(std::istream &stream) {
|
std::vector<std::string> ReadRow(std::istream &stream) {
|
||||||
@ -307,7 +307,7 @@ void WriteNodeRow(
|
|||||||
additional_labels.end());
|
additional_labels.end());
|
||||||
CHECK(id) << "Node ID must be specified";
|
CHECK(id) << "Node ID must be specified";
|
||||||
encoder->WriteVertex(
|
encoder->WriteVertex(
|
||||||
{communication::bolt::Id::FromUint(*id), labels, properties});
|
{communication::bolt::Id::FromUint(id->AsUint()), labels, properties});
|
||||||
}
|
}
|
||||||
|
|
||||||
auto PassNodes(
|
auto PassNodes(
|
||||||
@ -334,8 +334,8 @@ void WriteRelationshipsRow(
|
|||||||
communication::bolt::BaseEncoder<HashedFileWriter> *encoder,
|
communication::bolt::BaseEncoder<HashedFileWriter> *encoder,
|
||||||
const std::vector<Field> &fields, const std::vector<std::string> &row,
|
const std::vector<Field> &fields, const std::vector<std::string> &row,
|
||||||
const MemgraphNodeIdMap &node_id_map, storage::Gid relationship_id) {
|
const MemgraphNodeIdMap &node_id_map, storage::Gid relationship_id) {
|
||||||
std::optional<int64_t> start_id;
|
std::optional<storage::Gid> start_id;
|
||||||
std::optional<int64_t> end_id;
|
std::optional<storage::Gid> end_id;
|
||||||
std::optional<std::string> relationship_type;
|
std::optional<std::string> relationship_type;
|
||||||
std::map<std::string, communication::bolt::Value> properties;
|
std::map<std::string, communication::bolt::Value> properties;
|
||||||
for (int i = 0; i < row.size(); ++i) {
|
for (int i = 0; i < row.size(); ++i) {
|
||||||
@ -369,9 +369,9 @@ void WriteRelationshipsRow(
|
|||||||
CHECK(end_id) << "END_ID must be set";
|
CHECK(end_id) << "END_ID must be set";
|
||||||
CHECK(relationship_type) << "Relationship TYPE must be set";
|
CHECK(relationship_type) << "Relationship TYPE must be set";
|
||||||
|
|
||||||
auto bolt_id = communication::bolt::Id::FromUint(relationship_id);
|
auto bolt_id = communication::bolt::Id::FromUint(relationship_id.AsUint());
|
||||||
auto bolt_start_id = communication::bolt::Id::FromUint(*start_id);
|
auto bolt_start_id = communication::bolt::Id::FromUint(start_id->AsUint());
|
||||||
auto bolt_end_id = communication::bolt::Id::FromUint(*end_id);
|
auto bolt_end_id = communication::bolt::Id::FromUint(end_id->AsUint());
|
||||||
encoder->WriteEdge(
|
encoder->WriteEdge(
|
||||||
{bolt_id, bolt_start_id, bolt_end_id, *relationship_type, properties});
|
{bolt_id, bolt_start_id, bolt_end_id, *relationship_type, properties});
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user