diff --git a/arangod/Aql/Types.h b/arangod/Aql/Types.h index 454615115f..08aae2effa 100644 --- a/arangod/Aql/Types.h +++ b/arangod/Aql/Types.h @@ -33,6 +33,7 @@ #include "VocBase/document-collection.h" #include "Aql/AstNode.h" #include "Aql/Variable.h" +#include "V8/v8-conv.h" namespace triagens { namespace aql { @@ -83,6 +84,26 @@ namespace triagens { AqlValue* clone () const; + v8::Handle toV8 () const { + switch (_type) { + case JSON: { + return TRI_ObjectJson(_json->json()); + } + case DOCVEC: { + THROW_ARANGO_EXCEPTION(TRI_ERROR_NOT_IMPLEMENTED); + } + case RANGE: { + v8::Handle values = v8::Array::New(); + // TODO: fill range + THROW_ARANGO_EXCEPTION(TRI_ERROR_NOT_IMPLEMENTED); + return values; + } + default: { + THROW_ARANGO_EXCEPTION(TRI_ERROR_NOT_IMPLEMENTED); + } + } + } + std::string toString () { switch (_type) { case JSON: { diff --git a/arangod/Aql/V8Expression.h b/arangod/Aql/V8Expression.h index 12236d116c..cac51cff3d 100644 --- a/arangod/Aql/V8Expression.h +++ b/arangod/Aql/V8Expression.h @@ -31,6 +31,10 @@ #define ARANGODB_AQL_V8_EXPRESSION_H 1 #include "Basics/Common.h" +#include "Basics/JsonHelper.h" +#include "BasicsC/json.h" +#include "Aql/Types.h" +#include "V8/v8-conv.h" #include namespace triagens { @@ -65,11 +69,29 @@ namespace triagens { /// @brief execute the expression //////////////////////////////////////////////////////////////////////////////// - v8::Handle execute (v8::Handle argv) { - v8::HandleScope scope; + AqlValue* execute (AqlValue const** argv, + std::vector vars, + std::vector regs) { + // TODO: decide whether a separate handle scope is needed - v8::Handle args[] = { argv }; - return scope.Close(func->Call(func, 1, args)); + v8::Handle values = v8::Object::New(); + for (size_t i = 0; i < vars.size(); ++i) { + auto varname = vars[i]->name; + auto reg = regs[i]; + + values->Set(v8::String::New(varname.c_str(), (int) varname.size()), argv[reg]->toV8()); + } + + v8::Handle args[] = { values }; + v8::Handle result = func->Call(func, 1, args); + + TRI_json_t* json = TRI_ObjectToJson(result); + + if (json == nullptr) { + THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY); + } + + return new AqlValue(new triagens::basics::Json(TRI_UNKNOWN_MEM_ZONE, json)); }