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:
florijan 2017-03-14 12:55:10 +01:00
parent 2e0cc13813
commit 09999e877f
6 changed files with 35 additions and 39 deletions

View File

@ -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) {

View File

@ -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:

View File

@ -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());
}

View File

@ -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_;
}

View File

@ -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

View File

@ -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()); }
};