From ffd399906ae6a79942397f9ad333c80ed08a9581 Mon Sep 17 00:00:00 2001
From: Teon Banek <theongugl@gmail.com>
Date: Wed, 15 Mar 2017 15:18:42 +0100
Subject: [PATCH] Use Symbol to get frame value

Summary:
Since we always use the symbol position to read from frame, it's more
convenient for `Frame::operator[]` to accept `Symbol` instead of `int`.

Reviewers: florijan, mislav.bradac, buda

Reviewed By: florijan, buda

Differential Revision: https://phabricator.memgraph.io/D129
---
 src/query/entry.hpp                        | 2 +-
 src/query/frontend/interpret/interpret.hpp | 8 ++++----
 src/query/frontend/logical/operator.hpp    | 7 ++-----
 tests/unit/interpreter.cpp                 | 2 +-
 4 files changed, 8 insertions(+), 11 deletions(-)

diff --git a/src/query/entry.hpp b/src/query/entry.hpp
index 8a2927793..347c576eb 100644
--- a/src/query/entry.hpp
+++ b/src/query/entry.hpp
@@ -86,7 +86,7 @@ class Engine {
       while (cursor->Pull(frame, symbol_table)) {
         std::vector<TypedValue> values;
         for (auto &symbol : symbols)
-          values.emplace_back(frame[symbol.position_]);
+          values.emplace_back(frame[symbol]);
         stream.Result(values);
       }
 
diff --git a/src/query/frontend/interpret/interpret.hpp b/src/query/frontend/interpret/interpret.hpp
index 2b2e70dc3..9ad4c1494 100644
--- a/src/query/frontend/interpret/interpret.hpp
+++ b/src/query/frontend/interpret/interpret.hpp
@@ -14,8 +14,8 @@ class Frame {
  public:
   Frame(int size) : size_(size), elems_(size_) {}
 
-  auto &operator[](int pos) { return elems_[pos]; }
-  const auto &operator[](int pos) const { return elems_[pos]; }
+  auto &operator[](const Symbol &symbol) { return elems_[symbol.position_]; }
+  const auto &operator[](const Symbol &symbol) const { return elems_[symbol.position_]; }
 
  private:
   int size_;
@@ -45,11 +45,11 @@ class ExpressionEvaluator : public TreeVisitorBase {
 
   void PostVisit(NamedExpression &named_expression) override {
     auto symbol = symbol_table_[named_expression];
-    frame_[symbol.position_] = PopBack();
+    frame_[symbol] = PopBack();
   }
 
   void Visit(Identifier &ident) override {
-    result_stack_.push_back(frame_[symbol_table_[ident].position_]);
+    result_stack_.push_back(frame_[symbol_table_[ident]]);
   }
 
   void PostVisit(PropertyLookup &property_lookup) override {
diff --git a/src/query/frontend/logical/operator.hpp b/src/query/frontend/logical/operator.hpp
index 8c07916cd..06f39a72b 100644
--- a/src/query/frontend/logical/operator.hpp
+++ b/src/query/frontend/logical/operator.hpp
@@ -41,8 +41,7 @@ class ScanAll : public LogicalOperator {
 
     bool Pull(Frame& frame, SymbolTable& symbol_table) override {
       if (vertices_it_ == vertices_.end()) return false;
-      frame[symbol_table[*self_.node_atom->identifier_].position_] =
-          *vertices_it_++;
+      frame[symbol_table[*self_.node_atom->identifier_]] = *vertices_it_++;
       return true;
     }
 
@@ -80,8 +79,7 @@ class NodeFilter : public LogicalOperator {
 
     bool Pull(Frame& frame, SymbolTable& symbol_table) override {
       while (input_cursor_->Pull(frame, symbol_table)) {
-        const VertexAccessor& vertex =
-            frame[self_.input_symbol_.position_].Value<VertexAccessor>();
+        const auto &vertex = frame[self_.input_symbol_].Value<VertexAccessor>();
         if (VertexPasses(vertex, frame, symbol_table)) return true;
       }
       return false;
@@ -105,7 +103,6 @@ class NodeFilter : public LogicalOperator {
             !comparison_result.Value<bool>())
           return false;
       }
-
       return true;
     }
   };
diff --git a/tests/unit/interpreter.cpp b/tests/unit/interpreter.cpp
index 0406907c1..0aad3ee88 100644
--- a/tests/unit/interpreter.cpp
+++ b/tests/unit/interpreter.cpp
@@ -46,7 +46,7 @@ auto CollectProduce(std::shared_ptr<Produce> produce, SymbolTable &symbol_table,
   auto cursor = produce->MakeCursor(db_accessor);
   while (cursor->Pull(frame, symbol_table)) {
     std::vector<TypedValue> values;
-    for (auto &symbol : symbols) values.emplace_back(frame[symbol.position_]);
+    for (auto &symbol : symbols) values.emplace_back(frame[symbol]);
     stream.Result(values);
   }