Merge pull request #674 from memgraph/tyler_rename_ShardRequestManager_to_RequestRouter
[project-pineapples <- ] Rename ShardRequestManager to RequestRouter
This commit is contained in:
commit
7d52eedb21
@ -18,8 +18,8 @@
|
|||||||
#include "common/errors.hpp"
|
#include "common/errors.hpp"
|
||||||
#include "coordinator/shard_map.hpp"
|
#include "coordinator/shard_map.hpp"
|
||||||
#include "query/v2/accessors.hpp"
|
#include "query/v2/accessors.hpp"
|
||||||
|
#include "query/v2/request_router.hpp"
|
||||||
#include "query/v2/requests.hpp"
|
#include "query/v2/requests.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
|
||||||
#include "storage/v3/edge_accessor.hpp"
|
#include "storage/v3/edge_accessor.hpp"
|
||||||
#include "storage/v3/id_types.hpp"
|
#include "storage/v3/id_types.hpp"
|
||||||
#include "storage/v3/shard.hpp"
|
#include "storage/v3/shard.hpp"
|
||||||
@ -72,7 +72,7 @@ query::v2::TypedValue ToTypedValue(const Value &value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
communication::bolt::Vertex ToBoltVertex(const query::v2::accessors::VertexAccessor &vertex,
|
communication::bolt::Vertex ToBoltVertex(const query::v2::accessors::VertexAccessor &vertex,
|
||||||
const query::v2::ShardRequestManagerInterface *shard_request_manager,
|
const query::v2::RequestRouterInterface *request_router,
|
||||||
storage::v3::View /*view*/) {
|
storage::v3::View /*view*/) {
|
||||||
auto id = communication::bolt::Id::FromUint(0);
|
auto id = communication::bolt::Id::FromUint(0);
|
||||||
|
|
||||||
@ -80,44 +80,44 @@ communication::bolt::Vertex ToBoltVertex(const query::v2::accessors::VertexAcces
|
|||||||
std::vector<std::string> new_labels;
|
std::vector<std::string> new_labels;
|
||||||
new_labels.reserve(labels.size());
|
new_labels.reserve(labels.size());
|
||||||
for (const auto &label : labels) {
|
for (const auto &label : labels) {
|
||||||
new_labels.push_back(shard_request_manager->LabelToName(label.id));
|
new_labels.push_back(request_router->LabelToName(label.id));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto properties = vertex.Properties();
|
auto properties = vertex.Properties();
|
||||||
std::map<std::string, Value> new_properties;
|
std::map<std::string, Value> new_properties;
|
||||||
for (const auto &[prop, property_value] : properties) {
|
for (const auto &[prop, property_value] : properties) {
|
||||||
new_properties[shard_request_manager->PropertyToName(prop)] = ToBoltValue(property_value);
|
new_properties[request_router->PropertyToName(prop)] = ToBoltValue(property_value);
|
||||||
}
|
}
|
||||||
return communication::bolt::Vertex{id, new_labels, new_properties};
|
return communication::bolt::Vertex{id, new_labels, new_properties};
|
||||||
}
|
}
|
||||||
|
|
||||||
communication::bolt::Edge ToBoltEdge(const query::v2::accessors::EdgeAccessor &edge,
|
communication::bolt::Edge ToBoltEdge(const query::v2::accessors::EdgeAccessor &edge,
|
||||||
const query::v2::ShardRequestManagerInterface *shard_request_manager,
|
const query::v2::RequestRouterInterface *request_router,
|
||||||
storage::v3::View /*view*/) {
|
storage::v3::View /*view*/) {
|
||||||
// TODO(jbajic) Fix bolt communication
|
// TODO(jbajic) Fix bolt communication
|
||||||
auto id = communication::bolt::Id::FromUint(0);
|
auto id = communication::bolt::Id::FromUint(0);
|
||||||
auto from = communication::bolt::Id::FromUint(0);
|
auto from = communication::bolt::Id::FromUint(0);
|
||||||
auto to = communication::bolt::Id::FromUint(0);
|
auto to = communication::bolt::Id::FromUint(0);
|
||||||
const auto &type = shard_request_manager->EdgeTypeToName(edge.EdgeType());
|
const auto &type = request_router->EdgeTypeToName(edge.EdgeType());
|
||||||
|
|
||||||
auto properties = edge.Properties();
|
auto properties = edge.Properties();
|
||||||
std::map<std::string, Value> new_properties;
|
std::map<std::string, Value> new_properties;
|
||||||
for (const auto &[prop, property_value] : properties) {
|
for (const auto &[prop, property_value] : properties) {
|
||||||
new_properties[shard_request_manager->PropertyToName(prop)] = ToBoltValue(property_value);
|
new_properties[request_router->PropertyToName(prop)] = ToBoltValue(property_value);
|
||||||
}
|
}
|
||||||
return communication::bolt::Edge{id, from, to, type, new_properties};
|
return communication::bolt::Edge{id, from, to, type, new_properties};
|
||||||
}
|
}
|
||||||
|
|
||||||
communication::bolt::Path ToBoltPath(const query::v2::accessors::Path & /*edge*/,
|
communication::bolt::Path ToBoltPath(const query::v2::accessors::Path & /*edge*/,
|
||||||
const query::v2::ShardRequestManagerInterface * /*shard_request_manager*/,
|
const query::v2::RequestRouterInterface * /*request_router*/,
|
||||||
storage::v3::View /*view*/) {
|
storage::v3::View /*view*/) {
|
||||||
// TODO(jbajic) Fix bolt communication
|
// TODO(jbajic) Fix bolt communication
|
||||||
MG_ASSERT(false, "Path is unimplemented!");
|
MG_ASSERT(false, "Path is unimplemented!");
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Value ToBoltValue(const query::v2::TypedValue &value,
|
Value ToBoltValue(const query::v2::TypedValue &value, const query::v2::RequestRouterInterface *request_router,
|
||||||
const query::v2::ShardRequestManagerInterface *shard_request_manager, storage::v3::View view) {
|
storage::v3::View view) {
|
||||||
switch (value.type()) {
|
switch (value.type()) {
|
||||||
case query::v2::TypedValue::Type::Null:
|
case query::v2::TypedValue::Type::Null:
|
||||||
return {};
|
return {};
|
||||||
@ -133,7 +133,7 @@ Value ToBoltValue(const query::v2::TypedValue &value,
|
|||||||
std::vector<Value> values;
|
std::vector<Value> values;
|
||||||
values.reserve(value.ValueList().size());
|
values.reserve(value.ValueList().size());
|
||||||
for (const auto &v : value.ValueList()) {
|
for (const auto &v : value.ValueList()) {
|
||||||
auto value = ToBoltValue(v, shard_request_manager, view);
|
auto value = ToBoltValue(v, request_router, view);
|
||||||
values.emplace_back(std::move(value));
|
values.emplace_back(std::move(value));
|
||||||
}
|
}
|
||||||
return {std::move(values)};
|
return {std::move(values)};
|
||||||
@ -141,21 +141,21 @@ Value ToBoltValue(const query::v2::TypedValue &value,
|
|||||||
case query::v2::TypedValue::Type::Map: {
|
case query::v2::TypedValue::Type::Map: {
|
||||||
std::map<std::string, Value> map;
|
std::map<std::string, Value> map;
|
||||||
for (const auto &kv : value.ValueMap()) {
|
for (const auto &kv : value.ValueMap()) {
|
||||||
auto value = ToBoltValue(kv.second, shard_request_manager, view);
|
auto value = ToBoltValue(kv.second, request_router, view);
|
||||||
map.emplace(kv.first, std::move(value));
|
map.emplace(kv.first, std::move(value));
|
||||||
}
|
}
|
||||||
return {std::move(map)};
|
return {std::move(map)};
|
||||||
}
|
}
|
||||||
case query::v2::TypedValue::Type::Vertex: {
|
case query::v2::TypedValue::Type::Vertex: {
|
||||||
auto vertex = ToBoltVertex(value.ValueVertex(), shard_request_manager, view);
|
auto vertex = ToBoltVertex(value.ValueVertex(), request_router, view);
|
||||||
return {std::move(vertex)};
|
return {std::move(vertex)};
|
||||||
}
|
}
|
||||||
case query::v2::TypedValue::Type::Edge: {
|
case query::v2::TypedValue::Type::Edge: {
|
||||||
auto edge = ToBoltEdge(value.ValueEdge(), shard_request_manager, view);
|
auto edge = ToBoltEdge(value.ValueEdge(), request_router, view);
|
||||||
return {std::move(edge)};
|
return {std::move(edge)};
|
||||||
}
|
}
|
||||||
case query::v2::TypedValue::Type::Path: {
|
case query::v2::TypedValue::Type::Path: {
|
||||||
auto path = ToBoltPath(value.ValuePath(), shard_request_manager, view);
|
auto path = ToBoltPath(value.ValuePath(), request_router, view);
|
||||||
return {std::move(path)};
|
return {std::move(path)};
|
||||||
}
|
}
|
||||||
case query::v2::TypedValue::Type::Date:
|
case query::v2::TypedValue::Type::Date:
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include "communication/bolt/v1/value.hpp"
|
#include "communication/bolt/v1/value.hpp"
|
||||||
#include "coordinator/shard_map.hpp"
|
#include "coordinator/shard_map.hpp"
|
||||||
#include "query/v2/bindings/typed_value.hpp"
|
#include "query/v2/bindings/typed_value.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
#include "query/v2/request_router.hpp"
|
||||||
#include "storage/v3/property_value.hpp"
|
#include "storage/v3/property_value.hpp"
|
||||||
#include "storage/v3/result.hpp"
|
#include "storage/v3/result.hpp"
|
||||||
#include "storage/v3/shard.hpp"
|
#include "storage/v3/shard.hpp"
|
||||||
@ -32,40 +32,37 @@ namespace memgraph::glue::v2 {
|
|||||||
|
|
||||||
/// @param storage::v3::VertexAccessor for converting to
|
/// @param storage::v3::VertexAccessor for converting to
|
||||||
/// communication::bolt::Vertex.
|
/// communication::bolt::Vertex.
|
||||||
/// @param query::v2::ShardRequestManagerInterface *shard_request_manager getting label and property names.
|
/// @param query::v2::RequestRouterInterface *request_router getting label and property names.
|
||||||
/// @param storage::v3::View for deciding which vertex attributes are visible.
|
/// @param storage::v3::View for deciding which vertex attributes are visible.
|
||||||
///
|
///
|
||||||
/// @throw std::bad_alloc
|
/// @throw std::bad_alloc
|
||||||
communication::bolt::Vertex ToBoltVertex(const storage::v3::VertexAccessor &vertex,
|
communication::bolt::Vertex ToBoltVertex(const storage::v3::VertexAccessor &vertex,
|
||||||
const query::v2::ShardRequestManagerInterface *shard_request_manager,
|
const query::v2::RequestRouterInterface *request_router,
|
||||||
storage::v3::View view);
|
storage::v3::View view);
|
||||||
|
|
||||||
/// @param storage::v3::EdgeAccessor for converting to communication::bolt::Edge.
|
/// @param storage::v3::EdgeAccessor for converting to communication::bolt::Edge.
|
||||||
/// @param query::v2::ShardRequestManagerInterface *shard_request_manager getting edge type and property names.
|
/// @param query::v2::RequestRouterInterface *request_router getting edge type and property names.
|
||||||
/// @param storage::v3::View for deciding which edge attributes are visible.
|
/// @param storage::v3::View for deciding which edge attributes are visible.
|
||||||
///
|
///
|
||||||
/// @throw std::bad_alloc
|
/// @throw std::bad_alloc
|
||||||
communication::bolt::Edge ToBoltEdge(const storage::v3::EdgeAccessor &edge,
|
communication::bolt::Edge ToBoltEdge(const storage::v3::EdgeAccessor &edge,
|
||||||
const query::v2::ShardRequestManagerInterface *shard_request_manager,
|
const query::v2::RequestRouterInterface *request_router, storage::v3::View view);
|
||||||
storage::v3::View view);
|
|
||||||
|
|
||||||
/// @param query::v2::Path for converting to communication::bolt::Path.
|
/// @param query::v2::Path for converting to communication::bolt::Path.
|
||||||
/// @param query::v2::ShardRequestManagerInterface *shard_request_manager ToBoltVertex and ToBoltEdge.
|
/// @param query::v2::RequestRouterInterface *request_router ToBoltVertex and ToBoltEdge.
|
||||||
/// @param storage::v3::View for ToBoltVertex and ToBoltEdge.
|
/// @param storage::v3::View for ToBoltVertex and ToBoltEdge.
|
||||||
///
|
///
|
||||||
/// @throw std::bad_alloc
|
/// @throw std::bad_alloc
|
||||||
communication::bolt::Path ToBoltPath(const query::v2::accessors::Path &path,
|
communication::bolt::Path ToBoltPath(const query::v2::accessors::Path &path,
|
||||||
const query::v2::ShardRequestManagerInterface *shard_request_manager,
|
const query::v2::RequestRouterInterface *request_router, storage::v3::View view);
|
||||||
storage::v3::View view);
|
|
||||||
|
|
||||||
/// @param query::v2::TypedValue for converting to communication::bolt::Value.
|
/// @param query::v2::TypedValue for converting to communication::bolt::Value.
|
||||||
/// @param query::v2::ShardRequestManagerInterface *shard_request_manager ToBoltVertex and ToBoltEdge.
|
/// @param query::v2::RequestRouterInterface *request_router ToBoltVertex and ToBoltEdge.
|
||||||
/// @param storage::v3::View for ToBoltVertex and ToBoltEdge.
|
/// @param storage::v3::View for ToBoltVertex and ToBoltEdge.
|
||||||
///
|
///
|
||||||
/// @throw std::bad_alloc
|
/// @throw std::bad_alloc
|
||||||
communication::bolt::Value ToBoltValue(const query::v2::TypedValue &value,
|
communication::bolt::Value ToBoltValue(const query::v2::TypedValue &value,
|
||||||
const query::v2::ShardRequestManagerInterface *shard_request_manager,
|
const query::v2::RequestRouterInterface *request_router, storage::v3::View view);
|
||||||
storage::v3::View view);
|
|
||||||
|
|
||||||
query::v2::TypedValue ToTypedValue(const communication::bolt::Value &value);
|
query::v2::TypedValue ToTypedValue(const communication::bolt::Value &value);
|
||||||
|
|
||||||
@ -75,8 +72,7 @@ storage::v3::PropertyValue ToPropertyValue(const communication::bolt::Value &val
|
|||||||
|
|
||||||
communication::bolt::Value ToBoltValue(msgs::Value value);
|
communication::bolt::Value ToBoltValue(msgs::Value value);
|
||||||
|
|
||||||
communication::bolt::Value ToBoltValue(msgs::Value value,
|
communication::bolt::Value ToBoltValue(msgs::Value value, const query::v2::RequestRouterInterface *request_router,
|
||||||
const query::v2::ShardRequestManagerInterface *shard_request_manager,
|
|
||||||
storage::v3::View view);
|
storage::v3::View view);
|
||||||
|
|
||||||
} // namespace memgraph::glue::v2
|
} // namespace memgraph::glue::v2
|
||||||
|
@ -454,7 +454,7 @@ class BoltSession final : public memgraph::communication::bolt::Session<memgraph
|
|||||||
|
|
||||||
std::map<std::string, memgraph::communication::bolt::Value> Pull(TEncoder *encoder, std::optional<int> n,
|
std::map<std::string, memgraph::communication::bolt::Value> Pull(TEncoder *encoder, std::optional<int> n,
|
||||||
std::optional<int> qid) override {
|
std::optional<int> qid) override {
|
||||||
TypedValueResultStream stream(encoder, interpreter_.GetShardRequestManager());
|
TypedValueResultStream stream(encoder, interpreter_.GetRequestRouter());
|
||||||
return PullResults(stream, n, qid);
|
return PullResults(stream, n, qid);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -481,7 +481,7 @@ class BoltSession final : public memgraph::communication::bolt::Session<memgraph
|
|||||||
const auto &summary = interpreter_.Pull(&stream, n, qid);
|
const auto &summary = interpreter_.Pull(&stream, n, qid);
|
||||||
std::map<std::string, memgraph::communication::bolt::Value> decoded_summary;
|
std::map<std::string, memgraph::communication::bolt::Value> decoded_summary;
|
||||||
for (const auto &kv : summary) {
|
for (const auto &kv : summary) {
|
||||||
auto bolt_value = memgraph::glue::v2::ToBoltValue(kv.second, interpreter_.GetShardRequestManager(),
|
auto bolt_value = memgraph::glue::v2::ToBoltValue(kv.second, interpreter_.GetRequestRouter(),
|
||||||
memgraph::storage::v3::View::NEW);
|
memgraph::storage::v3::View::NEW);
|
||||||
decoded_summary.emplace(kv.first, std::move(bolt_value));
|
decoded_summary.emplace(kv.first, std::move(bolt_value));
|
||||||
}
|
}
|
||||||
@ -497,15 +497,14 @@ class BoltSession final : public memgraph::communication::bolt::Session<memgraph
|
|||||||
/// before forwarding the calls to original TEncoder.
|
/// before forwarding the calls to original TEncoder.
|
||||||
class TypedValueResultStream {
|
class TypedValueResultStream {
|
||||||
public:
|
public:
|
||||||
TypedValueResultStream(TEncoder *encoder,
|
TypedValueResultStream(TEncoder *encoder, const memgraph::query::v2::RequestRouterInterface *request_router)
|
||||||
const memgraph::query::v2::ShardRequestManagerInterface *shard_request_manager)
|
: encoder_(encoder), request_router_(request_router) {}
|
||||||
: encoder_(encoder), shard_request_manager_(shard_request_manager) {}
|
|
||||||
|
|
||||||
void Result(const std::vector<memgraph::query::v2::TypedValue> &values) {
|
void Result(const std::vector<memgraph::query::v2::TypedValue> &values) {
|
||||||
std::vector<memgraph::communication::bolt::Value> decoded_values;
|
std::vector<memgraph::communication::bolt::Value> decoded_values;
|
||||||
decoded_values.reserve(values.size());
|
decoded_values.reserve(values.size());
|
||||||
for (const auto &v : values) {
|
for (const auto &v : values) {
|
||||||
auto bolt_value = memgraph::glue::v2::ToBoltValue(v, shard_request_manager_, memgraph::storage::v3::View::NEW);
|
auto bolt_value = memgraph::glue::v2::ToBoltValue(v, request_router_, memgraph::storage::v3::View::NEW);
|
||||||
decoded_values.emplace_back(std::move(bolt_value));
|
decoded_values.emplace_back(std::move(bolt_value));
|
||||||
}
|
}
|
||||||
encoder_->MessageRecord(decoded_values);
|
encoder_->MessageRecord(decoded_values);
|
||||||
@ -513,7 +512,7 @@ class BoltSession final : public memgraph::communication::bolt::Session<memgraph
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
TEncoder *encoder_;
|
TEncoder *encoder_;
|
||||||
const memgraph::query::v2::ShardRequestManagerInterface *shard_request_manager_{nullptr};
|
const memgraph::query::v2::RequestRouterInterface *request_router_{nullptr};
|
||||||
};
|
};
|
||||||
memgraph::query::v2::Interpreter interpreter_;
|
memgraph::query::v2::Interpreter interpreter_;
|
||||||
memgraph::communication::v2::ServerEndpoint endpoint_;
|
memgraph::communication::v2::ServerEndpoint endpoint_;
|
||||||
|
@ -10,20 +10,20 @@
|
|||||||
// licenses/APL.txt.
|
// licenses/APL.txt.
|
||||||
|
|
||||||
#include "query/v2/accessors.hpp"
|
#include "query/v2/accessors.hpp"
|
||||||
|
#include "query/v2/request_router.hpp"
|
||||||
#include "query/v2/requests.hpp"
|
#include "query/v2/requests.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
|
||||||
#include "storage/v3/id_types.hpp"
|
#include "storage/v3/id_types.hpp"
|
||||||
|
|
||||||
namespace memgraph::query::v2::accessors {
|
namespace memgraph::query::v2::accessors {
|
||||||
EdgeAccessor::EdgeAccessor(Edge edge, const ShardRequestManagerInterface *manager)
|
EdgeAccessor::EdgeAccessor(Edge edge, const RequestRouterInterface *request_router)
|
||||||
: edge(std::move(edge)), manager_(manager) {}
|
: edge(std::move(edge)), request_router_(request_router) {}
|
||||||
|
|
||||||
EdgeTypeId EdgeAccessor::EdgeType() const { return edge.type.id; }
|
EdgeTypeId EdgeAccessor::EdgeType() const { return edge.type.id; }
|
||||||
|
|
||||||
const std::vector<std::pair<PropertyId, Value>> &EdgeAccessor::Properties() const { return edge.properties; }
|
const std::vector<std::pair<PropertyId, Value>> &EdgeAccessor::Properties() const { return edge.properties; }
|
||||||
|
|
||||||
Value EdgeAccessor::GetProperty(const std::string &prop_name) const {
|
Value EdgeAccessor::GetProperty(const std::string &prop_name) const {
|
||||||
auto maybe_prop = manager_->MaybeNameToProperty(prop_name);
|
auto maybe_prop = request_router_->MaybeNameToProperty(prop_name);
|
||||||
if (!maybe_prop) {
|
if (!maybe_prop) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
@ -39,20 +39,20 @@ bool EdgeAccessor::IsCycle() const { return edge.src == edge.dst; };
|
|||||||
size_t EdgeAccessor::CypherId() const { return edge.id.gid; }
|
size_t EdgeAccessor::CypherId() const { return edge.id.gid; }
|
||||||
|
|
||||||
VertexAccessor EdgeAccessor::To() const {
|
VertexAccessor EdgeAccessor::To() const {
|
||||||
return VertexAccessor(Vertex{edge.dst}, std::vector<std::pair<PropertyId, msgs::Value>>{}, manager_);
|
return VertexAccessor(Vertex{edge.dst}, std::vector<std::pair<PropertyId, msgs::Value>>{}, request_router_);
|
||||||
}
|
}
|
||||||
|
|
||||||
VertexAccessor EdgeAccessor::From() const {
|
VertexAccessor EdgeAccessor::From() const {
|
||||||
return VertexAccessor(Vertex{edge.src}, std::vector<std::pair<PropertyId, msgs::Value>>{}, manager_);
|
return VertexAccessor(Vertex{edge.src}, std::vector<std::pair<PropertyId, msgs::Value>>{}, request_router_);
|
||||||
}
|
}
|
||||||
|
|
||||||
VertexAccessor::VertexAccessor(Vertex v, std::vector<std::pair<PropertyId, Value>> props,
|
VertexAccessor::VertexAccessor(Vertex v, std::vector<std::pair<PropertyId, Value>> props,
|
||||||
const ShardRequestManagerInterface *manager)
|
const RequestRouterInterface *request_router)
|
||||||
: vertex(std::move(v)), properties(std::move(props)), manager_(manager) {}
|
: vertex(std::move(v)), properties(std::move(props)), request_router_(request_router) {}
|
||||||
|
|
||||||
VertexAccessor::VertexAccessor(Vertex v, std::map<PropertyId, Value> &&props,
|
VertexAccessor::VertexAccessor(Vertex v, std::map<PropertyId, Value> &&props,
|
||||||
const ShardRequestManagerInterface *manager)
|
const RequestRouterInterface *request_router)
|
||||||
: vertex(std::move(v)), manager_(manager) {
|
: vertex(std::move(v)), request_router_(request_router) {
|
||||||
properties.reserve(props.size());
|
properties.reserve(props.size());
|
||||||
for (auto &[id, value] : props) {
|
for (auto &[id, value] : props) {
|
||||||
properties.emplace_back(std::make_pair(id, std::move(value)));
|
properties.emplace_back(std::make_pair(id, std::move(value)));
|
||||||
@ -60,8 +60,8 @@ VertexAccessor::VertexAccessor(Vertex v, std::map<PropertyId, Value> &&props,
|
|||||||
}
|
}
|
||||||
|
|
||||||
VertexAccessor::VertexAccessor(Vertex v, const std::map<PropertyId, Value> &props,
|
VertexAccessor::VertexAccessor(Vertex v, const std::map<PropertyId, Value> &props,
|
||||||
const ShardRequestManagerInterface *manager)
|
const RequestRouterInterface *request_router)
|
||||||
: vertex(std::move(v)), manager_(manager) {
|
: vertex(std::move(v)), request_router_(request_router) {
|
||||||
properties.reserve(props.size());
|
properties.reserve(props.size());
|
||||||
for (const auto &[id, value] : props) {
|
for (const auto &[id, value] : props) {
|
||||||
properties.emplace_back(std::make_pair(id, value));
|
properties.emplace_back(std::make_pair(id, value));
|
||||||
@ -91,7 +91,7 @@ Value VertexAccessor::GetProperty(PropertyId prop_id) const {
|
|||||||
|
|
||||||
// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
|
// NOLINTNEXTLINE(readability-convert-member-functions-to-static)
|
||||||
Value VertexAccessor::GetProperty(const std::string &prop_name) const {
|
Value VertexAccessor::GetProperty(const std::string &prop_name) const {
|
||||||
auto maybe_prop = manager_->MaybeNameToProperty(prop_name);
|
auto maybe_prop = request_router_->MaybeNameToProperty(prop_name);
|
||||||
if (!maybe_prop) {
|
if (!maybe_prop) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include "utils/memory_tracker.hpp"
|
#include "utils/memory_tracker.hpp"
|
||||||
|
|
||||||
namespace memgraph::query::v2 {
|
namespace memgraph::query::v2 {
|
||||||
class ShardRequestManagerInterface;
|
class RequestRouterInterface;
|
||||||
} // namespace memgraph::query::v2
|
} // namespace memgraph::query::v2
|
||||||
|
|
||||||
namespace memgraph::query::v2::accessors {
|
namespace memgraph::query::v2::accessors {
|
||||||
@ -41,7 +41,7 @@ class VertexAccessor;
|
|||||||
|
|
||||||
class EdgeAccessor final {
|
class EdgeAccessor final {
|
||||||
public:
|
public:
|
||||||
explicit EdgeAccessor(Edge edge, const ShardRequestManagerInterface *manager);
|
explicit EdgeAccessor(Edge edge, const RequestRouterInterface *request_router);
|
||||||
|
|
||||||
[[nodiscard]] EdgeTypeId EdgeType() const;
|
[[nodiscard]] EdgeTypeId EdgeType() const;
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ class EdgeAccessor final {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Edge edge;
|
Edge edge;
|
||||||
const ShardRequestManagerInterface *manager_;
|
const RequestRouterInterface *request_router_;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VertexAccessor final {
|
class VertexAccessor final {
|
||||||
@ -73,10 +73,10 @@ class VertexAccessor final {
|
|||||||
using Label = msgs::Label;
|
using Label = msgs::Label;
|
||||||
using VertexId = msgs::VertexId;
|
using VertexId = msgs::VertexId;
|
||||||
VertexAccessor(Vertex v, std::vector<std::pair<PropertyId, Value>> props,
|
VertexAccessor(Vertex v, std::vector<std::pair<PropertyId, Value>> props,
|
||||||
const ShardRequestManagerInterface *manager);
|
const RequestRouterInterface *request_router);
|
||||||
|
|
||||||
VertexAccessor(Vertex v, std::map<PropertyId, Value> &&props, const ShardRequestManagerInterface *manager);
|
VertexAccessor(Vertex v, std::map<PropertyId, Value> &&props, const RequestRouterInterface *request_router);
|
||||||
VertexAccessor(Vertex v, const std::map<PropertyId, Value> &props, const ShardRequestManagerInterface *manager);
|
VertexAccessor(Vertex v, const std::map<PropertyId, Value> &props, const RequestRouterInterface *request_router);
|
||||||
|
|
||||||
[[nodiscard]] Label PrimaryLabel() const;
|
[[nodiscard]] Label PrimaryLabel() const;
|
||||||
|
|
||||||
@ -108,7 +108,7 @@ class VertexAccessor final {
|
|||||||
private:
|
private:
|
||||||
Vertex vertex;
|
Vertex vertex;
|
||||||
std::vector<std::pair<PropertyId, Value>> properties;
|
std::vector<std::pair<PropertyId, Value>> properties;
|
||||||
const ShardRequestManagerInterface *manager_;
|
const RequestRouterInterface *request_router_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Highly mocked interface. Won't work if used.
|
// Highly mocked interface. Won't work if used.
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
namespace memgraph::query::v2 {
|
namespace memgraph::query::v2 {
|
||||||
|
|
||||||
class ShardRequestManagerInterface;
|
class RequestRouterInterface;
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
class Callable {
|
class Callable {
|
||||||
@ -34,15 +34,14 @@ class Callable {
|
|||||||
auto operator()(const storage::v3::PropertyValue &val) const {
|
auto operator()(const storage::v3::PropertyValue &val) const {
|
||||||
return storage::v3::PropertyToTypedValue<TypedValue>(val);
|
return storage::v3::PropertyToTypedValue<TypedValue>(val);
|
||||||
};
|
};
|
||||||
auto operator()(const msgs::Value &val, ShardRequestManagerInterface *manager) const {
|
auto operator()(const msgs::Value &val, RequestRouterInterface *request_router) const {
|
||||||
return ValueToTypedValue(val, manager);
|
return ValueToTypedValue(val, request_router);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
using ExpressionEvaluator =
|
using ExpressionEvaluator = expr::ExpressionEvaluator<TypedValue, query::v2::EvaluationContext, RequestRouterInterface,
|
||||||
expr::ExpressionEvaluator<TypedValue, query::v2::EvaluationContext, ShardRequestManagerInterface, storage::v3::View,
|
storage::v3::View, storage::v3::LabelId, msgs::Value,
|
||||||
storage::v3::LabelId, msgs::Value, detail::Callable, common::ErrorCode,
|
detail::Callable, common::ErrorCode, expr::QueryEngineTag>;
|
||||||
expr::QueryEngineTag>;
|
|
||||||
|
|
||||||
} // namespace memgraph::query::v2
|
} // namespace memgraph::query::v2
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include "query/v2/parameters.hpp"
|
#include "query/v2/parameters.hpp"
|
||||||
#include "query/v2/plan/profile.hpp"
|
#include "query/v2/plan/profile.hpp"
|
||||||
//#include "query/v2/trigger.hpp"
|
//#include "query/v2/trigger.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
#include "query/v2/request_router.hpp"
|
||||||
#include "utils/async_timer.hpp"
|
#include "utils/async_timer.hpp"
|
||||||
|
|
||||||
namespace memgraph::query::v2 {
|
namespace memgraph::query::v2 {
|
||||||
@ -61,26 +61,26 @@ struct EvaluationContext {
|
|||||||
};
|
};
|
||||||
|
|
||||||
inline std::vector<storage::v3::PropertyId> NamesToProperties(const std::vector<std::string> &property_names,
|
inline std::vector<storage::v3::PropertyId> NamesToProperties(const std::vector<std::string> &property_names,
|
||||||
ShardRequestManagerInterface *shard_request_manager) {
|
RequestRouterInterface *request_router) {
|
||||||
std::vector<storage::v3::PropertyId> properties;
|
std::vector<storage::v3::PropertyId> properties;
|
||||||
// TODO Fix by using reference
|
// TODO Fix by using reference
|
||||||
properties.reserve(property_names.size());
|
properties.reserve(property_names.size());
|
||||||
if (shard_request_manager != nullptr) {
|
if (request_router != nullptr) {
|
||||||
for (const auto &name : property_names) {
|
for (const auto &name : property_names) {
|
||||||
properties.push_back(shard_request_manager->NameToProperty(name));
|
properties.push_back(request_router->NameToProperty(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline std::vector<storage::v3::LabelId> NamesToLabels(const std::vector<std::string> &label_names,
|
inline std::vector<storage::v3::LabelId> NamesToLabels(const std::vector<std::string> &label_names,
|
||||||
ShardRequestManagerInterface *shard_request_manager) {
|
RequestRouterInterface *request_router) {
|
||||||
std::vector<storage::v3::LabelId> labels;
|
std::vector<storage::v3::LabelId> labels;
|
||||||
labels.reserve(label_names.size());
|
labels.reserve(label_names.size());
|
||||||
// TODO Fix by using reference
|
// TODO Fix by using reference
|
||||||
if (shard_request_manager != nullptr) {
|
if (request_router != nullptr) {
|
||||||
for (const auto &name : label_names) {
|
for (const auto &name : label_names) {
|
||||||
labels.push_back(shard_request_manager->NameToLabel(name));
|
labels.push_back(request_router->NameToLabel(name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return labels;
|
return labels;
|
||||||
@ -97,7 +97,7 @@ struct ExecutionContext {
|
|||||||
plan::ProfilingStats *stats_root{nullptr};
|
plan::ProfilingStats *stats_root{nullptr};
|
||||||
ExecutionStats execution_stats;
|
ExecutionStats execution_stats;
|
||||||
utils::AsyncTimer timer;
|
utils::AsyncTimer timer;
|
||||||
ShardRequestManagerInterface *shard_request_manager{nullptr};
|
RequestRouterInterface *request_router{nullptr};
|
||||||
IdAllocator *edge_ids_alloc;
|
IdAllocator *edge_ids_alloc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -12,12 +12,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "bindings/typed_value.hpp"
|
#include "bindings/typed_value.hpp"
|
||||||
#include "query/v2/accessors.hpp"
|
#include "query/v2/accessors.hpp"
|
||||||
|
#include "query/v2/request_router.hpp"
|
||||||
#include "query/v2/requests.hpp"
|
#include "query/v2/requests.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
|
||||||
|
|
||||||
namespace memgraph::query::v2 {
|
namespace memgraph::query::v2 {
|
||||||
|
|
||||||
inline TypedValue ValueToTypedValue(const msgs::Value &value, ShardRequestManagerInterface *manager) {
|
inline TypedValue ValueToTypedValue(const msgs::Value &value, RequestRouterInterface *request_router) {
|
||||||
using Value = msgs::Value;
|
using Value = msgs::Value;
|
||||||
switch (value.type) {
|
switch (value.type) {
|
||||||
case Value::Type::Null:
|
case Value::Type::Null:
|
||||||
@ -35,7 +35,7 @@ inline TypedValue ValueToTypedValue(const msgs::Value &value, ShardRequestManage
|
|||||||
std::vector<TypedValue> dst;
|
std::vector<TypedValue> dst;
|
||||||
dst.reserve(lst.size());
|
dst.reserve(lst.size());
|
||||||
for (const auto &elem : lst) {
|
for (const auto &elem : lst) {
|
||||||
dst.push_back(ValueToTypedValue(elem, manager));
|
dst.push_back(ValueToTypedValue(elem, request_router));
|
||||||
}
|
}
|
||||||
return TypedValue(std::move(dst));
|
return TypedValue(std::move(dst));
|
||||||
}
|
}
|
||||||
@ -43,21 +43,21 @@ inline TypedValue ValueToTypedValue(const msgs::Value &value, ShardRequestManage
|
|||||||
const auto &value_map = value.map_v;
|
const auto &value_map = value.map_v;
|
||||||
std::map<std::string, TypedValue> dst;
|
std::map<std::string, TypedValue> dst;
|
||||||
for (const auto &[key, val] : value_map) {
|
for (const auto &[key, val] : value_map) {
|
||||||
dst[key] = ValueToTypedValue(val, manager);
|
dst[key] = ValueToTypedValue(val, request_router);
|
||||||
}
|
}
|
||||||
return TypedValue(std::move(dst));
|
return TypedValue(std::move(dst));
|
||||||
}
|
}
|
||||||
case Value::Type::Vertex:
|
case Value::Type::Vertex:
|
||||||
return TypedValue(accessors::VertexAccessor(
|
return TypedValue(accessors::VertexAccessor(
|
||||||
value.vertex_v, std::vector<std::pair<storage::v3::PropertyId, msgs::Value>>{}, manager));
|
value.vertex_v, std::vector<std::pair<storage::v3::PropertyId, msgs::Value>>{}, request_router));
|
||||||
case Value::Type::Edge:
|
case Value::Type::Edge:
|
||||||
return TypedValue(accessors::EdgeAccessor(value.edge_v, manager));
|
return TypedValue(accessors::EdgeAccessor(value.edge_v, request_router));
|
||||||
}
|
}
|
||||||
throw std::runtime_error("Incorrect type in conversion");
|
throw std::runtime_error("Incorrect type in conversion");
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const auto ValueToTypedValueFunctor = [](const msgs::Value &value, ShardRequestManagerInterface *manager) {
|
inline const auto ValueToTypedValueFunctor = [](const msgs::Value &value, RequestRouterInterface *request_router) {
|
||||||
return ValueToTypedValue(value, manager);
|
return ValueToTypedValue(value, request_router);
|
||||||
};
|
};
|
||||||
|
|
||||||
inline msgs::Value TypedValueToValue(const TypedValue &value) {
|
inline msgs::Value TypedValueToValue(const TypedValue &value) {
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
#include "query/v2/cypher_query_interpreter.hpp"
|
#include "query/v2/cypher_query_interpreter.hpp"
|
||||||
#include "query/v2/bindings/symbol_generator.hpp"
|
#include "query/v2/bindings/symbol_generator.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
#include "query/v2/request_router.hpp"
|
||||||
|
|
||||||
// NOLINTNEXTLINE (cppcoreguidelines-avoid-non-const-global-variables)
|
// NOLINTNEXTLINE (cppcoreguidelines-avoid-non-const-global-variables)
|
||||||
DEFINE_HIDDEN_bool(query_cost_planner, true, "Use the cost-estimating query planner.");
|
DEFINE_HIDDEN_bool(query_cost_planner, true, "Use the cost-estimating query planner.");
|
||||||
@ -118,9 +118,9 @@ ParsedQuery ParseQuery(const std::string &query_string, const std::map<std::stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<LogicalPlan> MakeLogicalPlan(AstStorage ast_storage, CypherQuery *query, const Parameters ¶meters,
|
std::unique_ptr<LogicalPlan> MakeLogicalPlan(AstStorage ast_storage, CypherQuery *query, const Parameters ¶meters,
|
||||||
ShardRequestManagerInterface *shard_manager,
|
RequestRouterInterface *request_router,
|
||||||
const std::vector<Identifier *> &predefined_identifiers) {
|
const std::vector<Identifier *> &predefined_identifiers) {
|
||||||
auto vertex_counts = plan::MakeVertexCountCache(shard_manager);
|
auto vertex_counts = plan::MakeVertexCountCache(request_router);
|
||||||
auto symbol_table = expr::MakeSymbolTable(query, predefined_identifiers);
|
auto symbol_table = expr::MakeSymbolTable(query, predefined_identifiers);
|
||||||
auto planning_context = plan::MakePlanningContext(&ast_storage, &symbol_table, query, &vertex_counts);
|
auto planning_context = plan::MakePlanningContext(&ast_storage, &symbol_table, query, &vertex_counts);
|
||||||
auto [root, cost] = plan::MakeLogicalPlan(&planning_context, parameters, FLAGS_query_cost_planner);
|
auto [root, cost] = plan::MakeLogicalPlan(&planning_context, parameters, FLAGS_query_cost_planner);
|
||||||
@ -130,7 +130,7 @@ std::unique_ptr<LogicalPlan> MakeLogicalPlan(AstStorage ast_storage, CypherQuery
|
|||||||
|
|
||||||
std::shared_ptr<CachedPlan> CypherQueryToPlan(uint64_t hash, AstStorage ast_storage, CypherQuery *query,
|
std::shared_ptr<CachedPlan> CypherQueryToPlan(uint64_t hash, AstStorage ast_storage, CypherQuery *query,
|
||||||
const Parameters ¶meters, utils::SkipList<PlanCacheEntry> *plan_cache,
|
const Parameters ¶meters, utils::SkipList<PlanCacheEntry> *plan_cache,
|
||||||
ShardRequestManagerInterface *shard_manager,
|
RequestRouterInterface *request_router,
|
||||||
const std::vector<Identifier *> &predefined_identifiers) {
|
const std::vector<Identifier *> &predefined_identifiers) {
|
||||||
std::optional<utils::SkipList<PlanCacheEntry>::Accessor> plan_cache_access;
|
std::optional<utils::SkipList<PlanCacheEntry>::Accessor> plan_cache_access;
|
||||||
if (plan_cache) {
|
if (plan_cache) {
|
||||||
@ -146,7 +146,7 @@ std::shared_ptr<CachedPlan> CypherQueryToPlan(uint64_t hash, AstStorage ast_stor
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto plan = std::make_shared<CachedPlan>(
|
auto plan = std::make_shared<CachedPlan>(
|
||||||
MakeLogicalPlan(std::move(ast_storage), query, parameters, shard_manager, predefined_identifiers));
|
MakeLogicalPlan(std::move(ast_storage), query, parameters, request_router, predefined_identifiers));
|
||||||
if (plan_cache_access) {
|
if (plan_cache_access) {
|
||||||
plan_cache_access->insert({hash, plan});
|
plan_cache_access->insert({hash, plan});
|
||||||
}
|
}
|
||||||
|
@ -132,7 +132,7 @@ class SingleNodeLogicalPlan final : public LogicalPlan {
|
|||||||
};
|
};
|
||||||
|
|
||||||
std::unique_ptr<LogicalPlan> MakeLogicalPlan(AstStorage ast_storage, CypherQuery *query, const Parameters ¶meters,
|
std::unique_ptr<LogicalPlan> MakeLogicalPlan(AstStorage ast_storage, CypherQuery *query, const Parameters ¶meters,
|
||||||
ShardRequestManagerInterface *shard_manager,
|
RequestRouterInterface *request_router,
|
||||||
const std::vector<Identifier *> &predefined_identifiers);
|
const std::vector<Identifier *> &predefined_identifiers);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -145,7 +145,7 @@ std::unique_ptr<LogicalPlan> MakeLogicalPlan(AstStorage ast_storage, CypherQuery
|
|||||||
*/
|
*/
|
||||||
std::shared_ptr<CachedPlan> CypherQueryToPlan(uint64_t hash, AstStorage ast_storage, CypherQuery *query,
|
std::shared_ptr<CachedPlan> CypherQueryToPlan(uint64_t hash, AstStorage ast_storage, CypherQuery *query,
|
||||||
const Parameters ¶meters, utils::SkipList<PlanCacheEntry> *plan_cache,
|
const Parameters ¶meters, utils::SkipList<PlanCacheEntry> *plan_cache,
|
||||||
ShardRequestManagerInterface *shard_manager,
|
RequestRouterInterface *request_router,
|
||||||
const std::vector<Identifier *> &predefined_identifiers = {});
|
const std::vector<Identifier *> &predefined_identifiers = {});
|
||||||
|
|
||||||
} // namespace memgraph::query::v2
|
} // namespace memgraph::query::v2
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
#include "query/v2/bindings/typed_value.hpp"
|
#include "query/v2/bindings/typed_value.hpp"
|
||||||
#include "query/v2/db_accessor.hpp"
|
#include "query/v2/db_accessor.hpp"
|
||||||
#include "query/v2/path.hpp"
|
#include "query/v2/path.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
#include "query/v2/request_router.hpp"
|
||||||
#include "utils/typeinfo.hpp"
|
#include "utils/typeinfo.hpp"
|
||||||
#include "query/v2/conversions.hpp"
|
#include "query/v2/conversions.hpp"
|
||||||
|
|
||||||
@ -838,14 +838,14 @@ cpp<#
|
|||||||
:slk-load (slk-load-ast-vector "Expression"))
|
:slk-load (slk-load-ast-vector "Expression"))
|
||||||
(function-name "std::string" :scope :public)
|
(function-name "std::string" :scope :public)
|
||||||
(function "std::function<TypedValue(const TypedValue *, int64_t,
|
(function "std::function<TypedValue(const TypedValue *, int64_t,
|
||||||
const functions::FunctionContext<ShardRequestManagerInterface> &)>"
|
const functions::FunctionContext<RequestRouterInterface> &)>"
|
||||||
:scope :public
|
:scope :public
|
||||||
:dont-save t
|
:dont-save t
|
||||||
:clone :copy
|
:clone :copy
|
||||||
:slk-load (lambda (member)
|
:slk-load (lambda (member)
|
||||||
#>cpp
|
#>cpp
|
||||||
self->${member} = functions::NameToFunction<TypedValue,
|
self->${member} = functions::NameToFunction<TypedValue,
|
||||||
functions::FunctionContext<ShardRequestManagerInterface>,
|
functions::FunctionContext<RequestRouterInterface>,
|
||||||
functions::QueryEngineTag, decltype(ValueToTypedValueFunctor)>(self->function_name_);
|
functions::QueryEngineTag, decltype(ValueToTypedValueFunctor)>(self->function_name_);
|
||||||
cpp<#)))
|
cpp<#)))
|
||||||
(:public
|
(:public
|
||||||
@ -869,7 +869,7 @@ cpp<#
|
|||||||
const std::vector<Expression *> &arguments)
|
const std::vector<Expression *> &arguments)
|
||||||
: arguments_(arguments),
|
: arguments_(arguments),
|
||||||
function_name_(function_name),
|
function_name_(function_name),
|
||||||
function_(functions::NameToFunction<TypedValue, functions::FunctionContext<ShardRequestManagerInterface>,
|
function_(functions::NameToFunction<TypedValue, functions::FunctionContext<RequestRouterInterface>,
|
||||||
functions::QueryEngineTag, decltype(ValueToTypedValueFunctor)>(function_name_)) {
|
functions::QueryEngineTag, decltype(ValueToTypedValueFunctor)>(function_name_)) {
|
||||||
if (!function_) {
|
if (!function_) {
|
||||||
throw SemanticException("Function '{}' doesn't exist.", function_name);
|
throw SemanticException("Function '{}' doesn't exist.", function_name);
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
namespace memgraph::query::v2 {
|
namespace memgraph::query::v2 {
|
||||||
|
|
||||||
class ShardRequestManagerInterface;
|
class RequestRouterInterface;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
const char kStartsWith[] = "STARTSWITH";
|
const char kStartsWith[] = "STARTSWITH";
|
||||||
@ -32,9 +32,9 @@ const char kId[] = "ID";
|
|||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
struct FunctionContext {
|
struct FunctionContext {
|
||||||
// TODO(kostasrim) consider optional here. ShardRequestManager does not exist on the storage.
|
// TODO(kostasrim) consider optional here. RequestRouter does not exist on the storage.
|
||||||
// DbAccessor *db_accessor;
|
// DbAccessor *db_accessor;
|
||||||
ShardRequestManagerInterface *manager;
|
RequestRouterInterface *request_router;
|
||||||
utils::MemoryResource *memory;
|
utils::MemoryResource *memory;
|
||||||
int64_t timestamp;
|
int64_t timestamp;
|
||||||
std::unordered_map<std::string, int64_t> *counters;
|
std::unordered_map<std::string, int64_t> *counters;
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
#include "query/v2/plan/planner.hpp"
|
#include "query/v2/plan/planner.hpp"
|
||||||
#include "query/v2/plan/profile.hpp"
|
#include "query/v2/plan/profile.hpp"
|
||||||
#include "query/v2/plan/vertex_count_cache.hpp"
|
#include "query/v2/plan/vertex_count_cache.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
#include "query/v2/request_router.hpp"
|
||||||
#include "storage/v3/property_value.hpp"
|
#include "storage/v3/property_value.hpp"
|
||||||
#include "storage/v3/shard.hpp"
|
#include "storage/v3/shard.hpp"
|
||||||
#include "utils/algorithm.hpp"
|
#include "utils/algorithm.hpp"
|
||||||
@ -143,7 +143,7 @@ class ReplQueryHandler final : public query::v2::ReplicationQueryHandler {
|
|||||||
/// @throw QueryRuntimeException if an error ocurred.
|
/// @throw QueryRuntimeException if an error ocurred.
|
||||||
|
|
||||||
Callback HandleAuthQuery(AuthQuery *auth_query, AuthQueryHandler *auth, const Parameters ¶meters,
|
Callback HandleAuthQuery(AuthQuery *auth_query, AuthQueryHandler *auth, const Parameters ¶meters,
|
||||||
ShardRequestManagerInterface *manager) {
|
RequestRouterInterface *request_router) {
|
||||||
// Empty frame for evaluation of password expression. This is OK since
|
// Empty frame for evaluation of password expression. This is OK since
|
||||||
// password should be either null or string literal and it's evaluation
|
// password should be either null or string literal and it's evaluation
|
||||||
// should not depend on frame.
|
// should not depend on frame.
|
||||||
@ -154,7 +154,7 @@ Callback HandleAuthQuery(AuthQuery *auth_query, AuthQueryHandler *auth, const Pa
|
|||||||
// the argument to Callback.
|
// the argument to Callback.
|
||||||
evaluation_context.timestamp = QueryTimestamp();
|
evaluation_context.timestamp = QueryTimestamp();
|
||||||
evaluation_context.parameters = parameters;
|
evaluation_context.parameters = parameters;
|
||||||
ExpressionEvaluator evaluator(&frame, symbol_table, evaluation_context, manager, storage::v3::View::OLD);
|
ExpressionEvaluator evaluator(&frame, symbol_table, evaluation_context, request_router, storage::v3::View::OLD);
|
||||||
|
|
||||||
std::string username = auth_query->user_;
|
std::string username = auth_query->user_;
|
||||||
std::string rolename = auth_query->role_;
|
std::string rolename = auth_query->role_;
|
||||||
@ -312,7 +312,7 @@ Callback HandleAuthQuery(AuthQuery *auth_query, AuthQueryHandler *auth, const Pa
|
|||||||
}
|
}
|
||||||
|
|
||||||
Callback HandleReplicationQuery(ReplicationQuery *repl_query, const Parameters ¶meters,
|
Callback HandleReplicationQuery(ReplicationQuery *repl_query, const Parameters ¶meters,
|
||||||
InterpreterContext *interpreter_context, ShardRequestManagerInterface *manager,
|
InterpreterContext *interpreter_context, RequestRouterInterface *request_router,
|
||||||
std::vector<Notification> *notifications) {
|
std::vector<Notification> *notifications) {
|
||||||
expr::Frame<TypedValue> frame(0);
|
expr::Frame<TypedValue> frame(0);
|
||||||
SymbolTable symbol_table;
|
SymbolTable symbol_table;
|
||||||
@ -321,7 +321,7 @@ Callback HandleReplicationQuery(ReplicationQuery *repl_query, const Parameters &
|
|||||||
// the argument to Callback.
|
// the argument to Callback.
|
||||||
evaluation_context.timestamp = QueryTimestamp();
|
evaluation_context.timestamp = QueryTimestamp();
|
||||||
evaluation_context.parameters = parameters;
|
evaluation_context.parameters = parameters;
|
||||||
ExpressionEvaluator evaluator(&frame, symbol_table, evaluation_context, manager, storage::v3::View::OLD);
|
ExpressionEvaluator evaluator(&frame, symbol_table, evaluation_context, request_router, storage::v3::View::OLD);
|
||||||
|
|
||||||
Callback callback;
|
Callback callback;
|
||||||
switch (repl_query->action_) {
|
switch (repl_query->action_) {
|
||||||
@ -448,7 +448,7 @@ Callback HandleReplicationQuery(ReplicationQuery *repl_query, const Parameters &
|
|||||||
}
|
}
|
||||||
|
|
||||||
Callback HandleSettingQuery(SettingQuery *setting_query, const Parameters ¶meters,
|
Callback HandleSettingQuery(SettingQuery *setting_query, const Parameters ¶meters,
|
||||||
ShardRequestManagerInterface *manager) {
|
RequestRouterInterface *request_router) {
|
||||||
expr::Frame<TypedValue> frame(0);
|
expr::Frame<TypedValue> frame(0);
|
||||||
SymbolTable symbol_table;
|
SymbolTable symbol_table;
|
||||||
EvaluationContext evaluation_context;
|
EvaluationContext evaluation_context;
|
||||||
@ -458,7 +458,7 @@ Callback HandleSettingQuery(SettingQuery *setting_query, const Parameters ¶m
|
|||||||
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
|
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch())
|
||||||
.count();
|
.count();
|
||||||
evaluation_context.parameters = parameters;
|
evaluation_context.parameters = parameters;
|
||||||
ExpressionEvaluator evaluator(&frame, symbol_table, evaluation_context, manager, storage::v3::View::OLD);
|
ExpressionEvaluator evaluator(&frame, symbol_table, evaluation_context, request_router, storage::v3::View::OLD);
|
||||||
|
|
||||||
Callback callback;
|
Callback callback;
|
||||||
switch (setting_query->action_) {
|
switch (setting_query->action_) {
|
||||||
@ -649,7 +649,7 @@ struct PullPlanVector {
|
|||||||
struct PullPlan {
|
struct PullPlan {
|
||||||
explicit PullPlan(std::shared_ptr<CachedPlan> plan, const Parameters ¶meters, bool is_profile_query,
|
explicit PullPlan(std::shared_ptr<CachedPlan> plan, const Parameters ¶meters, bool is_profile_query,
|
||||||
DbAccessor *dba, InterpreterContext *interpreter_context, utils::MemoryResource *execution_memory,
|
DbAccessor *dba, InterpreterContext *interpreter_context, utils::MemoryResource *execution_memory,
|
||||||
ShardRequestManagerInterface *shard_request_manager = nullptr,
|
RequestRouterInterface *request_router = nullptr,
|
||||||
// TriggerContextCollector *trigger_context_collector = nullptr,
|
// TriggerContextCollector *trigger_context_collector = nullptr,
|
||||||
std::optional<size_t> memory_limit = {});
|
std::optional<size_t> memory_limit = {});
|
||||||
std::optional<plan::ProfilingStatsWithTotalTime> Pull(AnyStream *stream, std::optional<int> n,
|
std::optional<plan::ProfilingStatsWithTotalTime> Pull(AnyStream *stream, std::optional<int> n,
|
||||||
@ -679,7 +679,7 @@ struct PullPlan {
|
|||||||
|
|
||||||
PullPlan::PullPlan(const std::shared_ptr<CachedPlan> plan, const Parameters ¶meters, const bool is_profile_query,
|
PullPlan::PullPlan(const std::shared_ptr<CachedPlan> plan, const Parameters ¶meters, const bool is_profile_query,
|
||||||
DbAccessor *dba, InterpreterContext *interpreter_context, utils::MemoryResource *execution_memory,
|
DbAccessor *dba, InterpreterContext *interpreter_context, utils::MemoryResource *execution_memory,
|
||||||
ShardRequestManagerInterface *shard_request_manager, const std::optional<size_t> memory_limit)
|
RequestRouterInterface *request_router, const std::optional<size_t> memory_limit)
|
||||||
: plan_(plan),
|
: plan_(plan),
|
||||||
cursor_(plan->plan().MakeCursor(execution_memory)),
|
cursor_(plan->plan().MakeCursor(execution_memory)),
|
||||||
frame_(plan->symbol_table().max_position(), execution_memory),
|
frame_(plan->symbol_table().max_position(), execution_memory),
|
||||||
@ -688,14 +688,14 @@ PullPlan::PullPlan(const std::shared_ptr<CachedPlan> plan, const Parameters &par
|
|||||||
ctx_.symbol_table = plan->symbol_table();
|
ctx_.symbol_table = plan->symbol_table();
|
||||||
ctx_.evaluation_context.timestamp = QueryTimestamp();
|
ctx_.evaluation_context.timestamp = QueryTimestamp();
|
||||||
ctx_.evaluation_context.parameters = parameters;
|
ctx_.evaluation_context.parameters = parameters;
|
||||||
ctx_.evaluation_context.properties = NamesToProperties(plan->ast_storage().properties_, shard_request_manager);
|
ctx_.evaluation_context.properties = NamesToProperties(plan->ast_storage().properties_, request_router);
|
||||||
ctx_.evaluation_context.labels = NamesToLabels(plan->ast_storage().labels_, shard_request_manager);
|
ctx_.evaluation_context.labels = NamesToLabels(plan->ast_storage().labels_, request_router);
|
||||||
if (interpreter_context->config.execution_timeout_sec > 0) {
|
if (interpreter_context->config.execution_timeout_sec > 0) {
|
||||||
ctx_.timer = utils::AsyncTimer{interpreter_context->config.execution_timeout_sec};
|
ctx_.timer = utils::AsyncTimer{interpreter_context->config.execution_timeout_sec};
|
||||||
}
|
}
|
||||||
ctx_.is_shutting_down = &interpreter_context->is_shutting_down;
|
ctx_.is_shutting_down = &interpreter_context->is_shutting_down;
|
||||||
ctx_.is_profile_query = is_profile_query;
|
ctx_.is_profile_query = is_profile_query;
|
||||||
ctx_.shard_request_manager = shard_request_manager;
|
ctx_.request_router = request_router;
|
||||||
ctx_.edge_ids_alloc = &interpreter_context->edge_ids_alloc;
|
ctx_.edge_ids_alloc = &interpreter_context->edge_ids_alloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -804,7 +804,7 @@ Interpreter::Interpreter(InterpreterContext *interpreter_context) : interpreter_
|
|||||||
auto random_uuid = boost::uuids::uuid{boost::uuids::random_generator()()};
|
auto random_uuid = boost::uuids::uuid{boost::uuids::random_generator()()};
|
||||||
auto query_io = interpreter_context_->io.ForkLocal(random_uuid);
|
auto query_io = interpreter_context_->io.ForkLocal(random_uuid);
|
||||||
|
|
||||||
shard_request_manager_ = std::make_unique<ShardRequestManager<io::local_transport::LocalTransport>>(
|
request_router_ = std::make_unique<RequestRouter<io::local_transport::LocalTransport>>(
|
||||||
coordinator::CoordinatorClient<io::local_transport::LocalTransport>(
|
coordinator::CoordinatorClient<io::local_transport::LocalTransport>(
|
||||||
query_io, interpreter_context_->coordinator_address, std::vector{interpreter_context_->coordinator_address}),
|
query_io, interpreter_context_->coordinator_address, std::vector{interpreter_context_->coordinator_address}),
|
||||||
std::move(query_io));
|
std::move(query_io));
|
||||||
@ -881,7 +881,7 @@ PreparedQuery Interpreter::PrepareTransactionQuery(std::string_view query_upper)
|
|||||||
PreparedQuery PrepareCypherQuery(ParsedQuery parsed_query, std::map<std::string, TypedValue> *summary,
|
PreparedQuery PrepareCypherQuery(ParsedQuery parsed_query, std::map<std::string, TypedValue> *summary,
|
||||||
InterpreterContext *interpreter_context, DbAccessor *dba,
|
InterpreterContext *interpreter_context, DbAccessor *dba,
|
||||||
utils::MemoryResource *execution_memory, std::vector<Notification> *notifications,
|
utils::MemoryResource *execution_memory, std::vector<Notification> *notifications,
|
||||||
ShardRequestManagerInterface *shard_request_manager) {
|
RequestRouterInterface *request_router) {
|
||||||
// TriggerContextCollector *trigger_context_collector = nullptr) {
|
// TriggerContextCollector *trigger_context_collector = nullptr) {
|
||||||
auto *cypher_query = utils::Downcast<CypherQuery>(parsed_query.query);
|
auto *cypher_query = utils::Downcast<CypherQuery>(parsed_query.query);
|
||||||
|
|
||||||
@ -890,8 +890,7 @@ PreparedQuery PrepareCypherQuery(ParsedQuery parsed_query, std::map<std::string,
|
|||||||
EvaluationContext evaluation_context;
|
EvaluationContext evaluation_context;
|
||||||
evaluation_context.timestamp = QueryTimestamp();
|
evaluation_context.timestamp = QueryTimestamp();
|
||||||
evaluation_context.parameters = parsed_query.parameters;
|
evaluation_context.parameters = parsed_query.parameters;
|
||||||
ExpressionEvaluator evaluator(&frame, symbol_table, evaluation_context, shard_request_manager,
|
ExpressionEvaluator evaluator(&frame, symbol_table, evaluation_context, request_router, storage::v3::View::OLD);
|
||||||
storage::v3::View::OLD);
|
|
||||||
const auto memory_limit =
|
const auto memory_limit =
|
||||||
expr::EvaluateMemoryLimit(&evaluator, cypher_query->memory_limit_, cypher_query->memory_scale_);
|
expr::EvaluateMemoryLimit(&evaluator, cypher_query->memory_limit_, cypher_query->memory_scale_);
|
||||||
if (memory_limit) {
|
if (memory_limit) {
|
||||||
@ -906,9 +905,9 @@ PreparedQuery PrepareCypherQuery(ParsedQuery parsed_query, std::map<std::string,
|
|||||||
"convert the parsed row values to the appropriate type. This can be done using the built-in "
|
"convert the parsed row values to the appropriate type. This can be done using the built-in "
|
||||||
"conversion functions such as ToInteger, ToFloat, ToBoolean etc.");
|
"conversion functions such as ToInteger, ToFloat, ToBoolean etc.");
|
||||||
}
|
}
|
||||||
auto plan = CypherQueryToPlan(
|
auto plan = CypherQueryToPlan(parsed_query.stripped_query.hash(), std::move(parsed_query.ast_storage), cypher_query,
|
||||||
parsed_query.stripped_query.hash(), std::move(parsed_query.ast_storage), cypher_query, parsed_query.parameters,
|
parsed_query.parameters,
|
||||||
parsed_query.is_cacheable ? &interpreter_context->plan_cache : nullptr, shard_request_manager);
|
parsed_query.is_cacheable ? &interpreter_context->plan_cache : nullptr, request_router);
|
||||||
|
|
||||||
summary->insert_or_assign("cost_estimate", plan->cost());
|
summary->insert_or_assign("cost_estimate", plan->cost());
|
||||||
auto rw_type_checker = plan::ReadWriteTypeChecker();
|
auto rw_type_checker = plan::ReadWriteTypeChecker();
|
||||||
@ -927,7 +926,7 @@ PreparedQuery PrepareCypherQuery(ParsedQuery parsed_query, std::map<std::string,
|
|||||||
utils::FindOr(parsed_query.stripped_query.named_expressions(), symbol.token_position(), symbol.name()).first);
|
utils::FindOr(parsed_query.stripped_query.named_expressions(), symbol.token_position(), symbol.name()).first);
|
||||||
}
|
}
|
||||||
auto pull_plan = std::make_shared<PullPlan>(plan, parsed_query.parameters, false, dba, interpreter_context,
|
auto pull_plan = std::make_shared<PullPlan>(plan, parsed_query.parameters, false, dba, interpreter_context,
|
||||||
execution_memory, shard_request_manager, memory_limit);
|
execution_memory, request_router, memory_limit);
|
||||||
// execution_memory, trigger_context_collector, memory_limit);
|
// execution_memory, trigger_context_collector, memory_limit);
|
||||||
return PreparedQuery{std::move(header), std::move(parsed_query.required_privileges),
|
return PreparedQuery{std::move(header), std::move(parsed_query.required_privileges),
|
||||||
[pull_plan = std::move(pull_plan), output_symbols = std::move(output_symbols), summary](
|
[pull_plan = std::move(pull_plan), output_symbols = std::move(output_symbols), summary](
|
||||||
@ -941,8 +940,7 @@ PreparedQuery PrepareCypherQuery(ParsedQuery parsed_query, std::map<std::string,
|
|||||||
}
|
}
|
||||||
|
|
||||||
PreparedQuery PrepareExplainQuery(ParsedQuery parsed_query, std::map<std::string, TypedValue> *summary,
|
PreparedQuery PrepareExplainQuery(ParsedQuery parsed_query, std::map<std::string, TypedValue> *summary,
|
||||||
InterpreterContext *interpreter_context,
|
InterpreterContext *interpreter_context, RequestRouterInterface *request_router,
|
||||||
ShardRequestManagerInterface *shard_request_manager,
|
|
||||||
utils::MemoryResource *execution_memory) {
|
utils::MemoryResource *execution_memory) {
|
||||||
const std::string kExplainQueryStart = "explain ";
|
const std::string kExplainQueryStart = "explain ";
|
||||||
MG_ASSERT(utils::StartsWith(utils::ToLowerCase(parsed_query.stripped_query.query()), kExplainQueryStart),
|
MG_ASSERT(utils::StartsWith(utils::ToLowerCase(parsed_query.stripped_query.query()), kExplainQueryStart),
|
||||||
@ -961,20 +959,20 @@ PreparedQuery PrepareExplainQuery(ParsedQuery parsed_query, std::map<std::string
|
|||||||
auto *cypher_query = utils::Downcast<CypherQuery>(parsed_inner_query.query);
|
auto *cypher_query = utils::Downcast<CypherQuery>(parsed_inner_query.query);
|
||||||
MG_ASSERT(cypher_query, "Cypher grammar should not allow other queries in EXPLAIN");
|
MG_ASSERT(cypher_query, "Cypher grammar should not allow other queries in EXPLAIN");
|
||||||
|
|
||||||
auto cypher_query_plan = CypherQueryToPlan(
|
auto cypher_query_plan =
|
||||||
parsed_inner_query.stripped_query.hash(), std::move(parsed_inner_query.ast_storage), cypher_query,
|
CypherQueryToPlan(parsed_inner_query.stripped_query.hash(), std::move(parsed_inner_query.ast_storage),
|
||||||
parsed_inner_query.parameters, parsed_inner_query.is_cacheable ? &interpreter_context->plan_cache : nullptr,
|
cypher_query, parsed_inner_query.parameters,
|
||||||
shard_request_manager);
|
parsed_inner_query.is_cacheable ? &interpreter_context->plan_cache : nullptr, request_router);
|
||||||
|
|
||||||
std::stringstream printed_plan;
|
std::stringstream printed_plan;
|
||||||
plan::PrettyPrint(*shard_request_manager, &cypher_query_plan->plan(), &printed_plan);
|
plan::PrettyPrint(*request_router, &cypher_query_plan->plan(), &printed_plan);
|
||||||
|
|
||||||
std::vector<std::vector<TypedValue>> printed_plan_rows;
|
std::vector<std::vector<TypedValue>> printed_plan_rows;
|
||||||
for (const auto &row : utils::Split(utils::RTrim(printed_plan.str()), "\n")) {
|
for (const auto &row : utils::Split(utils::RTrim(printed_plan.str()), "\n")) {
|
||||||
printed_plan_rows.push_back(std::vector<TypedValue>{TypedValue(row)});
|
printed_plan_rows.push_back(std::vector<TypedValue>{TypedValue(row)});
|
||||||
}
|
}
|
||||||
|
|
||||||
summary->insert_or_assign("explain", plan::PlanToJson(*shard_request_manager, &cypher_query_plan->plan()).dump());
|
summary->insert_or_assign("explain", plan::PlanToJson(*request_router, &cypher_query_plan->plan()).dump());
|
||||||
|
|
||||||
return PreparedQuery{{"QUERY PLAN"},
|
return PreparedQuery{{"QUERY PLAN"},
|
||||||
std::move(parsed_query.required_privileges),
|
std::move(parsed_query.required_privileges),
|
||||||
@ -991,7 +989,7 @@ PreparedQuery PrepareExplainQuery(ParsedQuery parsed_query, std::map<std::string
|
|||||||
PreparedQuery PrepareProfileQuery(ParsedQuery parsed_query, bool in_explicit_transaction,
|
PreparedQuery PrepareProfileQuery(ParsedQuery parsed_query, bool in_explicit_transaction,
|
||||||
std::map<std::string, TypedValue> *summary, InterpreterContext *interpreter_context,
|
std::map<std::string, TypedValue> *summary, InterpreterContext *interpreter_context,
|
||||||
DbAccessor *dba, utils::MemoryResource *execution_memory,
|
DbAccessor *dba, utils::MemoryResource *execution_memory,
|
||||||
ShardRequestManagerInterface *shard_request_manager = nullptr) {
|
RequestRouterInterface *request_router = nullptr) {
|
||||||
const std::string kProfileQueryStart = "profile ";
|
const std::string kProfileQueryStart = "profile ";
|
||||||
|
|
||||||
MG_ASSERT(utils::StartsWith(utils::ToLowerCase(parsed_query.stripped_query.query()), kProfileQueryStart),
|
MG_ASSERT(utils::StartsWith(utils::ToLowerCase(parsed_query.stripped_query.query()), kProfileQueryStart),
|
||||||
@ -1034,22 +1032,21 @@ PreparedQuery PrepareProfileQuery(ParsedQuery parsed_query, bool in_explicit_tra
|
|||||||
EvaluationContext evaluation_context;
|
EvaluationContext evaluation_context;
|
||||||
evaluation_context.timestamp = QueryTimestamp();
|
evaluation_context.timestamp = QueryTimestamp();
|
||||||
evaluation_context.parameters = parsed_inner_query.parameters;
|
evaluation_context.parameters = parsed_inner_query.parameters;
|
||||||
ExpressionEvaluator evaluator(&frame, symbol_table, evaluation_context, shard_request_manager,
|
ExpressionEvaluator evaluator(&frame, symbol_table, evaluation_context, request_router, storage::v3::View::OLD);
|
||||||
storage::v3::View::OLD);
|
|
||||||
const auto memory_limit =
|
const auto memory_limit =
|
||||||
expr::EvaluateMemoryLimit(&evaluator, cypher_query->memory_limit_, cypher_query->memory_scale_);
|
expr::EvaluateMemoryLimit(&evaluator, cypher_query->memory_limit_, cypher_query->memory_scale_);
|
||||||
|
|
||||||
auto cypher_query_plan = CypherQueryToPlan(
|
auto cypher_query_plan =
|
||||||
parsed_inner_query.stripped_query.hash(), std::move(parsed_inner_query.ast_storage), cypher_query,
|
CypherQueryToPlan(parsed_inner_query.stripped_query.hash(), std::move(parsed_inner_query.ast_storage),
|
||||||
parsed_inner_query.parameters, parsed_inner_query.is_cacheable ? &interpreter_context->plan_cache : nullptr,
|
cypher_query, parsed_inner_query.parameters,
|
||||||
shard_request_manager);
|
parsed_inner_query.is_cacheable ? &interpreter_context->plan_cache : nullptr, request_router);
|
||||||
auto rw_type_checker = plan::ReadWriteTypeChecker();
|
auto rw_type_checker = plan::ReadWriteTypeChecker();
|
||||||
rw_type_checker.InferRWType(const_cast<plan::LogicalOperator &>(cypher_query_plan->plan()));
|
rw_type_checker.InferRWType(const_cast<plan::LogicalOperator &>(cypher_query_plan->plan()));
|
||||||
|
|
||||||
return PreparedQuery{{"OPERATOR", "ACTUAL HITS", "RELATIVE TIME", "ABSOLUTE TIME", "CUSTOM DATA"},
|
return PreparedQuery{{"OPERATOR", "ACTUAL HITS", "RELATIVE TIME", "ABSOLUTE TIME", "CUSTOM DATA"},
|
||||||
std::move(parsed_query.required_privileges),
|
std::move(parsed_query.required_privileges),
|
||||||
[plan = std::move(cypher_query_plan), parameters = std::move(parsed_inner_query.parameters),
|
[plan = std::move(cypher_query_plan), parameters = std::move(parsed_inner_query.parameters),
|
||||||
summary, dba, interpreter_context, execution_memory, memory_limit, shard_request_manager,
|
summary, dba, interpreter_context, execution_memory, memory_limit, request_router,
|
||||||
// We want to execute the query we are profiling lazily, so we delay
|
// We want to execute the query we are profiling lazily, so we delay
|
||||||
// the construction of the corresponding context.
|
// the construction of the corresponding context.
|
||||||
stats_and_total_time = std::optional<plan::ProfilingStatsWithTotalTime>{},
|
stats_and_total_time = std::optional<plan::ProfilingStatsWithTotalTime>{},
|
||||||
@ -1058,7 +1055,7 @@ PreparedQuery PrepareProfileQuery(ParsedQuery parsed_query, bool in_explicit_tra
|
|||||||
// No output symbols are given so that nothing is streamed.
|
// No output symbols are given so that nothing is streamed.
|
||||||
if (!stats_and_total_time) {
|
if (!stats_and_total_time) {
|
||||||
stats_and_total_time = PullPlan(plan, parameters, true, dba, interpreter_context,
|
stats_and_total_time = PullPlan(plan, parameters, true, dba, interpreter_context,
|
||||||
execution_memory, shard_request_manager, memory_limit)
|
execution_memory, request_router, memory_limit)
|
||||||
.Pull(stream, {}, {}, summary);
|
.Pull(stream, {}, {}, summary);
|
||||||
pull_plan = std::make_shared<PullPlanVector>(ProfilingStatsToTable(*stats_and_total_time));
|
pull_plan = std::make_shared<PullPlanVector>(ProfilingStatsToTable(*stats_and_total_time));
|
||||||
}
|
}
|
||||||
@ -1185,14 +1182,14 @@ PreparedQuery PrepareIndexQuery(ParsedQuery parsed_query, bool in_explicit_trans
|
|||||||
PreparedQuery PrepareAuthQuery(ParsedQuery parsed_query, bool in_explicit_transaction,
|
PreparedQuery PrepareAuthQuery(ParsedQuery parsed_query, bool in_explicit_transaction,
|
||||||
std::map<std::string, TypedValue> *summary, InterpreterContext *interpreter_context,
|
std::map<std::string, TypedValue> *summary, InterpreterContext *interpreter_context,
|
||||||
DbAccessor *dba, utils::MemoryResource *execution_memory,
|
DbAccessor *dba, utils::MemoryResource *execution_memory,
|
||||||
ShardRequestManagerInterface *manager) {
|
RequestRouterInterface *request_router) {
|
||||||
if (in_explicit_transaction) {
|
if (in_explicit_transaction) {
|
||||||
throw UserModificationInMulticommandTxException();
|
throw UserModificationInMulticommandTxException();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto *auth_query = utils::Downcast<AuthQuery>(parsed_query.query);
|
auto *auth_query = utils::Downcast<AuthQuery>(parsed_query.query);
|
||||||
|
|
||||||
auto callback = HandleAuthQuery(auth_query, interpreter_context->auth, parsed_query.parameters, manager);
|
auto callback = HandleAuthQuery(auth_query, interpreter_context->auth, parsed_query.parameters, request_router);
|
||||||
|
|
||||||
SymbolTable symbol_table;
|
SymbolTable symbol_table;
|
||||||
std::vector<Symbol> output_symbols;
|
std::vector<Symbol> output_symbols;
|
||||||
@ -1221,14 +1218,14 @@ PreparedQuery PrepareAuthQuery(ParsedQuery parsed_query, bool in_explicit_transa
|
|||||||
|
|
||||||
PreparedQuery PrepareReplicationQuery(ParsedQuery parsed_query, const bool in_explicit_transaction,
|
PreparedQuery PrepareReplicationQuery(ParsedQuery parsed_query, const bool in_explicit_transaction,
|
||||||
std::vector<Notification> *notifications, InterpreterContext *interpreter_context,
|
std::vector<Notification> *notifications, InterpreterContext *interpreter_context,
|
||||||
ShardRequestManagerInterface *manager) {
|
RequestRouterInterface *request_router) {
|
||||||
if (in_explicit_transaction) {
|
if (in_explicit_transaction) {
|
||||||
throw ReplicationModificationInMulticommandTxException();
|
throw ReplicationModificationInMulticommandTxException();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto *replication_query = utils::Downcast<ReplicationQuery>(parsed_query.query);
|
auto *replication_query = utils::Downcast<ReplicationQuery>(parsed_query.query);
|
||||||
auto callback =
|
auto callback = HandleReplicationQuery(replication_query, parsed_query.parameters, interpreter_context,
|
||||||
HandleReplicationQuery(replication_query, parsed_query.parameters, interpreter_context, manager, notifications);
|
request_router, notifications);
|
||||||
|
|
||||||
return PreparedQuery{callback.header, std::move(parsed_query.required_privileges),
|
return PreparedQuery{callback.header, std::move(parsed_query.required_privileges),
|
||||||
[callback_fn = std::move(callback.fn), pull_plan = std::shared_ptr<PullPlanVector>{nullptr}](
|
[callback_fn = std::move(callback.fn), pull_plan = std::shared_ptr<PullPlanVector>{nullptr}](
|
||||||
@ -1317,14 +1314,14 @@ PreparedQuery PrepareCreateSnapshotQuery(ParsedQuery parsed_query, bool in_expli
|
|||||||
}
|
}
|
||||||
|
|
||||||
PreparedQuery PrepareSettingQuery(ParsedQuery parsed_query, const bool in_explicit_transaction,
|
PreparedQuery PrepareSettingQuery(ParsedQuery parsed_query, const bool in_explicit_transaction,
|
||||||
ShardRequestManagerInterface *manager) {
|
RequestRouterInterface *request_router) {
|
||||||
if (in_explicit_transaction) {
|
if (in_explicit_transaction) {
|
||||||
throw SettingConfigInMulticommandTxException{};
|
throw SettingConfigInMulticommandTxException{};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto *setting_query = utils::Downcast<SettingQuery>(parsed_query.query);
|
auto *setting_query = utils::Downcast<SettingQuery>(parsed_query.query);
|
||||||
MG_ASSERT(setting_query);
|
MG_ASSERT(setting_query);
|
||||||
auto callback = HandleSettingQuery(setting_query, parsed_query.parameters, manager);
|
auto callback = HandleSettingQuery(setting_query, parsed_query.parameters, request_router);
|
||||||
|
|
||||||
return PreparedQuery{std::move(callback.header), std::move(parsed_query.required_privileges),
|
return PreparedQuery{std::move(callback.header), std::move(parsed_query.required_privileges),
|
||||||
[callback_fn = std::move(callback.fn), pull_plan = std::shared_ptr<PullPlanVector>{nullptr}](
|
[callback_fn = std::move(callback.fn), pull_plan = std::shared_ptr<PullPlanVector>{nullptr}](
|
||||||
@ -1521,7 +1518,7 @@ Interpreter::PrepareResult Interpreter::Prepare(const std::string &query_string,
|
|||||||
if (!in_explicit_transaction_ &&
|
if (!in_explicit_transaction_ &&
|
||||||
(utils::Downcast<CypherQuery>(parsed_query.query) || utils::Downcast<ExplainQuery>(parsed_query.query) ||
|
(utils::Downcast<CypherQuery>(parsed_query.query) || utils::Downcast<ExplainQuery>(parsed_query.query) ||
|
||||||
utils::Downcast<ProfileQuery>(parsed_query.query))) {
|
utils::Downcast<ProfileQuery>(parsed_query.query))) {
|
||||||
shard_request_manager_->StartTransaction();
|
request_router_->StartTransaction();
|
||||||
}
|
}
|
||||||
|
|
||||||
utils::Timer planning_timer;
|
utils::Timer planning_timer;
|
||||||
@ -1530,14 +1527,14 @@ Interpreter::PrepareResult Interpreter::Prepare(const std::string &query_string,
|
|||||||
if (utils::Downcast<CypherQuery>(parsed_query.query)) {
|
if (utils::Downcast<CypherQuery>(parsed_query.query)) {
|
||||||
prepared_query = PrepareCypherQuery(std::move(parsed_query), &query_execution->summary, interpreter_context_,
|
prepared_query = PrepareCypherQuery(std::move(parsed_query), &query_execution->summary, interpreter_context_,
|
||||||
&*execution_db_accessor_, &query_execution->execution_memory,
|
&*execution_db_accessor_, &query_execution->execution_memory,
|
||||||
&query_execution->notifications, shard_request_manager_.get());
|
&query_execution->notifications, request_router_.get());
|
||||||
} else if (utils::Downcast<ExplainQuery>(parsed_query.query)) {
|
} else if (utils::Downcast<ExplainQuery>(parsed_query.query)) {
|
||||||
prepared_query = PrepareExplainQuery(std::move(parsed_query), &query_execution->summary, interpreter_context_,
|
prepared_query = PrepareExplainQuery(std::move(parsed_query), &query_execution->summary, interpreter_context_,
|
||||||
&*shard_request_manager_, &query_execution->execution_memory_with_exception);
|
&*request_router_, &query_execution->execution_memory_with_exception);
|
||||||
} else if (utils::Downcast<ProfileQuery>(parsed_query.query)) {
|
} else if (utils::Downcast<ProfileQuery>(parsed_query.query)) {
|
||||||
prepared_query = PrepareProfileQuery(
|
prepared_query = PrepareProfileQuery(std::move(parsed_query), in_explicit_transaction_, &query_execution->summary,
|
||||||
std::move(parsed_query), in_explicit_transaction_, &query_execution->summary, interpreter_context_,
|
interpreter_context_, &*execution_db_accessor_,
|
||||||
&*execution_db_accessor_, &query_execution->execution_memory_with_exception, shard_request_manager_.get());
|
&query_execution->execution_memory_with_exception, request_router_.get());
|
||||||
} else if (utils::Downcast<DumpQuery>(parsed_query.query)) {
|
} else if (utils::Downcast<DumpQuery>(parsed_query.query)) {
|
||||||
prepared_query = PrepareDumpQuery(std::move(parsed_query), &query_execution->summary, &*execution_db_accessor_,
|
prepared_query = PrepareDumpQuery(std::move(parsed_query), &query_execution->summary, &*execution_db_accessor_,
|
||||||
&query_execution->execution_memory);
|
&query_execution->execution_memory);
|
||||||
@ -1545,9 +1542,9 @@ Interpreter::PrepareResult Interpreter::Prepare(const std::string &query_string,
|
|||||||
prepared_query = PrepareIndexQuery(std::move(parsed_query), in_explicit_transaction_,
|
prepared_query = PrepareIndexQuery(std::move(parsed_query), in_explicit_transaction_,
|
||||||
&query_execution->notifications, interpreter_context_);
|
&query_execution->notifications, interpreter_context_);
|
||||||
} else if (utils::Downcast<AuthQuery>(parsed_query.query)) {
|
} else if (utils::Downcast<AuthQuery>(parsed_query.query)) {
|
||||||
prepared_query = PrepareAuthQuery(
|
prepared_query = PrepareAuthQuery(std::move(parsed_query), in_explicit_transaction_, &query_execution->summary,
|
||||||
std::move(parsed_query), in_explicit_transaction_, &query_execution->summary, interpreter_context_,
|
interpreter_context_, &*execution_db_accessor_,
|
||||||
&*execution_db_accessor_, &query_execution->execution_memory_with_exception, shard_request_manager_.get());
|
&query_execution->execution_memory_with_exception, request_router_.get());
|
||||||
} else if (utils::Downcast<InfoQuery>(parsed_query.query)) {
|
} else if (utils::Downcast<InfoQuery>(parsed_query.query)) {
|
||||||
prepared_query = PrepareInfoQuery(std::move(parsed_query), in_explicit_transaction_, &query_execution->summary,
|
prepared_query = PrepareInfoQuery(std::move(parsed_query), in_explicit_transaction_, &query_execution->summary,
|
||||||
interpreter_context_, interpreter_context_->db,
|
interpreter_context_, interpreter_context_->db,
|
||||||
@ -1558,7 +1555,7 @@ Interpreter::PrepareResult Interpreter::Prepare(const std::string &query_string,
|
|||||||
} else if (utils::Downcast<ReplicationQuery>(parsed_query.query)) {
|
} else if (utils::Downcast<ReplicationQuery>(parsed_query.query)) {
|
||||||
prepared_query =
|
prepared_query =
|
||||||
PrepareReplicationQuery(std::move(parsed_query), in_explicit_transaction_, &query_execution->notifications,
|
PrepareReplicationQuery(std::move(parsed_query), in_explicit_transaction_, &query_execution->notifications,
|
||||||
interpreter_context_, shard_request_manager_.get());
|
interpreter_context_, request_router_.get());
|
||||||
} else if (utils::Downcast<LockPathQuery>(parsed_query.query)) {
|
} else if (utils::Downcast<LockPathQuery>(parsed_query.query)) {
|
||||||
prepared_query = PrepareLockPathQuery(std::move(parsed_query), in_explicit_transaction_, interpreter_context_,
|
prepared_query = PrepareLockPathQuery(std::move(parsed_query), in_explicit_transaction_, interpreter_context_,
|
||||||
&*execution_db_accessor_);
|
&*execution_db_accessor_);
|
||||||
@ -1575,8 +1572,7 @@ Interpreter::PrepareResult Interpreter::Prepare(const std::string &query_string,
|
|||||||
prepared_query =
|
prepared_query =
|
||||||
PrepareCreateSnapshotQuery(std::move(parsed_query), in_explicit_transaction_, interpreter_context_);
|
PrepareCreateSnapshotQuery(std::move(parsed_query), in_explicit_transaction_, interpreter_context_);
|
||||||
} else if (utils::Downcast<SettingQuery>(parsed_query.query)) {
|
} else if (utils::Downcast<SettingQuery>(parsed_query.query)) {
|
||||||
prepared_query =
|
prepared_query = PrepareSettingQuery(std::move(parsed_query), in_explicit_transaction_, request_router_.get());
|
||||||
PrepareSettingQuery(std::move(parsed_query), in_explicit_transaction_, shard_request_manager_.get());
|
|
||||||
} else if (utils::Downcast<VersionQuery>(parsed_query.query)) {
|
} else if (utils::Downcast<VersionQuery>(parsed_query.query)) {
|
||||||
prepared_query = PrepareVersionQuery(std::move(parsed_query), in_explicit_transaction_);
|
prepared_query = PrepareVersionQuery(std::move(parsed_query), in_explicit_transaction_);
|
||||||
} else if (utils::Downcast<SchemaQuery>(parsed_query.query)) {
|
} else if (utils::Downcast<SchemaQuery>(parsed_query.query)) {
|
||||||
@ -1617,7 +1613,7 @@ void Interpreter::Commit() {
|
|||||||
// For now, we will not check if there are some unfinished queries.
|
// For now, we will not check if there are some unfinished queries.
|
||||||
// We should document clearly that all results should be pulled to complete
|
// We should document clearly that all results should be pulled to complete
|
||||||
// a query.
|
// a query.
|
||||||
shard_request_manager_->Commit();
|
request_router_->Commit();
|
||||||
if (!db_accessor_) return;
|
if (!db_accessor_) return;
|
||||||
|
|
||||||
const auto reset_necessary_members = [this]() {
|
const auto reset_necessary_members = [this]() {
|
||||||
|
@ -296,7 +296,7 @@ class Interpreter final {
|
|||||||
*/
|
*/
|
||||||
void Abort();
|
void Abort();
|
||||||
|
|
||||||
const ShardRequestManagerInterface *GetShardRequestManager() const { return shard_request_manager_.get(); }
|
const RequestRouterInterface *GetRequestRouter() const { return request_router_.get(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct QueryExecution {
|
struct QueryExecution {
|
||||||
@ -342,7 +342,7 @@ class Interpreter final {
|
|||||||
// move this unique_ptr into a shared_ptr.
|
// move this unique_ptr into a shared_ptr.
|
||||||
std::unique_ptr<storage::v3::Shard::Accessor> db_accessor_;
|
std::unique_ptr<storage::v3::Shard::Accessor> db_accessor_;
|
||||||
std::optional<DbAccessor> execution_db_accessor_;
|
std::optional<DbAccessor> execution_db_accessor_;
|
||||||
std::unique_ptr<ShardRequestManagerInterface> shard_request_manager_;
|
std::unique_ptr<RequestRouterInterface> request_router_;
|
||||||
bool in_explicit_transaction_{false};
|
bool in_explicit_transaction_{false};
|
||||||
bool expect_rollback_{false};
|
bool expect_rollback_{false};
|
||||||
|
|
||||||
|
@ -39,8 +39,8 @@
|
|||||||
#include "query/v2/frontend/ast/ast.hpp"
|
#include "query/v2/frontend/ast/ast.hpp"
|
||||||
#include "query/v2/path.hpp"
|
#include "query/v2/path.hpp"
|
||||||
#include "query/v2/plan/scoped_profile.hpp"
|
#include "query/v2/plan/scoped_profile.hpp"
|
||||||
|
#include "query/v2/request_router.hpp"
|
||||||
#include "query/v2/requests.hpp"
|
#include "query/v2/requests.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
|
||||||
#include "storage/v3/conversions.hpp"
|
#include "storage/v3/conversions.hpp"
|
||||||
#include "storage/v3/property_value.hpp"
|
#include "storage/v3/property_value.hpp"
|
||||||
#include "utils/algorithm.hpp"
|
#include "utils/algorithm.hpp"
|
||||||
@ -177,10 +177,10 @@ class DistributedCreateNodeCursor : public Cursor {
|
|||||||
bool Pull(Frame &frame, ExecutionContext &context) override {
|
bool Pull(Frame &frame, ExecutionContext &context) override {
|
||||||
SCOPED_PROFILE_OP("CreateNode");
|
SCOPED_PROFILE_OP("CreateNode");
|
||||||
if (input_cursor_->Pull(frame, context)) {
|
if (input_cursor_->Pull(frame, context)) {
|
||||||
auto &shard_manager = context.shard_request_manager;
|
auto &request_router = context.request_router;
|
||||||
{
|
{
|
||||||
SCOPED_REQUEST_WAIT_PROFILE;
|
SCOPED_REQUEST_WAIT_PROFILE;
|
||||||
shard_manager->Request(state_, NodeCreationInfoToRequest(context, frame));
|
request_router->Request(state_, NodeCreationInfoToRequest(context, frame));
|
||||||
}
|
}
|
||||||
PlaceNodeOnTheFrame(frame, context);
|
PlaceNodeOnTheFrame(frame, context);
|
||||||
return true;
|
return true;
|
||||||
@ -197,8 +197,8 @@ class DistributedCreateNodeCursor : public Cursor {
|
|||||||
// TODO(kostasrim) Make this work with batching
|
// TODO(kostasrim) Make this work with batching
|
||||||
const auto primary_label = msgs::Label{.id = nodes_info_[0]->labels[0]};
|
const auto primary_label = msgs::Label{.id = nodes_info_[0]->labels[0]};
|
||||||
msgs::Vertex v{.id = std::make_pair(primary_label, primary_keys_[0])};
|
msgs::Vertex v{.id = std::make_pair(primary_label, primary_keys_[0])};
|
||||||
frame[nodes_info_.front()->symbol] = TypedValue(
|
frame[nodes_info_.front()->symbol] =
|
||||||
query::v2::accessors::VertexAccessor(std::move(v), src_vertex_props_[0], context.shard_request_manager));
|
TypedValue(query::v2::accessors::VertexAccessor(std::move(v), src_vertex_props_[0], context.request_router));
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<msgs::NewVertex> NodeCreationInfoToRequest(ExecutionContext &context, Frame &frame) {
|
std::vector<msgs::NewVertex> NodeCreationInfoToRequest(ExecutionContext &context, Frame &frame) {
|
||||||
@ -218,7 +218,7 @@ class DistributedCreateNodeCursor : public Cursor {
|
|||||||
if (const auto *node_info_properties = std::get_if<PropertiesMapList>(&node_info->properties)) {
|
if (const auto *node_info_properties = std::get_if<PropertiesMapList>(&node_info->properties)) {
|
||||||
for (const auto &[key, value_expression] : *node_info_properties) {
|
for (const auto &[key, value_expression] : *node_info_properties) {
|
||||||
TypedValue val = value_expression->Accept(evaluator);
|
TypedValue val = value_expression->Accept(evaluator);
|
||||||
if (context.shard_request_manager->IsPrimaryKey(primary_label, key)) {
|
if (context.request_router->IsPrimaryKey(primary_label, key)) {
|
||||||
rqst.primary_key.push_back(TypedValueToValue(val));
|
rqst.primary_key.push_back(TypedValueToValue(val));
|
||||||
pk.push_back(TypedValueToValue(val));
|
pk.push_back(TypedValueToValue(val));
|
||||||
}
|
}
|
||||||
@ -227,8 +227,8 @@ class DistributedCreateNodeCursor : public Cursor {
|
|||||||
auto property_map = evaluator.Visit(*std::get<ParameterLookup *>(node_info->properties)).ValueMap();
|
auto property_map = evaluator.Visit(*std::get<ParameterLookup *>(node_info->properties)).ValueMap();
|
||||||
for (const auto &[key, value] : property_map) {
|
for (const auto &[key, value] : property_map) {
|
||||||
auto key_str = std::string(key);
|
auto key_str = std::string(key);
|
||||||
auto property_id = context.shard_request_manager->NameToProperty(key_str);
|
auto property_id = context.request_router->NameToProperty(key_str);
|
||||||
if (context.shard_request_manager->IsPrimaryKey(primary_label, property_id)) {
|
if (context.request_router->IsPrimaryKey(primary_label, property_id)) {
|
||||||
rqst.primary_key.push_back(TypedValueToValue(value));
|
rqst.primary_key.push_back(TypedValueToValue(value));
|
||||||
pk.push_back(TypedValueToValue(value));
|
pk.push_back(TypedValueToValue(value));
|
||||||
}
|
}
|
||||||
@ -386,10 +386,10 @@ class DistributedScanAllAndFilterCursor : public Cursor {
|
|||||||
|
|
||||||
using VertexAccessor = accessors::VertexAccessor;
|
using VertexAccessor = accessors::VertexAccessor;
|
||||||
|
|
||||||
bool MakeRequest(ShardRequestManagerInterface &shard_manager, ExecutionContext &context) {
|
bool MakeRequest(RequestRouterInterface &request_router, ExecutionContext &context) {
|
||||||
{
|
{
|
||||||
SCOPED_REQUEST_WAIT_PROFILE;
|
SCOPED_REQUEST_WAIT_PROFILE;
|
||||||
current_batch = shard_manager.Request(request_state_);
|
current_batch = request_router.Request(request_state_);
|
||||||
}
|
}
|
||||||
current_vertex_it = current_batch.begin();
|
current_vertex_it = current_batch.begin();
|
||||||
return !current_batch.empty();
|
return !current_batch.empty();
|
||||||
@ -398,7 +398,7 @@ class DistributedScanAllAndFilterCursor : public Cursor {
|
|||||||
bool Pull(Frame &frame, ExecutionContext &context) override {
|
bool Pull(Frame &frame, ExecutionContext &context) override {
|
||||||
SCOPED_PROFILE_OP(op_name_);
|
SCOPED_PROFILE_OP(op_name_);
|
||||||
|
|
||||||
auto &shard_manager = *context.shard_request_manager;
|
auto &request_router = *context.request_router;
|
||||||
while (true) {
|
while (true) {
|
||||||
if (MustAbort(context)) {
|
if (MustAbort(context)) {
|
||||||
throw HintedAbortError();
|
throw HintedAbortError();
|
||||||
@ -411,10 +411,11 @@ class DistributedScanAllAndFilterCursor : public Cursor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
request_state_.label = label_.has_value() ? std::make_optional(shard_manager.LabelToName(*label_)) : std::nullopt;
|
request_state_.label =
|
||||||
|
label_.has_value() ? std::make_optional(request_router.LabelToName(*label_)) : std::nullopt;
|
||||||
|
|
||||||
if (current_vertex_it == current_batch.end() &&
|
if (current_vertex_it == current_batch.end() &&
|
||||||
(request_state_.state == State::COMPLETED || !MakeRequest(shard_manager, context))) {
|
(request_state_.state == State::COMPLETED || !MakeRequest(request_router, context))) {
|
||||||
ResetExecutionState();
|
ResetExecutionState();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -696,7 +697,7 @@ bool Filter::FilterCursor::Pull(Frame &frame, ExecutionContext &context) {
|
|||||||
|
|
||||||
// Like all filters, newly set values should not affect filtering of old
|
// Like all filters, newly set values should not affect filtering of old
|
||||||
// nodes and edges.
|
// nodes and edges.
|
||||||
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context, context.shard_request_manager,
|
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context, context.request_router,
|
||||||
storage::v3::View::OLD);
|
storage::v3::View::OLD);
|
||||||
while (input_cursor_->Pull(frame, context)) {
|
while (input_cursor_->Pull(frame, context)) {
|
||||||
if (EvaluateFilter(evaluator, self_.expression_)) return true;
|
if (EvaluateFilter(evaluator, self_.expression_)) return true;
|
||||||
@ -737,8 +738,8 @@ bool Produce::ProduceCursor::Pull(Frame &frame, ExecutionContext &context) {
|
|||||||
|
|
||||||
if (input_cursor_->Pull(frame, context)) {
|
if (input_cursor_->Pull(frame, context)) {
|
||||||
// Produce should always yield the latest results.
|
// Produce should always yield the latest results.
|
||||||
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context,
|
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context, context.request_router,
|
||||||
context.shard_request_manager, storage::v3::View::NEW);
|
storage::v3::View::NEW);
|
||||||
for (auto named_expr : self_.named_expressions_) named_expr->Accept(evaluator);
|
for (auto named_expr : self_.named_expressions_) named_expr->Accept(evaluator);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -1122,8 +1123,8 @@ class AggregateCursor : public Cursor {
|
|||||||
* aggregation results, and not on the number of inputs.
|
* aggregation results, and not on the number of inputs.
|
||||||
*/
|
*/
|
||||||
void ProcessAll(Frame *frame, ExecutionContext *context) {
|
void ProcessAll(Frame *frame, ExecutionContext *context) {
|
||||||
ExpressionEvaluator evaluator(frame, context->symbol_table, context->evaluation_context,
|
ExpressionEvaluator evaluator(frame, context->symbol_table, context->evaluation_context, context->request_router,
|
||||||
context->shard_request_manager, storage::v3::View::NEW);
|
storage::v3::View::NEW);
|
||||||
while (input_cursor_->Pull(*frame, *context)) {
|
while (input_cursor_->Pull(*frame, *context)) {
|
||||||
ProcessOne(*frame, &evaluator);
|
ProcessOne(*frame, &evaluator);
|
||||||
}
|
}
|
||||||
@ -1343,8 +1344,8 @@ bool Skip::SkipCursor::Pull(Frame &frame, ExecutionContext &context) {
|
|||||||
// First successful pull from the input, evaluate the skip expression.
|
// First successful pull from the input, evaluate the skip expression.
|
||||||
// The skip expression doesn't contain identifiers so graph view
|
// The skip expression doesn't contain identifiers so graph view
|
||||||
// parameter is not important.
|
// parameter is not important.
|
||||||
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context,
|
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context, context.request_router,
|
||||||
context.shard_request_manager, storage::v3::View::OLD);
|
storage::v3::View::OLD);
|
||||||
TypedValue to_skip = self_.expression_->Accept(evaluator);
|
TypedValue to_skip = self_.expression_->Accept(evaluator);
|
||||||
if (to_skip.type() != TypedValue::Type::Int)
|
if (to_skip.type() != TypedValue::Type::Int)
|
||||||
throw QueryRuntimeException("Number of elements to skip must be an integer.");
|
throw QueryRuntimeException("Number of elements to skip must be an integer.");
|
||||||
@ -1398,8 +1399,8 @@ bool Limit::LimitCursor::Pull(Frame &frame, ExecutionContext &context) {
|
|||||||
if (limit_ == -1) {
|
if (limit_ == -1) {
|
||||||
// Limit expression doesn't contain identifiers so graph view is not
|
// Limit expression doesn't contain identifiers so graph view is not
|
||||||
// important.
|
// important.
|
||||||
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context,
|
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context, context.request_router,
|
||||||
context.shard_request_manager, storage::v3::View::OLD);
|
storage::v3::View::OLD);
|
||||||
TypedValue limit = self_.expression_->Accept(evaluator);
|
TypedValue limit = self_.expression_->Accept(evaluator);
|
||||||
if (limit.type() != TypedValue::Type::Int)
|
if (limit.type() != TypedValue::Type::Int)
|
||||||
throw QueryRuntimeException("Limit on number of returned elements must be an integer.");
|
throw QueryRuntimeException("Limit on number of returned elements must be an integer.");
|
||||||
@ -1454,8 +1455,8 @@ class OrderByCursor : public Cursor {
|
|||||||
SCOPED_PROFILE_OP("OrderBy");
|
SCOPED_PROFILE_OP("OrderBy");
|
||||||
|
|
||||||
if (!did_pull_all_) {
|
if (!did_pull_all_) {
|
||||||
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context,
|
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context, context.request_router,
|
||||||
context.shard_request_manager, storage::v3::View::OLD);
|
storage::v3::View::OLD);
|
||||||
auto *mem = cache_.get_allocator().GetMemoryResource();
|
auto *mem = cache_.get_allocator().GetMemoryResource();
|
||||||
while (input_cursor_->Pull(frame, context)) {
|
while (input_cursor_->Pull(frame, context)) {
|
||||||
// collect the order_by elements
|
// collect the order_by elements
|
||||||
@ -1712,8 +1713,8 @@ class UnwindCursor : public Cursor {
|
|||||||
if (!input_cursor_->Pull(frame, context)) return false;
|
if (!input_cursor_->Pull(frame, context)) return false;
|
||||||
|
|
||||||
// successful pull from input, initialize value and iterator
|
// successful pull from input, initialize value and iterator
|
||||||
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context,
|
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context, context.request_router,
|
||||||
context.shard_request_manager, storage::v3::View::OLD);
|
storage::v3::View::OLD);
|
||||||
TypedValue input_value = self_.input_expression_->Accept(evaluator);
|
TypedValue input_value = self_.input_expression_->Accept(evaluator);
|
||||||
if (input_value.type() != TypedValue::Type::List)
|
if (input_value.type() != TypedValue::Type::List)
|
||||||
throw QueryRuntimeException("Argument of UNWIND must be a list, but '{}' was provided.", input_value.type());
|
throw QueryRuntimeException("Argument of UNWIND must be a list, but '{}' was provided.", input_value.type());
|
||||||
@ -2224,7 +2225,7 @@ class LoadCsvCursor : public Cursor {
|
|||||||
Frame frame(0);
|
Frame frame(0);
|
||||||
SymbolTable symbol_table;
|
SymbolTable symbol_table;
|
||||||
auto evaluator =
|
auto evaluator =
|
||||||
ExpressionEvaluator(&frame, symbol_table, eval_context, context.shard_request_manager, storage::v3::View::OLD);
|
ExpressionEvaluator(&frame, symbol_table, eval_context, context.request_router, storage::v3::View::OLD);
|
||||||
|
|
||||||
auto maybe_file = ToOptionalString(&evaluator, self_->file_);
|
auto maybe_file = ToOptionalString(&evaluator, self_->file_);
|
||||||
auto maybe_delim = ToOptionalString(&evaluator, self_->delimiter_);
|
auto maybe_delim = ToOptionalString(&evaluator, self_->delimiter_);
|
||||||
@ -2261,8 +2262,8 @@ class ForeachCursor : public Cursor {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context,
|
ExpressionEvaluator evaluator(&frame, context.symbol_table, context.evaluation_context, context.request_router,
|
||||||
context.shard_request_manager, storage::v3::View::NEW);
|
storage::v3::View::NEW);
|
||||||
TypedValue expr_result = expression->Accept(evaluator);
|
TypedValue expr_result = expression->Accept(evaluator);
|
||||||
|
|
||||||
if (expr_result.IsNull()) {
|
if (expr_result.IsNull()) {
|
||||||
@ -2338,11 +2339,11 @@ class DistributedCreateExpandCursor : public Cursor {
|
|||||||
if (!input_cursor_->Pull(frame, context)) {
|
if (!input_cursor_->Pull(frame, context)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
auto &shard_manager = context.shard_request_manager;
|
auto &request_router = context.request_router;
|
||||||
ResetExecutionState();
|
ResetExecutionState();
|
||||||
{
|
{
|
||||||
SCOPED_REQUEST_WAIT_PROFILE;
|
SCOPED_REQUEST_WAIT_PROFILE;
|
||||||
shard_manager->Request(state_, ExpandCreationInfoToRequest(context, frame));
|
request_router->Request(state_, ExpandCreationInfoToRequest(context, frame));
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -2379,7 +2380,7 @@ class DistributedCreateExpandCursor : public Cursor {
|
|||||||
// handle parameter
|
// handle parameter
|
||||||
auto property_map = evaluator.Visit(*std::get<ParameterLookup *>(edge_info.properties)).ValueMap();
|
auto property_map = evaluator.Visit(*std::get<ParameterLookup *>(edge_info.properties)).ValueMap();
|
||||||
for (const auto &[property, value] : property_map) {
|
for (const auto &[property, value] : property_map) {
|
||||||
const auto property_id = context.shard_request_manager->NameToProperty(std::string(property));
|
const auto property_id = context.request_router->NameToProperty(std::string(property));
|
||||||
request.properties.emplace_back(property_id, storage::v3::TypedValueToValue(value));
|
request.properties.emplace_back(property_id, storage::v3::TypedValueToValue(value));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2394,7 +2395,7 @@ class DistributedCreateExpandCursor : public Cursor {
|
|||||||
const auto set_vertex = [&context](const auto &vertex, auto &vertex_id) {
|
const auto set_vertex = [&context](const auto &vertex, auto &vertex_id) {
|
||||||
vertex_id.first = vertex.PrimaryLabel();
|
vertex_id.first = vertex.PrimaryLabel();
|
||||||
for (const auto &[key, val] : vertex.Properties()) {
|
for (const auto &[key, val] : vertex.Properties()) {
|
||||||
if (context.shard_request_manager->IsPrimaryKey(vertex_id.first.id, key)) {
|
if (context.request_router->IsPrimaryKey(vertex_id.first.id, key)) {
|
||||||
vertex_id.second.push_back(val);
|
vertex_id.second.push_back(val);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2474,11 +2475,11 @@ class DistributedExpandCursor : public Cursor {
|
|||||||
request.src_vertices.push_back(get_dst_vertex(edge, direction));
|
request.src_vertices.push_back(get_dst_vertex(edge, direction));
|
||||||
request.direction = (direction == EdgeAtom::Direction::IN) ? msgs::EdgeDirection::OUT : msgs::EdgeDirection::IN;
|
request.direction = (direction == EdgeAtom::Direction::IN) ? msgs::EdgeDirection::OUT : msgs::EdgeDirection::IN;
|
||||||
ExecutionState<msgs::ExpandOneRequest> request_state;
|
ExecutionState<msgs::ExpandOneRequest> request_state;
|
||||||
auto result_rows = context.shard_request_manager->Request(request_state, std::move(request));
|
auto result_rows = context.request_router->Request(request_state, std::move(request));
|
||||||
MG_ASSERT(result_rows.size() == 1);
|
MG_ASSERT(result_rows.size() == 1);
|
||||||
auto &result_row = result_rows.front();
|
auto &result_row = result_rows.front();
|
||||||
frame[self_.common_.node_symbol] = accessors::VertexAccessor(
|
frame[self_.common_.node_symbol] = accessors::VertexAccessor(
|
||||||
msgs::Vertex{result_row.src_vertex}, result_row.src_vertex_properties, context.shard_request_manager);
|
msgs::Vertex{result_row.src_vertex}, result_row.src_vertex_properties, context.request_router);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InitEdges(Frame &frame, ExecutionContext &context) {
|
bool InitEdges(Frame &frame, ExecutionContext &context) {
|
||||||
@ -2502,7 +2503,7 @@ class DistributedExpandCursor : public Cursor {
|
|||||||
ExecutionState<msgs::ExpandOneRequest> request_state;
|
ExecutionState<msgs::ExpandOneRequest> request_state;
|
||||||
auto result_rows = std::invoke([&context, &request_state, &request]() mutable {
|
auto result_rows = std::invoke([&context, &request_state, &request]() mutable {
|
||||||
SCOPED_REQUEST_WAIT_PROFILE;
|
SCOPED_REQUEST_WAIT_PROFILE;
|
||||||
return context.shard_request_manager->Request(request_state, std::move(request));
|
return context.request_router->Request(request_state, std::move(request));
|
||||||
});
|
});
|
||||||
MG_ASSERT(result_rows.size() == 1);
|
MG_ASSERT(result_rows.size() == 1);
|
||||||
auto &result_row = result_rows.front();
|
auto &result_row = result_rows.front();
|
||||||
@ -2525,14 +2526,14 @@ class DistributedExpandCursor : public Cursor {
|
|||||||
case EdgeAtom::Direction::IN: {
|
case EdgeAtom::Direction::IN: {
|
||||||
for (auto &edge : edge_messages) {
|
for (auto &edge : edge_messages) {
|
||||||
edge_accessors.emplace_back(msgs::Edge{std::move(edge.other_end), vertex.Id(), {}, {edge.gid}, edge.type},
|
edge_accessors.emplace_back(msgs::Edge{std::move(edge.other_end), vertex.Id(), {}, {edge.gid}, edge.type},
|
||||||
context.shard_request_manager);
|
context.request_router);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EdgeAtom::Direction::OUT: {
|
case EdgeAtom::Direction::OUT: {
|
||||||
for (auto &edge : edge_messages) {
|
for (auto &edge : edge_messages) {
|
||||||
edge_accessors.emplace_back(msgs::Edge{vertex.Id(), std::move(edge.other_end), {}, {edge.gid}, edge.type},
|
edge_accessors.emplace_back(msgs::Edge{vertex.Id(), std::move(edge.other_end), {}, {edge.gid}, edge.type},
|
||||||
context.shard_request_manager);
|
context.request_router);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -14,13 +14,13 @@
|
|||||||
|
|
||||||
#include "query/v2/bindings/pretty_print.hpp"
|
#include "query/v2/bindings/pretty_print.hpp"
|
||||||
#include "query/v2/db_accessor.hpp"
|
#include "query/v2/db_accessor.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
#include "query/v2/request_router.hpp"
|
||||||
#include "utils/string.hpp"
|
#include "utils/string.hpp"
|
||||||
|
|
||||||
namespace memgraph::query::v2::plan {
|
namespace memgraph::query::v2::plan {
|
||||||
|
|
||||||
PlanPrinter::PlanPrinter(const ShardRequestManagerInterface *request_manager, std::ostream *out)
|
PlanPrinter::PlanPrinter(const RequestRouterInterface *request_router, std::ostream *out)
|
||||||
: request_manager_(request_manager), out_(out) {}
|
: request_router_(request_router), out_(out) {}
|
||||||
|
|
||||||
#define PRE_VISIT(TOp) \
|
#define PRE_VISIT(TOp) \
|
||||||
bool PlanPrinter::PreVisit(TOp &) { \
|
bool PlanPrinter::PreVisit(TOp &) { \
|
||||||
@ -34,7 +34,7 @@ bool PlanPrinter::PreVisit(CreateExpand &op) {
|
|||||||
WithPrintLn([&](auto &out) {
|
WithPrintLn([&](auto &out) {
|
||||||
out << "* CreateExpand (" << op.input_symbol_.name() << ")"
|
out << "* CreateExpand (" << op.input_symbol_.name() << ")"
|
||||||
<< (op.edge_info_.direction == query::v2::EdgeAtom::Direction::IN ? "<-" : "-") << "["
|
<< (op.edge_info_.direction == query::v2::EdgeAtom::Direction::IN ? "<-" : "-") << "["
|
||||||
<< op.edge_info_.symbol.name() << ":" << request_manager_->EdgeTypeToName(op.edge_info_.edge_type) << "]"
|
<< op.edge_info_.symbol.name() << ":" << request_router_->EdgeTypeToName(op.edge_info_.edge_type) << "]"
|
||||||
<< (op.edge_info_.direction == query::v2::EdgeAtom::Direction::OUT ? "->" : "-") << "("
|
<< (op.edge_info_.direction == query::v2::EdgeAtom::Direction::OUT ? "->" : "-") << "("
|
||||||
<< op.node_info_.symbol.name() << ")";
|
<< op.node_info_.symbol.name() << ")";
|
||||||
});
|
});
|
||||||
@ -54,7 +54,7 @@ bool PlanPrinter::PreVisit(query::v2::plan::ScanAll &op) {
|
|||||||
bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabel &op) {
|
bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabel &op) {
|
||||||
WithPrintLn([&](auto &out) {
|
WithPrintLn([&](auto &out) {
|
||||||
out << "* ScanAllByLabel"
|
out << "* ScanAllByLabel"
|
||||||
<< " (" << op.output_symbol_.name() << " :" << request_manager_->LabelToName(op.label_) << ")";
|
<< " (" << op.output_symbol_.name() << " :" << request_router_->LabelToName(op.label_) << ")";
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -62,8 +62,8 @@ bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabel &op) {
|
|||||||
bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabelPropertyValue &op) {
|
bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabelPropertyValue &op) {
|
||||||
WithPrintLn([&](auto &out) {
|
WithPrintLn([&](auto &out) {
|
||||||
out << "* ScanAllByLabelPropertyValue"
|
out << "* ScanAllByLabelPropertyValue"
|
||||||
<< " (" << op.output_symbol_.name() << " :" << request_manager_->LabelToName(op.label_) << " {"
|
<< " (" << op.output_symbol_.name() << " :" << request_router_->LabelToName(op.label_) << " {"
|
||||||
<< request_manager_->PropertyToName(op.property_) << "})";
|
<< request_router_->PropertyToName(op.property_) << "})";
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -71,8 +71,8 @@ bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabelPropertyValue &op) {
|
|||||||
bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabelPropertyRange &op) {
|
bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabelPropertyRange &op) {
|
||||||
WithPrintLn([&](auto &out) {
|
WithPrintLn([&](auto &out) {
|
||||||
out << "* ScanAllByLabelPropertyRange"
|
out << "* ScanAllByLabelPropertyRange"
|
||||||
<< " (" << op.output_symbol_.name() << " :" << request_manager_->LabelToName(op.label_) << " {"
|
<< " (" << op.output_symbol_.name() << " :" << request_router_->LabelToName(op.label_) << " {"
|
||||||
<< request_manager_->PropertyToName(op.property_) << "})";
|
<< request_router_->PropertyToName(op.property_) << "})";
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -80,8 +80,8 @@ bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabelPropertyRange &op) {
|
|||||||
bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabelProperty &op) {
|
bool PlanPrinter::PreVisit(query::v2::plan::ScanAllByLabelProperty &op) {
|
||||||
WithPrintLn([&](auto &out) {
|
WithPrintLn([&](auto &out) {
|
||||||
out << "* ScanAllByLabelProperty"
|
out << "* ScanAllByLabelProperty"
|
||||||
<< " (" << op.output_symbol_.name() << " :" << request_manager_->LabelToName(op.label_) << " {"
|
<< " (" << op.output_symbol_.name() << " :" << request_router_->LabelToName(op.label_) << " {"
|
||||||
<< request_manager_->PropertyToName(op.property_) << "})";
|
<< request_router_->PropertyToName(op.property_) << "})";
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -100,7 +100,7 @@ bool PlanPrinter::PreVisit(query::v2::plan::Expand &op) {
|
|||||||
<< (op.common_.direction == query::v2::EdgeAtom::Direction::IN ? "<-" : "-") << "["
|
<< (op.common_.direction == query::v2::EdgeAtom::Direction::IN ? "<-" : "-") << "["
|
||||||
<< op.common_.edge_symbol.name();
|
<< op.common_.edge_symbol.name();
|
||||||
utils::PrintIterable(*out_, op.common_.edge_types, "|", [this](auto &stream, const auto &edge_type) {
|
utils::PrintIterable(*out_, op.common_.edge_types, "|", [this](auto &stream, const auto &edge_type) {
|
||||||
stream << ":" << request_manager_->EdgeTypeToName(edge_type);
|
stream << ":" << request_router_->EdgeTypeToName(edge_type);
|
||||||
});
|
});
|
||||||
*out_ << "]" << (op.common_.direction == query::v2::EdgeAtom::Direction::OUT ? "->" : "-") << "("
|
*out_ << "]" << (op.common_.direction == query::v2::EdgeAtom::Direction::OUT ? "->" : "-") << "("
|
||||||
<< op.common_.node_symbol.name() << ")";
|
<< op.common_.node_symbol.name() << ")";
|
||||||
@ -129,7 +129,7 @@ bool PlanPrinter::PreVisit(query::v2::plan::ExpandVariable &op) {
|
|||||||
<< (op.common_.direction == query::v2::EdgeAtom::Direction::IN ? "<-" : "-") << "["
|
<< (op.common_.direction == query::v2::EdgeAtom::Direction::IN ? "<-" : "-") << "["
|
||||||
<< op.common_.edge_symbol.name();
|
<< op.common_.edge_symbol.name();
|
||||||
utils::PrintIterable(*out_, op.common_.edge_types, "|", [this](auto &stream, const auto &edge_type) {
|
utils::PrintIterable(*out_, op.common_.edge_types, "|", [this](auto &stream, const auto &edge_type) {
|
||||||
stream << ":" << request_manager_->EdgeTypeToName(edge_type);
|
stream << ":" << request_router_->EdgeTypeToName(edge_type);
|
||||||
});
|
});
|
||||||
*out_ << "]" << (op.common_.direction == query::v2::EdgeAtom::Direction::OUT ? "->" : "-") << "("
|
*out_ << "]" << (op.common_.direction == query::v2::EdgeAtom::Direction::OUT ? "->" : "-") << "("
|
||||||
<< op.common_.node_symbol.name() << ")";
|
<< op.common_.node_symbol.name() << ")";
|
||||||
@ -263,15 +263,14 @@ void PlanPrinter::Branch(query::v2::plan::LogicalOperator &op, const std::string
|
|||||||
--depth_;
|
--depth_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrettyPrint(const ShardRequestManagerInterface &request_manager, const LogicalOperator *plan_root,
|
void PrettyPrint(const RequestRouterInterface &request_router, const LogicalOperator *plan_root, std::ostream *out) {
|
||||||
std::ostream *out) {
|
PlanPrinter printer(&request_router, out);
|
||||||
PlanPrinter printer(&request_manager, out);
|
|
||||||
// FIXME(mtomic): We should make visitors that take const arguments.
|
// FIXME(mtomic): We should make visitors that take const arguments.
|
||||||
const_cast<LogicalOperator *>(plan_root)->Accept(printer);
|
const_cast<LogicalOperator *>(plan_root)->Accept(printer);
|
||||||
}
|
}
|
||||||
|
|
||||||
nlohmann::json PlanToJson(const ShardRequestManagerInterface &request_manager, const LogicalOperator *plan_root) {
|
nlohmann::json PlanToJson(const RequestRouterInterface &request_router, const LogicalOperator *plan_root) {
|
||||||
impl::PlanToJsonVisitor visitor(&request_manager);
|
impl::PlanToJsonVisitor visitor(&request_router);
|
||||||
// FIXME(mtomic): We should make visitors that take const arguments.
|
// FIXME(mtomic): We should make visitors that take const arguments.
|
||||||
const_cast<LogicalOperator *>(plan_root)->Accept(visitor);
|
const_cast<LogicalOperator *>(plan_root)->Accept(visitor);
|
||||||
return visitor.output();
|
return visitor.output();
|
||||||
@ -349,16 +348,16 @@ json ToJson(const utils::Bound<Expression *> &bound) {
|
|||||||
|
|
||||||
json ToJson(const Symbol &symbol) { return symbol.name(); }
|
json ToJson(const Symbol &symbol) { return symbol.name(); }
|
||||||
|
|
||||||
json ToJson(storage::v3::EdgeTypeId edge_type, const ShardRequestManagerInterface &request_manager) {
|
json ToJson(storage::v3::EdgeTypeId edge_type, const RequestRouterInterface &request_router) {
|
||||||
return request_manager.EdgeTypeToName(edge_type);
|
return request_router.EdgeTypeToName(edge_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
json ToJson(storage::v3::LabelId label, const ShardRequestManagerInterface &request_manager) {
|
json ToJson(storage::v3::LabelId label, const RequestRouterInterface &request_router) {
|
||||||
return request_manager.LabelToName(label);
|
return request_router.LabelToName(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
json ToJson(storage::v3::PropertyId property, const ShardRequestManagerInterface &request_manager) {
|
json ToJson(storage::v3::PropertyId property, const RequestRouterInterface &request_router) {
|
||||||
return request_manager.PropertyToName(property);
|
return request_router.PropertyToName(property);
|
||||||
}
|
}
|
||||||
|
|
||||||
json ToJson(NamedExpression *nexpr) {
|
json ToJson(NamedExpression *nexpr) {
|
||||||
@ -369,29 +368,29 @@ json ToJson(NamedExpression *nexpr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
json ToJson(const std::vector<std::pair<storage::v3::PropertyId, Expression *>> &properties,
|
json ToJson(const std::vector<std::pair<storage::v3::PropertyId, Expression *>> &properties,
|
||||||
const ShardRequestManagerInterface &request_manager) {
|
const RequestRouterInterface &request_router) {
|
||||||
json json;
|
json json;
|
||||||
for (const auto &prop_pair : properties) {
|
for (const auto &prop_pair : properties) {
|
||||||
json.emplace(ToJson(prop_pair.first, request_manager), ToJson(prop_pair.second));
|
json.emplace(ToJson(prop_pair.first, request_router), ToJson(prop_pair.second));
|
||||||
}
|
}
|
||||||
return json;
|
return json;
|
||||||
}
|
}
|
||||||
|
|
||||||
json ToJson(const NodeCreationInfo &node_info, const ShardRequestManagerInterface &request_manager) {
|
json ToJson(const NodeCreationInfo &node_info, const RequestRouterInterface &request_router) {
|
||||||
json self;
|
json self;
|
||||||
self["symbol"] = ToJson(node_info.symbol);
|
self["symbol"] = ToJson(node_info.symbol);
|
||||||
self["labels"] = ToJson(node_info.labels, request_manager);
|
self["labels"] = ToJson(node_info.labels, request_router);
|
||||||
const auto *props = std::get_if<PropertiesMapList>(&node_info.properties);
|
const auto *props = std::get_if<PropertiesMapList>(&node_info.properties);
|
||||||
self["properties"] = ToJson(props ? *props : PropertiesMapList{}, request_manager);
|
self["properties"] = ToJson(props ? *props : PropertiesMapList{}, request_router);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
json ToJson(const EdgeCreationInfo &edge_info, const ShardRequestManagerInterface &request_manager) {
|
json ToJson(const EdgeCreationInfo &edge_info, const RequestRouterInterface &request_router) {
|
||||||
json self;
|
json self;
|
||||||
self["symbol"] = ToJson(edge_info.symbol);
|
self["symbol"] = ToJson(edge_info.symbol);
|
||||||
const auto *props = std::get_if<PropertiesMapList>(&edge_info.properties);
|
const auto *props = std::get_if<PropertiesMapList>(&edge_info.properties);
|
||||||
self["properties"] = ToJson(props ? *props : PropertiesMapList{}, request_manager);
|
self["properties"] = ToJson(props ? *props : PropertiesMapList{}, request_router);
|
||||||
self["edge_type"] = ToJson(edge_info.edge_type, request_manager);
|
self["edge_type"] = ToJson(edge_info.edge_type, request_router);
|
||||||
self["direction"] = ToString(edge_info.direction);
|
self["direction"] = ToString(edge_info.direction);
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
@ -433,7 +432,7 @@ bool PlanToJsonVisitor::PreVisit(ScanAll &op) {
|
|||||||
bool PlanToJsonVisitor::PreVisit(ScanAllByLabel &op) {
|
bool PlanToJsonVisitor::PreVisit(ScanAllByLabel &op) {
|
||||||
json self;
|
json self;
|
||||||
self["name"] = "ScanAllByLabel";
|
self["name"] = "ScanAllByLabel";
|
||||||
self["label"] = ToJson(op.label_, *request_manager_);
|
self["label"] = ToJson(op.label_, *request_router_);
|
||||||
self["output_symbol"] = ToJson(op.output_symbol_);
|
self["output_symbol"] = ToJson(op.output_symbol_);
|
||||||
|
|
||||||
op.input_->Accept(*this);
|
op.input_->Accept(*this);
|
||||||
@ -446,8 +445,8 @@ bool PlanToJsonVisitor::PreVisit(ScanAllByLabel &op) {
|
|||||||
bool PlanToJsonVisitor::PreVisit(ScanAllByLabelPropertyRange &op) {
|
bool PlanToJsonVisitor::PreVisit(ScanAllByLabelPropertyRange &op) {
|
||||||
json self;
|
json self;
|
||||||
self["name"] = "ScanAllByLabelPropertyRange";
|
self["name"] = "ScanAllByLabelPropertyRange";
|
||||||
self["label"] = ToJson(op.label_, *request_manager_);
|
self["label"] = ToJson(op.label_, *request_router_);
|
||||||
self["property"] = ToJson(op.property_, *request_manager_);
|
self["property"] = ToJson(op.property_, *request_router_);
|
||||||
self["lower_bound"] = op.lower_bound_ ? ToJson(*op.lower_bound_) : json();
|
self["lower_bound"] = op.lower_bound_ ? ToJson(*op.lower_bound_) : json();
|
||||||
self["upper_bound"] = op.upper_bound_ ? ToJson(*op.upper_bound_) : json();
|
self["upper_bound"] = op.upper_bound_ ? ToJson(*op.upper_bound_) : json();
|
||||||
self["output_symbol"] = ToJson(op.output_symbol_);
|
self["output_symbol"] = ToJson(op.output_symbol_);
|
||||||
@ -462,8 +461,8 @@ bool PlanToJsonVisitor::PreVisit(ScanAllByLabelPropertyRange &op) {
|
|||||||
bool PlanToJsonVisitor::PreVisit(ScanAllByLabelPropertyValue &op) {
|
bool PlanToJsonVisitor::PreVisit(ScanAllByLabelPropertyValue &op) {
|
||||||
json self;
|
json self;
|
||||||
self["name"] = "ScanAllByLabelPropertyValue";
|
self["name"] = "ScanAllByLabelPropertyValue";
|
||||||
self["label"] = ToJson(op.label_, *request_manager_);
|
self["label"] = ToJson(op.label_, *request_router_);
|
||||||
self["property"] = ToJson(op.property_, *request_manager_);
|
self["property"] = ToJson(op.property_, *request_router_);
|
||||||
self["expression"] = ToJson(op.expression_);
|
self["expression"] = ToJson(op.expression_);
|
||||||
self["output_symbol"] = ToJson(op.output_symbol_);
|
self["output_symbol"] = ToJson(op.output_symbol_);
|
||||||
|
|
||||||
@ -477,8 +476,8 @@ bool PlanToJsonVisitor::PreVisit(ScanAllByLabelPropertyValue &op) {
|
|||||||
bool PlanToJsonVisitor::PreVisit(ScanAllByLabelProperty &op) {
|
bool PlanToJsonVisitor::PreVisit(ScanAllByLabelProperty &op) {
|
||||||
json self;
|
json self;
|
||||||
self["name"] = "ScanAllByLabelProperty";
|
self["name"] = "ScanAllByLabelProperty";
|
||||||
self["label"] = ToJson(op.label_, *request_manager_);
|
self["label"] = ToJson(op.label_, *request_router_);
|
||||||
self["property"] = ToJson(op.property_, *request_manager_);
|
self["property"] = ToJson(op.property_, *request_router_);
|
||||||
self["output_symbol"] = ToJson(op.output_symbol_);
|
self["output_symbol"] = ToJson(op.output_symbol_);
|
||||||
|
|
||||||
op.input_->Accept(*this);
|
op.input_->Accept(*this);
|
||||||
@ -501,7 +500,7 @@ bool PlanToJsonVisitor::PreVisit(ScanAllById &op) {
|
|||||||
bool PlanToJsonVisitor::PreVisit(CreateNode &op) {
|
bool PlanToJsonVisitor::PreVisit(CreateNode &op) {
|
||||||
json self;
|
json self;
|
||||||
self["name"] = "CreateNode";
|
self["name"] = "CreateNode";
|
||||||
self["node_info"] = ToJson(op.node_info_, *request_manager_);
|
self["node_info"] = ToJson(op.node_info_, *request_router_);
|
||||||
|
|
||||||
op.input_->Accept(*this);
|
op.input_->Accept(*this);
|
||||||
self["input"] = PopOutput();
|
self["input"] = PopOutput();
|
||||||
@ -514,8 +513,8 @@ bool PlanToJsonVisitor::PreVisit(CreateExpand &op) {
|
|||||||
json self;
|
json self;
|
||||||
self["name"] = "CreateExpand";
|
self["name"] = "CreateExpand";
|
||||||
self["input_symbol"] = ToJson(op.input_symbol_);
|
self["input_symbol"] = ToJson(op.input_symbol_);
|
||||||
self["node_info"] = ToJson(op.node_info_, *request_manager_);
|
self["node_info"] = ToJson(op.node_info_, *request_router_);
|
||||||
self["edge_info"] = ToJson(op.edge_info_, *request_manager_);
|
self["edge_info"] = ToJson(op.edge_info_, *request_router_);
|
||||||
self["existing_node"] = op.existing_node_;
|
self["existing_node"] = op.existing_node_;
|
||||||
|
|
||||||
op.input_->Accept(*this);
|
op.input_->Accept(*this);
|
||||||
@ -531,7 +530,7 @@ bool PlanToJsonVisitor::PreVisit(Expand &op) {
|
|||||||
self["input_symbol"] = ToJson(op.input_symbol_);
|
self["input_symbol"] = ToJson(op.input_symbol_);
|
||||||
self["node_symbol"] = ToJson(op.common_.node_symbol);
|
self["node_symbol"] = ToJson(op.common_.node_symbol);
|
||||||
self["edge_symbol"] = ToJson(op.common_.edge_symbol);
|
self["edge_symbol"] = ToJson(op.common_.edge_symbol);
|
||||||
self["edge_types"] = ToJson(op.common_.edge_types, *request_manager_);
|
self["edge_types"] = ToJson(op.common_.edge_types, *request_router_);
|
||||||
self["direction"] = ToString(op.common_.direction);
|
self["direction"] = ToString(op.common_.direction);
|
||||||
self["existing_node"] = op.common_.existing_node;
|
self["existing_node"] = op.common_.existing_node;
|
||||||
|
|
||||||
@ -548,7 +547,7 @@ bool PlanToJsonVisitor::PreVisit(ExpandVariable &op) {
|
|||||||
self["input_symbol"] = ToJson(op.input_symbol_);
|
self["input_symbol"] = ToJson(op.input_symbol_);
|
||||||
self["node_symbol"] = ToJson(op.common_.node_symbol);
|
self["node_symbol"] = ToJson(op.common_.node_symbol);
|
||||||
self["edge_symbol"] = ToJson(op.common_.edge_symbol);
|
self["edge_symbol"] = ToJson(op.common_.edge_symbol);
|
||||||
self["edge_types"] = ToJson(op.common_.edge_types, *request_manager_);
|
self["edge_types"] = ToJson(op.common_.edge_types, *request_router_);
|
||||||
self["direction"] = ToString(op.common_.direction);
|
self["direction"] = ToString(op.common_.direction);
|
||||||
self["type"] = ToString(op.type_);
|
self["type"] = ToString(op.type_);
|
||||||
self["is_reverse"] = op.is_reverse_;
|
self["is_reverse"] = op.is_reverse_;
|
||||||
@ -623,7 +622,7 @@ bool PlanToJsonVisitor::PreVisit(Delete &op) {
|
|||||||
bool PlanToJsonVisitor::PreVisit(SetProperty &op) {
|
bool PlanToJsonVisitor::PreVisit(SetProperty &op) {
|
||||||
json self;
|
json self;
|
||||||
self["name"] = "SetProperty";
|
self["name"] = "SetProperty";
|
||||||
self["property"] = ToJson(op.property_, *request_manager_);
|
self["property"] = ToJson(op.property_, *request_router_);
|
||||||
self["lhs"] = ToJson(op.lhs_);
|
self["lhs"] = ToJson(op.lhs_);
|
||||||
self["rhs"] = ToJson(op.rhs_);
|
self["rhs"] = ToJson(op.rhs_);
|
||||||
|
|
||||||
@ -660,7 +659,7 @@ bool PlanToJsonVisitor::PreVisit(SetLabels &op) {
|
|||||||
json self;
|
json self;
|
||||||
self["name"] = "SetLabels";
|
self["name"] = "SetLabels";
|
||||||
self["input_symbol"] = ToJson(op.input_symbol_);
|
self["input_symbol"] = ToJson(op.input_symbol_);
|
||||||
self["labels"] = ToJson(op.labels_, *request_manager_);
|
self["labels"] = ToJson(op.labels_, *request_router_);
|
||||||
|
|
||||||
op.input_->Accept(*this);
|
op.input_->Accept(*this);
|
||||||
self["input"] = PopOutput();
|
self["input"] = PopOutput();
|
||||||
@ -672,7 +671,7 @@ bool PlanToJsonVisitor::PreVisit(SetLabels &op) {
|
|||||||
bool PlanToJsonVisitor::PreVisit(RemoveProperty &op) {
|
bool PlanToJsonVisitor::PreVisit(RemoveProperty &op) {
|
||||||
json self;
|
json self;
|
||||||
self["name"] = "RemoveProperty";
|
self["name"] = "RemoveProperty";
|
||||||
self["property"] = ToJson(op.property_, *request_manager_);
|
self["property"] = ToJson(op.property_, *request_router_);
|
||||||
self["lhs"] = ToJson(op.lhs_);
|
self["lhs"] = ToJson(op.lhs_);
|
||||||
|
|
||||||
op.input_->Accept(*this);
|
op.input_->Accept(*this);
|
||||||
@ -686,7 +685,7 @@ bool PlanToJsonVisitor::PreVisit(RemoveLabels &op) {
|
|||||||
json self;
|
json self;
|
||||||
self["name"] = "RemoveLabels";
|
self["name"] = "RemoveLabels";
|
||||||
self["input_symbol"] = ToJson(op.input_symbol_);
|
self["input_symbol"] = ToJson(op.input_symbol_);
|
||||||
self["labels"] = ToJson(op.labels_, *request_manager_);
|
self["labels"] = ToJson(op.labels_, *request_router_);
|
||||||
|
|
||||||
op.input_->Accept(*this);
|
op.input_->Accept(*this);
|
||||||
self["input"] = PopOutput();
|
self["input"] = PopOutput();
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
#include "query/v2/frontend/ast/ast.hpp"
|
#include "query/v2/frontend/ast/ast.hpp"
|
||||||
#include "query/v2/plan/operator.hpp"
|
#include "query/v2/plan/operator.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
#include "query/v2/request_router.hpp"
|
||||||
|
|
||||||
namespace memgraph::query::v2 {
|
namespace memgraph::query::v2 {
|
||||||
|
|
||||||
@ -27,20 +27,19 @@ namespace plan {
|
|||||||
class LogicalOperator;
|
class LogicalOperator;
|
||||||
|
|
||||||
/// Pretty print a `LogicalOperator` plan to a `std::ostream`.
|
/// Pretty print a `LogicalOperator` plan to a `std::ostream`.
|
||||||
/// ShardRequestManager is needed for resolving label and property names.
|
/// RequestRouter is needed for resolving label and property names.
|
||||||
/// Note that `plan_root` isn't modified, but we can't take it as a const
|
/// Note that `plan_root` isn't modified, but we can't take it as a const
|
||||||
/// because we don't have support for visiting a const LogicalOperator.
|
/// because we don't have support for visiting a const LogicalOperator.
|
||||||
void PrettyPrint(const ShardRequestManagerInterface &request_manager, const LogicalOperator *plan_root,
|
void PrettyPrint(const RequestRouterInterface &request_router, const LogicalOperator *plan_root, std::ostream *out);
|
||||||
std::ostream *out);
|
|
||||||
|
|
||||||
/// Overload of `PrettyPrint` which defaults the `std::ostream` to `std::cout`.
|
/// Overload of `PrettyPrint` which defaults the `std::ostream` to `std::cout`.
|
||||||
inline void PrettyPrint(const ShardRequestManagerInterface &request_manager, const LogicalOperator *plan_root) {
|
inline void PrettyPrint(const RequestRouterInterface &request_router, const LogicalOperator *plan_root) {
|
||||||
PrettyPrint(request_manager, plan_root, &std::cout);
|
PrettyPrint(request_router, plan_root, &std::cout);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convert a `LogicalOperator` plan to a JSON representation.
|
/// Convert a `LogicalOperator` plan to a JSON representation.
|
||||||
/// DbAccessor is needed for resolving label and property names.
|
/// DbAccessor is needed for resolving label and property names.
|
||||||
nlohmann::json PlanToJson(const ShardRequestManagerInterface &request_manager, const LogicalOperator *plan_root);
|
nlohmann::json PlanToJson(const RequestRouterInterface &request_router, const LogicalOperator *plan_root);
|
||||||
|
|
||||||
class PlanPrinter : public virtual HierarchicalLogicalOperatorVisitor {
|
class PlanPrinter : public virtual HierarchicalLogicalOperatorVisitor {
|
||||||
public:
|
public:
|
||||||
@ -48,7 +47,7 @@ class PlanPrinter : public virtual HierarchicalLogicalOperatorVisitor {
|
|||||||
using HierarchicalLogicalOperatorVisitor::PreVisit;
|
using HierarchicalLogicalOperatorVisitor::PreVisit;
|
||||||
using HierarchicalLogicalOperatorVisitor::Visit;
|
using HierarchicalLogicalOperatorVisitor::Visit;
|
||||||
|
|
||||||
PlanPrinter(const ShardRequestManagerInterface *request_manager, std::ostream *out);
|
PlanPrinter(const RequestRouterInterface *request_router, std::ostream *out);
|
||||||
|
|
||||||
bool DefaultPreVisit() override;
|
bool DefaultPreVisit() override;
|
||||||
|
|
||||||
@ -115,7 +114,7 @@ class PlanPrinter : public virtual HierarchicalLogicalOperatorVisitor {
|
|||||||
void Branch(LogicalOperator &op, const std::string &branch_name = "");
|
void Branch(LogicalOperator &op, const std::string &branch_name = "");
|
||||||
|
|
||||||
int64_t depth_{0};
|
int64_t depth_{0};
|
||||||
const ShardRequestManagerInterface *request_manager_{nullptr};
|
const RequestRouterInterface *request_router_{nullptr};
|
||||||
std::ostream *out_{nullptr};
|
std::ostream *out_{nullptr};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -133,20 +132,20 @@ nlohmann::json ToJson(const utils::Bound<Expression *> &bound);
|
|||||||
|
|
||||||
nlohmann::json ToJson(const Symbol &symbol);
|
nlohmann::json ToJson(const Symbol &symbol);
|
||||||
|
|
||||||
nlohmann::json ToJson(storage::v3::EdgeTypeId edge_type, const ShardRequestManagerInterface &request_manager);
|
nlohmann::json ToJson(storage::v3::EdgeTypeId edge_type, const RequestRouterInterface &request_router);
|
||||||
|
|
||||||
nlohmann::json ToJson(storage::v3::LabelId label, const ShardRequestManagerInterface &request_manager);
|
nlohmann::json ToJson(storage::v3::LabelId label, const RequestRouterInterface &request_router);
|
||||||
|
|
||||||
nlohmann::json ToJson(storage::v3::PropertyId property, const ShardRequestManagerInterface &request_manager);
|
nlohmann::json ToJson(storage::v3::PropertyId property, const RequestRouterInterface &request_router);
|
||||||
|
|
||||||
nlohmann::json ToJson(NamedExpression *nexpr);
|
nlohmann::json ToJson(NamedExpression *nexpr);
|
||||||
|
|
||||||
nlohmann::json ToJson(const std::vector<std::pair<storage::v3::PropertyId, Expression *>> &properties,
|
nlohmann::json ToJson(const std::vector<std::pair<storage::v3::PropertyId, Expression *>> &properties,
|
||||||
const ShardRequestManagerInterface &request_manager);
|
const RequestRouterInterface &request_router);
|
||||||
|
|
||||||
nlohmann::json ToJson(const NodeCreationInfo &node_info, const ShardRequestManagerInterface &request_manager);
|
nlohmann::json ToJson(const NodeCreationInfo &node_info, const RequestRouterInterface &request_router);
|
||||||
|
|
||||||
nlohmann::json ToJson(const EdgeCreationInfo &edge_info, const ShardRequestManagerInterface &request_manager);
|
nlohmann::json ToJson(const EdgeCreationInfo &edge_info, const RequestRouterInterface &request_router);
|
||||||
|
|
||||||
nlohmann::json ToJson(const Aggregate::Element &elem);
|
nlohmann::json ToJson(const Aggregate::Element &elem);
|
||||||
|
|
||||||
@ -161,7 +160,7 @@ nlohmann::json ToJson(const std::vector<T> &items, Args &&...args) {
|
|||||||
|
|
||||||
class PlanToJsonVisitor : public virtual HierarchicalLogicalOperatorVisitor {
|
class PlanToJsonVisitor : public virtual HierarchicalLogicalOperatorVisitor {
|
||||||
public:
|
public:
|
||||||
explicit PlanToJsonVisitor(const ShardRequestManagerInterface *request_manager) : request_manager_(request_manager) {}
|
explicit PlanToJsonVisitor(const RequestRouterInterface *request_router) : request_router_(request_router) {}
|
||||||
|
|
||||||
using HierarchicalLogicalOperatorVisitor::PostVisit;
|
using HierarchicalLogicalOperatorVisitor::PostVisit;
|
||||||
using HierarchicalLogicalOperatorVisitor::PreVisit;
|
using HierarchicalLogicalOperatorVisitor::PreVisit;
|
||||||
@ -217,7 +216,7 @@ class PlanToJsonVisitor : public virtual HierarchicalLogicalOperatorVisitor {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
nlohmann::json output_;
|
nlohmann::json output_;
|
||||||
const ShardRequestManagerInterface *request_manager_;
|
const RequestRouterInterface *request_router_;
|
||||||
|
|
||||||
nlohmann::json PopOutput() {
|
nlohmann::json PopOutput() {
|
||||||
nlohmann::json tmp;
|
nlohmann::json tmp;
|
||||||
|
@ -272,7 +272,7 @@ class RuleBasedPlanner {
|
|||||||
PropertiesMapList vector_props;
|
PropertiesMapList vector_props;
|
||||||
vector_props.reserve(node_properties->size());
|
vector_props.reserve(node_properties->size());
|
||||||
for (const auto &kv : *node_properties) {
|
for (const auto &kv : *node_properties) {
|
||||||
// TODO(kostasrim) GetProperty should be implemented in terms of ShardRequestManager NameToProperty
|
// TODO(kostasrim) GetProperty should be implemented in terms of RequestRouter NameToProperty
|
||||||
vector_props.push_back({GetProperty(kv.first), kv.second});
|
vector_props.push_back({GetProperty(kv.first), kv.second});
|
||||||
}
|
}
|
||||||
return std::move(vector_props);
|
return std::move(vector_props);
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
#include "query/v2/bindings/typed_value.hpp"
|
#include "query/v2/bindings/typed_value.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
#include "query/v2/request_router.hpp"
|
||||||
#include "storage/v3/conversions.hpp"
|
#include "storage/v3/conversions.hpp"
|
||||||
#include "storage/v3/id_types.hpp"
|
#include "storage/v3/id_types.hpp"
|
||||||
#include "storage/v3/property_value.hpp"
|
#include "storage/v3/property_value.hpp"
|
||||||
@ -29,11 +29,11 @@ namespace memgraph::query::v2::plan {
|
|||||||
template <class TDbAccessor>
|
template <class TDbAccessor>
|
||||||
class VertexCountCache {
|
class VertexCountCache {
|
||||||
public:
|
public:
|
||||||
explicit VertexCountCache(TDbAccessor *shard_request_manager) : shard_request_manager_{shard_request_manager} {}
|
explicit VertexCountCache(TDbAccessor *request_router) : request_router_{request_router} {}
|
||||||
|
|
||||||
auto NameToLabel(const std::string &name) { return shard_request_manager_->NameToLabel(name); }
|
auto NameToLabel(const std::string &name) { return request_router_->NameToLabel(name); }
|
||||||
auto NameToProperty(const std::string &name) { return shard_request_manager_->NameToProperty(name); }
|
auto NameToProperty(const std::string &name) { return request_router_->NameToProperty(name); }
|
||||||
auto NameToEdgeType(const std::string &name) { return shard_request_manager_->NameToEdgeType(name); }
|
auto NameToEdgeType(const std::string &name) { return request_router_->NameToEdgeType(name); }
|
||||||
|
|
||||||
int64_t VerticesCount() { return 1; }
|
int64_t VerticesCount() { return 1; }
|
||||||
|
|
||||||
@ -53,11 +53,11 @@ class VertexCountCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// For now return true if label is primary label
|
// For now return true if label is primary label
|
||||||
bool LabelIndexExists(storage::v3::LabelId label) { return shard_request_manager_->IsPrimaryLabel(label); }
|
bool LabelIndexExists(storage::v3::LabelId label) { return request_router_->IsPrimaryLabel(label); }
|
||||||
|
|
||||||
bool LabelPropertyIndexExists(storage::v3::LabelId /*label*/, storage::v3::PropertyId /*property*/) { return false; }
|
bool LabelPropertyIndexExists(storage::v3::LabelId /*label*/, storage::v3::PropertyId /*property*/) { return false; }
|
||||||
|
|
||||||
ShardRequestManagerInterface *shard_request_manager_;
|
RequestRouterInterface *request_router_;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class TDbAccessor>
|
template <class TDbAccessor>
|
||||||
|
@ -83,10 +83,10 @@ struct ExecutionState {
|
|||||||
// CompoundKey is optional because some operators require to iterate over all the available keys
|
// CompoundKey is optional because some operators require to iterate over all the available keys
|
||||||
// of a shard. One example is ScanAll, where we only require the field label.
|
// of a shard. One example is ScanAll, where we only require the field label.
|
||||||
std::optional<CompoundKey> key;
|
std::optional<CompoundKey> key;
|
||||||
// Transaction id to be filled by the ShardRequestManager implementation
|
// Transaction id to be filled by the RequestRouter implementation
|
||||||
coordinator::Hlc transaction_id;
|
coordinator::Hlc transaction_id;
|
||||||
// Initialized by ShardRequestManager implementation. This vector is filled with the shards that
|
// Initialized by RequestRouter implementation. This vector is filled with the shards that
|
||||||
// the ShardRequestManager impl will send requests to. When a request to a shard exhausts it, meaning that
|
// the RequestRouter impl will send requests to. When a request to a shard exhausts it, meaning that
|
||||||
// it pulled all the requested data from the given Shard, it will be removed from the Vector. When the Vector becomes
|
// it pulled all the requested data from the given Shard, it will be removed from the Vector. When the Vector becomes
|
||||||
// empty, it means that all of the requests have completed succefully.
|
// empty, it means that all of the requests have completed succefully.
|
||||||
// TODO(gvolfing)
|
// TODO(gvolfing)
|
||||||
@ -101,16 +101,16 @@ struct ExecutionState {
|
|||||||
State state = INITIALIZING;
|
State state = INITIALIZING;
|
||||||
};
|
};
|
||||||
|
|
||||||
class ShardRequestManagerInterface {
|
class RequestRouterInterface {
|
||||||
public:
|
public:
|
||||||
using VertexAccessor = query::v2::accessors::VertexAccessor;
|
using VertexAccessor = query::v2::accessors::VertexAccessor;
|
||||||
ShardRequestManagerInterface() = default;
|
RequestRouterInterface() = default;
|
||||||
ShardRequestManagerInterface(const ShardRequestManagerInterface &) = delete;
|
RequestRouterInterface(const RequestRouterInterface &) = delete;
|
||||||
ShardRequestManagerInterface(ShardRequestManagerInterface &&) = delete;
|
RequestRouterInterface(RequestRouterInterface &&) = delete;
|
||||||
ShardRequestManagerInterface &operator=(const ShardRequestManagerInterface &) = delete;
|
RequestRouterInterface &operator=(const RequestRouterInterface &) = delete;
|
||||||
ShardRequestManagerInterface &&operator=(ShardRequestManagerInterface &&) = delete;
|
RequestRouterInterface &&operator=(RequestRouterInterface &&) = delete;
|
||||||
|
|
||||||
virtual ~ShardRequestManagerInterface() = default;
|
virtual ~RequestRouterInterface() = default;
|
||||||
|
|
||||||
virtual void StartTransaction() = 0;
|
virtual void StartTransaction() = 0;
|
||||||
virtual void Commit() = 0;
|
virtual void Commit() = 0;
|
||||||
@ -137,7 +137,7 @@ class ShardRequestManagerInterface {
|
|||||||
|
|
||||||
// TODO(kostasrim)rename this class template
|
// TODO(kostasrim)rename this class template
|
||||||
template <typename TTransport>
|
template <typename TTransport>
|
||||||
class ShardRequestManager : public ShardRequestManagerInterface {
|
class RequestRouter : public RequestRouterInterface {
|
||||||
public:
|
public:
|
||||||
using StorageClient = coordinator::RsmClient<TTransport, msgs::WriteRequests, msgs::WriteResponses,
|
using StorageClient = coordinator::RsmClient<TTransport, msgs::WriteRequests, msgs::WriteResponses,
|
||||||
msgs::ReadRequests, msgs::ReadResponses>;
|
msgs::ReadRequests, msgs::ReadResponses>;
|
||||||
@ -148,15 +148,14 @@ class ShardRequestManager : public ShardRequestManagerInterface {
|
|||||||
using ShardMap = coordinator::ShardMap;
|
using ShardMap = coordinator::ShardMap;
|
||||||
using CompoundKey = coordinator::PrimaryKey;
|
using CompoundKey = coordinator::PrimaryKey;
|
||||||
using VertexAccessor = query::v2::accessors::VertexAccessor;
|
using VertexAccessor = query::v2::accessors::VertexAccessor;
|
||||||
ShardRequestManager(CoordinatorClient coord, io::Io<TTransport> &&io)
|
RequestRouter(CoordinatorClient coord, io::Io<TTransport> &&io) : coord_cli_(std::move(coord)), io_(std::move(io)) {}
|
||||||
: coord_cli_(std::move(coord)), io_(std::move(io)) {}
|
|
||||||
|
|
||||||
ShardRequestManager(const ShardRequestManager &) = delete;
|
RequestRouter(const RequestRouter &) = delete;
|
||||||
ShardRequestManager(ShardRequestManager &&) = delete;
|
RequestRouter(RequestRouter &&) = delete;
|
||||||
ShardRequestManager &operator=(const ShardRequestManager &) = delete;
|
RequestRouter &operator=(const RequestRouter &) = delete;
|
||||||
ShardRequestManager &operator=(ShardRequestManager &&) = delete;
|
RequestRouter &operator=(RequestRouter &&) = delete;
|
||||||
|
|
||||||
~ShardRequestManager() override {}
|
~RequestRouter() override {}
|
||||||
|
|
||||||
void StartTransaction() override {
|
void StartTransaction() override {
|
||||||
coordinator::HlcRequest req{.last_shard_map_version = shards_map_.GetHlc()};
|
coordinator::HlcRequest req{.last_shard_map_version = shards_map_.GetHlc()};
|
@ -31,8 +31,8 @@
|
|||||||
#include "io/simulator/simulator_transport.hpp"
|
#include "io/simulator/simulator_transport.hpp"
|
||||||
#include "query/v2/accessors.hpp"
|
#include "query/v2/accessors.hpp"
|
||||||
#include "query/v2/conversions.hpp"
|
#include "query/v2/conversions.hpp"
|
||||||
|
#include "query/v2/request_router.hpp"
|
||||||
#include "query/v2/requests.hpp"
|
#include "query/v2/requests.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
|
||||||
#include "storage/v3/property_value.hpp"
|
#include "storage/v3/property_value.hpp"
|
||||||
#include "utils/result.hpp"
|
#include "utils/result.hpp"
|
||||||
|
|
||||||
@ -151,10 +151,10 @@ void RunStorageRaft(Raft<IoImpl, MockedShardRsm, WriteRequests, WriteResponses,
|
|||||||
server.Run();
|
server.Run();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestScanVertices(query::v2::ShardRequestManagerInterface &io) {
|
void TestScanVertices(query::v2::RequestRouterInterface &request_router) {
|
||||||
msgs::ExecutionState<ScanVerticesRequest> state{.label = "test_label"};
|
msgs::ExecutionState<ScanVerticesRequest> state{.label = "test_label"};
|
||||||
|
|
||||||
auto result = io.Request(state);
|
auto result = request_router.Request(state);
|
||||||
MG_ASSERT(result.size() == 2);
|
MG_ASSERT(result.size() == 2);
|
||||||
{
|
{
|
||||||
auto prop = result[0].GetProperty(msgs::PropertyId::FromUint(0));
|
auto prop = result[0].GetProperty(msgs::PropertyId::FromUint(0));
|
||||||
@ -163,7 +163,7 @@ void TestScanVertices(query::v2::ShardRequestManagerInterface &io) {
|
|||||||
MG_ASSERT(prop.int_v == 444);
|
MG_ASSERT(prop.int_v == 444);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = io.Request(state);
|
result = request_router.Request(state);
|
||||||
{
|
{
|
||||||
MG_ASSERT(result.size() == 1);
|
MG_ASSERT(result.size() == 1);
|
||||||
auto prop = result[0].GetProperty(msgs::PropertyId::FromUint(0));
|
auto prop = result[0].GetProperty(msgs::PropertyId::FromUint(0));
|
||||||
@ -171,11 +171,11 @@ void TestScanVertices(query::v2::ShardRequestManagerInterface &io) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestCreateVertices(query::v2::ShardRequestManagerInterface &io) {
|
void TestCreateVertices(query::v2::RequestRouterInterface &request_router) {
|
||||||
using PropVal = msgs::Value;
|
using PropVal = msgs::Value;
|
||||||
msgs::ExecutionState<CreateVerticesRequest> state;
|
msgs::ExecutionState<CreateVerticesRequest> state;
|
||||||
std::vector<msgs::NewVertex> new_vertices;
|
std::vector<msgs::NewVertex> new_vertices;
|
||||||
auto label_id = io.NameToLabel("test_label");
|
auto label_id = request_router.NameToLabel("test_label");
|
||||||
msgs::NewVertex a1{.primary_key = {PropVal(int64_t(1)), PropVal(int64_t(0))}};
|
msgs::NewVertex a1{.primary_key = {PropVal(int64_t(1)), PropVal(int64_t(0))}};
|
||||||
a1.label_ids.push_back({label_id});
|
a1.label_ids.push_back({label_id});
|
||||||
msgs::NewVertex a2{.primary_key = {PropVal(int64_t(13)), PropVal(int64_t(13))}};
|
msgs::NewVertex a2{.primary_key = {PropVal(int64_t(13)), PropVal(int64_t(13))}};
|
||||||
@ -183,17 +183,17 @@ void TestCreateVertices(query::v2::ShardRequestManagerInterface &io) {
|
|||||||
new_vertices.push_back(std::move(a1));
|
new_vertices.push_back(std::move(a1));
|
||||||
new_vertices.push_back(std::move(a2));
|
new_vertices.push_back(std::move(a2));
|
||||||
|
|
||||||
auto result = io.Request(state, std::move(new_vertices));
|
auto result = request_router.Request(state, std::move(new_vertices));
|
||||||
MG_ASSERT(result.size() == 2);
|
MG_ASSERT(result.size() == 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestCreateExpand(query::v2::ShardRequestManagerInterface &io) {
|
void TestCreateExpand(query::v2::RequestRouterInterface &request_router) {
|
||||||
using PropVal = msgs::Value;
|
using PropVal = msgs::Value;
|
||||||
msgs::ExecutionState<msgs::CreateExpandRequest> state;
|
msgs::ExecutionState<msgs::CreateExpandRequest> state;
|
||||||
std::vector<msgs::NewExpand> new_expands;
|
std::vector<msgs::NewExpand> new_expands;
|
||||||
|
|
||||||
const auto edge_type_id = io.NameToEdgeType("edge_type");
|
const auto edge_type_id = request_router.NameToEdgeType("edge_type");
|
||||||
const auto label = msgs::Label{io.NameToLabel("test_label")};
|
const auto label = msgs::Label{request_router.NameToLabel("test_label")};
|
||||||
const msgs::VertexId vertex_id_1{label, {PropVal(int64_t(0)), PropVal(int64_t(0))}};
|
const msgs::VertexId vertex_id_1{label, {PropVal(int64_t(0)), PropVal(int64_t(0))}};
|
||||||
const msgs::VertexId vertex_id_2{label, {PropVal(int64_t(13)), PropVal(int64_t(13))}};
|
const msgs::VertexId vertex_id_2{label, {PropVal(int64_t(13)), PropVal(int64_t(13))}};
|
||||||
msgs::NewExpand expand_1{
|
msgs::NewExpand expand_1{
|
||||||
@ -203,26 +203,26 @@ void TestCreateExpand(query::v2::ShardRequestManagerInterface &io) {
|
|||||||
new_expands.push_back(std::move(expand_1));
|
new_expands.push_back(std::move(expand_1));
|
||||||
new_expands.push_back(std::move(expand_2));
|
new_expands.push_back(std::move(expand_2));
|
||||||
|
|
||||||
auto responses = io.Request(state, std::move(new_expands));
|
auto responses = request_router.Request(state, std::move(new_expands));
|
||||||
MG_ASSERT(responses.size() == 2);
|
MG_ASSERT(responses.size() == 2);
|
||||||
MG_ASSERT(responses[0].success);
|
MG_ASSERT(responses[0].success);
|
||||||
MG_ASSERT(responses[1].success);
|
MG_ASSERT(responses[1].success);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestExpandOne(query::v2::ShardRequestManagerInterface &shard_request_manager) {
|
void TestExpandOne(query::v2::RequestRouterInterface &request_router) {
|
||||||
msgs::ExecutionState<msgs::ExpandOneRequest> state{};
|
msgs::ExecutionState<msgs::ExpandOneRequest> state{};
|
||||||
msgs::ExpandOneRequest request;
|
msgs::ExpandOneRequest request;
|
||||||
const auto edge_type_id = shard_request_manager.NameToEdgeType("edge_type");
|
const auto edge_type_id = request_router.NameToEdgeType("edge_type");
|
||||||
const auto label = msgs::Label{shard_request_manager.NameToLabel("test_label")};
|
const auto label = msgs::Label{request_router.NameToLabel("test_label")};
|
||||||
request.src_vertices.push_back(msgs::VertexId{label, {msgs::Value(int64_t(0)), msgs::Value(int64_t(0))}});
|
request.src_vertices.push_back(msgs::VertexId{label, {msgs::Value(int64_t(0)), msgs::Value(int64_t(0))}});
|
||||||
request.edge_types.push_back(msgs::EdgeType{edge_type_id});
|
request.edge_types.push_back(msgs::EdgeType{edge_type_id});
|
||||||
request.direction = msgs::EdgeDirection::BOTH;
|
request.direction = msgs::EdgeDirection::BOTH;
|
||||||
auto result_rows = shard_request_manager.Request(state, std::move(request));
|
auto result_rows = request_router.Request(state, std::move(request));
|
||||||
MG_ASSERT(result_rows.size() == 2);
|
MG_ASSERT(result_rows.size() == 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ShardRequestManager>
|
template <typename RequestRouter>
|
||||||
void TestAggregate(ShardRequestManager &io) {}
|
void TestAggregate(RequestRouter &request_router) {}
|
||||||
|
|
||||||
void DoTest() {
|
void DoTest() {
|
||||||
SimulatorConfig config{
|
SimulatorConfig config{
|
||||||
@ -337,12 +337,12 @@ void DoTest() {
|
|||||||
// also get the current shard map
|
// also get the current shard map
|
||||||
CoordinatorClient<SimulatorTransport> coordinator_client(cli_io, c_addrs[0], c_addrs);
|
CoordinatorClient<SimulatorTransport> coordinator_client(cli_io, c_addrs[0], c_addrs);
|
||||||
|
|
||||||
query::v2::ShardRequestManager<SimulatorTransport> io(std::move(coordinator_client), std::move(cli_io));
|
query::v2::RequestRouter<SimulatorTransport> request_router(std::move(coordinator_client), std::move(cli_io));
|
||||||
|
|
||||||
io.StartTransaction();
|
request_router.StartTransaction();
|
||||||
TestScanVertices(io);
|
TestScanVertices(request_router);
|
||||||
TestCreateVertices(io);
|
TestCreateVertices(request_router);
|
||||||
TestCreateExpand(io);
|
TestCreateExpand(request_router);
|
||||||
|
|
||||||
simulator.ShutDown();
|
simulator.ShutDown();
|
||||||
|
|
@ -30,8 +30,8 @@
|
|||||||
#include "io/simulator/simulator_transport.hpp"
|
#include "io/simulator/simulator_transport.hpp"
|
||||||
#include "machine_manager/machine_config.hpp"
|
#include "machine_manager/machine_config.hpp"
|
||||||
#include "machine_manager/machine_manager.hpp"
|
#include "machine_manager/machine_manager.hpp"
|
||||||
|
#include "query/v2/request_router.hpp"
|
||||||
#include "query/v2/requests.hpp"
|
#include "query/v2/requests.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
|
||||||
#include "testing_constants.hpp"
|
#include "testing_constants.hpp"
|
||||||
#include "utils/print_helpers.hpp"
|
#include "utils/print_helpers.hpp"
|
||||||
#include "utils/variant_helpers.hpp"
|
#include "utils/variant_helpers.hpp"
|
||||||
@ -151,8 +151,8 @@ ShardMap TestShardMap(int n_splits, int replication_factor) {
|
|||||||
return sm;
|
return sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExecuteOp(query::v2::ShardRequestManager<SimulatorTransport> &shard_request_manager,
|
void ExecuteOp(query::v2::RequestRouter<SimulatorTransport> &request_router, std::set<CompoundKey> &correctness_model,
|
||||||
std::set<CompoundKey> &correctness_model, CreateVertex create_vertex) {
|
CreateVertex create_vertex) {
|
||||||
const auto key1 = memgraph::storage::v3::PropertyValue(create_vertex.first);
|
const auto key1 = memgraph::storage::v3::PropertyValue(create_vertex.first);
|
||||||
const auto key2 = memgraph::storage::v3::PropertyValue(create_vertex.second);
|
const auto key2 = memgraph::storage::v3::PropertyValue(create_vertex.second);
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ void ExecuteOp(query::v2::ShardRequestManager<SimulatorTransport> &shard_request
|
|||||||
|
|
||||||
query::v2::ExecutionState<msgs::CreateVerticesRequest> state;
|
query::v2::ExecutionState<msgs::CreateVerticesRequest> state;
|
||||||
|
|
||||||
auto label_id = shard_request_manager.NameToLabel("test_label");
|
auto label_id = request_router.NameToLabel("test_label");
|
||||||
|
|
||||||
msgs::NewVertex nv{.primary_key = primary_key};
|
msgs::NewVertex nv{.primary_key = primary_key};
|
||||||
nv.label_ids.push_back({label_id});
|
nv.label_ids.push_back({label_id});
|
||||||
@ -174,7 +174,7 @@ void ExecuteOp(query::v2::ShardRequestManager<SimulatorTransport> &shard_request
|
|||||||
std::vector<msgs::NewVertex> new_vertices;
|
std::vector<msgs::NewVertex> new_vertices;
|
||||||
new_vertices.push_back(std::move(nv));
|
new_vertices.push_back(std::move(nv));
|
||||||
|
|
||||||
auto result = shard_request_manager.Request(state, std::move(new_vertices));
|
auto result = request_router.Request(state, std::move(new_vertices));
|
||||||
|
|
||||||
RC_ASSERT(result.size() == 1);
|
RC_ASSERT(result.size() == 1);
|
||||||
RC_ASSERT(!result[0].error.has_value());
|
RC_ASSERT(!result[0].error.has_value());
|
||||||
@ -182,11 +182,11 @@ void ExecuteOp(query::v2::ShardRequestManager<SimulatorTransport> &shard_request
|
|||||||
correctness_model.emplace(std::make_pair(create_vertex.first, create_vertex.second));
|
correctness_model.emplace(std::make_pair(create_vertex.first, create_vertex.second));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExecuteOp(query::v2::ShardRequestManager<SimulatorTransport> &shard_request_manager,
|
void ExecuteOp(query::v2::RequestRouter<SimulatorTransport> &request_router, std::set<CompoundKey> &correctness_model,
|
||||||
std::set<CompoundKey> &correctness_model, ScanAll scan_all) {
|
ScanAll scan_all) {
|
||||||
query::v2::ExecutionState<msgs::ScanVerticesRequest> request{.label = "test_label"};
|
query::v2::ExecutionState<msgs::ScanVerticesRequest> request{.label = "test_label"};
|
||||||
|
|
||||||
auto results = shard_request_manager.Request(request);
|
auto results = request_router.Request(request);
|
||||||
|
|
||||||
RC_ASSERT(results.size() == correctness_model.size());
|
RC_ASSERT(results.size() == correctness_model.size());
|
||||||
|
|
||||||
@ -247,15 +247,14 @@ std::pair<SimulatorStats, LatencyHistogramSummaries> RunClusterSimulation(const
|
|||||||
CoordinatorClient<SimulatorTransport> coordinator_client(cli_io, coordinator_address, {coordinator_address});
|
CoordinatorClient<SimulatorTransport> coordinator_client(cli_io, coordinator_address, {coordinator_address});
|
||||||
WaitForShardsToInitialize(coordinator_client);
|
WaitForShardsToInitialize(coordinator_client);
|
||||||
|
|
||||||
query::v2::ShardRequestManager<SimulatorTransport> shard_request_manager(std::move(coordinator_client),
|
query::v2::RequestRouter<SimulatorTransport> request_router(std::move(coordinator_client), std::move(cli_io));
|
||||||
std::move(cli_io));
|
|
||||||
|
|
||||||
shard_request_manager.StartTransaction();
|
request_router.StartTransaction();
|
||||||
|
|
||||||
auto correctness_model = std::set<CompoundKey>{};
|
auto correctness_model = std::set<CompoundKey>{};
|
||||||
|
|
||||||
for (const Op &op : ops) {
|
for (const Op &op : ops) {
|
||||||
std::visit([&](auto &o) { ExecuteOp(shard_request_manager, correctness_model, o); }, op.inner);
|
std::visit([&](auto &o) { ExecuteOp(request_router, correctness_model, o); }, op.inner);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We have now completed our workload without failing any assertions, so we can
|
// We have now completed our workload without failing any assertions, so we can
|
||||||
|
@ -29,8 +29,8 @@
|
|||||||
#include "io/simulator/simulator_transport.hpp"
|
#include "io/simulator/simulator_transport.hpp"
|
||||||
#include "machine_manager/machine_config.hpp"
|
#include "machine_manager/machine_config.hpp"
|
||||||
#include "machine_manager/machine_manager.hpp"
|
#include "machine_manager/machine_manager.hpp"
|
||||||
|
#include "query/v2/request_router.hpp"
|
||||||
#include "query/v2/requests.hpp"
|
#include "query/v2/requests.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
|
||||||
#include "utils/variant_helpers.hpp"
|
#include "utils/variant_helpers.hpp"
|
||||||
|
|
||||||
namespace memgraph::tests::simulation {
|
namespace memgraph::tests::simulation {
|
||||||
@ -161,8 +161,8 @@ ShardMap TestShardMap(int shards, int replication_factor, int gap_between_shards
|
|||||||
return sm;
|
return sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExecuteOp(query::v2::ShardRequestManager<LocalTransport> &shard_request_manager,
|
void ExecuteOp(query::v2::RequestRouter<LocalTransport> &request_router, std::set<CompoundKey> &correctness_model,
|
||||||
std::set<CompoundKey> &correctness_model, CreateVertex create_vertex) {
|
CreateVertex create_vertex) {
|
||||||
const auto key1 = memgraph::storage::v3::PropertyValue(create_vertex.first);
|
const auto key1 = memgraph::storage::v3::PropertyValue(create_vertex.first);
|
||||||
const auto key2 = memgraph::storage::v3::PropertyValue(create_vertex.second);
|
const auto key2 = memgraph::storage::v3::PropertyValue(create_vertex.second);
|
||||||
|
|
||||||
@ -176,7 +176,7 @@ void ExecuteOp(query::v2::ShardRequestManager<LocalTransport> &shard_request_man
|
|||||||
|
|
||||||
query::v2::ExecutionState<msgs::CreateVerticesRequest> state;
|
query::v2::ExecutionState<msgs::CreateVerticesRequest> state;
|
||||||
|
|
||||||
auto label_id = shard_request_manager.NameToLabel("test_label");
|
auto label_id = request_router.NameToLabel("test_label");
|
||||||
|
|
||||||
msgs::NewVertex nv{.primary_key = primary_key};
|
msgs::NewVertex nv{.primary_key = primary_key};
|
||||||
nv.label_ids.push_back({label_id});
|
nv.label_ids.push_back({label_id});
|
||||||
@ -184,7 +184,7 @@ void ExecuteOp(query::v2::ShardRequestManager<LocalTransport> &shard_request_man
|
|||||||
std::vector<msgs::NewVertex> new_vertices;
|
std::vector<msgs::NewVertex> new_vertices;
|
||||||
new_vertices.push_back(std::move(nv));
|
new_vertices.push_back(std::move(nv));
|
||||||
|
|
||||||
auto result = shard_request_manager.Request(state, std::move(new_vertices));
|
auto result = request_router.Request(state, std::move(new_vertices));
|
||||||
|
|
||||||
MG_ASSERT(result.size() == 1);
|
MG_ASSERT(result.size() == 1);
|
||||||
MG_ASSERT(!result[0].error.has_value());
|
MG_ASSERT(!result[0].error.has_value());
|
||||||
@ -192,11 +192,11 @@ void ExecuteOp(query::v2::ShardRequestManager<LocalTransport> &shard_request_man
|
|||||||
correctness_model.emplace(std::make_pair(create_vertex.first, create_vertex.second));
|
correctness_model.emplace(std::make_pair(create_vertex.first, create_vertex.second));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExecuteOp(query::v2::ShardRequestManager<LocalTransport> &shard_request_manager,
|
void ExecuteOp(query::v2::RequestRouter<LocalTransport> &request_router, std::set<CompoundKey> &correctness_model,
|
||||||
std::set<CompoundKey> &correctness_model, ScanAll scan_all) {
|
ScanAll scan_all) {
|
||||||
query::v2::ExecutionState<msgs::ScanVerticesRequest> request{.label = "test_label"};
|
query::v2::ExecutionState<msgs::ScanVerticesRequest> request{.label = "test_label"};
|
||||||
|
|
||||||
auto results = shard_request_manager.Request(request);
|
auto results = request_router.Request(request);
|
||||||
|
|
||||||
MG_ASSERT(results.size() == correctness_model.size());
|
MG_ASSERT(results.size() == correctness_model.size());
|
||||||
|
|
||||||
@ -245,23 +245,22 @@ void RunWorkload(int shards, int replication_factor, int create_ops, int scan_op
|
|||||||
WaitForShardsToInitialize(coordinator_client);
|
WaitForShardsToInitialize(coordinator_client);
|
||||||
auto time_after_shard_stabilization = cli_io_2.Now();
|
auto time_after_shard_stabilization = cli_io_2.Now();
|
||||||
|
|
||||||
query::v2::ShardRequestManager<LocalTransport> shard_request_manager(std::move(coordinator_client),
|
query::v2::RequestRouter<LocalTransport> request_router(std::move(coordinator_client), std::move(cli_io));
|
||||||
std::move(cli_io));
|
|
||||||
|
|
||||||
shard_request_manager.StartTransaction();
|
request_router.StartTransaction();
|
||||||
|
|
||||||
auto correctness_model = std::set<CompoundKey>{};
|
auto correctness_model = std::set<CompoundKey>{};
|
||||||
|
|
||||||
auto time_before_creates = cli_io_2.Now();
|
auto time_before_creates = cli_io_2.Now();
|
||||||
|
|
||||||
for (int i = 0; i < create_ops; i++) {
|
for (int i = 0; i < create_ops; i++) {
|
||||||
ExecuteOp(shard_request_manager, correctness_model, CreateVertex{.first = i, .second = i});
|
ExecuteOp(request_router, correctness_model, CreateVertex{.first = i, .second = i});
|
||||||
}
|
}
|
||||||
|
|
||||||
auto time_after_creates = cli_io_2.Now();
|
auto time_after_creates = cli_io_2.Now();
|
||||||
|
|
||||||
for (int i = 0; i < scan_ops; i++) {
|
for (int i = 0; i < scan_ops; i++) {
|
||||||
ExecuteOp(shard_request_manager, correctness_model, ScanAll{});
|
ExecuteOp(request_router, correctness_model, ScanAll{});
|
||||||
}
|
}
|
||||||
|
|
||||||
auto time_after_scan = cli_io_2.Now();
|
auto time_after_scan = cli_io_2.Now();
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
#include <machine_manager/machine_manager.hpp>
|
#include <machine_manager/machine_manager.hpp>
|
||||||
#include <query/v2/requests.hpp>
|
#include <query/v2/requests.hpp>
|
||||||
#include "io/rsm/rsm_client.hpp"
|
#include "io/rsm/rsm_client.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
#include "query/v2/request_router.hpp"
|
||||||
#include "storage/v3/id_types.hpp"
|
#include "storage/v3/id_types.hpp"
|
||||||
#include "storage/v3/schemas.hpp"
|
#include "storage/v3/schemas.hpp"
|
||||||
|
|
||||||
@ -109,19 +109,19 @@ ShardMap TestShardMap() {
|
|||||||
return sm;
|
return sm;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ShardRequestManager>
|
template <typename RequestRouter>
|
||||||
void TestScanAll(ShardRequestManager &shard_request_manager) {
|
void TestScanAll(RequestRouter &request_router) {
|
||||||
query::v2::ExecutionState<msgs::ScanVerticesRequest> state{.label = kLabelName};
|
query::v2::ExecutionState<msgs::ScanVerticesRequest> state{.label = kLabelName};
|
||||||
|
|
||||||
auto result = shard_request_manager.Request(state);
|
auto result = request_router.Request(state);
|
||||||
EXPECT_EQ(result.size(), 2);
|
EXPECT_EQ(result.size(), 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestCreateVertices(query::v2::ShardRequestManagerInterface &shard_request_manager) {
|
void TestCreateVertices(query::v2::RequestRouterInterface &request_router) {
|
||||||
using PropVal = msgs::Value;
|
using PropVal = msgs::Value;
|
||||||
query::v2::ExecutionState<msgs::CreateVerticesRequest> state;
|
query::v2::ExecutionState<msgs::CreateVerticesRequest> state;
|
||||||
std::vector<msgs::NewVertex> new_vertices;
|
std::vector<msgs::NewVertex> new_vertices;
|
||||||
auto label_id = shard_request_manager.NameToLabel(kLabelName);
|
auto label_id = request_router.NameToLabel(kLabelName);
|
||||||
msgs::NewVertex a1{.primary_key = {PropVal(int64_t(0)), PropVal(int64_t(0))}};
|
msgs::NewVertex a1{.primary_key = {PropVal(int64_t(0)), PropVal(int64_t(0))}};
|
||||||
a1.label_ids.push_back({label_id});
|
a1.label_ids.push_back({label_id});
|
||||||
msgs::NewVertex a2{.primary_key = {PropVal(int64_t(13)), PropVal(int64_t(13))}};
|
msgs::NewVertex a2{.primary_key = {PropVal(int64_t(13)), PropVal(int64_t(13))}};
|
||||||
@ -129,18 +129,18 @@ void TestCreateVertices(query::v2::ShardRequestManagerInterface &shard_request_m
|
|||||||
new_vertices.push_back(std::move(a1));
|
new_vertices.push_back(std::move(a1));
|
||||||
new_vertices.push_back(std::move(a2));
|
new_vertices.push_back(std::move(a2));
|
||||||
|
|
||||||
auto result = shard_request_manager.Request(state, std::move(new_vertices));
|
auto result = request_router.Request(state, std::move(new_vertices));
|
||||||
EXPECT_EQ(result.size(), 1);
|
EXPECT_EQ(result.size(), 1);
|
||||||
EXPECT_FALSE(result[0].error.has_value()) << result[0].error->message;
|
EXPECT_FALSE(result[0].error.has_value()) << result[0].error->message;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestCreateExpand(query::v2::ShardRequestManagerInterface &shard_request_manager) {
|
void TestCreateExpand(query::v2::RequestRouterInterface &request_router) {
|
||||||
using PropVal = msgs::Value;
|
using PropVal = msgs::Value;
|
||||||
query::v2::ExecutionState<msgs::CreateExpandRequest> state;
|
query::v2::ExecutionState<msgs::CreateExpandRequest> state;
|
||||||
std::vector<msgs::NewExpand> new_expands;
|
std::vector<msgs::NewExpand> new_expands;
|
||||||
|
|
||||||
const auto edge_type_id = shard_request_manager.NameToEdgeType("edge_type");
|
const auto edge_type_id = request_router.NameToEdgeType("edge_type");
|
||||||
const auto label = msgs::Label{shard_request_manager.NameToLabel("test_label")};
|
const auto label = msgs::Label{request_router.NameToLabel("test_label")};
|
||||||
const msgs::VertexId vertex_id_1{label, {PropVal(int64_t(0)), PropVal(int64_t(0))}};
|
const msgs::VertexId vertex_id_1{label, {PropVal(int64_t(0)), PropVal(int64_t(0))}};
|
||||||
const msgs::VertexId vertex_id_2{label, {PropVal(int64_t(13)), PropVal(int64_t(13))}};
|
const msgs::VertexId vertex_id_2{label, {PropVal(int64_t(13)), PropVal(int64_t(13))}};
|
||||||
msgs::NewExpand expand_1{
|
msgs::NewExpand expand_1{
|
||||||
@ -150,27 +150,27 @@ void TestCreateExpand(query::v2::ShardRequestManagerInterface &shard_request_man
|
|||||||
new_expands.push_back(std::move(expand_1));
|
new_expands.push_back(std::move(expand_1));
|
||||||
new_expands.push_back(std::move(expand_2));
|
new_expands.push_back(std::move(expand_2));
|
||||||
|
|
||||||
auto responses = shard_request_manager.Request(state, std::move(new_expands));
|
auto responses = request_router.Request(state, std::move(new_expands));
|
||||||
MG_ASSERT(responses.size() == 1);
|
MG_ASSERT(responses.size() == 1);
|
||||||
MG_ASSERT(!responses[0].error.has_value());
|
MG_ASSERT(!responses[0].error.has_value());
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestExpandOne(query::v2::ShardRequestManagerInterface &shard_request_manager) {
|
void TestExpandOne(query::v2::RequestRouterInterface &request_router) {
|
||||||
query::v2::ExecutionState<msgs::ExpandOneRequest> state{};
|
query::v2::ExecutionState<msgs::ExpandOneRequest> state{};
|
||||||
msgs::ExpandOneRequest request;
|
msgs::ExpandOneRequest request;
|
||||||
const auto edge_type_id = shard_request_manager.NameToEdgeType("edge_type");
|
const auto edge_type_id = request_router.NameToEdgeType("edge_type");
|
||||||
const auto label = msgs::Label{shard_request_manager.NameToLabel("test_label")};
|
const auto label = msgs::Label{request_router.NameToLabel("test_label")};
|
||||||
request.src_vertices.push_back(msgs::VertexId{label, {msgs::Value(int64_t(0)), msgs::Value(int64_t(0))}});
|
request.src_vertices.push_back(msgs::VertexId{label, {msgs::Value(int64_t(0)), msgs::Value(int64_t(0))}});
|
||||||
request.edge_types.push_back(msgs::EdgeType{edge_type_id});
|
request.edge_types.push_back(msgs::EdgeType{edge_type_id});
|
||||||
request.direction = msgs::EdgeDirection::BOTH;
|
request.direction = msgs::EdgeDirection::BOTH;
|
||||||
auto result_rows = shard_request_manager.Request(state, std::move(request));
|
auto result_rows = request_router.Request(state, std::move(request));
|
||||||
MG_ASSERT(result_rows.size() == 1);
|
MG_ASSERT(result_rows.size() == 1);
|
||||||
MG_ASSERT(result_rows[0].in_edges_with_all_properties.size() == 1);
|
MG_ASSERT(result_rows[0].in_edges_with_all_properties.size() == 1);
|
||||||
MG_ASSERT(result_rows[0].out_edges_with_all_properties.size() == 1);
|
MG_ASSERT(result_rows[0].out_edges_with_all_properties.size() == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ShardRequestManager>
|
template <typename RequestRouter>
|
||||||
void TestAggregate(ShardRequestManager &shard_request_manager) {}
|
void TestAggregate(RequestRouter &request_router) {}
|
||||||
|
|
||||||
MachineManager<LocalTransport> MkMm(LocalSystem &local_system, std::vector<Address> coordinator_addresses, Address addr,
|
MachineManager<LocalTransport> MkMm(LocalSystem &local_system, std::vector<Address> coordinator_addresses, Address addr,
|
||||||
ShardMap shard_map) {
|
ShardMap shard_map) {
|
||||||
@ -226,14 +226,13 @@ TEST(MachineManager, BasicFunctionality) {
|
|||||||
|
|
||||||
CoordinatorClient<LocalTransport> coordinator_client(cli_io, coordinator_address, {coordinator_address});
|
CoordinatorClient<LocalTransport> coordinator_client(cli_io, coordinator_address, {coordinator_address});
|
||||||
|
|
||||||
query::v2::ShardRequestManager<LocalTransport> shard_request_manager(std::move(coordinator_client),
|
query::v2::RequestRouter<LocalTransport> request_router(std::move(coordinator_client), std::move(cli_io));
|
||||||
std::move(cli_io));
|
|
||||||
|
|
||||||
shard_request_manager.StartTransaction();
|
request_router.StartTransaction();
|
||||||
TestCreateVertices(shard_request_manager);
|
TestCreateVertices(request_router);
|
||||||
TestScanAll(shard_request_manager);
|
TestScanAll(request_router);
|
||||||
TestCreateExpand(shard_request_manager);
|
TestCreateExpand(request_router);
|
||||||
TestExpandOne(shard_request_manager);
|
TestExpandOne(request_router);
|
||||||
local_system.ShutDown();
|
local_system.ShutDown();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -27,8 +27,8 @@
|
|||||||
#include "query/v2/bindings/frame.hpp"
|
#include "query/v2/bindings/frame.hpp"
|
||||||
#include "query/v2/context.hpp"
|
#include "query/v2/context.hpp"
|
||||||
#include "query/v2/frontend/ast/ast.hpp"
|
#include "query/v2/frontend/ast/ast.hpp"
|
||||||
|
#include "query/v2/request_router.hpp"
|
||||||
#include "query/v2/requests.hpp"
|
#include "query/v2/requests.hpp"
|
||||||
#include "query/v2/shard_request_manager.hpp"
|
|
||||||
#include "query_v2_query_common.hpp"
|
#include "query_v2_query_common.hpp"
|
||||||
#include "storage/v3/property_value.hpp"
|
#include "storage/v3/property_value.hpp"
|
||||||
#include "storage/v3/shard.hpp"
|
#include "storage/v3/shard.hpp"
|
||||||
@ -65,10 +65,10 @@ using memgraph::functions::FunctionRuntimeException;
|
|||||||
|
|
||||||
namespace memgraph::query::v2::tests {
|
namespace memgraph::query::v2::tests {
|
||||||
|
|
||||||
class MockedShardRequestManager : public ShardRequestManagerInterface {
|
class MockedRequestRouter : public RequestRouterInterface {
|
||||||
public:
|
public:
|
||||||
using VertexAccessor = accessors::VertexAccessor;
|
using VertexAccessor = accessors::VertexAccessor;
|
||||||
explicit MockedShardRequestManager(ShardMap shard_map) : shards_map_(std::move(shard_map)) { SetUpNameIdMappers(); }
|
explicit MockedRequestRouter(ShardMap shard_map) : shards_map_(std::move(shard_map)) { SetUpNameIdMappers(); }
|
||||||
memgraph::storage::v3::EdgeTypeId NameToEdgeType(const std::string &name) const override {
|
memgraph::storage::v3::EdgeTypeId NameToEdgeType(const std::string &name) const override {
|
||||||
return shards_map_.GetEdgeTypeId(name).value();
|
return shards_map_.GetEdgeTypeId(name).value();
|
||||||
}
|
}
|
||||||
@ -215,9 +215,8 @@ class ExpressionEvaluatorTest : public ::testing::Test {
|
|||||||
SymbolTable symbol_table;
|
SymbolTable symbol_table;
|
||||||
|
|
||||||
Frame frame{128};
|
Frame frame{128};
|
||||||
std::unique_ptr<ShardRequestManagerInterface> shard_manager =
|
std::unique_ptr<RequestRouterInterface> request_router = std::make_unique<MockedRequestRouter>(CreateDummyShardmap());
|
||||||
std::make_unique<MockedShardRequestManager>(CreateDummyShardmap());
|
ExpressionEvaluator eval{&frame, symbol_table, ctx, request_router.get(), memgraph::storage::v3::View::OLD};
|
||||||
ExpressionEvaluator eval{&frame, symbol_table, ctx, shard_manager.get(), memgraph::storage::v3::View::OLD};
|
|
||||||
|
|
||||||
Identifier *CreateIdentifierWithValue(std::string name, const TypedValue &value) {
|
Identifier *CreateIdentifierWithValue(std::string name, const TypedValue &value) {
|
||||||
auto id = storage.Create<Identifier>(name, true);
|
auto id = storage.Create<Identifier>(name, true);
|
||||||
@ -229,8 +228,8 @@ class ExpressionEvaluatorTest : public ::testing::Test {
|
|||||||
|
|
||||||
template <class TExpression>
|
template <class TExpression>
|
||||||
auto Eval(TExpression *expr) {
|
auto Eval(TExpression *expr) {
|
||||||
ctx.properties = NamesToProperties(storage.properties_, shard_manager.get());
|
ctx.properties = NamesToProperties(storage.properties_, request_router.get());
|
||||||
ctx.labels = NamesToLabels(storage.labels_, shard_manager.get());
|
ctx.labels = NamesToLabels(storage.labels_, request_router.get());
|
||||||
auto value = expr->Accept(eval);
|
auto value = expr->Accept(eval);
|
||||||
EXPECT_EQ(value.GetMemoryResource(), &mem) << "ExpressionEvaluator must use the MemoryResource from "
|
EXPECT_EQ(value.GetMemoryResource(), &mem) << "ExpressionEvaluator must use the MemoryResource from "
|
||||||
"EvaluationContext for allocations!";
|
"EvaluationContext for allocations!";
|
||||||
@ -544,25 +543,25 @@ using VertexId = memgraph::msgs::VertexId;
|
|||||||
using Label = memgraph::msgs::Label;
|
using Label = memgraph::msgs::Label;
|
||||||
|
|
||||||
accessors::VertexAccessor CreateVertex(std::vector<std::pair<PropertyId, Value>> props,
|
accessors::VertexAccessor CreateVertex(std::vector<std::pair<PropertyId, Value>> props,
|
||||||
const ShardRequestManagerInterface *manager, Vertex v = {}) {
|
const RequestRouterInterface *request_router, Vertex v = {}) {
|
||||||
return {std::move(v), std::move(props), manager};
|
return {std::move(v), std::move(props), request_router};
|
||||||
}
|
}
|
||||||
|
|
||||||
accessors::EdgeAccessor CreateEdge(std::vector<std::pair<PropertyId, Value>> props,
|
accessors::EdgeAccessor CreateEdge(std::vector<std::pair<PropertyId, Value>> props,
|
||||||
const ShardRequestManagerInterface *manager, EdgeId edge_id = {}, VertexId src = {},
|
const RequestRouterInterface *request_router, EdgeId edge_id = {}, VertexId src = {},
|
||||||
VertexId dst = {}) {
|
VertexId dst = {}) {
|
||||||
auto edge = Edge{.src = std::move(src),
|
auto edge = Edge{.src = std::move(src),
|
||||||
.dst = std::move(dst),
|
.dst = std::move(dst),
|
||||||
.properties = std::move(props),
|
.properties = std::move(props),
|
||||||
.id = edge_id,
|
.id = edge_id,
|
||||||
.type = EdgeType{manager->NameToEdgeType("edge_type")}};
|
.type = EdgeType{request_router->NameToEdgeType("edge_type")}};
|
||||||
return accessors::EdgeAccessor{std::move(edge), manager};
|
return accessors::EdgeAccessor{std::move(edge), request_router};
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ExpressionEvaluatorTest, VertexAndEdgeIndexing) {
|
TEST_F(ExpressionEvaluatorTest, VertexAndEdgeIndexing) {
|
||||||
auto prop = shard_manager->NameToProperty("prop");
|
auto prop = request_router->NameToProperty("prop");
|
||||||
auto vertex = CreateVertex({{prop, Value(static_cast<int64_t>(42))}}, shard_manager.get(), {});
|
auto vertex = CreateVertex({{prop, Value(static_cast<int64_t>(42))}}, request_router.get(), {});
|
||||||
auto edge = CreateEdge({{prop, Value(static_cast<int64_t>(43))}}, shard_manager.get(), {}, {}, {});
|
auto edge = CreateEdge({{prop, Value(static_cast<int64_t>(43))}}, request_router.get(), {}, {}, {});
|
||||||
|
|
||||||
auto *vertex_id = CreateIdentifierWithValue("v1", TypedValue(vertex));
|
auto *vertex_id = CreateIdentifierWithValue("v1", TypedValue(vertex));
|
||||||
auto *edge_id = CreateIdentifierWithValue("e11", TypedValue(edge));
|
auto *edge_id = CreateIdentifierWithValue("e11", TypedValue(edge));
|
||||||
@ -741,9 +740,9 @@ TEST_F(ExpressionEvaluatorTest, IsNullOperator) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ExpressionEvaluatorTest, LabelsTest) {
|
TEST_F(ExpressionEvaluatorTest, LabelsTest) {
|
||||||
Label label{shard_manager->NameToLabel("label1")};
|
Label label{request_router->NameToLabel("label1")};
|
||||||
Vertex vertex = {{}, {label}};
|
Vertex vertex = {{}, {label}};
|
||||||
auto v1 = CreateVertex({}, shard_manager.get(), vertex);
|
auto v1 = CreateVertex({}, request_router.get(), vertex);
|
||||||
auto *identifier = storage.Create<Identifier>("n");
|
auto *identifier = storage.Create<Identifier>("n");
|
||||||
auto node_symbol = symbol_table.CreateSymbol("n", true);
|
auto node_symbol = symbol_table.CreateSymbol("n", true);
|
||||||
identifier->MapTo(node_symbol);
|
identifier->MapTo(node_symbol);
|
||||||
@ -1121,9 +1120,9 @@ TEST_F(ExpressionEvaluatorTest, RegexMatch) {
|
|||||||
class ExpressionEvaluatorPropertyLookup : public ExpressionEvaluatorTest {
|
class ExpressionEvaluatorPropertyLookup : public ExpressionEvaluatorTest {
|
||||||
protected:
|
protected:
|
||||||
std::pair<std::string, memgraph::storage::v3::PropertyId> prop_age =
|
std::pair<std::string, memgraph::storage::v3::PropertyId> prop_age =
|
||||||
std::make_pair("age", shard_manager->NameToProperty("age"));
|
std::make_pair("age", request_router->NameToProperty("age"));
|
||||||
std::pair<std::string, memgraph::storage::v3::PropertyId> prop_height =
|
std::pair<std::string, memgraph::storage::v3::PropertyId> prop_height =
|
||||||
std::make_pair("height", shard_manager->NameToProperty("height"));
|
std::make_pair("height", request_router->NameToProperty("height"));
|
||||||
Identifier *identifier = storage.Create<Identifier>("element");
|
Identifier *identifier = storage.Create<Identifier>("element");
|
||||||
Symbol symbol = symbol_table.CreateSymbol("element", true);
|
Symbol symbol = symbol_table.CreateSymbol("element", true);
|
||||||
|
|
||||||
@ -1191,10 +1190,10 @@ static TypedValue MakeTypedValueList(TArgs &&...args) {
|
|||||||
TEST_F(FunctionTest, EndNode) {
|
TEST_F(FunctionTest, EndNode) {
|
||||||
ASSERT_THROW(EvaluateFunction("ENDNODE"), FunctionRuntimeException);
|
ASSERT_THROW(EvaluateFunction("ENDNODE"), FunctionRuntimeException);
|
||||||
ASSERT_TRUE(EvaluateFunction("ENDNODE", TypedValue()).IsNull());
|
ASSERT_TRUE(EvaluateFunction("ENDNODE", TypedValue()).IsNull());
|
||||||
Label l{shard_manager->NameToLabel("label1")};
|
Label l{request_router->NameToLabel("label1")};
|
||||||
EdgeId e_id{10};
|
EdgeId e_id{10};
|
||||||
VertexId dst{l, {msgs::Value(static_cast<int64_t>(2))}};
|
VertexId dst{l, {msgs::Value(static_cast<int64_t>(2))}};
|
||||||
auto e = CreateEdge({}, shard_manager.get(), e_id, {}, dst);
|
auto e = CreateEdge({}, request_router.get(), e_id, {}, dst);
|
||||||
const auto res = EvaluateFunction("ENDNODE", e).ValueVertex().Id();
|
const auto res = EvaluateFunction("ENDNODE", e).ValueVertex().Id();
|
||||||
ASSERT_EQ(res, dst);
|
ASSERT_EQ(res, dst);
|
||||||
ASSERT_THROW(EvaluateFunction("ENDNODE", 2), FunctionRuntimeException);
|
ASSERT_THROW(EvaluateFunction("ENDNODE", 2), FunctionRuntimeException);
|
||||||
@ -1213,12 +1212,12 @@ TEST_F(FunctionTest, Head) {
|
|||||||
TEST_F(FunctionTest, Properties) {
|
TEST_F(FunctionTest, Properties) {
|
||||||
ASSERT_THROW(EvaluateFunction("PROPERTIES"), FunctionRuntimeException);
|
ASSERT_THROW(EvaluateFunction("PROPERTIES"), FunctionRuntimeException);
|
||||||
ASSERT_TRUE(EvaluateFunction("PROPERTIES", TypedValue()).IsNull());
|
ASSERT_TRUE(EvaluateFunction("PROPERTIES", TypedValue()).IsNull());
|
||||||
const auto height = shard_manager->NameToProperty("height");
|
const auto height = request_router->NameToProperty("height");
|
||||||
const auto age = shard_manager->NameToProperty("age");
|
const auto age = request_router->NameToProperty("age");
|
||||||
auto v1 = CreateVertex({{height, Value(static_cast<int64_t>(5))}, {age, Value(static_cast<int64_t>(10))}},
|
auto v1 = CreateVertex({{height, Value(static_cast<int64_t>(5))}, {age, Value(static_cast<int64_t>(10))}},
|
||||||
shard_manager.get());
|
request_router.get());
|
||||||
auto e = CreateEdge({{height, Value(static_cast<int64_t>(3))}, {age, Value(static_cast<int64_t>(15))}},
|
auto e = CreateEdge({{height, Value(static_cast<int64_t>(3))}, {age, Value(static_cast<int64_t>(15))}},
|
||||||
shard_manager.get());
|
request_router.get());
|
||||||
|
|
||||||
auto prop_values_to_int = [](TypedValue t) {
|
auto prop_values_to_int = [](TypedValue t) {
|
||||||
std::unordered_map<std::string, int> properties;
|
std::unordered_map<std::string, int> properties;
|
||||||
@ -1262,10 +1261,10 @@ TEST_F(FunctionTest, Size) {
|
|||||||
TEST_F(FunctionTest, StartNode) {
|
TEST_F(FunctionTest, StartNode) {
|
||||||
ASSERT_THROW(EvaluateFunction("STARTNODE"), FunctionRuntimeException);
|
ASSERT_THROW(EvaluateFunction("STARTNODE"), FunctionRuntimeException);
|
||||||
ASSERT_TRUE(EvaluateFunction("STARTNODE", TypedValue()).IsNull());
|
ASSERT_TRUE(EvaluateFunction("STARTNODE", TypedValue()).IsNull());
|
||||||
Label l{shard_manager->NameToLabel("label1")};
|
Label l{request_router->NameToLabel("label1")};
|
||||||
EdgeId e_id{5};
|
EdgeId e_id{5};
|
||||||
VertexId src{l, {msgs::Value(static_cast<int64_t>(4))}};
|
VertexId src{l, {msgs::Value(static_cast<int64_t>(4))}};
|
||||||
auto e = CreateEdge({}, shard_manager.get(), e_id, src);
|
auto e = CreateEdge({}, request_router.get(), e_id, src);
|
||||||
const auto res = EvaluateFunction("STARTNODE", e).ValueVertex().Id();
|
const auto res = EvaluateFunction("STARTNODE", e).ValueVertex().Id();
|
||||||
ASSERT_EQ(res, src);
|
ASSERT_EQ(res, src);
|
||||||
ASSERT_THROW(EvaluateFunction("STARTNODE", 2), FunctionRuntimeException);
|
ASSERT_THROW(EvaluateFunction("STARTNODE", 2), FunctionRuntimeException);
|
||||||
@ -1310,7 +1309,7 @@ TEST_F(FunctionTest, ToInteger) {
|
|||||||
TEST_F(FunctionTest, Type) {
|
TEST_F(FunctionTest, Type) {
|
||||||
ASSERT_THROW(EvaluateFunction("TYPE"), FunctionRuntimeException);
|
ASSERT_THROW(EvaluateFunction("TYPE"), FunctionRuntimeException);
|
||||||
ASSERT_TRUE(EvaluateFunction("TYPE", TypedValue()).IsNull());
|
ASSERT_TRUE(EvaluateFunction("TYPE", TypedValue()).IsNull());
|
||||||
auto e = CreateEdge({}, shard_manager.get());
|
auto e = CreateEdge({}, request_router.get());
|
||||||
ASSERT_EQ(EvaluateFunction("TYPE", e).ValueString(), "edge_type");
|
ASSERT_EQ(EvaluateFunction("TYPE", e).ValueString(), "edge_type");
|
||||||
ASSERT_THROW(EvaluateFunction("TYPE", 2), FunctionRuntimeException);
|
ASSERT_THROW(EvaluateFunction("TYPE", 2), FunctionRuntimeException);
|
||||||
}
|
}
|
||||||
@ -1329,17 +1328,17 @@ TEST_F(FunctionTest, ValueType) {
|
|||||||
ASSERT_EQ(EvaluateFunction("VALUETYPE", TypedValue(std::map<std::string, TypedValue>{{"test", TypedValue(1)}}))
|
ASSERT_EQ(EvaluateFunction("VALUETYPE", TypedValue(std::map<std::string, TypedValue>{{"test", TypedValue(1)}}))
|
||||||
.ValueString(),
|
.ValueString(),
|
||||||
"MAP");
|
"MAP");
|
||||||
auto v1 = CreateVertex({}, shard_manager.get());
|
auto v1 = CreateVertex({}, request_router.get());
|
||||||
ASSERT_EQ(EvaluateFunction("VALUETYPE", v1).ValueString(), "NODE");
|
ASSERT_EQ(EvaluateFunction("VALUETYPE", v1).ValueString(), "NODE");
|
||||||
auto e = CreateEdge({}, shard_manager.get());
|
auto e = CreateEdge({}, request_router.get());
|
||||||
ASSERT_EQ(EvaluateFunction("VALUETYPE", e).ValueString(), "RELATIONSHIP");
|
ASSERT_EQ(EvaluateFunction("VALUETYPE", e).ValueString(), "RELATIONSHIP");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(FunctionTest, Labels) {
|
TEST_F(FunctionTest, Labels) {
|
||||||
ASSERT_THROW(EvaluateFunction("LABELS"), FunctionRuntimeException);
|
ASSERT_THROW(EvaluateFunction("LABELS"), FunctionRuntimeException);
|
||||||
ASSERT_TRUE(EvaluateFunction("LABELS", TypedValue()).IsNull());
|
ASSERT_TRUE(EvaluateFunction("LABELS", TypedValue()).IsNull());
|
||||||
Label label{shard_manager->NameToLabel("label1")};
|
Label label{request_router->NameToLabel("label1")};
|
||||||
auto v = CreateVertex({}, shard_manager.get(), {{}, {label}});
|
auto v = CreateVertex({}, request_router.get(), {{}, {label}});
|
||||||
std::vector<std::string> labels;
|
std::vector<std::string> labels;
|
||||||
auto evaluated_labels = EvaluateFunction("LABELS", v).ValueList();
|
auto evaluated_labels = EvaluateFunction("LABELS", v).ValueList();
|
||||||
labels.reserve(evaluated_labels.size());
|
labels.reserve(evaluated_labels.size());
|
||||||
@ -1556,9 +1555,9 @@ TEST_F(FunctionTest, Counter) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(FunctionTest, Id) {
|
TEST_F(FunctionTest, Id) {
|
||||||
auto v = CreateVertex({}, shard_manager.get());
|
auto v = CreateVertex({}, request_router.get());
|
||||||
EXPECT_THROW(EvaluateFunction("ID", v), FunctionRuntimeException);
|
EXPECT_THROW(EvaluateFunction("ID", v), FunctionRuntimeException);
|
||||||
auto e = CreateEdge({}, shard_manager.get(), EdgeId{10});
|
auto e = CreateEdge({}, request_router.get(), EdgeId{10});
|
||||||
EXPECT_EQ(EvaluateFunction("ID", e).ValueInt(), 10);
|
EXPECT_EQ(EvaluateFunction("ID", e).ValueInt(), 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user