From d706a91b1bacbad8d6cdd1916ff354670e2c9aec Mon Sep 17 00:00:00 2001 From: Teon Banek <teon.banek@memgraph.io> Date: Thu, 25 May 2017 15:45:03 +0200 Subject: [PATCH] Don't make an Expansion of single node if it is expanded Summary: We would redundantly generate an Expansion for the first node if it was part of an expand. For example, the pattern `(n) -[r]- (m)` would generate `Expansion{n}` and `Expansion{n, r, m}`, when only the latter is enough. This change corrects that behaviour by dropping the first Expansion. Reviewers: florijan, mislav.bradac Reviewed By: florijan Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D412 --- src/query/plan/planner.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/query/plan/planner.cpp b/src/query/plan/planner.cpp index c698cb2d9..5ef9a1b65 100644 --- a/src/query/plan/planner.cpp +++ b/src/query/plan/planner.cpp @@ -593,15 +593,19 @@ LogicalOperator *HandleWriteClause(Clause *clause, LogicalOperator *input_op, std::vector<Expansion> NormalizePatterns( const std::vector<Pattern *> &patterns) { std::vector<Expansion> expansions; - auto collect_node = [&](auto *node) { - expansions.emplace_back(Expansion{node}); - }; + auto ignore_node = [&](auto *node) {}; auto collect_expansion = [&](auto *prev_node, auto *edge, auto *current_node) { expansions.emplace_back(Expansion{prev_node, edge, current_node}); }; for (const auto &pattern : patterns) { - ForeachPattern(*pattern, collect_node, collect_expansion); + if (pattern->atoms_.size() == 1U) { + auto *node = dynamic_cast<NodeAtom *>(pattern->atoms_[0]); + debug_assert(node, "First pattern atom is not a node"); + expansions.emplace_back(Expansion{node}); + } else { + ForeachPattern(*pattern, ignore_node, collect_expansion); + } } return expansions; }