1
0
Fork 0
arangodb/js/server/tests/aql/aql-optimizer-keep.js

211 lines
8.7 KiB
JavaScript

/*jshint globalstrict:false, strict:false, maxlen: 500 */
/*global assertTrue, assertFalse, assertEqual, AQL_EXECUTE */
////////////////////////////////////////////////////////////////////////////////
/// @brief tests for COLLECT w/ KEEP
///
/// @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 jsunity = require("jsunity");
var internal = require("internal");
var errors = internal.errors;
var db = require("@arangodb").db;
var helper = require("@arangodb/aql-helper");
var assertQueryError = helper.assertQueryError;
////////////////////////////////////////////////////////////////////////////////
/// @brief test suite
////////////////////////////////////////////////////////////////////////////////
function optimizerKeepTestSuite () {
var c;
return {
setUp : function () {
db._drop("UnitTestsCollection");
c = db._create("UnitTestsCollection");
for (var i = 0; i < 1000; ++i) {
c.save({ group: "test" + (i % 10), value: i });
}
},
tearDown : function () {
db._drop("UnitTestsCollection");
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test no into, no keep
////////////////////////////////////////////////////////////////////////////////
testInvalidSyntax : function () {
assertQueryError(errors.ERROR_QUERY_PARSE.code, "LET a = 1 FOR i IN " + c.name() + " COLLECT class = i.group KEEP i RETURN class");
assertQueryError(errors.ERROR_QUERY_PARSE.code, "LET a = 1 FOR i IN " + c.name() + " COLLECT class = i.group INTO group KEEP RETURN class");
assertQueryError(errors.ERROR_QUERY_PARSE.code, "LET a = 1 FOR i IN " + c.name() + " COLLECT class = i.group INTO group KEEP i KEEP i RETURN class");
assertQueryError(errors.ERROR_QUERY_PARSE.code, "LET a = 1 FOR i IN " + c.name() + " COLLECT class = i.group INTO group KEEP i + 1 RETURN class");
assertQueryError(errors.ERROR_QUERY_PARSE.code, "LET a = 1 FOR i IN " + c.name() + " COLLECT KEEP i RETURN class");
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test no into, no keep
////////////////////////////////////////////////////////////////////////////////
testNoInto : function () {
var query = "LET a = 1 LET b = 2 LET c = CONCAT('foo', 'bar') FOR i IN " + c.name() + " COLLECT class = i.group RETURN class";
var results = AQL_EXECUTE(query);
assertEqual([ "test0", "test1", "test2", "test3", "test4", "test5", "test6", "test7", "test8", "test9" ], results.json, query);
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test no keep
////////////////////////////////////////////////////////////////////////////////
testIntoNoKeep : function () {
var query = "LET a = 1 LET b = 2 LET c = CONCAT('foo', 'bar') FOR i IN " + c.name() + " LET calc = PASSTHRU(i.group) COLLECT class = calc INTO group RETURN group";
var results = AQL_EXECUTE(query);
assertEqual(10, results.json.length);
for (var i = 0; i < results.json.length; ++i) {
var group = results.json[i];
assertTrue(Array.isArray(group));
assertTrue(100, group.length);
for (var j = 0; j < group.length; ++j) {
assertFalse(group[j].hasOwnProperty("a"));
assertFalse(group[j].hasOwnProperty("b"));
assertFalse(group[j].hasOwnProperty("c"));
assertTrue(group[j].hasOwnProperty("calc"));
assertFalse(group[j].hasOwnProperty("class"));
}
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test keep
////////////////////////////////////////////////////////////////////////////////
testIntoKeepRepeated : function () {
var query = "LET a = 1 LET b = 2 LET c = CONCAT('foo', 'bar') FOR i IN " + c.name() + " COLLECT class = i.group INTO group KEEP a, a, a, a RETURN group";
var results = AQL_EXECUTE(query);
assertEqual(10, results.json.length);
for (var i = 0; i < results.json.length; ++i) {
var group = results.json[i];
assertTrue(Array.isArray(group));
assertTrue(100, group.length);
for (var j = 0; j < group.length; ++j) {
assertTrue(group[j].hasOwnProperty("a"));
assertFalse(group[j].hasOwnProperty("b"));
assertFalse(group[j].hasOwnProperty("c"));
assertFalse(group[j].hasOwnProperty("calc"));
assertFalse(group[j].hasOwnProperty("class"));
}
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test keep
////////////////////////////////////////////////////////////////////////////////
testIntoKeep1 : function () {
var query = "LET a = 1 LET b = 2 LET c = CONCAT('foo', 'bar') FOR i IN " + c.name() + " LET calc1 = PASSTHRU(i.group) LET calc2 = PASSTHRU(i.group) COLLECT class = calc1 INTO group KEEP calc1 RETURN group";
var results = AQL_EXECUTE(query);
assertEqual(10, results.json.length);
for (var i = 0; i < results.json.length; ++i) {
var group = results.json[i];
assertTrue(Array.isArray(group));
assertTrue(100, group.length);
for (var j = 0; j < group.length; ++j) {
assertFalse(group[j].hasOwnProperty("a"));
assertFalse(group[j].hasOwnProperty("b"));
assertFalse(group[j].hasOwnProperty("c"));
assertTrue(group[j].hasOwnProperty("calc1"));
assertFalse(group[j].hasOwnProperty("calc2"));
assertFalse(group[j].hasOwnProperty("class"));
}
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test keep
////////////////////////////////////////////////////////////////////////////////
testIntoKeep2 : function () {
var query = "LET a = 1 LET b = 2 LET c = CONCAT('foo', 'bar') FOR i IN " + c.name() + " LET calc1 = PASSTHRU(i.group) LET calc2 = PASSTHRU(i.group) COLLECT class = calc1 INTO group KEEP calc2, c, a RETURN group";
var results = AQL_EXECUTE(query);
assertEqual(10, results.json.length);
for (var i = 0; i < results.json.length; ++i) {
var group = results.json[i];
assertTrue(Array.isArray(group));
assertTrue(100, group.length);
for (var j = 0; j < group.length; ++j) {
assertTrue(group[j].hasOwnProperty("a"));
assertFalse(group[j].hasOwnProperty("b"));
assertTrue(group[j].hasOwnProperty("c"));
assertFalse(group[j].hasOwnProperty("calc1"));
assertTrue(group[j].hasOwnProperty("calc2"));
assertFalse(group[j].hasOwnProperty("class"));
}
}
},
////////////////////////////////////////////////////////////////////////////////
/// @brief test keep
////////////////////////////////////////////////////////////////////////////////
testIntoKeep3 : function () {
var query = "FOR j IN 1..1 FOR i IN " + c.name() + " LET a = PASSTHRU(1) LET b = CONCAT('foo', 'bar') LET c = CONCAT(i.group, 'x') COLLECT class = i.group INTO group KEEP c, b RETURN group";
var results = AQL_EXECUTE(query);
assertEqual(10, results.json.length);
for (var i = 0; i < results.json.length; ++i) {
var group = results.json[i];
assertTrue(Array.isArray(group));
assertTrue(100, group.length);
for (var j = 0; j < group.length; ++j) {
assertFalse(group[j].hasOwnProperty("a"));
assertTrue(group[j].hasOwnProperty("b"));
assertTrue(group[j].hasOwnProperty("c"));
assertFalse(group[j].hasOwnProperty("i"));
assertFalse(group[j].hasOwnProperty("j"));
assertFalse(group[j].hasOwnProperty("class"));
}
}
}
};
}
////////////////////////////////////////////////////////////////////////////////
/// @brief executes the test suite
////////////////////////////////////////////////////////////////////////////////
jsunity.run(optimizerKeepTestSuite);
return jsunity.done();