1
0
Fork 0

collection.any() sharded

This commit is contained in:
Jan Steemann 2014-01-30 17:30:39 +01:00
parent 7a8f2257cc
commit 51a58b7844
3 changed files with 52 additions and 10 deletions

View File

@ -1873,8 +1873,6 @@ static v8::Handle<v8::Value> JS_AnyQuery (v8::Arguments const& argv) {
if (col == 0) { if (col == 0) {
TRI_V8_EXCEPTION_INTERNAL(scope, "cannot extract collection"); TRI_V8_EXCEPTION_INTERNAL(scope, "cannot extract collection");
} }
TRI_SHARDING_COLLECTION_NOT_YET_IMPLEMENTED(scope, col);
TRI_barrier_t* barrier = 0; TRI_barrier_t* barrier = 0;
TRI_doc_mptr_t document; TRI_doc_mptr_t document;
@ -3117,7 +3115,7 @@ void TRI_InitV8Queries (v8::Handle<v8::Context> context) {
rt = v8g->VocbaseColTempl; rt = v8g->VocbaseColTempl;
TRI_AddMethodVocbase(rt, "ALL", JS_AllQuery); TRI_AddMethodVocbase(rt, "ALL", JS_AllQuery);
TRI_AddMethodVocbase(rt, "any", JS_AnyQuery); TRI_AddMethodVocbase(rt, "ANY", JS_AnyQuery);
TRI_AddMethodVocbase(rt, "BY_CONDITION_BITARRAY", JS_ByConditionBitarray); TRI_AddMethodVocbase(rt, "BY_CONDITION_BITARRAY", JS_ByConditionBitarray);
TRI_AddMethodVocbase(rt, "BY_CONDITION_SKIPLIST", JS_ByConditionSkiplist); TRI_AddMethodVocbase(rt, "BY_CONDITION_SKIPLIST", JS_ByConditionSkiplist);
TRI_AddMethodVocbase(rt, "BY_EXAMPLE", JS_ByExampleQuery); TRI_AddMethodVocbase(rt, "BY_EXAMPLE", JS_ByExampleQuery);

View File

@ -1085,6 +1085,7 @@ static v8::Handle<v8::Value> DocumentVocbaseCol_Coordinator (
// First get the initial data: // First get the initial data:
string const dbname(collection->_dbName); string const dbname(collection->_dbName);
// TODO: someone might rename the collection while we're reading its name...
string const collname(collection->_name); string const collname(collection->_name);
string key; string key;

View File

@ -209,14 +209,58 @@ ArangoCollection.prototype.index = function (id) {
/// @{ /// @{
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief returns any document from a collection
///
/// @FUN{@FA{collection}.any()
///
/// Returns a random document from the collection or @LIT{null} if none exists.
///
////////////////////////////////////////////////////////////////////////////////
ArangoCollection.prototype.any = function () {
var cluster = require("org/arangodb/cluster");
if (cluster.isCoordinator()) {
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/any",
JSON.stringify({
collection: shard,
}),
{ },
options);
});
var results = cluster.wait(coord, shards), i;
for (i = 0; i < results.length; ++i) {
var body = JSON.parse(results[i].body);
if (body.document !== null) {
return body.document;
}
}
return null;
}
return this.ANY();
};
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
/// @brief constructs a query-by-example for a collection /// @brief constructs a query-by-example for a collection
/// ///
/// @FUN{@FA{collection}.firstExample(@FA{example})} /// @FUN{@FA{collection}.firstExample(@FA{example})}
/// ///
/// Returns the a document of a collection that match the specified example or /// Returns the first document of a collection that matches the specified
/// @LIT{null}. The example must be specified as paths and values. See /// example or @LIT{null}. The example must be specified as paths and values.
/// @FN{byExample} for details. /// See @FN{byExample} for details.
/// ///
/// @FUN{@FA{collection}.firstExample(@FA{path1}, @FA{value1}, ...)} /// @FUN{@FA{collection}.firstExample(@FA{path1}, @FA{value1}, ...)}
/// ///
@ -245,10 +289,9 @@ ArangoCollection.prototype.firstExample = function (example) {
} }
} }
var documents = simple.byExample(this, e, 0, 1); var documents = (new simple.SimpleQueryByExample(this, e)).limit(1).toArray();
if (documents.length > 0) {
if (0 < documents.documents.length) { return documents[0];
return documents.documents[0];
} }
return null; return null;