From 10062b143c332b1b92dd1c5321ef0650d0d63e45 Mon Sep 17 00:00:00 2001 From: Marko Budiselic Date: Sat, 11 Mar 2017 21:21:09 +0100 Subject: [PATCH] Interpreter merge. --- src/query/entry.hpp | 48 +++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/src/query/entry.hpp b/src/query/entry.hpp index 373a5d5fc..c55b0e1bf 100644 --- a/src/query/entry.hpp +++ b/src/query/entry.hpp @@ -1,45 +1,55 @@ #pragma once #include "database/graph_db_accessor.hpp" -#include "query/frontend/opencypher/parser.hpp" #include "query/context.hpp" +#include "query/frontend/opencypher/parser.hpp" +#include "query/frontend/typecheck/typecheck.hpp" namespace query { template class Engine { public: - Engine() { - } + Engine() {} auto Execute(const std::string &query, GraphDbAccessor &db_accessor, Stream &stream) { Config config; Context ctx(config, db_accessor); + + // query -> AST ::frontend::opencypher::Parser parser(query); auto low_level_tree = parser.tree(); - auto high_level_tree = low2high_tree.Apply(ctx, low_level_tree); - TypedcheckedTree typechecked_tree; - auto logical_plan = LogicalPlanner(ctx).Apply(typechecked_tree); - // interpret & stream results + // AST -> high level tree + auto high_level_tree = low2high_tree.Apply(ctx, low_level_tree); + + // symbol table fill + SymbolTable symbol_table; + TypeCheckVisitor typecheck_visitor; + high_level_tree.Accept(typecheck_visitor); + + // high level tree -> logical plan + auto logical_plan = query::Apply(high_level_tree); + // generate frame based on symbol table max_position - Frame frame(size); + Frame frame(symbol_table.max_position()); + + // interpret auto cursor = logical_plan.MakeCursor(frame); logical_plan.WriteHeader(stream); auto symbols = logical_plan.OutputSymbols(symbol_table); while (cursor.pull(frame, context)) { - std::vector values(symbols.size()); - for (auto symbol : symbols) { - values.emplace_back(frame[symbol]); - } - stream.Result(values); + std::vector values(symbols.size()); + for (auto symbol : symbols) { + values.emplace_back(frame[symbol]); + } + stream.Result(values); } - stream.Summary({"type": "r"}); - + stream.Summary({"type" : "r"}); } -private: - Context ctx; - HighLevelAstConversion low2high_tree; - + + private: + Context ctx; + HighLevelAstConversion low2high_tree; }; }