1
0
Fork 0

handle AstNodes of type collection

This commit is contained in:
Jan Steemann 2015-07-22 11:59:45 +02:00
parent 1dfbc8ec1c
commit aad327714c
2 changed files with 14 additions and 6 deletions

View File

@ -672,8 +672,15 @@ AqlValue Expression::executeSimpleExpression (AstNode const* node,
try { try {
for (size_t i = 0; i < n; ++i) { for (size_t i = 0; i < n; ++i) {
TRI_document_collection_t const* myCollection = nullptr; TRI_document_collection_t const* myCollection = nullptr;
auto value = executeSimpleExpression(member->getMemberUnchecked(i), &myCollection, trx, argv, startPos, vars, regs, false); auto arg = member->getMemberUnchecked(i);
parameters.emplace_back(std::make_pair(value, myCollection)); if (arg->type == NODE_TYPE_COLLECTION) {
char const* collectionName = arg->getStringValue();
parameters.emplace_back(std::make_pair(AqlValue(new Json(TRI_UNKNOWN_MEM_ZONE, collectionName, strlen(collectionName))), nullptr));
}
else {
auto value = executeSimpleExpression(arg, &myCollection, trx, argv, startPos, vars, regs, false);
parameters.emplace_back(std::make_pair(value, myCollection));
}
} }
auto res2 = func->implementation(_ast->query(), trx, parameters); auto res2 = func->implementation(_ast->query(), trx, parameters);

View File

@ -28,6 +28,7 @@
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
#include "Aql/Functions.h" #include "Aql/Functions.h"
#include "Aql/Function.h"
#include "Aql/Query.h" #include "Aql/Query.h"
#include "Basics/Exceptions.h" #include "Basics/Exceptions.h"
#include "Basics/fpconv.h" #include "Basics/fpconv.h"
@ -1171,7 +1172,7 @@ AqlValue Functions::Unique (triagens::aql::Query* query,
triagens::arango::AqlTransaction* trx, triagens::arango::AqlTransaction* trx,
FunctionParameters const& parameters) { FunctionParameters const& parameters) {
if (parameters.size() != 1) { if (parameters.size() != 1) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNIQUE"); THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNIQUE", (int) 1, (int) 1);
} }
auto const value = ExtractFunctionParameter(trx, parameters, 0, false); auto const value = ExtractFunctionParameter(trx, parameters, 0, false);
@ -1228,7 +1229,7 @@ AqlValue Functions::Union (triagens::aql::Query* query,
size_t const n = parameters.size(); size_t const n = parameters.size();
if (n < 2) { if (n < 2) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNION"); THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNION", (int) 2, (int) Function::MaxArguments);
} }
std::unique_ptr<TRI_json_t> result(TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE, 16)); std::unique_ptr<TRI_json_t> result(TRI_CreateArrayJson(TRI_UNKNOWN_MEM_ZONE, 16));
@ -1288,7 +1289,7 @@ AqlValue Functions::UnionDistinct (triagens::aql::Query* query,
size_t const n = parameters.size(); size_t const n = parameters.size();
if (n < 2) { if (n < 2) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNION_DISTINCT"); THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNION_DISTINCT", (int) 2, (int) Function::MaxArguments);
} }
std::unordered_set<TRI_json_t*, triagens::basics::JsonHash, triagens::basics::JsonEqual> values( std::unordered_set<TRI_json_t*, triagens::basics::JsonHash, triagens::basics::JsonEqual> values(
@ -1378,7 +1379,7 @@ AqlValue Functions::Intersection (triagens::aql::Query* query,
size_t const n = parameters.size(); size_t const n = parameters.size();
if (n < 2) { if (n < 2) {
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "INTERSECTION"); THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "INTERSECTION", (int) 2, (int) Function::MaxArguments);
} }
std::unordered_map<TRI_json_t*, size_t, triagens::basics::JsonHash, triagens::basics::JsonEqual> values( std::unordered_map<TRI_json_t*, size_t, triagens::basics::JsonHash, triagens::basics::JsonEqual> values(