Query - EdgeFilter - test improvements and bugfix

Summary: EdgeFiltering on type was implemented wrong, requiring ALL the given edge types to be satisfied instead of OR. Added a test and fixed implementation. Also resolved a few TODOs in EdgeFilterTest.

Reviewers: buda, teon.banek, mislav.bradac

Reviewed By: teon.banek

Subscribers: pullbot

Differential Revision: https://phabricator.memgraph.io/D170
This commit is contained in:
florijan 2017-03-24 09:37:28 +01:00
parent f9b91cf680
commit 3a07a95f61
2 changed files with 48 additions and 6 deletions

View File

@ -581,8 +581,12 @@ class EdgeFilter : public LogicalOperator {
bool EdgePasses(const EdgeAccessor &edge, Frame &frame,
SymbolTable &symbol_table) {
for (auto edge_type : self_.edge_atom_->edge_types_)
if (edge.edge_type() != edge_type) return false;
// edge type filtering - logical OR
const auto &types = self_.edge_atom_->edge_types_;
GraphDb::EdgeType type = edge.edge_type();
if (!std::any_of(types.begin(), types.end(),
[type](auto t) { return t == type; }))
return false;
ExpressionEvaluator expression_evaluator(frame, symbol_table);
for (auto prop_pair : self_.edge_atom_->properties_) {

View File

@ -645,8 +645,7 @@ TEST(Interpreter, EdgeFilter) {
auto r_m = MakeExpand(storage, symbol_table, std::get<1>(n), std::get<2>(n),
"r", EdgeAtom::Direction::RIGHT, false, "m", false);
std::get<0>(r_m)->edge_types_.push_back(edge_types[0]);
// TODO when int literal expression becomes available
// add a property filter
std::get<0>(r_m)->properties_[prop] = storage.Create<Literal>(42);
auto edge_filter = std::make_shared<EdgeFilter>(
std::get<4>(r_m), std::get<1>(r_m), std::get<0>(r_m));
@ -658,6 +657,45 @@ TEST(Interpreter, EdgeFilter) {
auto produce = MakeProduce(edge_filter, output);
ResultStreamFaker result = CollectProduce(produce, symbol_table, *dba);
// TODO change the expected value to 1 once property filtering is available
EXPECT_EQ(result.GetResults().size(), 3);
EXPECT_EQ(result.GetResults().size(), 1);
}
TEST(Interpreter, EdgeFilterMultipleTypes) {
Dbms dbms;
auto dba = dbms.active();
auto v1 = dba->insert_vertex();
auto v2 = dba->insert_vertex();
auto type_1 = dba->edge_type("type_1");
auto type_2 = dba->edge_type("type_2");
auto type_3 = dba->edge_type("type_3");
dba->insert_edge(v1, v2, type_1);
dba->insert_edge(v1, v2, type_2);
dba->insert_edge(v1, v2, type_3);
dba->advance_command();
AstTreeStorage storage;
SymbolTable symbol_table;
// make a scan all
auto n = MakeScanAll(storage, symbol_table, "n");
auto r_m = MakeExpand(storage, symbol_table, std::get<1>(n), std::get<2>(n),
"r", EdgeAtom::Direction::RIGHT, false, "m", false);
// add a property filter
auto edge_filter = std::make_shared<EdgeFilter>(
std::get<4>(r_m), std::get<1>(r_m), std::get<0>(r_m));
std::get<0>(r_m)->edge_types_.push_back(type_1);
std::get<0>(r_m)->edge_types_.push_back(type_2);
// make a named expression and a produce
auto output =
storage.Create<NamedExpression>("m", storage.Create<Identifier>("m"));
auto produce = MakeProduce(edge_filter, output);
// fill up the symbol table
symbol_table[*output] = symbol_table.CreateSymbol("named_expression_1");
symbol_table[*output->expression_] = std::get<3>(r_m);
ResultStreamFaker result = CollectProduce(produce, symbol_table, *dba);
EXPECT_EQ(result.GetResults().size(), 2);
}