2017-04-10 18:22:48 +08:00
|
|
|
#include "storage/vertex_accessor.hpp"
|
|
|
|
|
2017-02-17 00:43:39 +08:00
|
|
|
#include <algorithm>
|
|
|
|
|
2017-04-03 17:26:32 +08:00
|
|
|
#include "database/graph_db_accessor.hpp"
|
2017-02-15 21:10:16 +08:00
|
|
|
#include "storage/util.hpp"
|
2017-04-10 18:22:48 +08:00
|
|
|
#include "utils/algorithm.hpp"
|
2016-08-25 22:29:45 +08:00
|
|
|
|
2017-04-03 17:12:15 +08:00
|
|
|
size_t VertexAccessor::out_degree() const { return current().out_.size(); }
|
2016-08-30 13:16:04 +08:00
|
|
|
|
2017-04-03 17:12:15 +08:00
|
|
|
size_t VertexAccessor::in_degree() const { return current().in_.size(); }
|
2016-07-05 11:01:22 +08:00
|
|
|
|
2017-03-29 18:37:58 +08:00
|
|
|
bool VertexAccessor::add_label(GraphDbTypes::Label label) {
|
2017-04-03 17:12:15 +08:00
|
|
|
auto &labels_view = current().labels_;
|
2017-02-17 00:43:39 +08:00
|
|
|
auto found = std::find(labels_view.begin(), labels_view.end(), label);
|
2017-02-18 18:54:37 +08:00
|
|
|
if (found != labels_view.end()) return false;
|
2017-02-17 00:43:39 +08:00
|
|
|
|
|
|
|
// not a duplicate label, add it
|
2017-04-14 23:32:59 +08:00
|
|
|
Vertex &vertex = update();
|
|
|
|
vertex.labels_.emplace_back(label);
|
|
|
|
this->db_accessor().update_label_index(label, *this, &vertex);
|
2017-02-17 00:43:39 +08:00
|
|
|
return true;
|
2016-07-05 11:01:22 +08:00
|
|
|
}
|
|
|
|
|
2017-03-29 18:37:58 +08:00
|
|
|
size_t VertexAccessor::remove_label(GraphDbTypes::Label label) {
|
2017-02-17 00:43:39 +08:00
|
|
|
auto &labels = update().labels_;
|
|
|
|
auto found = std::find(labels.begin(), labels.end(), label);
|
2017-02-18 18:54:37 +08:00
|
|
|
if (found == labels.end()) return 0;
|
2017-02-17 00:43:39 +08:00
|
|
|
|
|
|
|
std::swap(*found, labels.back());
|
|
|
|
labels.pop_back();
|
|
|
|
return 1;
|
2016-08-18 22:34:36 +08:00
|
|
|
}
|
2016-07-05 11:01:22 +08:00
|
|
|
|
2017-03-29 18:37:58 +08:00
|
|
|
bool VertexAccessor::has_label(GraphDbTypes::Label label) const {
|
2017-04-03 17:12:15 +08:00
|
|
|
auto &labels = this->current().labels_;
|
2017-02-17 00:43:39 +08:00
|
|
|
return std::find(labels.begin(), labels.end(), label) != labels.end();
|
2016-07-05 11:01:22 +08:00
|
|
|
}
|
|
|
|
|
2017-03-29 18:37:58 +08:00
|
|
|
const std::vector<GraphDbTypes::Label> &VertexAccessor::labels() const {
|
2017-04-03 17:12:15 +08:00
|
|
|
return this->current().labels_;
|
2016-07-05 11:01:22 +08:00
|
|
|
}
|
2017-04-10 18:22:48 +08:00
|
|
|
|
|
|
|
std::ostream &operator<<(std::ostream &os, const VertexAccessor &va) {
|
|
|
|
os << "V(";
|
|
|
|
PrintIterable(os, va.labels(), ":",
|
|
|
|
[&](auto label) { return va.db_accessor().label_name(label); });
|
|
|
|
os << " {";
|
|
|
|
auto prop_to_string = [&](const auto kv) {
|
|
|
|
std::stringstream ss;
|
|
|
|
ss << va.db_accessor().property_name(kv.first) << ": " << kv.second;
|
|
|
|
return ss.str();
|
|
|
|
};
|
|
|
|
PrintIterable(os, va.Properties(), ", ", prop_to_string);
|
|
|
|
return os << "})";
|
|
|
|
}
|