Format all the memgraph and test source files (#97)
This commit is contained in:
@@ -20,26 +20,20 @@ using Direction = query::EdgeAtom::Direction;
|
||||
template <class TAccessor>
|
||||
std::string ToString(const std::vector<TypedValue> &row, const TAccessor &acc) {
|
||||
std::ostringstream os;
|
||||
utils::PrintIterable(os, row, ", ", [&](auto &stream, const auto &item) {
|
||||
stream << ToString(item, acc);
|
||||
});
|
||||
utils::PrintIterable(os, row, ", ", [&](auto &stream, const auto &item) { stream << ToString(item, acc); });
|
||||
return os.str();
|
||||
}
|
||||
template <class TAccessor>
|
||||
std::string ToString(const std::vector<std::vector<TypedValue>> &rows,
|
||||
const TAccessor &acc) {
|
||||
std::string ToString(const std::vector<std::vector<TypedValue>> &rows, const TAccessor &acc) {
|
||||
std::ostringstream os;
|
||||
utils::PrintIterable(os, rows, "\n", [&](auto &stream, const auto &item) {
|
||||
stream << ToString(item, acc);
|
||||
});
|
||||
utils::PrintIterable(os, rows, "\n", [&](auto &stream, const auto &item) { stream << ToString(item, acc); });
|
||||
return os.str();
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
template <class TAccessor>
|
||||
void AssertRows(const std::vector<std::vector<TypedValue>> &datum,
|
||||
std::vector<std::vector<TypedValue>> expected,
|
||||
void AssertRows(const std::vector<std::vector<TypedValue>> &datum, std::vector<std::vector<TypedValue>> expected,
|
||||
const TAccessor &acc) {
|
||||
auto row_equal = [](const auto &row1, const auto &row2) {
|
||||
if (row1.size() != row2.size()) {
|
||||
@@ -47,34 +41,29 @@ void AssertRows(const std::vector<std::vector<TypedValue>> &datum,
|
||||
}
|
||||
TypedValue::BoolEqual value_eq;
|
||||
auto row1_it = row1.begin();
|
||||
for (auto row2_it = row2.begin(); row2_it != row2.end();
|
||||
++row1_it, ++row2_it) {
|
||||
for (auto row2_it = row2.begin(); row2_it != row2.end(); ++row1_it, ++row2_it) {
|
||||
if (!value_eq(*row1_it, *row2_it)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
ASSERT_TRUE(std::is_permutation(datum.begin(), datum.end(), expected.begin(),
|
||||
expected.end(), row_equal))
|
||||
ASSERT_TRUE(std::is_permutation(datum.begin(), datum.end(), expected.begin(), expected.end(), row_equal))
|
||||
<< "Actual rows:" << std::endl
|
||||
<< ToString(datum, acc) << std::endl
|
||||
<< "Expected rows:" << std::endl
|
||||
<< ToString(expected, acc);
|
||||
};
|
||||
|
||||
void CheckPlansProduce(
|
||||
size_t expected_plan_count, query::CypherQuery *query, AstStorage &storage,
|
||||
query::DbAccessor *dba,
|
||||
std::function<void(const std::vector<std::vector<TypedValue>> &)> check) {
|
||||
void CheckPlansProduce(size_t expected_plan_count, query::CypherQuery *query, AstStorage &storage,
|
||||
query::DbAccessor *dba,
|
||||
std::function<void(const std::vector<std::vector<TypedValue>> &)> check) {
|
||||
auto symbol_table = query::MakeSymbolTable(query);
|
||||
auto planning_context =
|
||||
MakePlanningContext(&storage, &symbol_table, query, dba);
|
||||
auto planning_context = MakePlanningContext(&storage, &symbol_table, query, dba);
|
||||
auto query_parts = CollectQueryParts(symbol_table, storage, query);
|
||||
EXPECT_TRUE(query_parts.query_parts.size() > 0);
|
||||
auto single_query_parts = query_parts.query_parts.at(0).single_query_parts;
|
||||
auto plans = MakeLogicalPlanForSingleQuery<VariableStartPlanner>(
|
||||
single_query_parts, &planning_context);
|
||||
auto plans = MakeLogicalPlanForSingleQuery<VariableStartPlanner>(single_query_parts, &planning_context);
|
||||
EXPECT_EQ(std::distance(plans.begin(), plans.end()), expected_plan_count);
|
||||
for (const auto &plan : plans) {
|
||||
auto *produce = dynamic_cast<Produce *>(plan.get());
|
||||
@@ -96,9 +85,7 @@ TEST(TestVariableStartPlanner, MatchReturn) {
|
||||
dba.AdvanceCommand();
|
||||
// Test MATCH (n) -[r]-> (m) RETURN n
|
||||
AstStorage storage;
|
||||
auto *query = QUERY(SINGLE_QUERY(
|
||||
MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m"))),
|
||||
RETURN("n")));
|
||||
auto *query = QUERY(SINGLE_QUERY(MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m"))), RETURN("n")));
|
||||
// We have 2 nodes `n` and `m` from which we could start, so expect 2 plans.
|
||||
CheckPlansProduce(2, query, storage, &dba, [&](const auto &results) {
|
||||
// We expect to produce only a single (v1) node.
|
||||
@@ -121,8 +108,7 @@ TEST(TestVariableStartPlanner, MatchTripletPatternReturn) {
|
||||
// Test `MATCH (n) -[r]-> (m) -[e]-> (l) RETURN n`
|
||||
AstStorage storage;
|
||||
auto *query = QUERY(SINGLE_QUERY(
|
||||
MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m"),
|
||||
EDGE("e", Direction::OUT), NODE("l"))),
|
||||
MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m"), EDGE("e", Direction::OUT), NODE("l"))),
|
||||
RETURN("n")));
|
||||
// We have 3 nodes: `n`, `m` and `l` from which we could start.
|
||||
CheckPlansProduce(3, query, storage, &dba, [&](const auto &results) {
|
||||
@@ -133,10 +119,9 @@ TEST(TestVariableStartPlanner, MatchTripletPatternReturn) {
|
||||
{
|
||||
// Equivalent to `MATCH (n) -[r]-> (m), (m) -[e]-> (l) RETURN n`.
|
||||
AstStorage storage;
|
||||
auto *query = QUERY(SINGLE_QUERY(
|
||||
MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m")),
|
||||
PATTERN(NODE("m"), EDGE("e", Direction::OUT), NODE("l"))),
|
||||
RETURN("n")));
|
||||
auto *query = QUERY(SINGLE_QUERY(MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m")),
|
||||
PATTERN(NODE("m"), EDGE("e", Direction::OUT), NODE("l"))),
|
||||
RETURN("n")));
|
||||
CheckPlansProduce(3, query, storage, &dba, [&](const auto &results) {
|
||||
AssertRows(results, {{TypedValue(query::VertexAccessor(v1))}}, dba);
|
||||
});
|
||||
@@ -156,10 +141,9 @@ TEST(TestVariableStartPlanner, MatchOptionalMatchReturn) {
|
||||
dba.AdvanceCommand();
|
||||
// Test MATCH (n) -[r]-> (m) OPTIONAL MATCH (m) -[e]-> (l) RETURN n, l
|
||||
AstStorage storage;
|
||||
auto *query = QUERY(SINGLE_QUERY(
|
||||
MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m"))),
|
||||
OPTIONAL_MATCH(PATTERN(NODE("m"), EDGE("e", Direction::OUT), NODE("l"))),
|
||||
RETURN("n", "l")));
|
||||
auto *query =
|
||||
QUERY(SINGLE_QUERY(MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m"))),
|
||||
OPTIONAL_MATCH(PATTERN(NODE("m"), EDGE("e", Direction::OUT), NODE("l"))), RETURN("n", "l")));
|
||||
// We have 2 nodes `n` and `m` from which we could start the MATCH, and 2
|
||||
// nodes for OPTIONAL MATCH. This should produce 2 * 2 plans.
|
||||
CheckPlansProduce(4, query, storage, &dba, [&](const auto &results) {
|
||||
@@ -167,8 +151,7 @@ TEST(TestVariableStartPlanner, MatchOptionalMatchReturn) {
|
||||
// * (v1), (v3)
|
||||
// * (v2), null
|
||||
AssertRows(results,
|
||||
{{TypedValue(query::VertexAccessor(v1)),
|
||||
TypedValue(query::VertexAccessor(v3))},
|
||||
{{TypedValue(query::VertexAccessor(v1)), TypedValue(query::VertexAccessor(v3))},
|
||||
{TypedValue(query::VertexAccessor(v2)), TypedValue()}},
|
||||
dba);
|
||||
});
|
||||
@@ -188,20 +171,15 @@ TEST(TestVariableStartPlanner, MatchOptionalMatchMergeReturn) {
|
||||
// Test MATCH (n) -[r]-> (m) OPTIONAL MATCH (m) -[e]-> (l)
|
||||
// MERGE (u) -[q:r]-> (v) RETURN n, m, l, u, v
|
||||
AstStorage storage;
|
||||
auto *query = QUERY(SINGLE_QUERY(
|
||||
MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m"))),
|
||||
OPTIONAL_MATCH(PATTERN(NODE("m"), EDGE("e", Direction::OUT), NODE("l"))),
|
||||
MERGE(PATTERN(NODE("u"), EDGE("q", Direction::OUT, {r_type_name}),
|
||||
NODE("v"))),
|
||||
RETURN("n", "m", "l", "u", "v")));
|
||||
auto *query = QUERY(SINGLE_QUERY(MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m"))),
|
||||
OPTIONAL_MATCH(PATTERN(NODE("m"), EDGE("e", Direction::OUT), NODE("l"))),
|
||||
MERGE(PATTERN(NODE("u"), EDGE("q", Direction::OUT, {r_type_name}), NODE("v"))),
|
||||
RETURN("n", "m", "l", "u", "v")));
|
||||
// Since MATCH, OPTIONAL MATCH and MERGE each have 2 nodes from which we can
|
||||
// start, we generate 2 * 2 * 2 plans.
|
||||
CheckPlansProduce(8, query, storage, &dba, [&](const auto &results) {
|
||||
// We expect to produce a single row: (v1), (v2), null, (v1), (v2)
|
||||
AssertRows(results,
|
||||
{{TypedValue(v1), TypedValue(v2), TypedValue(), TypedValue(v1),
|
||||
TypedValue(v2)}},
|
||||
dba);
|
||||
AssertRows(results, {{TypedValue(v1), TypedValue(v2), TypedValue(), TypedValue(v1), TypedValue(v2)}}, dba);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -216,17 +194,14 @@ TEST(TestVariableStartPlanner, MatchWithMatchReturn) {
|
||||
dba.AdvanceCommand();
|
||||
// Test MATCH (n) -[r]-> (m) WITH n MATCH (m) -[r]-> (l) RETURN n, m, l
|
||||
AstStorage storage;
|
||||
auto *query = QUERY(SINGLE_QUERY(
|
||||
MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m"))),
|
||||
WITH("n"),
|
||||
MATCH(PATTERN(NODE("m"), EDGE("r", Direction::OUT), NODE("l"))),
|
||||
RETURN("n", "m", "l")));
|
||||
auto *query =
|
||||
QUERY(SINGLE_QUERY(MATCH(PATTERN(NODE("n"), EDGE("r", Direction::OUT), NODE("m"))), WITH("n"),
|
||||
MATCH(PATTERN(NODE("m"), EDGE("r", Direction::OUT), NODE("l"))), RETURN("n", "m", "l")));
|
||||
// We can start from 2 nodes in each match. Since WITH separates query parts,
|
||||
// we expect to get 2 plans for each, which totals 2 * 2.
|
||||
CheckPlansProduce(4, query, storage, &dba, [&](const auto &results) {
|
||||
// We expect to produce a single row: (v1), (v1), (v2)
|
||||
AssertRows(results, {{TypedValue(v1), TypedValue(v1), TypedValue(v2)}},
|
||||
dba);
|
||||
AssertRows(results, {{TypedValue(v1), TypedValue(v1), TypedValue(v2)}}, dba);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -244,14 +219,12 @@ TEST(TestVariableStartPlanner, MatchVariableExpand) {
|
||||
// Test MATCH (n) -[r*]-> (m) RETURN r
|
||||
AstStorage storage;
|
||||
auto edge = EDGE_VARIABLE("r", Type::DEPTH_FIRST, Direction::OUT);
|
||||
auto *query = QUERY(
|
||||
SINGLE_QUERY(MATCH(PATTERN(NODE("n"), edge, NODE("m"))), RETURN("r")));
|
||||
auto *query = QUERY(SINGLE_QUERY(MATCH(PATTERN(NODE("n"), edge, NODE("m"))), RETURN("r")));
|
||||
// We expect to get a single column with the following rows:
|
||||
TypedValue r1_list(std::vector<TypedValue>{TypedValue(r1)}); // [r1]
|
||||
TypedValue r2_list(std::vector<TypedValue>{TypedValue(r2)}); // [r2]
|
||||
// [r1, r2]
|
||||
TypedValue r1_r2_list(
|
||||
std::vector<TypedValue>{TypedValue(r1), TypedValue(r2)});
|
||||
TypedValue r1_r2_list(std::vector<TypedValue>{TypedValue(r1), TypedValue(r2)});
|
||||
CheckPlansProduce(2, query, storage, &dba, [&](const auto &results) {
|
||||
AssertRows(results, {{r1_list}, {r2_list}, {r1_r2_list}}, dba);
|
||||
});
|
||||
@@ -276,8 +249,7 @@ TEST(TestVariableStartPlanner, MatchVariableExpandReferenceNode) {
|
||||
AstStorage storage;
|
||||
auto edge = EDGE_VARIABLE("r", Type::DEPTH_FIRST, Direction::OUT);
|
||||
edge->upper_bound_ = PROPERTY_LOOKUP("n", id);
|
||||
auto *query = QUERY(
|
||||
SINGLE_QUERY(MATCH(PATTERN(NODE("n"), edge, NODE("m"))), RETURN("r")));
|
||||
auto *query = QUERY(SINGLE_QUERY(MATCH(PATTERN(NODE("n"), edge, NODE("m"))), RETURN("r")));
|
||||
// We expect to get a single column with the following rows:
|
||||
// [r1] (v1 -[*..1]-> v2)
|
||||
TypedValue r1_list(std::vector<TypedValue>{TypedValue(r1)});
|
||||
@@ -306,13 +278,11 @@ TEST(TestVariableStartPlanner, MatchVariableExpandBoth) {
|
||||
auto edge = EDGE_VARIABLE("r", Type::DEPTH_FIRST, Direction::BOTH);
|
||||
auto node_n = NODE("n");
|
||||
node_n->properties_[storage.GetPropertyIx("id")] = LITERAL(1);
|
||||
auto *query =
|
||||
QUERY(SINGLE_QUERY(MATCH(PATTERN(node_n, edge, NODE("m"))), RETURN("r")));
|
||||
auto *query = QUERY(SINGLE_QUERY(MATCH(PATTERN(node_n, edge, NODE("m"))), RETURN("r")));
|
||||
// We expect to get a single column with the following rows:
|
||||
TypedValue r1_list(std::vector<TypedValue>{TypedValue(r1)}); // [r1]
|
||||
// [r1, r2]
|
||||
TypedValue r1_r2_list(
|
||||
std::vector<TypedValue>{TypedValue(r1), TypedValue(r2)});
|
||||
TypedValue r1_r2_list(std::vector<TypedValue>{TypedValue(r1), TypedValue(r2)});
|
||||
CheckPlansProduce(2, query, storage, &dba, [&](const auto &results) {
|
||||
AssertRows(results, {{r1_list}, {r1_r2_list}}, dba);
|
||||
});
|
||||
@@ -335,20 +305,16 @@ TEST(TestVariableStartPlanner, MatchBfs) {
|
||||
dba.AdvanceCommand();
|
||||
// Test MATCH (n) -[r *bfs..10](r, n | n.id <> 3)]-> (m) RETURN r
|
||||
AstStorage storage;
|
||||
auto *bfs = storage.Create<query::EdgeAtom>(
|
||||
IDENT("r"), EdgeAtom::Type::BREADTH_FIRST, Direction::OUT,
|
||||
std::vector<query::EdgeTypeIx>{});
|
||||
auto *bfs = storage.Create<query::EdgeAtom>(IDENT("r"), EdgeAtom::Type::BREADTH_FIRST, Direction::OUT,
|
||||
std::vector<query::EdgeTypeIx>{});
|
||||
bfs->filter_lambda_.inner_edge = IDENT("r");
|
||||
bfs->filter_lambda_.inner_node = IDENT("n");
|
||||
bfs->filter_lambda_.expression = NEQ(PROPERTY_LOOKUP("n", id), LITERAL(3));
|
||||
bfs->upper_bound_ = LITERAL(10);
|
||||
auto *query = QUERY(
|
||||
SINGLE_QUERY(MATCH(PATTERN(NODE("n"), bfs, NODE("m"))), RETURN("r")));
|
||||
auto *query = QUERY(SINGLE_QUERY(MATCH(PATTERN(NODE("n"), bfs, NODE("m"))), RETURN("r")));
|
||||
// We expect to get a single column with the following rows:
|
||||
TypedValue r1_list(std::vector<TypedValue>{TypedValue(r1)}); // [r1]
|
||||
CheckPlansProduce(2, query, storage, &dba, [&](const auto &results) {
|
||||
AssertRows(results, {{r1_list}}, dba);
|
||||
});
|
||||
CheckPlansProduce(2, query, storage, &dba, [&](const auto &results) { AssertRows(results, {{r1_list}}, dba); });
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Reference in New Issue
Block a user