From 3a07a95f6151662daa881fc20b78582d587c8d80 Mon Sep 17 00:00:00 2001 From: florijan Date: Fri, 24 Mar 2017 09:37:28 +0100 Subject: [PATCH] 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 --- src/query/frontend/logical/operator.hpp | 8 +++-- tests/unit/interpreter.cpp | 46 ++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/query/frontend/logical/operator.hpp b/src/query/frontend/logical/operator.hpp index b20e287a2..fd35ddd45 100644 --- a/src/query/frontend/logical/operator.hpp +++ b/src/query/frontend/logical/operator.hpp @@ -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_) { diff --git a/tests/unit/interpreter.cpp b/tests/unit/interpreter.cpp index cc71c98e6..13033df8b 100644 --- a/tests/unit/interpreter.cpp +++ b/tests/unit/interpreter.cpp @@ -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(42); auto edge_filter = std::make_shared( 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( + 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("m", storage.Create("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); }