mirror of https://gitee.com/bigwinds/arangodb
439 lines
11 KiB
JavaScript
439 lines
11 KiB
JavaScript
/*jshint globalstrict:false, strict:false, maxlen: 500 */
|
|
/*global AQL_EXECUTE */
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief tests for query language, functions
|
|
///
|
|
/// @file
|
|
///
|
|
/// DISCLAIMER
|
|
///
|
|
/// Copyright 2010-2012 triagens GmbH, Cologne, Germany
|
|
///
|
|
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|
/// you may not use this file except in compliance with the License.
|
|
/// You may obtain a copy of the License at
|
|
///
|
|
/// http://www.apache.org/licenses/LICENSE-2.0
|
|
///
|
|
/// Unless required by applicable law or agreed to in writing, software
|
|
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
/// See the License for the specific language governing permissions and
|
|
/// limitations under the License.
|
|
///
|
|
/// Copyright holder is triAGENS GmbH, Cologne, Germany
|
|
///
|
|
/// @author Jan Steemann
|
|
/// @author Copyright 2012, triAGENS GmbH, Cologne, Germany
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var internal = require("internal");
|
|
var errors = internal.errors;
|
|
var jsunity = require("jsunity");
|
|
var db = internal.db;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test suite
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function ahuacatlFunctionsBruteTestSuite () {
|
|
var c = null;
|
|
|
|
var all = [
|
|
"IS_NULL",
|
|
"IS_BOOL",
|
|
"IS_NUMBER",
|
|
"IS_STRING",
|
|
"IS_ARRAY",
|
|
"IS_LIST",
|
|
"IS_OBJECT",
|
|
"IS_DOCUMENT",
|
|
"IS_DATESTRING",
|
|
"TO_NUMBER",
|
|
"TO_STRING",
|
|
"TO_BOOL",
|
|
"TO_ARRAY",
|
|
"TO_LIST",
|
|
"CONCAT",
|
|
"CONCAT_SEPARATOR",
|
|
"CHAR_LENGTH",
|
|
"LOWER",
|
|
"UPPER",
|
|
"SUBSTRING",
|
|
"CONTAINS",
|
|
"LIKE",
|
|
"LEFT",
|
|
"RIGHT",
|
|
"TRIM",
|
|
"LTRIM",
|
|
"RTRIM",
|
|
"FIND_FIRST",
|
|
"FIND_LAST",
|
|
"SPLIT",
|
|
"SUBSTITUTE",
|
|
"MD5",
|
|
"SHA1",
|
|
"RANDOM_TOKEN",
|
|
"FLOOR",
|
|
"CEIL",
|
|
"ROUND",
|
|
"ABS",
|
|
"RAND",
|
|
"SQRT",
|
|
"POW",
|
|
"RANGE",
|
|
"UNION",
|
|
"UNION_DISTINCT",
|
|
"MINUS",
|
|
"INTERSECTION",
|
|
"FLATTEN",
|
|
"LENGTH",
|
|
"COUNT",
|
|
"MIN",
|
|
"MAX",
|
|
"SUM",
|
|
"MEDIAN",
|
|
"PERCENTILE",
|
|
"AVERAGE",
|
|
"AVG",
|
|
"VARIANCE_SAMPLE",
|
|
"VARIANCE_POPULATION",
|
|
"STDDEV_SAMPLE",
|
|
"STDDEV_POPULATION",
|
|
"STDDEV",
|
|
"UNIQUE",
|
|
"SLICE",
|
|
"REVERSE",
|
|
"FIRST",
|
|
"LAST",
|
|
"NTH",
|
|
"POSITION",
|
|
"CALL",
|
|
"APPLY",
|
|
"PUSH",
|
|
"APPEND",
|
|
"POP",
|
|
"SHIFT",
|
|
"UNSHIFT",
|
|
"REMOVE_VALUE",
|
|
"REMOVE_VALUES",
|
|
"REMOVE_NTH",
|
|
"HAS",
|
|
"ATTRIBUTES",
|
|
"VALUES",
|
|
"MERGE",
|
|
"MERGE_RECURSIVE",
|
|
"DOCUMENT",
|
|
"MATCHES",
|
|
"UNSET",
|
|
"UNSET_RECURSIVE",
|
|
"KEEP",
|
|
"TRANSLATE",
|
|
"ZIP",
|
|
"NEAR",
|
|
"WITHIN",
|
|
"WITHIN_RECTANGLE",
|
|
"IS_IN_POLYGON",
|
|
"FULLTEXT",
|
|
"DATE_NOW",
|
|
"DATE_TIMESTAMP",
|
|
"DATE_ISO8601",
|
|
"DATE_DAYOFWEEK",
|
|
"DATE_YEAR",
|
|
"DATE_MONTH",
|
|
"DATE_DAY",
|
|
"DATE_HOUR",
|
|
"DATE_MINUTE",
|
|
"DATE_SECOND",
|
|
"DATE_MILLISECOND",
|
|
"DATE_DAYOFYEAR",
|
|
"DATE_ISOWEEK",
|
|
"DATE_LEAPYEAR",
|
|
"DATE_QUARTER",
|
|
"DATE_DAYS_IN_MONTH",
|
|
"DATE_ADD",
|
|
"DATE_SUBTRACT",
|
|
"DATE_DIFF",
|
|
"DATE_COMPARE",
|
|
"DATE_FORMAT",
|
|
"NOT_NULL",
|
|
"FIRST_LIST",
|
|
"FIRST_DOCUMENT",
|
|
"PARSE_IDENTIFIER",
|
|
"IS_SAME_COLLECTION"
|
|
];
|
|
|
|
// find all functions that have parameters
|
|
var funcs = [];
|
|
all.forEach(function(func) {
|
|
var query = "RETURN " + func + "()";
|
|
try {
|
|
AQL_EXECUTE(query);
|
|
} catch (err) {
|
|
var s = String(err);
|
|
var re = s.match(/minimum: (\d+), maximum: (\d+)/);
|
|
if (re) {
|
|
var min = Number(re[1]);
|
|
var max = Number(re[2]);
|
|
|
|
if (max >= 1000) {
|
|
max = min + 1;
|
|
}
|
|
if (max > 0) {
|
|
funcs.push({ name: func, min: min, max: max });
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
var oneArgument = function(func) {
|
|
return func.min === 1;
|
|
};
|
|
|
|
var twoArguments = function(func) {
|
|
return func.min === 2;
|
|
};
|
|
|
|
var skip = function(err) {
|
|
if (!err.hasOwnProperty('errorNum')) {
|
|
return false;
|
|
}
|
|
|
|
return [
|
|
errors.ERROR_ARANGO_CROSS_COLLECTION_REQUEST.code,
|
|
errors.ERROR_QUERY_FUNCTION_ARGUMENT_TYPE_MISMATCH.code,
|
|
errors.ERROR_QUERY_FUNCTION_NOT_FOUND.code,
|
|
errors.ERROR_QUERY_FUNCTION_NAME_UNKNOWN.code,
|
|
errors.ERROR_GRAPH_NOT_FOUND.code,
|
|
errors.ERROR_GRAPH_INVALID_GRAPH.code,
|
|
].indexOf(err.errorNum) !== -1;
|
|
};
|
|
|
|
return {
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief set up
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
setUp : function () {
|
|
db._drop("UnitTestsFunctions");
|
|
c = db._create("UnitTestsFunctions");
|
|
c.insert({ _key: "test", value: "test" });
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief tear down
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
tearDown : function () {
|
|
db._drop("UnitTestsFunctions");
|
|
},
|
|
|
|
testFunctionsOneWithDoc : function() {
|
|
funcs.filter(oneArgument).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc)";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsOneWithDocArray : function() {
|
|
funcs.filter(oneArgument).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc ])";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsOneWithKey : function() {
|
|
funcs.filter(oneArgument).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc._key)";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsOneWithId : function() {
|
|
funcs.filter(oneArgument).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc._id)";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsOneWithIdArray : function() {
|
|
funcs.filter(oneArgument).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc._id ])";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsTwoWithDoc : function() {
|
|
funcs.filter(twoArguments).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc, doc)";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsTwoWithDocArray : function() {
|
|
funcs.filter(twoArguments).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc ], [ doc ])";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
require("internal").print(query);
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionTwoWithKey : function() {
|
|
funcs.filter(twoArguments).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc._key, doc._key)";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsTwoWithId : function() {
|
|
funcs.filter(twoArguments).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc._id, doc._id)";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsTwoWithIdArray : function() {
|
|
funcs.filter(twoArguments).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc._id ], [ doc._id ])";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsTwoWithDocId : function() {
|
|
funcs.filter(twoArguments).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc, doc._id)";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsTwoWithDocIdArray : function() {
|
|
funcs.filter(twoArguments).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc, [ doc._id ])";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsTwoWithIdDoc : function() {
|
|
funcs.filter(twoArguments).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "(doc._id, doc)";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsTwoWithIdDocArray : function() {
|
|
funcs.filter(twoArguments).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc._id ], doc)";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
testFunctionsTwoWithIdArrayDocArray : function() {
|
|
funcs.filter(twoArguments).forEach(function(func) {
|
|
var query = "FOR doc IN @@collection RETURN " + func.name + "([ doc._id ], [ doc ])";
|
|
try {
|
|
AQL_EXECUTE(query, { "@collection" : c.name() });
|
|
} catch (err) {
|
|
if (!skip(err)) {
|
|
throw err;
|
|
}
|
|
}
|
|
});
|
|
},
|
|
|
|
};
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief executes the test suite
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
jsunity.run(ahuacatlFunctionsBruteTestSuite);
|
|
|
|
return jsunity.done();
|
|
|