mirror of https://gitee.com/bigwinds/arangodb
Merge branch 'devel' of https://github.com/arangodb/arangodb into devel
This commit is contained in:
commit
d73050f1c7
|
@ -180,8 +180,8 @@ std::unordered_map<std::string, Function const> 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) },
|
||||
{ "UNSHIFT", Function("UNSHIFT", "AQL_UNSHIFT", "l,.|b", 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) },
|
||||
{ "REMOVE_NTH", Function("REMOVE_NTH", "AQL_REMOVE_NTH", "l,n", true, true, false, true, true) },
|
||||
|
|
|
@ -3482,6 +3482,85 @@ AqlValue Functions::Append (triagens::aql::Query* query,
|
|||
}
|
||||
return AqlValue(new Json(TRI_UNKNOWN_MEM_ZONE, list.copy().steal()));
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief function UNSHIFT
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
AqlValue Functions::Unshift (triagens::aql::Query* query,
|
||||
triagens::arango::AqlTransaction* trx,
|
||||
FunctionParameters const& parameters) {
|
||||
size_t const n = parameters.size();
|
||||
if (n != 2 && n != 3) {
|
||||
THROW_ARANGO_EXCEPTION_PARAMS(TRI_ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH, "UNSHIFT", (int) 2, (int) 3);
|
||||
}
|
||||
Json list = ExtractFunctionParameter(trx, parameters, 0, false);
|
||||
Json toAppend = ExtractFunctionParameter(trx, parameters, 1, false);
|
||||
|
||||
if (list.isNull()) {
|
||||
Json result(Json::Array, 1);
|
||||
result.add(toAppend.copy());
|
||||
return AqlValue(new Json(TRI_UNKNOWN_MEM_ZONE, result.steal()));
|
||||
}
|
||||
|
||||
if (list.isArray()) {
|
||||
bool unique = false;
|
||||
if (n == 3) {
|
||||
Json uniqueJson = ExtractFunctionParameter(trx, parameters, 2, false);
|
||||
unique = ValueToBoolean(uniqueJson.json());
|
||||
}
|
||||
if (unique && ListContainsElement(list, toAppend)) {
|
||||
return AqlValue(new Json(TRI_UNKNOWN_MEM_ZONE, list.copy().steal()));
|
||||
}
|
||||
Json copy = list.copy();
|
||||
TRI_json_t* toAppendCopy = toAppend.copy().steal();
|
||||
|
||||
int res = TRI_InsertVector(&(copy.json()->_value._objects), toAppendCopy, 0);
|
||||
// free the pointer, but not the contents
|
||||
TRI_Free(TRI_UNKNOWN_MEM_ZONE, toAppendCopy);
|
||||
|
||||
if (res != TRI_ERROR_NO_ERROR) {
|
||||
THROW_ARANGO_EXCEPTION(TRI_ERROR_OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
return AqlValue(new Json(TRI_UNKNOWN_MEM_ZONE, copy.steal()));
|
||||
}
|
||||
|
||||
RegisterInvalidArgumentWarning(query, "UNSHIFT");
|
||||
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
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
|
@ -134,6 +134,8 @@ namespace triagens {
|
|||
static AqlValue Push (triagens::aql::Query*, triagens::arango::AqlTransaction*, FunctionParameters const&);
|
||||
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&);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -212,6 +212,12 @@ function ahuacatlListTestSuite () {
|
|||
data.forEach(function (d) {
|
||||
var actual = getQueryResults("RETURN UNSHIFT(" + d[1].map(function (v) { return JSON.stringify(v); }).join(", ") + ")");
|
||||
assertEqual(d[0], actual[0], d);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(UNSHIFT(" + d[1].map(function (v) { return JSON.stringify(v); }).join(", ") + "))");
|
||||
assertEqual(d[0], actual[0], d);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(V8(UNSHIFT(" + d[1].map(function (v) { return JSON.stringify(v); }).join(", ") + ")))");
|
||||
assertEqual(d[0], actual[0], d);
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -224,6 +230,7 @@ function ahuacatlListTestSuite () {
|
|||
for (var i = 0; i < 2000; i += 2) {
|
||||
l.push(i);
|
||||
}
|
||||
|
||||
var actual = getQueryResults("RETURN UNSHIFT(" + JSON.stringify(l) + ", 1000, true)");
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(1000, actual[0].length);
|
||||
|
@ -241,6 +248,50 @@ function ahuacatlListTestSuite () {
|
|||
l.unshift(1001);
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(1002, actual[0].length);
|
||||
|
||||
// Reset to start
|
||||
l.shift();
|
||||
l.shift();
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(UNSHIFT(" + JSON.stringify(l) + ", 1000, true))");
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(1000, actual[0].length);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(UNSHIFT(" + JSON.stringify(l) + ", 1000, true))");
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(1000, actual[0].length);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(UNSHIFT(" + JSON.stringify(l) + ", 1000, false))");
|
||||
l.unshift(1000);
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(1001, actual[0].length);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(UNSHIFT(" + JSON.stringify(l) + ", 1001, true))");
|
||||
l.unshift(1001);
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(1002, actual[0].length);
|
||||
|
||||
// Reset to start
|
||||
l.shift();
|
||||
l.shift();
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(V8(UNSHIFT(" + JSON.stringify(l) + ", 1000, true)))");
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(1000, actual[0].length);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(V8(UNSHIFT(" + JSON.stringify(l) + ", 1000, true)))");
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(1000, actual[0].length);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(V8(UNSHIFT(" + JSON.stringify(l) + ", 1000, false)))");
|
||||
l.unshift(1000);
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(1001, actual[0].length);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(V8(UNSHIFT(" + JSON.stringify(l) + ", 1001, true)))");
|
||||
l.unshift(1001);
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(1002, actual[0].length);
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -251,6 +302,14 @@ function ahuacatlListTestSuite () {
|
|||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN UNSHIFT()");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN UNSHIFT([ ])");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN UNSHIFT([ ], 1, 2, 3)");
|
||||
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(UNSHIFT())");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(UNSHIFT([ ]))");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(UNSHIFT([ ], 1, 2, 3))");
|
||||
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(V8(UNSHIFT()))");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(V8(UNSHIFT([ ])))");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(V8(UNSHIFT([ ], 1, 2, 3)))");
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -412,6 +471,12 @@ function ahuacatlListTestSuite () {
|
|||
data.forEach(function (d) {
|
||||
var actual = getQueryResults("RETURN SHIFT(" + JSON.stringify(d[1]) + ")");
|
||||
assertEqual(d[0], actual[0], d);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(SHIFT(" + JSON.stringify(d[1]) + "))");
|
||||
assertEqual(d[0], actual[0], d);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(V8(SHIFT(" + JSON.stringify(d[1]) + ")))");
|
||||
assertEqual(d[0], actual[0], d);
|
||||
});
|
||||
},
|
||||
|
||||
|
@ -425,11 +490,37 @@ function ahuacatlListTestSuite () {
|
|||
l.push(i);
|
||||
}
|
||||
var actual = getQueryResults("RETURN SHIFT(" + JSON.stringify(l) + ")");
|
||||
l.shift();
|
||||
var first = l.shift();
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(999, actual[0].length);
|
||||
|
||||
actual = getQueryResults("RETURN SHIFT(" + JSON.stringify(l) + ")");
|
||||
var second = l.shift();
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(998, actual[0].length);
|
||||
|
||||
l.unshift(second);
|
||||
l.unshift(first);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(SHIFT(" + JSON.stringify(l) + "))");
|
||||
first = l.shift();
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(999, actual[0].length);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(SHIFT(" + JSON.stringify(l) + "))");
|
||||
second = l.shift();
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(998, actual[0].length);
|
||||
|
||||
l.unshift(second);
|
||||
l.unshift(first);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(V8(SHIFT(" + JSON.stringify(l) + ")))");
|
||||
l.shift();
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(999, actual[0].length);
|
||||
|
||||
actual = getQueryResults("RETURN NOOPT(V8(SHIFT(" + JSON.stringify(l) + ")))");
|
||||
l.shift();
|
||||
assertEqual(l, actual[0]);
|
||||
assertEqual(998, actual[0].length);
|
||||
|
@ -443,6 +534,14 @@ function ahuacatlListTestSuite () {
|
|||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SHIFT()");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SHIFT([ ], 1)");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN SHIFT([ ], 1, 2)");
|
||||
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(SHIFT())");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(SHIFT([ ], 1))");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(SHIFT([ ], 1, 2))");
|
||||
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(V8(SHIFT()))");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(V8(SHIFT([ ], 1)))");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN NOOPT(V8(SHIFT([ ], 1, 2)))");
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
|
Loading…
Reference in New Issue