mirror of https://gitee.com/bigwinds/arangodb
420 lines
15 KiB
JavaScript
420 lines
15 KiB
JavaScript
/*jshint globalstrict:false, strict:false */
|
|
/*global assertEqual, assertNotEqual, assertNull, assertTrue, assertUndefined, fail */
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
/// DISCLAIMER
|
|
///
|
|
/// Copyright 2014-2018 ArangoDB GmbH, Cologne, Germany
|
|
/// Copyright 2004-2014 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 ArangoDB GmbH, Cologne, Germany
|
|
///
|
|
/// @author Jan Steemann
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
let jsunity = require("jsunity");
|
|
let arangodb = require("@arangodb");
|
|
let db = arangodb.db;
|
|
let ERRORS = arangodb.errors;
|
|
const isEnterprise = require("internal").isEnterprise();
|
|
const communityCompat = "community-compat";
|
|
const enterpriseCompat = "enterprise-compat";
|
|
const defaultSharding = isEnterprise ? enterpriseCompat : communityCompat;
|
|
|
|
function DocumentShardingSuite() {
|
|
let name1 = "UnitTestsCollection1";
|
|
let name2 = "UnitTestsCollection2";
|
|
|
|
return {
|
|
|
|
setUp : function () {
|
|
db._drop(name2);
|
|
db._drop(name1);
|
|
},
|
|
|
|
tearDown : function () {
|
|
db._drop(name2);
|
|
db._drop(name1);
|
|
},
|
|
|
|
testCreateWithInvalidSharding : function () {
|
|
try {
|
|
db._create(name1, { shardingStrategy: "peng", numberOfShards: 5 });
|
|
fail();
|
|
} catch (err) {
|
|
assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum);
|
|
}
|
|
},
|
|
|
|
testCreateWithNoneSharding : function () {
|
|
try {
|
|
db._create(name1, { shardingStrategy: "none", numberOfShards: 5 });
|
|
fail();
|
|
} catch (err) {
|
|
assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum);
|
|
}
|
|
},
|
|
|
|
testCreateWithEnterpriseSharding : function () {
|
|
let c = db._create(name1, { shardingStrategy: enterpriseCompat, numberOfShards: 5 });
|
|
assertEqual(enterpriseCompat, c.properties()["shardingStrategy"]);
|
|
assertEqual(5, c.properties()["numberOfShards"]);
|
|
assertEqual(["_key"], c.properties()["shardKeys"]);
|
|
|
|
for (let i = 0; i < 1000; ++i) {
|
|
c.insert({ _key: "test" + i, value: i });
|
|
}
|
|
|
|
assertEqual([ 188, 192, 198, 204, 218 ], Object.values(c.count(true)).sort());
|
|
|
|
for (let i = 0; i < 1000; ++i) {
|
|
assertEqual(i, c.document("test" + i).value);
|
|
}
|
|
},
|
|
|
|
testCreateWithEnterpriseShardingNonDefaultKeysNumericValues : function () {
|
|
let c = db._create(name1, { shardingStrategy: enterpriseCompat, shardKeys: ["value"], numberOfShards: 5 });
|
|
assertEqual(enterpriseCompat, c.properties()["shardingStrategy"]);
|
|
assertEqual(5, c.properties()["numberOfShards"]);
|
|
assertEqual(["value"], c.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c.insert({ value: i })._key);
|
|
}
|
|
|
|
assertEqual([ 0, 0, 0, 0, 1000 ], Object.values(c.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertEqual(i, c.document(k).value);
|
|
});
|
|
},
|
|
|
|
testCreateWithCommunitySharding : function () {
|
|
let c = db._create(name1, { shardingStrategy: communityCompat, numberOfShards: 5 });
|
|
assertEqual(communityCompat, c.properties()["shardingStrategy"]);
|
|
assertEqual(5, c.properties()["numberOfShards"]);
|
|
assertEqual(["_key"], c.properties()["shardKeys"]);
|
|
|
|
for (let i = 0; i < 1000; ++i) {
|
|
c.insert({ _key: "test" + i, value: i });
|
|
}
|
|
|
|
assertEqual([ 188, 192, 198, 204, 218 ], Object.values(c.count(true)).sort());
|
|
|
|
for (let i = 0; i < 1000; ++i) {
|
|
assertEqual(i, c.document("test" + i).value);
|
|
}
|
|
},
|
|
|
|
testDistributeShardsLikeWithCommunitySharding : function () {
|
|
let c1 = db._create(name1, { shardingStrategy: communityCompat, numberOfShards: 5 });
|
|
let c2 = db._create(name2, { distributeShardsLike: name1 });
|
|
assertEqual(communityCompat, c1.properties()["shardingStrategy"]);
|
|
assertEqual(communityCompat, c2.properties()["shardingStrategy"]);
|
|
assertEqual(5, c1.properties()["numberOfShards"]);
|
|
assertEqual(5, c2.properties()["numberOfShards"]);
|
|
assertEqual(["_key"], c1.properties()["shardKeys"]);
|
|
assertEqual(["_key"], c2.properties()["shardKeys"]);
|
|
|
|
for (let i = 0; i < 1000; ++i) {
|
|
c2.insert({ _key: "test" + i, value: i });
|
|
}
|
|
|
|
assertEqual([ 188, 192, 198, 204, 218 ], Object.values(c2.count(true)).sort());
|
|
|
|
for (let i = 0; i < 1000; ++i) {
|
|
assertEqual(i, c2.document("test" + i).value);
|
|
}
|
|
},
|
|
|
|
testDistributeShardsLikeWithDiffentKeyAttribute : function () {
|
|
let c1 = db._create(name1, { shardingStrategy: communityCompat, numberOfShards: 5, shardKeys: ["one"] });
|
|
let c2 = db._create(name2, { distributeShardsLike: name1, shardKeys: ["two"] });
|
|
assertEqual(communityCompat, c1.properties()["shardingStrategy"]);
|
|
assertEqual(communityCompat, c2.properties()["shardingStrategy"]);
|
|
assertEqual(5, c1.properties()["numberOfShards"]);
|
|
assertEqual(5, c2.properties()["numberOfShards"]);
|
|
assertEqual(["one"], c1.properties()["shardKeys"]);
|
|
assertEqual(["two"], c2.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c2.insert({ two: i })._key);
|
|
}
|
|
|
|
assertEqual([ 179, 192, 200, 207, 222 ], Object.values(c2.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertEqual(i, c2.document(k).two);
|
|
});
|
|
},
|
|
|
|
testDistributeShardsLikeWithDiffentKeyAttributes : function () {
|
|
let c1 = db._create(name1, { shardingStrategy: communityCompat, numberOfShards: 5, shardKeys: ["one", "two"] });
|
|
let c2 = db._create(name2, { distributeShardsLike: name1, shardKeys: ["three", "four"] });
|
|
assertEqual(communityCompat, c1.properties()["shardingStrategy"]);
|
|
assertEqual(communityCompat, c2.properties()["shardingStrategy"]);
|
|
assertEqual(5, c1.properties()["numberOfShards"]);
|
|
assertEqual(5, c2.properties()["numberOfShards"]);
|
|
assertEqual(["one", "two"], c1.properties()["shardKeys"]);
|
|
assertEqual(["three", "four"], c2.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c2.insert({ three: i, four: i + 1 })._key);
|
|
}
|
|
|
|
assertEqual([ 187, 188, 203, 208, 214 ], Object.values(c2.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertEqual(i, c2.document(k).three);
|
|
});
|
|
},
|
|
|
|
testDistributeShardsLikeWithDiffentNumberOfKeyAttributes : function () {
|
|
let c1 = db._create(name1, { shardingStrategy: communityCompat, numberOfShards: 5, shardKeys: ["one", "two"] });
|
|
try {
|
|
db._create(name2, { distributeShardsLike: name1, shardKeys: ["three"] });
|
|
fail();
|
|
} catch (err) {
|
|
assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum);
|
|
}
|
|
},
|
|
|
|
testCreateWithNonDefaultKeysMissingValues : function () {
|
|
let c = db._create(name1, { shardingStrategy: communityCompat, shardKeys: ["value"], numberOfShards: 5 });
|
|
assertEqual(communityCompat, c.properties()["shardingStrategy"]);
|
|
assertEqual(5, c.properties()["numberOfShards"]);
|
|
assertEqual(["value"], c.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c.insert({ })._key);
|
|
}
|
|
|
|
assertEqual([ 0, 0, 0, 0, 1000 ], Object.values(c.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertUndefined(c.document(k).value);
|
|
});
|
|
},
|
|
|
|
testCreateWithNonDefaultKeysNumericValues : function () {
|
|
let c = db._create(name1, { shardingStrategy: communityCompat, shardKeys: ["value"], numberOfShards: 5 });
|
|
assertEqual(communityCompat, c.properties()["shardingStrategy"]);
|
|
assertEqual(5, c.properties()["numberOfShards"]);
|
|
assertEqual(["value"], c.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c.insert({ value: i })._key);
|
|
}
|
|
|
|
assertEqual([ 179, 192, 200, 207, 222 ], Object.values(c.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertEqual(i, c.document(k).value);
|
|
});
|
|
},
|
|
|
|
testCreateWithNonDefaultKeysNullValues : function () {
|
|
let c = db._create(name1, { shardingStrategy: communityCompat, shardKeys: ["value"], numberOfShards: 5 });
|
|
assertEqual(communityCompat, c.properties()["shardingStrategy"]);
|
|
assertEqual(5, c.properties()["numberOfShards"]);
|
|
assertEqual(["value"], c.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c.insert({ value: null })._key);
|
|
}
|
|
|
|
assertEqual([ 0, 0, 0, 0, 1000 ], Object.values(c.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertNull(c.document(k).value);
|
|
});
|
|
},
|
|
|
|
testDistributeShardsLikeWithNonDefaultKeys : function () {
|
|
let c1 = db._create(name1, { shardingStrategy: communityCompat, shardKeys: ["value"], numberOfShards: 5 });
|
|
let c2 = db._create(name2, { distributeShardsLike: name1, shardKeys: ["value"] });
|
|
assertEqual(communityCompat, c1.properties()["shardingStrategy"]);
|
|
assertEqual(communityCompat, c2.properties()["shardingStrategy"]);
|
|
assertEqual(5, c1.properties()["numberOfShards"]);
|
|
assertEqual(5, c2.properties()["numberOfShards"]);
|
|
assertEqual(["value"], c1.properties()["shardKeys"]);
|
|
assertEqual(["value"], c2.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c2.insert({ value: i })._key);
|
|
}
|
|
|
|
assertEqual([ 179, 192, 200, 207, 222 ], Object.values(c2.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertEqual(i, c2.document(k).value);
|
|
});
|
|
}
|
|
|
|
};
|
|
}
|
|
|
|
function EdgeShardingSuite() {
|
|
let name1 = "UnitTestsCollection1";
|
|
let name2 = "UnitTestsCollection2";
|
|
|
|
return {
|
|
|
|
setUp : function () {
|
|
db._drop(name2);
|
|
db._drop(name1);
|
|
},
|
|
|
|
tearDown : function () {
|
|
db._drop(name2);
|
|
db._drop(name1);
|
|
},
|
|
|
|
testEdgeCreateWithInvalidSharding : function () {
|
|
try {
|
|
db._createEdgeCollection(name1, { shardingStrategy: "peng", numberOfShards: 5 });
|
|
fail();
|
|
} catch (err) {
|
|
assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum);
|
|
}
|
|
},
|
|
|
|
testEdgeCreateWithNoneSharding : function () {
|
|
try {
|
|
db._createEdgeCollection(name1, { shardingStrategy: "none", numberOfShards: 5 });
|
|
fail();
|
|
} catch (err) {
|
|
assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum);
|
|
}
|
|
},
|
|
|
|
testEdgeCreateWithCommunitySharding : function () {
|
|
let c = db._createEdgeCollection(name1, { shardingStrategy: communityCompat, numberOfShards: 5 });
|
|
assertEqual(communityCompat, c.properties()["shardingStrategy"]);
|
|
assertEqual(5, c.properties()["numberOfShards"]);
|
|
assertEqual(["_key"], c.properties()["shardKeys"]);
|
|
|
|
for (let i = 0; i < 1000; ++i) {
|
|
c.insert({ _key: "test" + i, value: i, _from: "v/test" + i, _to: "v/test" + i });
|
|
}
|
|
|
|
assertEqual([ 188, 192, 198, 204, 218 ], Object.values(c.count(true)).sort());
|
|
|
|
for (let i = 0; i < 1000; ++i) {
|
|
assertEqual(i, c.document("test" + i).value);
|
|
}
|
|
},
|
|
|
|
testEdgeCreateWithEnterpriseSharding : function () {
|
|
if (!isEnterprise) {
|
|
try {
|
|
db._createEdgeCollection(name1, { shardingStrategy: enterpriseCompat, numberOfShards: 5 });
|
|
} catch (err) {
|
|
assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err.errorNum);
|
|
}
|
|
}
|
|
},
|
|
|
|
testEdgeCreateWithNonDefaultKeysMissingValues : function () {
|
|
let c = db._createEdgeCollection(name1, { shardingStrategy: communityCompat, shardKeys: ["value"], numberOfShards: 5 });
|
|
assertEqual(communityCompat, c.properties()["shardingStrategy"]);
|
|
assertEqual(5, c.properties()["numberOfShards"]);
|
|
assertEqual(["value"], c.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c.insert({ _from: "v/test" + i, _to: "v/test" + i })._key);
|
|
}
|
|
|
|
assertEqual([ 0, 0, 0, 0, 1000 ], Object.values(c.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertUndefined(c.document(k).value);
|
|
});
|
|
},
|
|
|
|
testEdgeCreateWithNonDefaultKeysNumericValues : function () {
|
|
let c = db._createEdgeCollection(name1, { shardingStrategy: communityCompat, shardKeys: ["value"], numberOfShards: 5 });
|
|
assertEqual(communityCompat, c.properties()["shardingStrategy"]);
|
|
assertEqual(5, c.properties()["numberOfShards"]);
|
|
assertEqual(["value"], c.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c.insert({ value: i, _from: "v/test" + i, _to: "v/test" + i })._key);
|
|
}
|
|
|
|
assertEqual([ 179, 192, 200, 207, 222 ], Object.values(c.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertEqual(i, c.document(k).value);
|
|
});
|
|
},
|
|
|
|
testEdgeCreateWithNonDefaultKeysNullValues : function () {
|
|
let c = db._createEdgeCollection(name1, { shardingStrategy: communityCompat, shardKeys: ["value"], numberOfShards: 5 });
|
|
assertEqual(communityCompat, c.properties()["shardingStrategy"]);
|
|
assertEqual(5, c.properties()["numberOfShards"]);
|
|
assertEqual(["value"], c.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c.insert({ value: null, _from: "v/test" + i, _to: "v/test" + i })._key);
|
|
}
|
|
|
|
assertEqual([ 0, 0, 0, 0, 1000 ], Object.values(c.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertNull(c.document(k).value);
|
|
});
|
|
},
|
|
|
|
testEdgeDistributeShardsLikeWithNonDefaultKeys : function () {
|
|
let c1 = db._createEdgeCollection(name1, { shardingStrategy: communityCompat, shardKeys: ["value"], numberOfShards: 5 });
|
|
let c2 = db._createEdgeCollection(name2, { distributeShardsLike: name1, shardKeys: ["value"] });
|
|
assertEqual(communityCompat, c1.properties()["shardingStrategy"]);
|
|
assertEqual(communityCompat, c2.properties()["shardingStrategy"]);
|
|
assertEqual(5, c1.properties()["numberOfShards"]);
|
|
assertEqual(5, c2.properties()["numberOfShards"]);
|
|
assertEqual(["value"], c1.properties()["shardKeys"]);
|
|
assertEqual(["value"], c2.properties()["shardKeys"]);
|
|
|
|
let keys = [];
|
|
for (let i = 0; i < 1000; ++i) {
|
|
keys.push(c2.insert({ value: i, _from: "v/test" + i, _to: "v/test" + i })._key);
|
|
}
|
|
|
|
assertEqual([ 179, 192, 200, 207, 222 ], Object.values(c2.count(true)).sort());
|
|
|
|
keys.forEach(function(k, i) {
|
|
assertEqual(i, c2.document(k).value);
|
|
});
|
|
}
|
|
|
|
};
|
|
}
|
|
|
|
jsunity.run(DocumentShardingSuite);
|
|
jsunity.run(EdgeShardingSuite);
|
|
|
|
return jsunity.done();
|