From dc6dba1ef4adc3cb83f6ca1d889dc271e192b7c9 Mon Sep 17 00:00:00 2001 From: Willi Goesgens Date: Thu, 2 Oct 2014 13:15:02 +0200 Subject: [PATCH] Cluster Communication: serialize a global set of the currently available variables. --- arangod/Aql/ExecutionEngine.cpp | 1 + arangod/Aql/Query.cpp | 1 + arangod/Aql/VariableGenerator.cpp | 32 +++++++++++++++++++++++++++++++ arangod/Aql/VariableGenerator.h | 12 ++++++++++++ 4 files changed, 46 insertions(+) diff --git a/arangod/Aql/ExecutionEngine.cpp b/arangod/Aql/ExecutionEngine.cpp index f3d9d7b1d6..16688b4ea2 100644 --- a/arangod/Aql/ExecutionEngine.cpp +++ b/arangod/Aql/ExecutionEngine.cpp @@ -475,6 +475,7 @@ std::cout << "REGISTERING QUERY ON COORDINATOR WITH ID: " << id << "\n"; result.set("plan", jsonNodesList); result.set("part", triagens::basics::Json("main")); // TODO: set correct query type + result.set("variables", query->ast()->variables()->toJson(TRI_UNKNOWN_MEM_ZONE)); std::unique_ptr body(new std::string(triagens::basics::JsonHelper::toString(result.json()))); diff --git a/arangod/Aql/Query.cpp b/arangod/Aql/Query.cpp index 7f7e0091aa..45ce90b8b2 100644 --- a/arangod/Aql/Query.cpp +++ b/arangod/Aql/Query.cpp @@ -387,6 +387,7 @@ QueryResult Query::prepare (QueryRegistry* registry) { enterState(PLAN_INSTANCIATION); ExecutionPlan::getCollectionsFromJson(parser->ast(), _queryJson); + parser->ast()->variables()->fromJson(_queryJson); // creating the plan may have produced some collections // we need to add them to the transaction now (otherwise the query will fail) int res = _trx->addCollectionList(_collections.collections()); diff --git a/arangod/Aql/VariableGenerator.cpp b/arangod/Aql/VariableGenerator.cpp index 1ef1c26624..deaf480ae8 100644 --- a/arangod/Aql/VariableGenerator.cpp +++ b/arangod/Aql/VariableGenerator.cpp @@ -27,9 +27,11 @@ /// @author Copyright 2012-2013, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// +#include "Utils/Exception.h" #include "Aql/VariableGenerator.h" using namespace triagens::aql; +using Json = triagens::basics::Json; // ----------------------------------------------------------------------------- // --SECTION-- constructors / destructors @@ -202,6 +204,36 @@ std::string VariableGenerator::nextName () const { return std::to_string(_id); // to_string: c++11 } +//////////////////////////////////////////////////////////////////////////////// +/// @brief export to JSON, returns an AUTOFREE Json object +//////////////////////////////////////////////////////////////////////////////// + +triagens::basics::Json VariableGenerator::toJson (TRI_memory_zone_t* zone) const { + Json jsonAllVariablesList(Json::List, _variables.size()); + for (auto oneVariable: _variables) { + jsonAllVariablesList(oneVariable.second->toJson()); + } + return jsonAllVariablesList; +} + +//////////////////////////////////////////////////////////////////////////////// +/// @brief import from JSON +//////////////////////////////////////////////////////////////////////////////// + +void VariableGenerator::fromJson (Json const& query) { + + Json jsonAllVariablesList = query.get("variables"); + if (!jsonAllVariablesList.isList()) { + THROW_ARANGO_EXCEPTION_MESSAGE(TRI_ERROR_INTERNAL, "variables needs to be a list"); + } + + auto len = jsonAllVariablesList.size(); + _variables.reserve(len); + for (size_t i = 0; i < len; i++) { + createVariable(jsonAllVariablesList.at(i)); + } +} + // ----------------------------------------------------------------------------- // --SECTION-- END-OF-FILE // ----------------------------------------------------------------------------- diff --git a/arangod/Aql/VariableGenerator.h b/arangod/Aql/VariableGenerator.h index 479d1c39d4..edba34b46c 100644 --- a/arangod/Aql/VariableGenerator.h +++ b/arangod/Aql/VariableGenerator.h @@ -117,6 +117,18 @@ namespace triagens { std::string nextName () const; +//////////////////////////////////////////////////////////////////////////////// +/// @brief export to JSON, returns an AUTOFREE Json object +//////////////////////////////////////////////////////////////////////////////// + + triagens::basics::Json toJson (TRI_memory_zone_t*) const; + +//////////////////////////////////////////////////////////////////////////////// +/// @brief import from JSON +//////////////////////////////////////////////////////////////////////////////// + + void fromJson (triagens::basics::Json const& jsonAllVariablesList); + // ----------------------------------------------------------------------------- // --SECTION-- private functions // -----------------------------------------------------------------------------