From 0e897b412aba6ae7b37207a767800b2e43ef66af Mon Sep 17 00:00:00 2001 From: Marko Budiselic Date: Thu, 25 Feb 2016 23:49:35 +0100 Subject: [PATCH] small code refactor --- query_engine/code_generator.hpp | 21 +++++++++--- query_engine/traverser/code_traverser.hpp | 34 +++++++++++++++++++ query_engine/traverser/query_traverser.hpp | 27 --------------- query_engine/traverser/read_traverser.hpp | 9 +++++ query_engine/traverser/update_traverser.hpp | 7 ++++ ...eate_traverser.hpp => write_traverser.hpp} | 9 ++--- 6 files changed, 68 insertions(+), 39 deletions(-) create mode 100644 query_engine/traverser/code_traverser.hpp delete mode 100644 query_engine/traverser/query_traverser.hpp create mode 100644 query_engine/traverser/read_traverser.hpp create mode 100644 query_engine/traverser/update_traverser.hpp rename query_engine/traverser/{create_traverser.hpp => write_traverser.hpp} (88%) diff --git a/query_engine/code_generator.hpp b/query_engine/code_generator.hpp index d196e7b8c..cc4448590 100644 --- a/query_engine/code_generator.hpp +++ b/query_engine/code_generator.hpp @@ -1,9 +1,11 @@ #pragma once +#include "cypher/ast/ast.hpp" +#include "cypher/compiler.hpp" #include "utils/string/file.hpp" #include "template_engine/engine.hpp" #include "config/config.hpp" -#include "traverser/query_traverser.hpp" +#include "traverser/code_traverser.hpp" using std::string; @@ -15,23 +17,32 @@ public: const uint64_t stripped_hash, const std::string& path) { + // get paths string template_path = CONFIG(config::TEMPLATE_CPU_CPP_PATH); string template_file = utils::read_file(template_path.c_str()); - traverser.build_tree(query); - string code = traverser.traverse(); + + // traversing + auto tree = compiler.syntax_tree(query); + code_traverser.reset(); + tree.root->accept(code_traverser); + + // save the code string generated = template_engine.render( template_file, { {"class_name", "CodeCPU"}, {"stripped_hash", std::to_string(stripped_hash)}, {"query", query}, - {"code", code}, + {"code", code_traverser.code}, {"return_type", "int"} } ); utils::write_file(generated, path); } + private: template_engine::TemplateEngine template_engine; - QueryTraverser traverser; + ast::Ast tree; + cypher::Compiler compiler; + CodeTraverser code_traverser; }; diff --git a/query_engine/traverser/code_traverser.hpp b/query_engine/traverser/code_traverser.hpp new file mode 100644 index 000000000..b6fa175ac --- /dev/null +++ b/query_engine/traverser/code_traverser.hpp @@ -0,0 +1,34 @@ +#pragma once + +#include + +#include "cypher/visitor/traverser.hpp" +#include "cypher/ast/queries.hpp" +#include "write_traverser.hpp" +#include "read_traverser.hpp" + +class CodeTraverser : public Traverser +{ +public: + + std::string code; + + void reset() + { + code = ""; + } + + void visit(ast::WriteQuery& write_query) override + { + auto write_traverser = WriteTraverser(); + write_query.accept(write_traverser); + code = write_traverser.code; + } + + void visit(ast::ReadQuery& read_query) override + { + auto read_traverser = ReadTraverser(); + read_query.accept(read_traverser); + code = read_traverser.code; + } +}; diff --git a/query_engine/traverser/query_traverser.hpp b/query_engine/traverser/query_traverser.hpp deleted file mode 100644 index 5eca9513f..000000000 --- a/query_engine/traverser/query_traverser.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include "cypher/ast/ast.hpp" -#include "cypher/compiler.hpp" -#include "create_traverser.hpp" - -class QueryTraverser -{ -public: - QueryTraverser() = default; - - void build_tree(const std::string& query) - { - tree = compiler.syntax_tree(query); - } - - std::string traverse() - { - tree.root->accept(traverser); - return traverser.code; - } - -private: - ast::Ast tree; - cypher::Compiler compiler; - CreateTraverser traverser; -}; diff --git a/query_engine/traverser/read_traverser.hpp b/query_engine/traverser/read_traverser.hpp new file mode 100644 index 000000000..ad42bf146 --- /dev/null +++ b/query_engine/traverser/read_traverser.hpp @@ -0,0 +1,9 @@ +#pragma once + +#include "cypher/visitor/traverser.hpp" + +class ReadTraverser : public Traverser +{ +public: + std::string code; +}; diff --git a/query_engine/traverser/update_traverser.hpp b/query_engine/traverser/update_traverser.hpp new file mode 100644 index 000000000..914076bdf --- /dev/null +++ b/query_engine/traverser/update_traverser.hpp @@ -0,0 +1,7 @@ +#pragma once + +#include "cypher/visitor/traverser.hpp" + +class UpdateTraverser : public Traverser +{ +}; diff --git a/query_engine/traverser/create_traverser.hpp b/query_engine/traverser/write_traverser.hpp similarity index 88% rename from query_engine/traverser/create_traverser.hpp rename to query_engine/traverser/write_traverser.hpp index f14128b39..ad97aba4c 100644 --- a/query_engine/traverser/create_traverser.hpp +++ b/query_engine/traverser/write_traverser.hpp @@ -7,13 +7,10 @@ #include "cypher/visitor/traverser.hpp" #include "query_engine/util.hpp" -using std::cout; -using std::endl; -class CreateTraverser : public Traverser +class WriteTraverser : public Traverser { private: - std::string key; uint32_t index{0}; public: @@ -29,9 +26,7 @@ public: void visit(ast::Property& property) override { - key = property.idn->name; - - Traverser::visit(property); + auto key = property.idn->name; code += line("vertex_accessor.property("); code += line("\t\"" + key + "\", args[" + std::to_string(index) + "]");