mirror of https://gitee.com/bigwinds/arangodb
247 lines
5.7 KiB
JavaScript
247 lines
5.7 KiB
JavaScript
/*global assertTrue */
|
|
|
|
"use strict";
|
|
|
|
var jsunity = require("jsunity");
|
|
|
|
var aqlFuncs = {
|
|
"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":"szl|+",
|
|
"CHAR_LENGTH":"s",
|
|
"LOWER":"s",
|
|
"UPPER":"s",
|
|
"SUBSTRING":"s,n|n",
|
|
"CONTAINS":"s,s|b",
|
|
"LIKE":"s,r|b",
|
|
"LEFT":"s,n",
|
|
"RIGHT":"s,n",
|
|
"TRIM":"s|ns",
|
|
"LTRIM":"s|s",
|
|
"RTRIM":"s|s",
|
|
"FIND_FIRST":"s,s|zn,zn",
|
|
"FIND_LAST":"s,s|zn,zn",
|
|
"SPLIT":"s|sl,n",
|
|
"SUBSTITUTE":"s,las|lsn,n",
|
|
"MD5":"s",
|
|
"SHA1":"s",
|
|
"RANDOM_TOKEN":"n",
|
|
"FLOOR":"n",
|
|
"CEIL":"n",
|
|
"ROUND":"n",
|
|
"ABS":"n",
|
|
"RAND":"",
|
|
"SQRT":"n",
|
|
"POW":"n,n",
|
|
"RANGE":"n,n|n",
|
|
"UNION":"l,l|+",
|
|
"UNION_DISTINCT":"l,l|+",
|
|
"MINUS":"l,l|+",
|
|
"INTERSECTION":"l,l|+",
|
|
"FLATTEN":"l|n",
|
|
"LENGTH":"las",
|
|
"COUNT":"las",
|
|
"MIN":"l",
|
|
"MAX":"l",
|
|
"SUM":"l",
|
|
"MEDIAN":"l",
|
|
"PERCENTILE":"l,n|s",
|
|
"AVERAGE":"l",
|
|
"AVG":"l",
|
|
"VARIANCE_SAMPLE":"l",
|
|
"VARIANCE_POPULATION":"l",
|
|
"VARIANCE":"l",
|
|
"STDDEV_SAMPLE":"l",
|
|
"STDDEV_POPULATION":"l",
|
|
"STDDEV":"l",
|
|
"UNIQUE":"l",
|
|
"SORTED_UNIQUE":"l",
|
|
"SLICE":"l,n|n",
|
|
"REVERSE":"ls",
|
|
"FIRST":"l",
|
|
"LAST":"l",
|
|
"NTH":"l,n",
|
|
"POSITION":"l,.|b",
|
|
"CALL":"s|.+",
|
|
"APPLY":"s|l",
|
|
"PUSH":"l,.|b",
|
|
"APPEND":"l,lz|b",
|
|
"POP":"l",
|
|
"SHIFT":"l",
|
|
"UNSHIFT":"l,.|b",
|
|
"REMOVE_VALUE":"l,.|n",
|
|
"REMOVE_VALUES":"l,lz",
|
|
"REMOVE_NTH":"l,n",
|
|
"HAS":"az,s",
|
|
"ATTRIBUTES":"a|b,b",
|
|
"VALUES":"a|b",
|
|
"MERGE":"la|+",
|
|
"MERGE_RECURSIVE":"a,a|+",
|
|
"DOCUMENT":"h.|.",
|
|
"MATCHES":".,l|b",
|
|
"UNSET":"a,sl|+",
|
|
"UNSET_RECURSIVE":"a,sl|+",
|
|
"KEEP":"a,sl|+",
|
|
"TRANSLATE":".,a|.",
|
|
"ZIP":"l,l",
|
|
"NEAR":"hs,n,n|nz,s",
|
|
"WITHIN":"hs,n,n,n|s",
|
|
"WITHIN_RECTANGLE":"hs,d,d,d,d",
|
|
"IS_IN_POLYGON":"l,ln|nb",
|
|
"FULLTEXT":"hs,s,s|n",
|
|
"DATE_NOW":"",
|
|
"DATE_TIMESTAMP":"ns|ns,ns,ns,ns,ns,ns",
|
|
"DATE_ISO8601":"ns|ns,ns,ns,ns,ns,ns",
|
|
"DATE_DAYOFWEEK":"ns",
|
|
"DATE_YEAR":"ns",
|
|
"DATE_MONTH":"ns",
|
|
"DATE_DAY":"ns",
|
|
"DATE_HOUR":"ns",
|
|
"DATE_MINUTE":"ns",
|
|
"DATE_SECOND":"ns",
|
|
"DATE_DAYOFYEAR":"ns",
|
|
"DATE_ISOWEEK":"ns",
|
|
"DATE_LEAPYEAR":"ns",
|
|
"DATE_QUARTER":"ns",
|
|
"DATE_DAYS_IN_MONTH":"ns",
|
|
"DATE_ADD":"ns,ns|n",
|
|
"DATE_SUBTRACT":"ns,ns|n",
|
|
"DATE_DIFF":"ns,ns,s|b",
|
|
"DATE_COMPARE":"ns,ns,s|s",
|
|
"DATE_FORMAT":"ns,s",
|
|
"FAIL":"|s",
|
|
"PASSTHRU":".",
|
|
"NOOPT":".",
|
|
"V8":".",
|
|
"SLEEP":"n",
|
|
"COLLECTIONS":"",
|
|
"NOT_NULL":".|+",
|
|
"FIRST_LIST":".|+",
|
|
"FIRST_DOCUMENT":".|+",
|
|
"PARSE_IDENTIFIER":".",
|
|
"CURRENT_USER":"",
|
|
"CURRENT_DATABASE":"",
|
|
"COLLECTION_COUNT":"chs",
|
|
};
|
|
|
|
let args = {
|
|
"null": null,
|
|
"usmallint" : 1,
|
|
"smallint": -1,
|
|
"double": Math.PI,
|
|
"emptyobj": {},
|
|
"flatobj": {"hans": null, "kanns": 8, "nicht": "..,-"},
|
|
"nan": NaN,
|
|
"inf": Infinity,
|
|
"emptyarr": [],
|
|
"arr": ["hund", 1, 0.9, null, "\0jaja"],
|
|
"hihi": "😂",
|
|
"regex": /haha/,
|
|
"complexobject": {
|
|
"hans": 17,
|
|
"wurst": {
|
|
"lala": 19001,
|
|
"hund": null,
|
|
"0byte": "\0hahah",
|
|
"BATMAN": NaN,
|
|
"inf": Infinity,
|
|
"mett": [1,2, "POLIZEI", null, null, {}]
|
|
},
|
|
"SYM": Symbol("unicodekatze"),
|
|
"HIHI": "😂",
|
|
},
|
|
};
|
|
|
|
|
|
var db = require("@arangodb").db;
|
|
|
|
function stressTestSuite() {
|
|
return {
|
|
testMatrix: function() {
|
|
var numSuccessful = 0;
|
|
var keys = Object.keys(args);
|
|
|
|
var generateAqlArgument = function(keyIndex, index) {
|
|
return "@a" + index;
|
|
};
|
|
|
|
var argumentReducer = function(current, keyIndex, index) {
|
|
current['a' + index] = args[keys[keyIndex]];
|
|
return current;
|
|
};
|
|
|
|
Object.keys(aqlFuncs).forEach(function(aqlFunc) {
|
|
var funcArguments = aqlFuncs[aqlFunc];
|
|
var funcParts = funcArguments.split('|');
|
|
|
|
var funcMinArguments = funcParts[0].length > 0 ? funcParts[0].split(',').length : 0;
|
|
var funcMaxArguments = funcParts.length > 1
|
|
? funcMinArguments + funcParts[1].split(',').length
|
|
: funcMinArguments;
|
|
|
|
// test one off for every function
|
|
var testMinArguments = funcMinArguments - 1;
|
|
if (testMinArguments < 0) {
|
|
testMinArguments = 0;
|
|
}
|
|
var testMaxArguments = funcMaxArguments + 1;
|
|
|
|
// try up to 5 arguments for every query
|
|
for (var i=testMinArguments;i<=testMaxArguments;i++) {
|
|
// and brute force every combination :D
|
|
// generate a matrix with indices pointing to our possible values
|
|
// start with 0 in every cell
|
|
var keyIndices = [];
|
|
for (var j=1;j<=i;j++) {
|
|
keyIndices.push(0);
|
|
}
|
|
|
|
// mop: generate query for this argument count run
|
|
var query = "RETURN " + aqlFunc + "(" + keyIndices.map(generateAqlArgument).join(",") + ")";
|
|
|
|
// mop: start at the end, increment during loop and overflow to the front
|
|
var lastIndex = keyIndices.length - 1;
|
|
while (true) {
|
|
var queryArgs = keyIndices.reduce(argumentReducer, {});
|
|
//console.log(query, queryArgs);
|
|
try {
|
|
db._query({"query": query, "bindVars": queryArgs});
|
|
numSuccessful++;
|
|
} catch (e) {
|
|
}
|
|
|
|
var index = lastIndex;
|
|
while (++keyIndices[index] >= keys.length) {
|
|
keyIndices[index] = 0;
|
|
index--;
|
|
if (index < 0) {
|
|
break;
|
|
}
|
|
}
|
|
if (index < 0) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
assertTrue(numSuccessful, "Not a single test has been successful. Something is broken :S");
|
|
}
|
|
};
|
|
}
|
|
|
|
jsunity.run(stressTestSuite);
|
|
|
|
return jsunity.done();
|