flex/storages/rt_mutable_graph/schema.h (225 lines of code) (raw):
/** Copyright 2020 Alibaba Group Holding Limited.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef GRAPHSCOPE_FRAGMENT_SCHEMA_H_
#define GRAPHSCOPE_FRAGMENT_SCHEMA_H_
#include "flex/engines/hqps_db/core/utils/hqps_utils.h"
#include "flex/storages/rt_mutable_graph/types.h"
#include "flex/utils/id_indexer.h"
#include "flex/utils/property/table.h"
#include "flex/utils/property/types.h"
#include "flex/utils/result.h"
#include "flex/utils/yaml_utils.h"
namespace gs {
class Schema {
public:
// How many built-in plugins are there.
// Currently only one builtin plugin, SERVER_APP is supported.
static constexpr uint8_t RESERVED_PLUGIN_NUM = 1;
static constexpr uint8_t MAX_PLUGIN_ID = 245;
static constexpr uint8_t ADHOC_READ_PLUGIN_ID = 253;
static constexpr uint8_t HQPS_ADHOC_READ_PLUGIN_ID = 254;
static constexpr uint8_t HQPS_ADHOC_WRITE_PLUGIN_ID = 255;
static constexpr uint8_t CYPHER_READ_PLUGIN_ID = 248;
static constexpr uint8_t CYPHER_WRITE_PLUGIN_ID = 247;
static constexpr uint8_t CYPHER_READ_DEBUG_PLUGIN_ID = 246;
static constexpr const char* HQPS_ADHOC_READ_PLUGIN_ID_STR = "\xFE";
static constexpr const char* HQPS_ADHOC_WRITE_PLUGIN_ID_STR = "\xFF";
static constexpr const char* ADHOC_READ_PLUGIN_ID_STR = "\xFD";
static constexpr const char* CYPHER_READ_DEBUG_PLUGIN_ID_STR = "\xF6";
static constexpr const char* PRIMITIVE_TYPE_KEY = "primitive_type";
static constexpr const char* VARCHAR_KEY = "varchar";
static constexpr const char* MAX_LENGTH_KEY = "max_length";
// The builtin plugins are reserved for the system.
static constexpr uint8_t BUILTIN_PLUGIN_NUM = 4;
static constexpr uint8_t BUILTIN_COUNT_VERTICES_PLUGIN_ID = 252;
static constexpr const char* BUILTIN_COUNT_VERTICES_PLUGIN_NAME =
"count_vertices";
static constexpr uint8_t BUILTIN_PAGERANK_PLUGIN_ID = 251;
static constexpr const char* BUILTIN_PAGERANK_PLUGIN_NAME = "pagerank";
static constexpr uint8_t BUILTIN_K_DEGREE_NEIGHBORS_PLUGIN_ID = 250;
static constexpr const char* BUILTIN_K_DEGREE_NEIGHBORS_PLUGIN_NAME =
"k_neighbors";
static constexpr uint8_t BUILTIN_TVSP_PLUGIN_ID = 249;
static constexpr const char* BUILTIN_TVSP_PLUGIN_NAME =
"shortest_path_among_three";
static constexpr const char* BUILTIN_PLUGIN_NAMES[BUILTIN_PLUGIN_NUM] = {
BUILTIN_COUNT_VERTICES_PLUGIN_NAME, BUILTIN_PAGERANK_PLUGIN_NAME,
BUILTIN_K_DEGREE_NEIGHBORS_PLUGIN_NAME, BUILTIN_TVSP_PLUGIN_NAME};
static constexpr uint8_t BUILTIN_PLUGIN_IDS[BUILTIN_PLUGIN_NUM] = {
BUILTIN_COUNT_VERTICES_PLUGIN_ID, BUILTIN_PAGERANK_PLUGIN_ID,
BUILTIN_K_DEGREE_NEIGHBORS_PLUGIN_ID, BUILTIN_TVSP_PLUGIN_ID};
// An array containing all compatible versions of schema.
static const std::vector<std::string> COMPATIBLE_VERSIONS;
static constexpr const char* DEFAULT_SCHEMA_VERSION = "v0.0";
static bool IsBuiltinPlugin(const std::string& plugin_name);
using label_type = label_t;
Schema();
~Schema();
static const std::vector<std::string>& GetCompatibleVersions();
void Clear();
void add_vertex_label(
const std::string& label, const std::vector<PropertyType>& property_types,
const std::vector<std::string>& property_names,
const std::vector<std::tuple<PropertyType, std::string, size_t>>&
primary_key,
const std::vector<StorageStrategy>& strategies = {},
size_t max_vnum = static_cast<size_t>(1) << 32,
const std::string& description = "");
void add_edge_label(const std::string& src_label,
const std::string& dst_label,
const std::string& edge_label,
const std::vector<PropertyType>& properties,
const std::vector<std::string>& prop_names,
EdgeStrategy oe = EdgeStrategy::kMultiple,
EdgeStrategy ie = EdgeStrategy::kMultiple,
bool oe_mutable = true, bool ie_mutable = true,
bool sort_on_compaction = false,
const std::string& description = "");
label_t vertex_label_num() const;
label_t edge_label_num() const;
bool contains_vertex_label(const std::string& label) const;
label_t get_vertex_label_id(const std::string& label) const;
void set_vertex_properties(
label_t label_id, const std::vector<PropertyType>& types,
const std::vector<StorageStrategy>& strategies = {});
const std::vector<PropertyType>& get_vertex_properties(
const std::string& label) const;
const std::vector<std::string>& get_vertex_property_names(
const std::string& label) const;
const std::string& get_vertex_description(const std::string& label) const;
const std::vector<PropertyType>& get_vertex_properties(label_t label) const;
const std::vector<std::string>& get_vertex_property_names(
label_t label) const;
const std::string& get_vertex_description(label_t label) const;
const std::vector<StorageStrategy>& get_vertex_storage_strategies(
const std::string& label) const;
size_t get_max_vnum(const std::string& label) const;
bool exist(const std::string& src_label, const std::string& dst_label,
const std::string& edge_label) const;
bool exist(label_type src_label, label_type dst_label,
label_type edge_label) const;
const std::vector<PropertyType>& get_edge_properties(
const std::string& src_label, const std::string& dst_label,
const std::string& label) const;
const std::vector<PropertyType>& get_edge_properties(label_t src_label,
label_t dst_label,
label_t label) const;
const std::string& get_compiler_path() const;
void set_compiler_path(const std::string& compiler_path);
std::string get_edge_description(const std::string& src_label,
const std::string& dst_label,
const std::string& label) const;
std::string get_edge_description(label_t src_label, label_t dst_label,
label_t label) const;
PropertyType get_edge_property(label_t src, label_t dst, label_t edge) const;
const std::vector<std::string>& get_edge_property_names(
const std::string& src_label, const std::string& dst_label,
const std::string& label) const;
const std::vector<std::string>& get_edge_property_names(
const label_t& src_label, const label_t& dst_label,
const label_t& label) const;
bool vertex_has_property(const std::string& label,
const std::string& prop) const;
bool vertex_has_primary_key(const std::string& label,
const std::string& prop) const;
bool edge_has_property(const std::string& src_label,
const std::string& dst_label,
const std::string& edge_label,
const std::string& prop) const;
bool has_vertex_label(const std::string& label) const;
bool has_edge_label(const std::string& src_label,
const std::string& dst_label,
const std::string& edge_label) const;
bool has_edge_label(label_t src_label, label_t dst_label,
label_t edge_label) const;
bool valid_edge_property(const std::string& src_label,
const std::string& dst_label,
const std::string& label) const;
EdgeStrategy get_outgoing_edge_strategy(const std::string& src_label,
const std::string& dst_label,
const std::string& label) const;
EdgeStrategy get_incoming_edge_strategy(const std::string& src_label,
const std::string& dst_label,
const std::string& label) const;
inline EdgeStrategy get_outgoing_edge_strategy(label_t src_label,
label_t dst_label,
label_t label) const {
uint32_t index = generate_edge_label(src_label, dst_label, label);
return oe_strategy_.at(index);
}
inline EdgeStrategy get_incoming_edge_strategy(label_t src_label,
label_t dst_label,
label_t label) const {
uint32_t index = generate_edge_label(src_label, dst_label, label);
return ie_strategy_.at(index);
}
bool outgoing_edge_mutable(const std::string& src_label,
const std::string& dst_label,
const std::string& label) const;
bool incoming_edge_mutable(const std::string& src_label,
const std::string& dst_label,
const std::string& label) const;
bool get_sort_on_compaction(const std::string& src_label,
const std::string& dst_label,
const std::string& label) const;
bool contains_edge_label(const std::string& label) const;
label_t get_edge_label_id(const std::string& label) const;
std::string get_vertex_label_name(label_t index) const;
std::string get_edge_label_name(label_t index) const;
const std::vector<std::tuple<PropertyType, std::string, size_t>>&
get_vertex_primary_key(label_t index) const;
const std::string& get_vertex_primary_key_name(label_t index) const;
void Serialize(std::unique_ptr<grape::LocalIOAdaptor>& writer) const;
void Deserialize(std::unique_ptr<grape::LocalIOAdaptor>& reader);
static Result<Schema> LoadFromYaml(const std::string& schema_config);
static Result<Schema> LoadFromYamlNode(const YAML::Node& schema_node);
bool Equals(const Schema& other) const;
// Return the map from plugin name to plugin id
const std::unordered_map<std::string, std::pair<std::string, uint8_t>>&
GetPlugins() const;
bool EmplacePlugins(
const std::vector<std::pair<std::string, std::string>>& plugins);
void SetPluginDir(const std::string& plugin_dir);
void RemovePlugin(const std::string& plugin_name);
std::string GetPluginDir() const;
inline void SetGraphName(const std::string& name) { name_ = name; }
inline void SetGraphId(const std::string& id) { id_ = id; }
inline std::string GetGraphName() const { return name_; }
inline std::string GetGraphId() const { return id_; }
std::string GetDescription() const;
void SetDescription(const std::string& description);
void SetRemotePath(const std::string& remote_path);
inline std::string GetRemotePath() const { return remote_path_; }
void SetVersion(const std::string& version);
std::string GetVersion() const;
bool has_multi_props_edge() const;
const std::unordered_map<std::string, std::pair<PropertyType, uint8_t>>&
get_vprop_name_to_type_and_index(label_t label) const;
private:
label_t vertex_label_to_index(const std::string& label);
label_t edge_label_to_index(const std::string& label);
uint32_t generate_edge_label(label_t src, label_t dst, label_t edge) const;
std::string name_, id_;
IdIndexer<std::string, label_t> vlabel_indexer_;
IdIndexer<std::string, label_t> elabel_indexer_;
std::vector<std::vector<PropertyType>> vproperties_;
std::vector<std::vector<std::string>> vprop_names_;
std::vector<std::string> v_descriptions_;
std::vector<std::vector<std::tuple<PropertyType, std::string, size_t>>>
v_primary_keys_; // the third element is the index of the property in the
// vertex property list
std::vector<std::vector<StorageStrategy>> vprop_storage_;
std::map<uint32_t, std::vector<PropertyType>> eproperties_;
std::map<uint32_t, std::vector<std::string>> eprop_names_;
std::map<uint32_t, std::string> e_descriptions_;
std::map<uint32_t, EdgeStrategy> oe_strategy_;
std::map<uint32_t, EdgeStrategy> ie_strategy_;
std::map<uint32_t, bool> oe_mutability_;
std::map<uint32_t, bool> ie_mutability_;
std::map<uint32_t, bool> sort_on_compactions_;
std::vector<std::unordered_map<std::string, std::pair<PropertyType, uint8_t>>>
vprop_name_to_type_and_index_;
std::vector<size_t> max_vnum_;
std::unordered_map<std::string, std::pair<std::string, uint8_t>>
plugin_name_to_path_and_id_; // key is plugin_name, value is plugin_path
// and plugin_id
std::string plugin_dir_;
std::string description_;
std::string version_;
std::string compiler_path_;
std::string remote_path_; // The path to the data on the remote storage
bool has_multi_props_edge_;
};
} // namespace gs
#endif // GRAPHSCOPE_FRAGMENT_SCHEMA_H_