RecordAccessor uses pointers for storage so it's move/copy assignable
Summary: See above. Reviewers: buda, teon.banek, mislav.bradac Reviewed By: mislav.bradac Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D118
This commit is contained in:
parent
2e0cc13813
commit
09999e877f
@ -57,7 +57,7 @@ bool GraphDbAccessor::remove_vertex(VertexAccessor& vertex_accessor) {
|
||||
if (vertex_accessor.out_degree() > 0 || vertex_accessor.in_degree() > 0)
|
||||
return false;
|
||||
|
||||
vertex_accessor.vlist_.remove(&vertex_accessor.update(), *transaction_);
|
||||
vertex_accessor.vlist_->remove(&vertex_accessor.update(), *transaction_);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -70,7 +70,7 @@ void GraphDbAccessor::detach_remove_vertex(VertexAccessor& vertex_accessor) {
|
||||
for (auto edge_accessor : vertex_accessor.out()) remove_edge(edge_accessor);
|
||||
|
||||
// mvcc removal of the vertex
|
||||
vertex_accessor.vlist_.remove(&vertex_accessor.update(), *transaction_);
|
||||
vertex_accessor.vlist_->remove(&vertex_accessor.update(), *transaction_);
|
||||
}
|
||||
|
||||
EdgeAccessor GraphDbAccessor::insert_edge(VertexAccessor& from,
|
||||
@ -79,7 +79,7 @@ EdgeAccessor GraphDbAccessor::insert_edge(VertexAccessor& from,
|
||||
// create an edge
|
||||
auto edge_vlist = new mvcc::VersionList<Edge>();
|
||||
Edge* edge =
|
||||
edge_vlist->insert(*transaction_, from.vlist_, to.vlist_, edge_type);
|
||||
edge_vlist->insert(*transaction_, *from.vlist_, *to.vlist_, edge_type);
|
||||
|
||||
// set the vertex connections to this edge
|
||||
from.update().out_.emplace_back(edge_vlist);
|
||||
@ -109,9 +109,9 @@ void swap_out_edge(std::vector<mvcc::VersionList<Edge>*>& edges,
|
||||
}
|
||||
|
||||
void GraphDbAccessor::remove_edge(EdgeAccessor& edge_accessor) {
|
||||
swap_out_edge(edge_accessor.from().update().out_, &edge_accessor.vlist_);
|
||||
swap_out_edge(edge_accessor.to().update().in_, &edge_accessor.vlist_);
|
||||
edge_accessor.vlist_.remove(&edge_accessor.update(), *transaction_);
|
||||
swap_out_edge(edge_accessor.from().update().out_, edge_accessor.vlist_);
|
||||
swap_out_edge(edge_accessor.to().update().in_, edge_accessor.vlist_);
|
||||
edge_accessor.vlist_->remove(&edge_accessor.update(), *transaction_);
|
||||
}
|
||||
|
||||
GraphDb::Label GraphDbAccessor::label(const std::string& label_name) {
|
||||
|
@ -176,7 +176,7 @@ class GraphDbAccessor {
|
||||
*/
|
||||
template <typename TRecord>
|
||||
void init_record(RecordAccessor<TRecord>& accessor) {
|
||||
accessor.record_ = accessor.vlist_.find(*transaction_);
|
||||
accessor.record_ = accessor.vlist_->find(*transaction_);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -186,7 +186,7 @@ class GraphDbAccessor {
|
||||
template <typename TRecord>
|
||||
void update(RecordAccessor<TRecord>& accessor) {
|
||||
if (!accessor.record_->is_visible_write(*transaction_))
|
||||
accessor.record_ = accessor.vlist_.update(*transaction_);
|
||||
accessor.record_ = accessor.vlist_->update(*transaction_);
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -8,9 +8,9 @@ void EdgeAccessor::set_edge_type(GraphDb::EdgeType edge_type) {
|
||||
GraphDb::EdgeType EdgeAccessor::edge_type() const { return view().edge_type_; }
|
||||
|
||||
VertexAccessor EdgeAccessor::from() const {
|
||||
return VertexAccessor(view().from_, db_accessor_);
|
||||
return VertexAccessor(view().from_, db_accessor());
|
||||
}
|
||||
|
||||
VertexAccessor EdgeAccessor::to() const {
|
||||
return VertexAccessor(view().to_, db_accessor_);
|
||||
return VertexAccessor(view().to_, db_accessor());
|
||||
}
|
||||
|
@ -7,8 +7,8 @@
|
||||
template <typename TRecord>
|
||||
RecordAccessor<TRecord>::RecordAccessor(mvcc::VersionList<TRecord> &vlist,
|
||||
GraphDbAccessor &db_accessor)
|
||||
: db_accessor_(db_accessor), vlist_(vlist), record_(nullptr) {
|
||||
db_accessor_.init_record(*this);
|
||||
: db_accessor_(&db_accessor), vlist_(&vlist), record_(nullptr) {
|
||||
db_accessor.init_record(*this);
|
||||
debug_assert(record_ != nullptr, "Record is nullptr.");
|
||||
}
|
||||
|
||||
@ -16,7 +16,7 @@ template <typename TRecord>
|
||||
RecordAccessor<TRecord>::RecordAccessor(mvcc::VersionList<TRecord> &vlist,
|
||||
TRecord &record,
|
||||
GraphDbAccessor &db_accessor)
|
||||
: db_accessor_(db_accessor), vlist_(vlist), record_(&record) {
|
||||
: db_accessor_(&db_accessor), vlist_(&vlist), record_(&record) {
|
||||
debug_assert(record_ != nullptr, "Record is nullptr.");
|
||||
}
|
||||
|
||||
@ -46,18 +46,13 @@ void RecordAccessor<TRecord>::PropertiesAccept(
|
||||
}
|
||||
|
||||
template <typename TRecord>
|
||||
GraphDbAccessor &RecordAccessor<TRecord>::db_accessor() {
|
||||
return db_accessor_;
|
||||
}
|
||||
|
||||
template <typename TRecord>
|
||||
const GraphDbAccessor &RecordAccessor<TRecord>::db_accessor() const {
|
||||
return db_accessor_;
|
||||
GraphDbAccessor &RecordAccessor<TRecord>::db_accessor() const {
|
||||
return *db_accessor_;
|
||||
}
|
||||
|
||||
template <typename TRecord>
|
||||
TRecord &RecordAccessor<TRecord>::update() {
|
||||
db_accessor_.update(*this);
|
||||
db_accessor().update(*this);
|
||||
return *record_;
|
||||
}
|
||||
|
||||
|
@ -51,6 +51,12 @@ class RecordAccessor {
|
||||
RecordAccessor(mvcc::VersionList<TRecord>& vlist, TRecord& record,
|
||||
GraphDbAccessor& db_accessor);
|
||||
|
||||
// this class is default copyable, movable and assignable
|
||||
RecordAccessor(const RecordAccessor &other) = default;
|
||||
RecordAccessor(RecordAccessor &&other) = default;
|
||||
RecordAccessor &operator=(const RecordAccessor &other) = default;
|
||||
RecordAccessor &operator=(RecordAccessor &&other) = default;
|
||||
|
||||
/**
|
||||
* Gets the property for the given key.
|
||||
* @param key
|
||||
@ -94,21 +100,21 @@ class RecordAccessor {
|
||||
* not actual values inside RecordAccessors.
|
||||
*/
|
||||
friend bool operator<(const RecordAccessor& a, const RecordAccessor& b) {
|
||||
debug_assert(&a.db_accessor_ == &b.db_accessor_,
|
||||
debug_assert(a.db_accessor_ == b.db_accessor_,
|
||||
"Not in the same transaction."); // assume the same
|
||||
// db_accessor / transaction
|
||||
return &a.vlist_ < &b.vlist_;
|
||||
return a.vlist_ < b.vlist_;
|
||||
}
|
||||
|
||||
friend bool operator==(const RecordAccessor& a, const RecordAccessor& b) {
|
||||
debug_assert(&a.db_accessor_ == &b.db_accessor_,
|
||||
debug_assert(a.db_accessor_ == b.db_accessor_,
|
||||
"Not in the same transaction."); // assume the same
|
||||
// db_accessor / transaction
|
||||
return &a.vlist_ == &b.vlist_;
|
||||
return a.vlist_ == b.vlist_;
|
||||
}
|
||||
|
||||
friend bool operator!=(const RecordAccessor& a, const RecordAccessor& b) {
|
||||
debug_assert(&a.db_accessor_ == &b.db_accessor_,
|
||||
debug_assert(a.db_accessor_ == b.db_accessor_,
|
||||
"Not in the same transaction."); // assume the same
|
||||
// db_accessor / transaction
|
||||
return !(a == b);
|
||||
@ -119,14 +125,7 @@ class RecordAccessor {
|
||||
*
|
||||
* @return See above.
|
||||
*/
|
||||
GraphDbAccessor& db_accessor();
|
||||
|
||||
/**
|
||||
* Returns a GraphDB accessor of this record accessor.
|
||||
*
|
||||
* @return See above.
|
||||
*/
|
||||
const GraphDbAccessor& db_accessor() const;
|
||||
GraphDbAccessor& db_accessor() const;
|
||||
|
||||
protected:
|
||||
/**
|
||||
@ -143,15 +142,17 @@ class RecordAccessor {
|
||||
*/
|
||||
const TRecord& view() const;
|
||||
|
||||
|
||||
private:
|
||||
|
||||
// The database accessor for which this record accessor is created
|
||||
// Provides means of getting to the transaction and database functions.
|
||||
// Immutable, set in the constructor and never changed.
|
||||
GraphDbAccessor& db_accessor_;
|
||||
GraphDbAccessor *db_accessor_;
|
||||
|
||||
private:
|
||||
// The record (edge or vertex) this accessor provides access to.
|
||||
// Immutable, set in the constructor and never changed.
|
||||
mvcc::VersionList<TRecord>& vlist_;
|
||||
mvcc::VersionList<TRecord> *vlist_;
|
||||
|
||||
/* The version of the record currently used in this transaction. Defaults to
|
||||
* the
|
||||
|
@ -64,10 +64,10 @@ class VertexAccessor : public RecordAccessor<Vertex> {
|
||||
/**
|
||||
* Returns EdgeAccessors for all incoming edges.
|
||||
*/
|
||||
auto in() { return make_accessor_iterator<EdgeAccessor>(view().in_, db_accessor_); }
|
||||
auto in() { return make_accessor_iterator<EdgeAccessor>(view().in_, db_accessor()); }
|
||||
|
||||
/**
|
||||
* Returns EdgeAccessors for all outgoing edges.
|
||||
*/
|
||||
auto out() { return make_accessor_iterator<EdgeAccessor>(view().out_, db_accessor_); }
|
||||
auto out() { return make_accessor_iterator<EdgeAccessor>(view().out_, db_accessor()); }
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user