1
0
Fork 0

updateByExample sharded

This commit is contained in:
Jan Steemann 2014-01-30 17:54:25 +01:00
parent 8d1ac573a6
commit 6b00e2ccc2
1 changed files with 108 additions and 28 deletions

View File

@ -373,21 +373,59 @@ ArangoCollection.prototype.replaceByExample = function (example,
newValue,
waitForSync,
limit) {
var replaced = 0;
var documents;
if (limit === 0) {
return 0;
}
if (typeof newValue !== "object" || Array.isArray(newValue)) {
var err = new ArangoError();
err.errorNum = internal.errors.ERROR_BAD_PARAMETER.code;
err.errorMessage = "invalid value for parameter 'newValue'";
var err1 = new ArangoError();
err1.errorNum = internal.errors.ERROR_BAD_PARAMETER.code;
err1.errorMessage = "invalid value for parameter 'newValue'";
throw err;
throw err1;
}
var replaced = 0;
var documents;
var cluster = require("org/arangodb/cluster");
if (cluster.isCoordinator()) {
if (limit > 0) {
var err2 = new ArangoError();
err2.errorNum = internal.errors.ERROR_NOT_IMPLEMENTED.code;
err2.errorMessage = "limit not supported in clustered operation";
throw err2;
}
var dbName = require("internal").db._name();
var shards = cluster.shardList(dbName, this.name());
var coord = { coordTransactionID: ArangoClusterInfo.uniqid() };
var options = { coordTransactionID: coord.coordTransactionID, timeout: 360 };
shards.forEach(function (shard) {
ArangoClusterComm.asyncRequest("put",
"shard:" + shard,
dbName,
"/_api/simple/replace-by-example",
JSON.stringify({
collection: shard,
example: example,
newValue: newValue,
waitForSync: waitForSync
}),
{ },
options);
});
var results = cluster.wait(coord, shards), i;
for (i = 0; i < results.length; ++i) {
var body = JSON.parse(results[i].body);
replaced += (body.replaced || 0);
}
}
else {
documents = this.byExample(example);
if (limit > 0) {
documents = documents.limit(limit);
@ -400,6 +438,7 @@ ArangoCollection.prototype.replaceByExample = function (example,
replaced++;
}
}
}
return replaced;
};
@ -413,21 +452,61 @@ ArangoCollection.prototype.updateByExample = function (example,
keepNull,
waitForSync,
limit) {
var updated = 0;
var documents;
if (limit === 0) {
return 0;
}
if (typeof newValue !== "object" || Array.isArray(newValue)) {
var err = new ArangoError();
err.errorNum = internal.errors.ERROR_BAD_PARAMETER.code;
err.errorMessage = "invalid value for parameter 'newValue'";
var err1 = new ArangoError();
err1.errorNum = internal.errors.ERROR_BAD_PARAMETER.code;
err1.errorMessage = "invalid value for parameter 'newValue'";
throw err;
throw err1;
}
var updated = 0;
var documents;
var cluster = require("org/arangodb/cluster");
if (cluster.isCoordinator()) {
if (limit > 0) {
var err2 = new ArangoError();
err2.errorNum = internal.errors.ERROR_NOT_IMPLEMENTED.code;
err2.errorMessage = "limit not supported in clustered operation";
throw err2;
}
var dbName = require("internal").db._name();
var shards = cluster.shardList(dbName, this.name());
var coord = { coordTransactionID: ArangoClusterInfo.uniqid() };
var options = { coordTransactionID: coord.coordTransactionID, timeout: 360 };
shards.forEach(function (shard) {
ArangoClusterComm.asyncRequest("put",
"shard:" + shard,
dbName,
"/_api/simple/update-by-example",
JSON.stringify({
collection: shard,
example: example,
newValue: newValue,
waitForSync: waitForSync,
keepNull: keepNull
}),
{ },
options);
});
var results = cluster.wait(coord, shards), i;
for (i = 0; i < results.length; ++i) {
var body = JSON.parse(results[i].body);
updated += (body.updated || 0);
}
}
else {
documents = this.byExample(example);
if (limit > 0) {
documents = documents.limit(limit);
@ -440,6 +519,7 @@ ArangoCollection.prototype.updateByExample = function (example,
updated++;
}
}
}
return updated;
};