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