From 1d1242af50c56f80d7c83fe1afa0d3a812920ed4 Mon Sep 17 00:00:00 2001
From: Marko Budiselic <mbudiselicbuda@gmail.com>
Date: Sun, 26 Jun 2016 23:43:28 +0100
Subject: [PATCH] query_engine executable file

---
 CMakeLists.txt                                | 36 +++++++++++++++++--
 src/query_engine/code_compiler.hpp            |  2 +-
 src/query_engine/main.cpp                     |  7 ++--
 src/query_engine/traverser/read_traverser.hpp | 16 ++++-----
 .../traverser/write_traverser.hpp             | 16 ++++-----
 src/utils/string/file.hpp                     |  8 ++++-
 6 files changed, 60 insertions(+), 25 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 6e3e39b4f..0e3e8e214 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,6 +33,17 @@ function(get_file_names file_paths file_names)
     set(file_names "${file_names}" PARENT_SCOPE)
 endfunction()
 
+MACRO(SUBDIRLIST result curdir)
+    FILE(GLOB children RELATIVE ${curdir} ${curdir}/*)
+    SET(dirlist "")
+    FOREACH(child ${children})
+        IF(IS_DIRECTORY ${curdir}/${child})
+            LIST(APPEND dirlist ${child})
+        ENDIF()
+    ENDFOREACH()
+    SET(${result} ${dirlist})
+ENDMACRO()
+
 # custom targets
 
 # move test data data to the build directory
@@ -93,6 +104,17 @@ SET(cypher_build_include_dir ${build_include_dir}/cypher)
 FILE(MAKE_DIRECTORY ${cypher_build_include_dir})
 FILE(RENAME ${CMAKE_BINARY_DIR}/cypher.h ${cypher_build_include_dir}/cypher.h)
 
+# copy query_engine's templates file
+FILE(COPY ${src_dir}/query_engine/template DESTINATION ${CMAKE_BINARY_DIR})
+# create destination folder for compiled queries
+FILE(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/compiled/cpu)
+
+# TODO: filter header files, all files don't need to be copied
+SUBDIRLIST(source_folders ${src_dir})
+foreach(source_folder ${source_folders})
+    file(COPY ${src_dir}/${source_folder} DESTINATION ${build_include_dir})
+endforeach()
+
 # compiler options
 SET(COMPILE_OPTIONS "-O0 -g3 -Wall -Werror -fmessage-length=0")
 
@@ -134,18 +156,26 @@ add_library(cypher_lib STATIC ${CMAKE_BINARY_DIR}/cypher.cpp)
 enable_testing()
 add_subdirectory(tests)
 
+# REST API preprocessor
 EXECUTE_PROCESS(
     COMMAND python link_resources.py
     WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/api
 )
 
-# add main executable
+# memgraph executable
 add_executable(memgraph src/memgraph.cpp)
 add_dependencies(memgraph cypher_lib)
-
-# link libraries
+# memgraph link libraries
 target_link_libraries(memgraph Threads::Threads)
 target_link_libraries(memgraph pcre)
 target_link_libraries(memgraph ${libuv_static_lib})
 target_link_libraries(memgraph ${r3_static_lib})
 target_link_libraries(memgraph ${http_parser_static_lib})
+
+# query_engine executable
+add_executable(query_engine src/query_engine/main.cpp)
+# query_engine link libraries
+target_link_libraries(query_engine Threads::Threads)
+target_link_libraries(query_engine dl)
+target_link_libraries(query_engine cypher_lib)
+target_link_libraries(query_engine ${fmt_static_lib})
diff --git a/src/query_engine/code_compiler.hpp b/src/query_engine/code_compiler.hpp
index 92bb0a110..d07531f8d 100644
--- a/src/query_engine/code_compiler.hpp
+++ b/src/query_engine/code_compiler.hpp
@@ -15,7 +15,7 @@ public:
                           "-std=c++1y",   // compile flags
                           in_file,        // input file
                           "-o", out_file, // ouput file
-                          "-I../",        // include paths
+                          "-I./include",  // include paths (TODO: parameter)
                           "-shared -fPIC" // shared library flags
                           );
 
diff --git a/src/query_engine/main.cpp b/src/query_engine/main.cpp
index 1a4031dc8..44924964a 100644
--- a/src/query_engine/main.cpp
+++ b/src/query_engine/main.cpp
@@ -17,11 +17,10 @@ int main(int argc, char** argv)
     auto arguments = all_arguments(argc, argv);
 
     // query extraction
-    // auto cypher_query = extract_query(arguments);
-    // cout << "QUERY: " << cypher_query << endl;
-
+    auto cypher_query = extract_query(arguments);
+    cout << "QUERY: " << cypher_query << endl;
     QueryEngine engine;
-    // engine.execute(cypher_query);
+    engine.execute(cypher_query);
 
     // using std::placeholders::_1;
     // auto f = std::bind(&QueryEngine::execute, &engine, _1);
diff --git a/src/query_engine/traverser/read_traverser.hpp b/src/query_engine/traverser/read_traverser.hpp
index 047e44e85..3a427abb3 100644
--- a/src/query_engine/traverser/read_traverser.hpp
+++ b/src/query_engine/traverser/read_traverser.hpp
@@ -30,13 +30,13 @@ public:
     void visit(ast::Return& ret) override
     {
         code += line("t.commit();");
-        code += line("auto &properties = vertex_accessor.properties();");
-        code += line("ResultList::data_t data = {&properties};");
-        code += line("auto result_data = "
-                     "std::make_shared<ResultList>(std::move(data));");
-        code += line("QueryResult::data_t query_data = {{\"" +
-                     ret.return_list->value->name + "\", result_data}};");
-        code += line("return std::make_shared<QueryResult>"
-                     "(std::move(query_data));");
+        // code += line("auto &properties = vertex_accessor.properties();");
+        // code += line("ResultList::data_t data = {&properties};");
+        // code += line("auto result_data = "
+        //              "std::make_shared<ResultList>(std::move(data));");
+        // code += line("QueryResult::data_t query_data = {{\"" +
+        //              ret.return_list->value->name + "\", result_data}};");
+        // code += line("return std::make_shared<QueryResult>"
+        //              "(std::move(query_data));");
     }
 };
diff --git a/src/query_engine/traverser/write_traverser.hpp b/src/query_engine/traverser/write_traverser.hpp
index ad97aba4c..dbe7047ef 100644
--- a/src/query_engine/traverser/write_traverser.hpp
+++ b/src/query_engine/traverser/write_traverser.hpp
@@ -38,13 +38,13 @@ public:
     void visit(ast::Return& ret) override
     {
         code += line("t.commit();");
-        code += line("auto &properties = vertex_accessor.properties();");
-        code += line("ResultList::data_t data = {&properties};");
-        code += line("auto result_data = "
-                     "std::make_shared<ResultList>(std::move(data));");
-        code += line("QueryResult::data_t query_data = {{\"" +
-                     ret.return_list->value->name + "\", result_data}};");
-        code += line("return std::make_shared<QueryResult>"
-                     "(std::move(query_data));");
+        // code += line("auto &properties = vertex_accessor.properties();");
+        // code += line("ResultList::data_t data = {&properties};");
+        // code += line("auto result_data = "
+        //              "std::make_shared<ResultList>(std::move(data));");
+        // code += line("QueryResult::data_t query_data = {{\"" +
+        //              ret.return_list->value->name + "\", result_data}};");
+        // code += line("return std::make_shared<QueryResult>"
+        //              "(std::move(query_data));");
     }
 };
diff --git a/src/utils/string/file.hpp b/src/utils/string/file.hpp
index 093a74bd8..465d36505 100644
--- a/src/utils/string/file.hpp
+++ b/src/utils/string/file.hpp
@@ -5,6 +5,9 @@
 #include <streambuf>
 #include <string>
 #include <cerrno>
+#include <stdexcept>
+
+#include <fmt/format.h>
 
 namespace utils
 {
@@ -12,10 +15,13 @@ namespace utils
 std::string read_file(const char *filename)
 {
     std::ifstream in(filename, std::ios::in | std::ios::binary);
+
     if (in)
         return std::string(std::istreambuf_iterator<char>(in),
                            std::istreambuf_iterator<char>());
-    throw(errno);
+
+    auto error_message = fmt::format("{0}{1}", "Fail to read: ", filename);
+    throw std::runtime_error(error_message);
 }
 
 void write_file(const std::string& content, const std::string& path)