mirror of https://gitee.com/bigwinds/arangodb
implemented first() and last()
This commit is contained in:
parent
83b0cd8e5b
commit
4f3070715c
|
@ -60,6 +60,14 @@ is specified, the server will pick a reasonable default value.
|
||||||
@anchor SimpleQueryToArray
|
@anchor SimpleQueryToArray
|
||||||
@copydetails JSF_ArangoCollection_prototype_toArray
|
@copydetails JSF_ArangoCollection_prototype_toArray
|
||||||
|
|
||||||
|
@CLEARPAGE
|
||||||
|
@anchor SimpleQueryFirst
|
||||||
|
@copydetails JSF_ArangoCollection_prototype_first
|
||||||
|
|
||||||
|
@CLEARPAGE
|
||||||
|
@anchor SimpleQueryLast
|
||||||
|
@copydetails JSF_ArangoCollection_prototype_last
|
||||||
|
|
||||||
@CLEARPAGE
|
@CLEARPAGE
|
||||||
Geo Queries {#SimpleQueriesGeoQueries}
|
Geo Queries {#SimpleQueriesGeoQueries}
|
||||||
======================================
|
======================================
|
||||||
|
|
|
@ -10,6 +10,8 @@ TOC {#SimpleQueriesTOC}
|
||||||
- @ref SimpleQueryAny "collection.any"
|
- @ref SimpleQueryAny "collection.any"
|
||||||
- @ref SimpleQueryCollectionCount "collection.count"
|
- @ref SimpleQueryCollectionCount "collection.count"
|
||||||
- @ref SimpleQueryToArray "collection.toArray"
|
- @ref SimpleQueryToArray "collection.toArray"
|
||||||
|
- @ref SimpleQueryFirst "collection.first"
|
||||||
|
- @ref SimpleQueryLast "collection.last"
|
||||||
- @ref SimpleQueriesGeoQueries
|
- @ref SimpleQueriesGeoQueries
|
||||||
- @ref SimpleQueryNear "collection.near"
|
- @ref SimpleQueryNear "collection.near"
|
||||||
- @ref SimpleQueryWithin "collection.within"
|
- @ref SimpleQueryWithin "collection.within"
|
||||||
|
|
|
@ -2445,43 +2445,15 @@ static v8::Handle<v8::Value> JS_InEdgesQuery (v8::Arguments const& argv) {
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief selects the n first documents in the collection
|
/// @brief selects the n first documents in the collection
|
||||||
///
|
|
||||||
/// @FUN{@FA{collection}.first(@FA{count})}
|
|
||||||
///
|
|
||||||
/// The @FN{first} method returns the n first documents from the collection, in
|
|
||||||
/// order of document insertion/update time.
|
|
||||||
///
|
|
||||||
/// If called with the @FA{count} argument, the result is a list of up to
|
|
||||||
/// @FA{count} documents. If @FA{count} is bigger than the number of documents
|
|
||||||
/// in the collection, then the result will contain as many documents as there
|
|
||||||
/// are in the collection.
|
|
||||||
/// The result list is ordered, with the "oldest" documents being positioned at
|
|
||||||
/// the beginning of the result list.
|
|
||||||
///
|
|
||||||
/// When called without an argument, the result is the first document from the
|
|
||||||
/// collection. If the collection does not contain any documents, the result
|
|
||||||
/// returned is @LIT{null}.
|
|
||||||
///
|
|
||||||
/// @EXAMPLES
|
|
||||||
///
|
|
||||||
/// @code
|
|
||||||
/// arangod> db.example.first(1)
|
|
||||||
/// [ { "_id" : "example/222716379559", "_rev" : "222716379559", "Hello" : "World" } ]
|
|
||||||
/// @endcode
|
|
||||||
///
|
|
||||||
/// @code
|
|
||||||
/// arangod> db.example.first()
|
|
||||||
/// { "_id" : "example/222716379559", "_rev" : "222716379559", "Hello" : "World" }
|
|
||||||
/// @endcode
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static v8::Handle<v8::Value> JS_FirstQuery (v8::Arguments const& argv) {
|
static v8::Handle<v8::Value> JS_FirstQuery (v8::Arguments const& argv) {
|
||||||
v8::HandleScope scope;
|
v8::HandleScope scope;
|
||||||
|
|
||||||
if (argv.Length() > 1) {
|
if (argv.Length() > 1) {
|
||||||
TRI_V8_EXCEPTION_USAGE(scope, "first(<count>)");
|
TRI_V8_EXCEPTION_USAGE(scope, "FIRST(<count>)");
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t count = 1;
|
int64_t count = 1;
|
||||||
bool returnList = false;
|
bool returnList = false;
|
||||||
|
|
||||||
|
@ -2501,8 +2473,6 @@ static v8::Handle<v8::Value> JS_FirstQuery (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;
|
||||||
|
|
||||||
|
@ -2730,41 +2700,13 @@ static v8::Handle<v8::Value> JS_FulltextQuery (v8::Arguments const& argv) {
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief selects the n last documents in the collection
|
/// @brief selects the n last documents in the collection
|
||||||
///
|
|
||||||
/// @FUN{@FA{collection}.last(@FA{count})}
|
|
||||||
///
|
|
||||||
/// The @FN{first} method returns the n last documents from the collection, in
|
|
||||||
/// order of document insertion/update time.
|
|
||||||
///
|
|
||||||
/// If called with the @FA{count} argument, the result is a list of up to
|
|
||||||
/// @FA{count} documents. If @FA{count} is bigger than the number of documents
|
|
||||||
/// in the collection, then the result will contain as many documents as there
|
|
||||||
/// are in the collection.
|
|
||||||
/// The result list is ordered, with the "latest" documents being positioned at
|
|
||||||
/// the beginning of the result list.
|
|
||||||
///
|
|
||||||
/// When called without an argument, the result is the last document from the
|
|
||||||
/// collection. If the collection does not contain any documents, the result
|
|
||||||
/// returned is @LIT{null}.
|
|
||||||
///
|
|
||||||
/// @EXAMPLES
|
|
||||||
///
|
|
||||||
/// @code
|
|
||||||
/// arangod> db.example.last(1)
|
|
||||||
/// [ { "_id" : "example/222716379559", "_rev" : "222716379559", "Hello" : "World" } ]
|
|
||||||
/// @endcode
|
|
||||||
///
|
|
||||||
/// @code
|
|
||||||
/// arangod> db.example.last()
|
|
||||||
/// { "_id" : "example/222716379559", "_rev" : "222716379559", "Hello" : "World" }
|
|
||||||
/// @endcode
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static v8::Handle<v8::Value> JS_LastQuery (v8::Arguments const& argv) {
|
static v8::Handle<v8::Value> JS_LastQuery (v8::Arguments const& argv) {
|
||||||
v8::HandleScope scope;
|
v8::HandleScope scope;
|
||||||
|
|
||||||
if (argv.Length() > 1) {
|
if (argv.Length() > 1) {
|
||||||
TRI_V8_EXCEPTION_USAGE(scope, "last(<count>)");
|
TRI_V8_EXCEPTION_USAGE(scope, "LAST(<count>)");
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t count = 1;
|
int64_t count = 1;
|
||||||
|
@ -3129,10 +3071,10 @@ void TRI_InitV8Queries (v8::Handle<v8::Context> context) {
|
||||||
TRI_AddMethodVocbase(rt, "BY_EXAMPLE_SKIPLIST", JS_ByExampleSkiplist);
|
TRI_AddMethodVocbase(rt, "BY_EXAMPLE_SKIPLIST", JS_ByExampleSkiplist);
|
||||||
TRI_AddMethodVocbase(rt, "checksum", JS_ChecksumCollection);
|
TRI_AddMethodVocbase(rt, "checksum", JS_ChecksumCollection);
|
||||||
TRI_AddMethodVocbase(rt, "edges", JS_EdgesQuery);
|
TRI_AddMethodVocbase(rt, "edges", JS_EdgesQuery);
|
||||||
TRI_AddMethodVocbase(rt, "first", JS_FirstQuery);
|
TRI_AddMethodVocbase(rt, "FIRST", JS_FirstQuery);
|
||||||
TRI_AddMethodVocbase(rt, "FULLTEXT", JS_FulltextQuery);
|
TRI_AddMethodVocbase(rt, "FULLTEXT", JS_FulltextQuery);
|
||||||
TRI_AddMethodVocbase(rt, "inEdges", JS_InEdgesQuery);
|
TRI_AddMethodVocbase(rt, "inEdges", JS_InEdgesQuery);
|
||||||
TRI_AddMethodVocbase(rt, "last", JS_LastQuery);
|
TRI_AddMethodVocbase(rt, "LAST", JS_LastQuery);
|
||||||
TRI_AddMethodVocbase(rt, "NEAR", JS_NearQuery);
|
TRI_AddMethodVocbase(rt, "NEAR", JS_NearQuery);
|
||||||
|
|
||||||
// internal method. not intended to be used by end-users
|
// internal method. not intended to be used by end-users
|
||||||
|
|
|
@ -1031,19 +1031,13 @@ actions.defineHttp({
|
||||||
/// @fn JSA_put_api_simple_first
|
/// @fn JSA_put_api_simple_first
|
||||||
/// @brief returns the first document(s) of a collection
|
/// @brief returns the first document(s) of a collection
|
||||||
///
|
///
|
||||||
/// @RESTHEADER{PUT /_api/simple/first,executes simple query first}
|
/// @RESTHEADER{PUT /_api/simple/first,returns the first document(s) of a collection}
|
||||||
///
|
///
|
||||||
/// @RESTBODYPARAM{query,json,required}
|
/// @RESTBODYPARAM{query,json,required}
|
||||||
/// Contains the query.
|
/// Contains the query.
|
||||||
///
|
///
|
||||||
/// @RESTDESCRIPTION
|
/// @RESTDESCRIPTION
|
||||||
///
|
///
|
||||||
/// The request body must be a JSON object with the following attributes:
|
|
||||||
/// - `collection`: the name of the collection
|
|
||||||
///
|
|
||||||
/// - `count`: the number of documents to return at most. Specifiying count is
|
|
||||||
/// optional. If it is not specified, it defaults to 1.
|
|
||||||
///
|
|
||||||
/// This will return the first documents from the collection, in the order of
|
/// This will return the first documents from the collection, in the order of
|
||||||
/// insertion/update time. When the `count` argument is supplied, the result
|
/// insertion/update time. When the `count` argument is supplied, the result
|
||||||
/// will be a list of documents, with the "oldest" document being first in the
|
/// will be a list of documents, with the "oldest" document being first in the
|
||||||
|
@ -1051,6 +1045,15 @@ actions.defineHttp({
|
||||||
/// If the `count` argument is not supplied, the result is the "oldest" document
|
/// If the `count` argument is not supplied, the result is the "oldest" document
|
||||||
/// of the collection, or `null` if the collection is empty.
|
/// of the collection, or `null` if the collection is empty.
|
||||||
///
|
///
|
||||||
|
/// The request body must be a JSON object with the following attributes:
|
||||||
|
/// - `collection`: the name of the collection
|
||||||
|
///
|
||||||
|
/// - `count`: the number of documents to return at most. Specifiying count is
|
||||||
|
/// optional. If it is not specified, it defaults to 1.
|
||||||
|
///
|
||||||
|
/// Note: this method is not supported for sharded collections with more than
|
||||||
|
/// one shard.
|
||||||
|
///
|
||||||
/// @RESTRETURNCODES
|
/// @RESTRETURNCODES
|
||||||
///
|
///
|
||||||
/// @RESTRETURNCODE{200}
|
/// @RESTRETURNCODE{200}
|
||||||
|
@ -1146,27 +1149,30 @@ actions.defineHttp({
|
||||||
/// @fn JSA_put_api_simple_last
|
/// @fn JSA_put_api_simple_last
|
||||||
/// @brief returns the last document(s) of a collection
|
/// @brief returns the last document(s) of a collection
|
||||||
///
|
///
|
||||||
/// @RESTHEADER{PUT /_api/simple/last,executes simple query last}
|
/// @RESTHEADER{PUT /_api/simple/last,returns the last document(s) of a collection}
|
||||||
///
|
///
|
||||||
/// @RESTBODYPARAM{query,json,required}
|
/// @RESTBODYPARAM{query,json,required}
|
||||||
/// Contains the query.
|
/// Contains the query.
|
||||||
///
|
///
|
||||||
/// @RESTDESCRIPTION
|
/// @RESTDESCRIPTION
|
||||||
///
|
///
|
||||||
|
/// This will return the last documents from the collection, in the order of
|
||||||
|
/// insertion/update time. When the `count` argument is supplied, the result
|
||||||
|
/// will be a list of documents, with the "latest" document being first in the
|
||||||
|
/// result list.
|
||||||
|
///
|
||||||
/// The request body must be a JSON object with the following attributes:
|
/// The request body must be a JSON object with the following attributes:
|
||||||
/// - `collection`: the name of the collection
|
/// - `collection`: the name of the collection
|
||||||
///
|
///
|
||||||
/// - `count`: the number of documents to return at most. Specifiying count is
|
/// - `count`: the number of documents to return at most. Specifiying count is
|
||||||
/// optional. If it is not specified, it defaults to 1.
|
/// optional. If it is not specified, it defaults to 1.
|
||||||
///
|
///
|
||||||
/// This will return the last documents from the collection, in the order of
|
|
||||||
/// insertion/update time. When the `count` argument is supplied, the result
|
|
||||||
/// will be a list of documents, with the "latest" document being first in the
|
|
||||||
/// result list.
|
|
||||||
///
|
|
||||||
/// If the `count` argument is not supplied, the result is the "latest" document
|
/// If the `count` argument is not supplied, the result is the "latest" document
|
||||||
/// of the collection, or `null` if the collection is empty.
|
/// of the collection, or `null` if the collection is empty.
|
||||||
///
|
///
|
||||||
|
/// Note: this method is not supported for sharded collections with more than
|
||||||
|
/// one shard.
|
||||||
|
///
|
||||||
/// @RESTRETURNCODES
|
/// @RESTRETURNCODES
|
||||||
///
|
///
|
||||||
/// @RESTRETURNCODE{200}
|
/// @RESTRETURNCODE{200}
|
||||||
|
|
|
@ -253,6 +253,161 @@ ArangoCollection.prototype.any = function () {
|
||||||
return this.ANY();
|
return this.ANY();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief selects the n first documents in the collection
|
||||||
|
///
|
||||||
|
/// @FUN{@FA{collection}.first(@FA{count})}
|
||||||
|
///
|
||||||
|
/// The @FN{first} method returns the n first documents from the collection, in
|
||||||
|
/// order of document insertion/update time.
|
||||||
|
///
|
||||||
|
/// If called with the @FA{count} argument, the result is a list of up to
|
||||||
|
/// @FA{count} documents. If @FA{count} is bigger than the number of documents
|
||||||
|
/// in the collection, then the result will contain as many documents as there
|
||||||
|
/// are in the collection.
|
||||||
|
/// The result list is ordered, with the "oldest" documents being positioned at
|
||||||
|
/// the beginning of the result list.
|
||||||
|
///
|
||||||
|
/// When called without an argument, the result is the first document from the
|
||||||
|
/// collection. If the collection does not contain any documents, the result
|
||||||
|
/// returned is @LIT{null}.
|
||||||
|
///
|
||||||
|
/// Note: this method is not supported on sharded collections with more than
|
||||||
|
/// one shard.
|
||||||
|
///
|
||||||
|
/// @EXAMPLES
|
||||||
|
///
|
||||||
|
/// @code
|
||||||
|
/// arangod> db.example.first(1)
|
||||||
|
/// [ { "_id" : "example/222716379559", "_rev" : "222716379559", "Hello" : "World" } ]
|
||||||
|
/// @endcode
|
||||||
|
///
|
||||||
|
/// @code
|
||||||
|
/// arangod> db.example.first()
|
||||||
|
/// { "_id" : "example/222716379559", "_rev" : "222716379559", "Hello" : "World" }
|
||||||
|
/// @endcode
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ArangoCollection.prototype.first = function (count) {
|
||||||
|
var cluster = require("org/arangodb/cluster");
|
||||||
|
|
||||||
|
if (cluster.isCoordinator()) {
|
||||||
|
var dbName = require("internal").db._name();
|
||||||
|
var shards = cluster.shardList(dbName, this.name());
|
||||||
|
|
||||||
|
if (shards.length !== 1) {
|
||||||
|
var err = new ArangoError();
|
||||||
|
err.errorNum = internal.errors.ERROR_NOT_IMPLEMENTED.code;
|
||||||
|
err.errorMessage = "operation is not supported in clustered collections with multiple shards";
|
||||||
|
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
|
var coord = { coordTransactionID: ArangoClusterInfo.uniqid() };
|
||||||
|
var options = { coordTransactionID: coord.coordTransactionID, timeout: 360 };
|
||||||
|
var shard = shards[0];
|
||||||
|
|
||||||
|
ArangoClusterComm.asyncRequest("put",
|
||||||
|
"shard:" + shard,
|
||||||
|
dbName,
|
||||||
|
"/_api/simple/first",
|
||||||
|
JSON.stringify({
|
||||||
|
collection: shard,
|
||||||
|
count: count
|
||||||
|
}),
|
||||||
|
{ },
|
||||||
|
options);
|
||||||
|
|
||||||
|
var results = cluster.wait(coord, shards), i;
|
||||||
|
|
||||||
|
if (results.length) {
|
||||||
|
var body = JSON.parse(results[i].body);
|
||||||
|
return body.result || null;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return this.FIRST(count);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// @brief selects the n last documents in the collection
|
||||||
|
///
|
||||||
|
/// @FUN{@FA{collection}.last(@FA{count})}
|
||||||
|
///
|
||||||
|
/// The @FN{first} method returns the n last documents from the collection, in
|
||||||
|
/// order of document insertion/update time.
|
||||||
|
///
|
||||||
|
/// If called with the @FA{count} argument, the result is a list of up to
|
||||||
|
/// @FA{count} documents. If @FA{count} is bigger than the number of documents
|
||||||
|
/// in the collection, then the result will contain as many documents as there
|
||||||
|
/// are in the collection.
|
||||||
|
/// The result list is ordered, with the "latest" documents being positioned at
|
||||||
|
/// the beginning of the result list.
|
||||||
|
///
|
||||||
|
/// When called without an argument, the result is the last document from the
|
||||||
|
/// collection. If the collection does not contain any documents, the result
|
||||||
|
/// returned is @LIT{null}.
|
||||||
|
///
|
||||||
|
/// Note: this method is not supported on sharded collections with more than
|
||||||
|
/// one shard.
|
||||||
|
///
|
||||||
|
/// @EXAMPLES
|
||||||
|
///
|
||||||
|
/// @code
|
||||||
|
/// arangod> db.example.last(1)
|
||||||
|
/// [ { "_id" : "example/222716379559", "_rev" : "222716379559", "Hello" : "World" } ]
|
||||||
|
/// @endcode
|
||||||
|
///
|
||||||
|
/// @code
|
||||||
|
/// arangod> db.example.last()
|
||||||
|
/// { "_id" : "example/222716379559", "_rev" : "222716379559", "Hello" : "World" }
|
||||||
|
/// @endcode
|
||||||
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ArangoCollection.prototype.last = function (count) {
|
||||||
|
var cluster = require("org/arangodb/cluster");
|
||||||
|
|
||||||
|
if (cluster.isCoordinator()) {
|
||||||
|
var dbName = require("internal").db._name();
|
||||||
|
var shards = cluster.shardList(dbName, this.name());
|
||||||
|
|
||||||
|
if (shards.length !== 1) {
|
||||||
|
var err = new ArangoError();
|
||||||
|
err.errorNum = internal.errors.ERROR_NOT_IMPLEMENTED.code;
|
||||||
|
err.errorMessage = "operation is not supported in clustered collections with multiple shards";
|
||||||
|
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
|
||||||
|
var coord = { coordTransactionID: ArangoClusterInfo.uniqid() };
|
||||||
|
var options = { coordTransactionID: coord.coordTransactionID, timeout: 360 };
|
||||||
|
var shard = shards[0];
|
||||||
|
|
||||||
|
ArangoClusterComm.asyncRequest("put",
|
||||||
|
"shard:" + shard,
|
||||||
|
dbName,
|
||||||
|
"/_api/simple/last",
|
||||||
|
JSON.stringify({
|
||||||
|
collection: shard,
|
||||||
|
count: count
|
||||||
|
}),
|
||||||
|
{ },
|
||||||
|
options);
|
||||||
|
|
||||||
|
var results = cluster.wait(coord, shards), i;
|
||||||
|
|
||||||
|
if (results.length) {
|
||||||
|
var body = JSON.parse(results[i].body);
|
||||||
|
return body.result || null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return this.LAST(count);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
/// @brief constructs a query-by-example for a collection
|
/// @brief constructs a query-by-example for a collection
|
||||||
///
|
///
|
||||||
|
|
Loading…
Reference in New Issue