diff --git a/arangod/V8Server/v8-query.cpp b/arangod/V8Server/v8-query.cpp index 9e0910242f..200d779a0b 100644 --- a/arangod/V8Server/v8-query.cpp +++ b/arangod/V8Server/v8-query.cpp @@ -1873,8 +1873,6 @@ static v8::Handle JS_AnyQuery (v8::Arguments const& argv) { if (col == 0) { TRI_V8_EXCEPTION_INTERNAL(scope, "cannot extract collection"); } - - TRI_SHARDING_COLLECTION_NOT_YET_IMPLEMENTED(scope, col); TRI_barrier_t* barrier = 0; TRI_doc_mptr_t document; @@ -3117,7 +3115,7 @@ void TRI_InitV8Queries (v8::Handle context) { rt = v8g->VocbaseColTempl; 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_SKIPLIST", JS_ByConditionSkiplist); TRI_AddMethodVocbase(rt, "BY_EXAMPLE", JS_ByExampleQuery); diff --git a/arangod/V8Server/v8-vocbase.cpp b/arangod/V8Server/v8-vocbase.cpp index 4b8be244af..82fe86dd57 100644 --- a/arangod/V8Server/v8-vocbase.cpp +++ b/arangod/V8Server/v8-vocbase.cpp @@ -1085,6 +1085,7 @@ static v8::Handle DocumentVocbaseCol_Coordinator ( // First get the initial data: string const dbname(collection->_dbName); + // TODO: someone might rename the collection while we're reading its name... string const collname(collection->_name); string key; diff --git a/js/server/modules/org/arangodb/arango-collection.js b/js/server/modules/org/arangodb/arango-collection.js index efb6069040..cb0f58726d 100644 --- a/js/server/modules/org/arangodb/arango-collection.js +++ b/js/server/modules/org/arangodb/arango-collection.js @@ -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 /// /// @FUN{@FA{collection}.firstExample(@FA{example})} /// -/// Returns the a document of a collection that match the specified example or -/// @LIT{null}. The example must be specified as paths and values. See -/// @FN{byExample} for details. +/// Returns the first document of a collection that matches the specified +/// example or @LIT{null}. The example must be specified as paths and values. +/// See @FN{byExample} for details. /// /// @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); - - if (0 < documents.documents.length) { - return documents.documents[0]; + var documents = (new simple.SimpleQueryByExample(this, e)).limit(1).toArray(); + if (documents.length > 0) { + return documents[0]; } return null;