diff --git a/CMakeLists.txt b/CMakeLists.txt index d56da56fe..5f00a3439 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -350,6 +350,7 @@ set(memgraph_src_files ${src_dir}/query/stripper.cpp ${src_dir}/query/backend/cpp/cypher_main_visitor.cpp ${src_dir}/query/backend/cpp/typed_value.cpp + ${src_dir}/query/frontend/ast/ast.cpp ) # ----------------------------------------------------------------------------- diff --git a/src/query/backend/cpp/typed_value.hpp b/src/query/backend/cpp/typed_value.hpp index 3f3845863..aadd7aa41 100644 --- a/src/query/backend/cpp/typed_value.hpp +++ b/src/query/backend/cpp/typed_value.hpp @@ -25,7 +25,7 @@ typedef traversal_template::Path Path; * TypedValue::Type. Each such type corresponds to exactly one C++ type. */ class TypedValue : public TotalOrdering { - private: + public: /** Private default constructor, makes Null */ TypedValue() : type_(Type::Null) {} diff --git a/src/query/frontend/ast/ast.cpp b/src/query/frontend/ast/ast.cpp new file mode 100644 index 000000000..34abc30dc --- /dev/null +++ b/src/query/frontend/ast/ast.cpp @@ -0,0 +1,10 @@ +#include "query/frontend/interpret/interpret.hpp" +#include "query/frontend/typecheck/symbol_table.hpp" + +namespace query { + +TypedValue Ident::Evaluate(Frame& frame, SymbolTable& symbol_table) { + return frame[symbol_table[*this].position_]; +} + +} diff --git a/src/query/frontend/ast/ast.hpp b/src/query/frontend/ast/ast.hpp index ef2f9dd30..f35538258 100644 --- a/src/query/frontend/ast/ast.hpp +++ b/src/query/frontend/ast/ast.hpp @@ -4,6 +4,7 @@ #include #include "database/graph_db.hpp" +#include "query/backend/cpp/typed_value.hpp" namespace query { @@ -13,6 +14,9 @@ using sptr = std::shared_ptr; template using uptr = std::unique_ptr; +class Frame; +class SymbolTable; + class Tree { public: Tree(const int uid) : uid_(uid) {} @@ -22,11 +26,14 @@ private: }; class Expr : public Tree { + public: + virtual TypedValue Evaluate(Frame&, SymbolTable&) = 0; }; -class Ident : public Tree { +class Ident : public Expr { public: - std::string identifier_; + std::string identifier_; + TypedValue Evaluate(Frame& frame, SymbolTable& symbol_table) override; }; class Part { diff --git a/src/query/frontend/interpret/interpret.hpp b/src/query/frontend/interpret/interpret.hpp index 7a2240094..b965a0394 100644 --- a/src/query/frontend/interpret/interpret.hpp +++ b/src/query/frontend/interpret/interpret.hpp @@ -4,6 +4,8 @@ #include "query/backend/cpp/typed_value.hpp" +namespace query { + class Frame { public: Frame(int size) : size_(size), elems_(size_) {} @@ -16,3 +18,4 @@ class Frame { std::vector elems_; }; +} diff --git a/src/query/frontend/logical/operator.hpp b/src/query/frontend/logical/operator.hpp index 96deb7132..df3721250 100644 --- a/src/query/frontend/logical/operator.hpp +++ b/src/query/frontend/logical/operator.hpp @@ -55,14 +55,15 @@ class ScanAll : public LogicalOperator { for (auto label : node_part->labels_) { if (!vertex.has_label(label)) return false; } - frame[symbol_table[parent_.node_part_->identifier_].position_] = vertex; + frame[symbol_table[node_part->identifier_].position_] = vertex; return true; } }; public: uptr MakeCursor(GraphDbAccessor db) override { - return new ScanAllCursor(*this, db); + Cursor* cursor = new ScanAllCursor(*this, db); + return uptr(cursor); } friend class ScanAll::ScanAllCursor; @@ -77,6 +78,18 @@ class Produce : public LogicalOperator { } private: + class ProduceCursor : public Cursor { + public: + ProduceCursor(Produce& parent) : parent_(parent) {} + bool pull(Frame &frame, SymbolTable& symbol_table) override { + for (auto expr : parent_.exprs_) { + frame[symbol_table[*expr].position_] = expr->Evaluate(frame, symbol_table); + } + return true; + } + private: + Produce& parent_; + }; std::vector> exprs_; }; }