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;
 }