diff --git a/src/database/graph_db.hpp b/src/database/graph_db.hpp index c0254022a..00061d131 100644 --- a/src/database/graph_db.hpp +++ b/src/database/graph_db.hpp @@ -11,6 +11,7 @@ #include "database/indexes/label_property_index.hpp" #include "durability/wal.hpp" #include "mvcc/version_list.hpp" +#include "storage/concurrent_id_mapper.hpp" #include "storage/deferred_deleter.hpp" #include "storage/edge.hpp" #include "storage/garbage_collector.hpp" @@ -114,9 +115,15 @@ class GraphDb { // unique object stores // TODO this should be also garbage collected - ConcurrentSet labels_; - ConcurrentSet edge_types_; - ConcurrentSet properties_; + ConcurrentIdMapper + labels_; + ConcurrentIdMapper + edge_types_; + ConcurrentIdMapper + properties_; // indexes KeyIndex labels_index_; diff --git a/src/database/graph_db_accessor.cpp b/src/database/graph_db_accessor.cpp index 8f99ae4ae..a98b9cb9f 100644 --- a/src/database/graph_db_accessor.cpp +++ b/src/database/graph_db_accessor.cpp @@ -336,37 +336,37 @@ void GraphDbAccessor::RemoveEdge(EdgeAccessor &edge_accessor, GraphDbTypes::Label GraphDbAccessor::Label(const std::string &label_name) { DCHECK(!commited_ && !aborted_) << "Accessor committed or aborted"; - return &(*db_.labels_.access().insert(label_name).first); + return db_.labels_.insert_value(label_name); } const std::string &GraphDbAccessor::LabelName( const GraphDbTypes::Label label) const { DCHECK(!commited_ && !aborted_) << "Accessor committed or aborted"; - return *label; + return db_.labels_.value_by_id(label); } GraphDbTypes::EdgeType GraphDbAccessor::EdgeType( const std::string &edge_type_name) { DCHECK(!commited_ && !aborted_) << "Accessor committed or aborted"; - return &(*db_.edge_types_.access().insert(edge_type_name).first); + return db_.edge_types_.insert_value(edge_type_name); } const std::string &GraphDbAccessor::EdgeTypeName( const GraphDbTypes::EdgeType edge_type) const { DCHECK(!commited_ && !aborted_) << "Accessor committed or aborted"; - return *edge_type; + return db_.edge_types_.value_by_id(edge_type); } GraphDbTypes::Property GraphDbAccessor::Property( const std::string &property_name) { DCHECK(!commited_ && !aborted_) << "Accessor committed or aborted"; - return &(*db_.properties_.access().insert(property_name).first); + return db_.properties_.insert_value(property_name); } const std::string &GraphDbAccessor::PropertyName( const GraphDbTypes::Property property) const { DCHECK(!commited_ && !aborted_) << "Accessor committed or aborted"; - return *property; + return db_.properties_.value_by_id(property); } int64_t GraphDbAccessor::Counter(const std::string &name) { diff --git a/src/database/graph_db_datatypes.hpp b/src/database/graph_db_datatypes.hpp index 4cd8499a9..9f88a8ee0 100644 --- a/src/database/graph_db_datatypes.hpp +++ b/src/database/graph_db_datatypes.hpp @@ -2,10 +2,54 @@ #include +#include "utils/total_ordering.hpp" + namespace GraphDbTypes { -// definitions for what data types are used for a Label, Property, EdgeType -// TODO: Typedefing pointers is terrible astractions, get rid of it. -using Label = const std::string *; -using EdgeType = const std::string *; -using Property = const std::string *; +template +class Common : TotalOrdering { + public: + using StorageT = uint16_t; + + Common() {} + explicit Common(const StorageT storage) : storage_(storage) {} + friend bool operator==(const TSpecificType &a, const TSpecificType &b) { + return a.storage_ == b.storage_; + } + friend bool operator<(const TSpecificType &a, const TSpecificType &b) { + return a.storage_ < b.storage_; + } + + struct Hash { + std::hash hash{}; + size_t operator()(const TSpecificType &t) const { return hash(t.storage_); } + }; + + private: + StorageT storage_{0}; }; + +class Label : public Common