mirror of https://gitee.com/bigwinds/arangodb
make `CONCAT` and `CONCAT_SEPARATOR` more useful
This commit is contained in:
parent
487f35affb
commit
8c08a3b24a
|
@ -6,6 +6,8 @@ v2.3.0 (XXX-XX-XX)
|
|||
|
||||
* added AQL functions `ASSEMBLE` and `VALUES`
|
||||
|
||||
* made AQL functions `CONCAT` and `CONCAT_SEPARATOR` work with list arguments
|
||||
|
||||
|
||||
v2.3.0-beta2 (2014-11-08)
|
||||
-------------------------
|
||||
|
|
|
@ -3,11 +3,19 @@
|
|||
For string processing, AQL offers the following functions:
|
||||
|
||||
- *CONCAT(value1, value2, ... valuen)*: Concatenate the strings
|
||||
passed as in *value1* to *valuen*. *null* values are ignored
|
||||
passed as in *value1* to *valuen*. *null* values are ignored. List value arguments
|
||||
are expanded automatically, and their individual members will be concatenated.
|
||||
|
||||
/* "foobarbaz" */
|
||||
RETURN CONCAT('foo', 'bar', 'baz')
|
||||
|
||||
/* "foobarbaz" */
|
||||
RETURN CONCAT([ 'foo', 'bar', 'baz' ])
|
||||
|
||||
- *CONCAT_SEPARATOR(separator, value1, value2, ... valuen)*:
|
||||
Concatenate the strings passed as arguments *value1* to *valuen* using the
|
||||
*separator* string. *null* values are ignored
|
||||
*separator* string. *null* values are ignored. List value arguments
|
||||
are expanded automatically, and their individual members will be concatenated.
|
||||
|
||||
- *CHAR_LENGTH(value)*: Return the number of characters in *value*. This is
|
||||
a synonym for *LENGTH(value)*
|
||||
|
|
|
@ -104,8 +104,8 @@ std::unordered_map<std::string, Function const> const Executor::FunctionNames{
|
|||
{ "TO_LIST", Function("TO_LIST", "AQL_TO_LIST", ".", true, false, true) },
|
||||
|
||||
// string functions
|
||||
{ "CONCAT", Function("CONCAT", "AQL_CONCAT", "sz,sz|+", true, false, true) },
|
||||
{ "CONCAT_SEPARATOR", Function("CONCAT_SEPARATOR", "AQL_CONCAT_SEPARATOR", "s,sz,sz|+", true, false, true) },
|
||||
{ "CONCAT", Function("CONCAT", "AQL_CONCAT", "szl|+", true, false, true) },
|
||||
{ "CONCAT_SEPARATOR", Function("CONCAT_SEPARATOR", "AQL_CONCAT_SEPARATOR", "s,szl|+", true, false, true) },
|
||||
{ "CHAR_LENGTH", Function("CHAR_LENGTH", "AQL_CHAR_LENGTH", "s", true, false, true) },
|
||||
{ "LOWER", Function("LOWER", "AQL_LOWER", "s", true, false, true) },
|
||||
{ "UPPER", Function("UPPER", "AQL_UPPER", "s", true, false, true) },
|
||||
|
|
|
@ -1547,14 +1547,24 @@ function ARITHMETIC_MODULUS (lhs, rhs) {
|
|||
function AQL_CONCAT () {
|
||||
"use strict";
|
||||
|
||||
var result = '', i;
|
||||
var result = '', i, j;
|
||||
|
||||
for (i = 0; i < arguments.length; ++i) {
|
||||
var element = arguments[i];
|
||||
if (TYPEWEIGHT(element) === TYPEWEIGHT_NULL) {
|
||||
var weight = TYPEWEIGHT(element);
|
||||
if (weight === TYPEWEIGHT_NULL) {
|
||||
continue;
|
||||
}
|
||||
result += AQL_TO_STRING(element);
|
||||
else if (weight === TYPEWEIGHT_LIST) {
|
||||
for (j = 0; j < element.length; ++j) {
|
||||
if (TYPEWEIGHT(element[j]) !== TYPEWEIGHT_NULL) {
|
||||
result += AQL_TO_STRING(element[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
result += AQL_TO_STRING(element);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
@ -1567,12 +1577,13 @@ function AQL_CONCAT () {
|
|||
function AQL_CONCAT_SEPARATOR () {
|
||||
"use strict";
|
||||
|
||||
var separator, found = false, result = '', i;
|
||||
var separator, found = false, result = '', i, j;
|
||||
|
||||
for (i = 0; i < arguments.length; ++i) {
|
||||
var element = arguments[i];
|
||||
|
||||
if (i > 0 && TYPEWEIGHT(element) === TYPEWEIGHT_NULL) {
|
||||
var weight = TYPEWEIGHT(element);
|
||||
|
||||
if (i > 0 && weight === TYPEWEIGHT_NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1584,8 +1595,22 @@ function AQL_CONCAT_SEPARATOR () {
|
|||
result += separator;
|
||||
}
|
||||
|
||||
found = true;
|
||||
result += AQL_TO_STRING(element);
|
||||
if (weight === TYPEWEIGHT_LIST) {
|
||||
found = false;
|
||||
for (j = 0; j < element.length; ++j) {
|
||||
if (TYPEWEIGHT(element[j]) !== TYPEWEIGHT_NULL) {
|
||||
if (found) {
|
||||
result += separator;
|
||||
}
|
||||
result += AQL_TO_STRING(element[j]);
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
result += AQL_TO_STRING(element);
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
|
|
@ -773,13 +773,22 @@ function ahuacatlStringFunctionsTestSuite () {
|
|||
assertEqual(expected, actual);
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test concat function
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testConcatList : function () {
|
||||
var expected = [ "theQuickBrownアボカドJumps名称について" ];
|
||||
var actual = getQueryResults("FOR r IN [ 1 ] return CONCAT([ 'the', 'Quick', '', null, 'Brown', null, 'アボカド', 'Jumps', '名称について' ])");
|
||||
assertEqual(expected, actual);
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test concat function
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testConcatInvalid : function () {
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN CONCAT()");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN CONCAT(\"yes\")");
|
||||
assertEqual([ "yestrue" ], getQueryResults("RETURN CONCAT(\"yes\", true)"));
|
||||
assertEqual([ "yes4" ], getQueryResults("RETURN CONCAT(\"yes\", 4)"));
|
||||
assertEqual([ "yes" ], getQueryResults("RETURN CONCAT(\"yes\", [ ])"));
|
||||
|
@ -791,7 +800,7 @@ function ahuacatlStringFunctionsTestSuite () {
|
|||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test concatseparator function
|
||||
/// @brief test concat_separator function
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testConcatSeparator1 : function () {
|
||||
|
@ -801,7 +810,7 @@ function ahuacatlStringFunctionsTestSuite () {
|
|||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test concatseparator function
|
||||
/// @brief test concat_separator function
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testConcatSeparator2 : function () {
|
||||
|
@ -811,13 +820,32 @@ function ahuacatlStringFunctionsTestSuite () {
|
|||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test concatseparator function
|
||||
/// @brief test concat_separator function
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testConcatSeparatorList1 : function () {
|
||||
var expected = [ "the,Quick,Brown,Fox,Jumps,higher,than,you" ];
|
||||
var actual = getQueryResults("FOR r IN [ 1 ] return CONCAT_SEPARATOR(',', [ 'the', 'Quick', null, 'Brown', null, 'Fox', 'Jumps' ], 'higher', [ 'than', 'you' ])");
|
||||
assertEqual(expected, actual);
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test concat_separator function
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testConcatSeparatorList2 : function () {
|
||||
var expected = [ "the*/*/Quick*/*/Brown*/*/*/*/Fox*/*/Jumps*/*/higher*/*/than*/*/you" ];
|
||||
var actual = getQueryResults("FOR r IN [ 1 ] return CONCAT_SEPARATOR('*/*/', [ 'the', 'Quick', null, 'Brown', '', 'Fox', 'Jumps' ], [ ], 'higher', [ 'than', 'you' ])");
|
||||
assertEqual(expected, actual);
|
||||
},
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// @brief test concat_separator function
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
testConcatSeparatorInvalid : function () {
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN CONCAT_SEPARATOR()");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN CONCAT_SEPARATOR(\"yes\")");
|
||||
assertQueryError(errors.ERROR_QUERY_FUNCTION_ARGUMENT_NUMBER_MISMATCH.code, "RETURN CONCAT_SEPARATOR(\"yes\", \"yes\")");
|
||||
assertEqual([ "yesnullyes" ], getQueryResults("RETURN CONCAT_SEPARATOR(null, \"yes\", \"yes\")"));
|
||||
assertEqual([ "yestrueyes" ], getQueryResults("RETURN CONCAT_SEPARATOR(true, \"yes\", \"yes\")"));
|
||||
assertEqual([ "yes4yes" ], getQueryResults("RETURN CONCAT_SEPARATOR(4, \"yes\", \"yes\")"));
|
||||
|
@ -825,7 +853,7 @@ function ahuacatlStringFunctionsTestSuite () {
|
|||
assertEqual([ "yes[object Object]yes" ], getQueryResults("RETURN CONCAT_SEPARATOR({ }, \"yes\", \"yes\")"));
|
||||
assertEqual([ "trueyesyes" ], getQueryResults("RETURN CONCAT_SEPARATOR(\"yes\", true, \"yes\")"));
|
||||
assertEqual([ "4yesyes" ], getQueryResults("RETURN CONCAT_SEPARATOR(\"yes\", 4, \"yes\")"));
|
||||
assertEqual([ "yesyes" ], getQueryResults("RETURN CONCAT_SEPARATOR(\"yes\", [ ], \"yes\")"));
|
||||
assertEqual([ "yes" ], getQueryResults("RETURN CONCAT_SEPARATOR(\"yes\", [ ], \"yes\")"));
|
||||
assertEqual([ "[object Object]yesyes" ], getQueryResults("RETURN CONCAT_SEPARATOR(\"yes\", { }, \"yes\")"));
|
||||
assertEqual([ "yesyestrue" ], getQueryResults("RETURN CONCAT_SEPARATOR(\"yes\", \"yes\", true)"));
|
||||
assertEqual([ "yesyes4" ], getQueryResults("RETURN CONCAT_SEPARATOR(\"yes\", \"yes\", 4)"));
|
||||
|
|
Loading…
Reference in New Issue