From 1957ef668d4c1de68ce6b4a55775129a7a623d7f Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Tue, 3 Nov 2015 17:36:28 +0100 Subject: [PATCH] Added CXX implementation of SHIFT --- arangod/Aql/Executor.cpp | 2 +- arangod/Aql/Functions.cpp | 31 +++++++++++++++++++++++++++++++ arangod/Aql/Functions.h | 1 + 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/arangod/Aql/Executor.cpp b/arangod/Aql/Executor.cpp index 2467bd9fe3..b84360a8e1 100644 --- a/arangod/Aql/Executor.cpp +++ b/arangod/Aql/Executor.cpp @@ -180,7 +180,7 @@ std::unordered_map const Executor::FunctionNames{ { "PUSH", Function("PUSH", "AQL_PUSH", "l,.|b", true, true, false, true, false, &Functions::Push) }, { "APPEND", Function("APPEND", "AQL_APPEND", "l,lz|b", true, true, false, true, true, &Functions::Append) }, { "POP", Function("POP", "AQL_POP", "l", true, true, false, true, true, &Functions::Pop) }, - { "SHIFT", Function("SHIFT", "AQL_SHIFT", "l", true, true, false, true, true) }, + { "SHIFT", Function("SHIFT", "AQL_SHIFT", "l", true, true, false, true, true, &Functions::Shift) }, { "UNSHIFT", Function("UNSHIFT", "AQL_UNSHIFT", "l,.|b", true, true, false, true, true, &Functions::Unshift) }, { "REMOVE_VALUE", Function("REMOVE_VALUE", "AQL_REMOVE_VALUE", "l,.|n", true, true, false, true, true) }, { "REMOVE_VALUES", Function("REMOVE_VALUES", "AQL_REMOVE_VALUES", "l,lz", true, true, false, true, true) }, diff --git a/arangod/Aql/Functions.cpp b/arangod/Aql/Functions.cpp index 4f696fa266..15f771011f 100644 --- a/arangod/Aql/Functions.cpp +++ b/arangod/Aql/Functions.cpp @@ -3530,6 +3530,37 @@ AqlValue Functions::Unshift (triagens::aql::Query* query, return AqlValue(new Json(Json::Null)); } +//////////////////////////////////////////////////////////////////////////////// +/// @brief function SHIFT +//////////////////////////////////////////////////////////////////////////////// + +AqlValue Functions::Shift (triagens::aql::Query* query, + triagens::arango::AqlTransaction* trx, + FunctionParameters const& parameters) { + size_t const n = parameters.size(); + + if (n != 1) { + THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "SHIFT", (int) 1, (int) 1); + } + + Json list = ExtractFunctionParameter(trx, parameters, 0, false); + if (list.isNull()) { + return AqlValue(new Json(Json::Null)); + } + if (list.isArray()) { + if (list.size() == 0) { + return AqlValue(new Json(Json::Array, 0)); + } + if (!TRI_DeleteArrayJson(TRI_UNKNOWN_MEM_ZONE, list.json(), 0)) { + THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY); + } + return AqlValue(new Json(TRI_UNKNOWN_MEM_ZONE, list.copy().steal())); + } + + RegisterInvalidArgumentWarning(query, "SHIFT"); + return AqlValue(new Json(Json::Null)); +} + // ----------------------------------------------------------------------------- // --SECTION-- END-OF-FILE // ----------------------------------------------------------------------------- diff --git a/arangod/Aql/Functions.h b/arangod/Aql/Functions.h index b750b36e83..314aa4b9df 100644 --- a/arangod/Aql/Functions.h +++ b/arangod/Aql/Functions.h @@ -135,6 +135,7 @@ namespace triagens { static AqlValue Pop (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&); static AqlValue Append (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&); static AqlValue Unshift (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&); + static AqlValue Shift (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&); }; }