mirror of https://gitee.com/bigwinds/arangodb
280 lines
9.8 KiB
JavaScript
280 lines
9.8 KiB
JavaScript
/*jshint globalstrict:false, strict:false, strict: false, maxlen: 500 */
|
|
/*global assertEqual, assertFalse, assertNull, assertTrue, AQL_EXECUTE */
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief tests for query language, bind parameters
|
|
///
|
|
/// @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 db = require("@arangodb").db;
|
|
var jsunity = require("jsunity");
|
|
var helper = require("@arangodb/aql-helper");
|
|
var internal = require("internal");
|
|
var assertQueryError = helper.assertQueryError;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test suite
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function ahuacatlClusterUpsertKeySuite () {
|
|
var cn1 = "UnitTestsAhuacatlUpsert1";
|
|
var c1;
|
|
|
|
var sorter = function (l, r) {
|
|
if (l["new"].value2 !== r["new"].value2) {
|
|
return l["new"].value2 - r["new"].value2;
|
|
}
|
|
return 0;
|
|
};
|
|
|
|
return {
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief set up
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
setUp : function () {
|
|
db._drop(cn1);
|
|
c1 = db._create(cn1, { numberOfShards: 5 });
|
|
|
|
for (var i = 0; i < 20; ++i) {
|
|
c1.save({ _key: "test" + i, value: i });
|
|
}
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief tear down
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
tearDown : function () {
|
|
db._drop(cn1);
|
|
c1 = null;
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test upsert
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testUpsertOnlyUpdate : function () {
|
|
var actual = AQL_EXECUTE("FOR i IN 0..9 UPSERT { _key: CONCAT('test', i) } INSERT { new: true, value2: i } UPDATE { value2: i, new: false, value: OLD.value + 1 } IN @@cn1 RETURN { old: OLD, new: NEW }", { "@cn1": cn1 });
|
|
|
|
actual.json.sort(sorter);
|
|
assertEqual(10, actual.json.length);
|
|
for (var i = 0; i < 10; ++i) {
|
|
var doc = actual.json[i];
|
|
|
|
assertEqual(i, doc["new"].value2);
|
|
assertEqual("test" + i, doc.old._key);
|
|
assertEqual(i, doc.old.value);
|
|
assertEqual("test" + i, doc["new"]._key);
|
|
assertEqual(i + 1, doc["new"].value);
|
|
assertFalse(doc["new"]["new"]);
|
|
}
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test upsert
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testUpsertOnlyInsert : function () {
|
|
var actual = AQL_EXECUTE("FOR i IN 50..59 UPSERT { _key: CONCAT('test', i) } INSERT { new: true, value2: i, _key: CONCAT('test', i) } UPDATE { value2: i, new: false, value: OLD.value + 1 } IN @@cn1 RETURN { old: OLD, new: NEW }", { "@cn1": cn1 });
|
|
actual.json.sort(sorter);
|
|
|
|
assertEqual(10, actual.json.length);
|
|
for (var i = 0; i < 10; ++i) {
|
|
var doc = actual.json[i];
|
|
|
|
assertEqual(50 + i, doc["new"].value2);
|
|
assertNull(doc.old);
|
|
assertEqual("test" + (50 + i), doc["new"]._key);
|
|
assertTrue(doc["new"]["new"]);
|
|
}
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test upsert
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testUpsertMixed : function () {
|
|
var actual = AQL_EXECUTE("FOR i IN 0..39 UPSERT { _key: CONCAT('test', i) } INSERT { new: true, value2: i, _key: CONCAT('test', i) } UPDATE { value2: i, new: false, value: OLD.value + 1 } IN @@cn1 RETURN { old: OLD, new: NEW }", { "@cn1": cn1 });
|
|
actual.json.sort(sorter);
|
|
|
|
assertEqual(40, actual.json.length);
|
|
for (var i = 0; i < 40; ++i) {
|
|
var doc = actual.json[i];
|
|
|
|
assertEqual(i, doc["new"].value2);
|
|
assertEqual("test" + i, doc["new"]._key);
|
|
|
|
if (i < 20) {
|
|
assertEqual("test" + i, doc.old._key);
|
|
assertEqual(i, doc.old.value);
|
|
assertEqual(i + 1, doc["new"].value);
|
|
assertFalse(doc["new"]["new"]);
|
|
}
|
|
else {
|
|
assertNull(doc.old);
|
|
assertTrue(doc["new"]["new"]);
|
|
}
|
|
}
|
|
}
|
|
|
|
};
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test suite
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
function ahuacatlClusterUpsertNonKeySuite () {
|
|
var cn1 = "UnitTestsAhuacatlUpsert1";
|
|
var c1;
|
|
var errors = internal.errors;
|
|
|
|
var sorter = function (l, r) {
|
|
if (l["new"].value2 !== r["new"].value2) {
|
|
return l["new"].value2 - r["new"].value2;
|
|
}
|
|
return 0;
|
|
};
|
|
|
|
return {
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief set up
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
setUp : function () {
|
|
db._drop(cn1);
|
|
c1 = db._create(cn1, { numberOfShards: 5, shardKeys: [ "value" ] });
|
|
|
|
for (var i = 0; i < 20; ++i) {
|
|
c1.save({ value: i });
|
|
}
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief tear down
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
tearDown : function () {
|
|
db._drop(cn1);
|
|
c1 = null;
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test upsert
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testUpsertOnlyUpdateNonKey : function () {
|
|
var actual = AQL_EXECUTE("FOR i IN 0..9 UPSERT { value : i } INSERT { new: true, value2: i, value: i } UPDATE { value2: i, new: false } IN @@cn1 RETURN { old: OLD, new: NEW }", { "@cn1": cn1 });
|
|
|
|
actual.json.sort(sorter);
|
|
assertEqual(10, actual.json.length);
|
|
for (var i = 0; i < 10; ++i) {
|
|
var doc = actual.json[i];
|
|
|
|
assertEqual(i, doc["new"].value2);
|
|
assertEqual(i, doc.old.value);
|
|
assertEqual(i, doc["new"].value);
|
|
assertFalse(doc["new"]["new"]);
|
|
}
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test upsert
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testUpsertOnlyInsertNonKey : function () {
|
|
var actual = AQL_EXECUTE("FOR i IN 50..59 UPSERT { value: i } INSERT { new: true, value2: i, value: i } UPDATE { value2: i, new: false } IN @@cn1 RETURN { old: OLD, new: NEW }", { "@cn1": cn1 });
|
|
actual.json.sort(sorter);
|
|
|
|
assertEqual(10, actual.json.length);
|
|
for (var i = 0; i < 10; ++i) {
|
|
var doc = actual.json[i];
|
|
|
|
assertNull(doc.old);
|
|
assertEqual(50 + i, doc["new"].value2);
|
|
assertEqual(50 + i, doc["new"].value);
|
|
assertTrue(doc["new"]["new"]);
|
|
}
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test upsert
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testUpsertMixedNonKey : function () {
|
|
var actual = AQL_EXECUTE("FOR i IN 0..39 UPSERT { value: i } INSERT { new: true, value2: i, value: i } UPDATE { value2: i, new: false } IN @@cn1 RETURN { old: OLD, new: NEW }", { "@cn1": cn1 });
|
|
actual.json.sort(sorter);
|
|
|
|
assertEqual(40, actual.json.length);
|
|
for (var i = 0; i < 40; ++i) {
|
|
var doc = actual.json[i];
|
|
|
|
assertEqual(i, doc["new"].value2);
|
|
|
|
if (i < 20) {
|
|
assertEqual(i, doc.old.value);
|
|
assertEqual(i, doc["new"].value);
|
|
assertFalse(doc["new"]["new"]);
|
|
}
|
|
else {
|
|
assertNull(doc.old);
|
|
assertEqual(i, doc["new"].value);
|
|
assertTrue(doc["new"]["new"]);
|
|
}
|
|
}
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test upsert
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testUpsertInsertWithKeyNonKey : function () {
|
|
assertQueryError(errors.ERROR_CLUSTER_MUST_NOT_SPECIFY_KEY.code, "FOR i IN 20..29 UPSERT { value: i } INSERT { _key: CONCAT('test', i) } UPDATE { } IN @@cn1 RETURN { old: OLD, new: NEW }", { "@cn1": cn1 });
|
|
},
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief test upsert
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
testUpsertShardKeyChangeNonKey : function () {
|
|
assertQueryError(errors.ERROR_CLUSTER_MUST_NOT_CHANGE_SHARDING_ATTRIBUTES.code, "FOR i IN 0..19 UPSERT { value: i } INSERT { } UPDATE { value: OLD.value + 1 } IN @@cn1 RETURN { old: OLD, new: NEW }", { "@cn1": cn1 });
|
|
}
|
|
|
|
};
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// @brief executes the test suite
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
jsunity.run(ahuacatlClusterUpsertKeySuite);
|
|
jsunity.run(ahuacatlClusterUpsertNonKeySuite);
|
|
|
|
return jsunity.done();
|
|
|