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:
parent
f9b91cf680
commit
3a07a95f61
@ -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_) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user