You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by jc...@apache.org on 2009/02/13 21:52:29 UTC
svn commit: r744240 - in /couchdb/trunk: share/www/script/couch_tests.js
src/couchdb/couch_db.hrl src/couchdb/couch_httpd_external.erl
src/couchdb/couch_httpd_show.erl src/couchdb/couch_httpd_view.erl
Author: jchris
Date: Fri Feb 13 20:52:28 2009
New Revision: 744240
URL: http://svn.apache.org/viewvc?rev=744240&view=rev
Log:
apply COUCHDB-252.
Allow _list functions to signal that iteration of the view should cease.
Thanks davisp.
Modified:
couchdb/trunk/share/www/script/couch_tests.js
couchdb/trunk/src/couchdb/couch_db.hrl
couchdb/trunk/src/couchdb/couch_httpd_external.erl
couchdb/trunk/src/couchdb/couch_httpd_show.erl
couchdb/trunk/src/couchdb/couch_httpd_view.erl
Modified: couchdb/trunk/share/www/script/couch_tests.js
URL: http://svn.apache.org/viewvc/couchdb/trunk/share/www/script/couch_tests.js?rev=744240&r1=744239&r2=744240&view=diff
==============================================================================
--- couchdb/trunk/share/www/script/couch_tests.js [utf-8] (original)
+++ couchdb/trunk/share/www/script/couch_tests.js [utf-8] Fri Feb 13 20:52:28 2009
@@ -2796,9 +2796,33 @@
}
})
}),
- qsParams: stringFun(function(head, row, req, row_number) {
+ qsParams: stringFun(function(head, row, req, row_info) {
if(head) return {body: req.query.foo};
else return {body: "\n"};
+ }),
+ stopIter: stringFun(function(head, row, req, row_info) {
+ if(head) {
+ return {body: "head"};
+ } else if(row) {
+ if(row_info.row_number > 2) return {stop: true};
+ return {body: " " + row_info.row_number};
+ } else {
+ return {body: " tail"};
+ }
+ }),
+ stopIter2: stringFun(function(head, row, req, row_info) {
+ return respondWith(req, {
+ html: function() {
+ if(head) {
+ return "head";
+ } else if(row) {
+ if(row_info.row_number > 2) return {stop: true};
+ return " " + row_info.row_number;
+ } else {
+ return " tail";
+ }
+ }
+ });
})
}
};
@@ -2870,6 +2894,15 @@
// now with extra qs params
xhr = CouchDB.request("GET", "/test_suite_db/_list/lists/qsParams/basicView?foo=blam");
T(xhr.responseText.match(/blam/));
+
+
+ // aborting iteration
+ xhr = CouchDB.request("GET", "/test_suite_db/_list/lists/stopIter/basicView");
+ T(xhr.responseText.match(/^head 0 1 2 tail$/));
+ xhr = CouchDB.request("GET", "/test_suite_db/_list/lists/stopIter2/basicView");
+ T(xhr.responseText.match(/^head 0 1 2 tail$/));
+
+
},
compact: function(debug) {
Modified: couchdb/trunk/src/couchdb/couch_db.hrl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_db.hrl?rev=744240&r1=744239&r2=744240&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_db.hrl (original)
+++ couchdb/trunk/src/couchdb/couch_db.hrl Fri Feb 13 20:52:28 2009
@@ -162,6 +162,7 @@
-record(extern_resp_args, {
code = 200,
+ stop = false,
data = <<>>,
ctype = "application/json",
headers = []
Modified: couchdb/trunk/src/couchdb/couch_httpd_external.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_external.erl?rev=744240&r1=744239&r2=744240&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_httpd_external.erl (original)
+++ couchdb/trunk/src/couchdb/couch_httpd_external.erl Fri Feb 13 20:52:28 2009
@@ -106,6 +106,8 @@
Args;
{<<"code">>, Value} ->
Args#extern_resp_args{code=Value};
+ {<<"stop">>, true} ->
+ Args#extern_resp_args{stop=true};
{<<"json">>, Value} ->
Args#extern_resp_args{
data=?JSON_ENCODE(Value),
Modified: couchdb/trunk/src/couchdb/couch_httpd_show.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_show.erl?rev=744240&r1=744239&r2=744240&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_httpd_show.erl (original)
+++ couchdb/trunk/src/couchdb/couch_httpd_show.erl Fri Feb 13 20:52:28 2009
@@ -127,13 +127,17 @@
JsonResp = couch_query_servers:render_list_row(QueryServer,
Req, Db2, {{Key, DocId}, Value}),
#extern_resp_args{
+ stop = StopIter,
data = RowBody
} = couch_httpd_external:parse_external_response(JsonResp),
RowFront2 = case RowFront of
nil -> [];
_ -> RowFront
end,
- send_chunk(Resp, RowFront2 ++ binary_to_list(RowBody))
+ case StopIter of
+ true -> stop;
+ _ -> send_chunk(Resp, RowFront2 ++ binary_to_list(RowBody))
+ end
end,
FoldlFun = couch_httpd_view:make_view_fold_fun(Req, QueryArgs, Db, RowCount,
Modified: couchdb/trunk/src/couchdb/couch_httpd_view.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/couchdb/couch_httpd_view.erl?rev=744240&r1=744239&r2=744240&view=diff
==============================================================================
--- couchdb/trunk/src/couchdb/couch_httpd_view.erl (original)
+++ couchdb/trunk/src/couchdb/couch_httpd_view.erl Fri Feb 13 20:52:28 2009
@@ -416,13 +416,17 @@
Offset = ReduceCountFun(OffsetReds),
{ok, Resp2, BeginBody} = StartRespFun(Req, 200,
TotalViewCount, Offset),
- SendRowFun(Resp2, Db,
- {{Key, DocId}, Value}, BeginBody, IncludeDocs),
- {ok, {AccLimit - 1, 0, Resp2, AccRevRows}};
+ case SendRowFun(Resp2, Db,
+ {{Key, DocId}, Value}, BeginBody, IncludeDocs) of
+ stop -> {stop, {AccLimit - 1, 0, Resp2, AccRevRows}};
+ _ -> {ok, {AccLimit - 1, 0, Resp2, AccRevRows}}
+ end;
{_, AccLimit, _, Resp} when (AccLimit > 0) ->
- SendRowFun(Resp, Db,
- {{Key, DocId}, Value}, nil, IncludeDocs),
- {ok, {AccLimit - 1, 0, Resp, AccRevRows}}
+ case SendRowFun(Resp, Db,
+ {{Key, DocId}, Value}, nil, IncludeDocs) of
+ stop -> {stop, {AccLimit - 1, 0, Resp, AccRevRows}};
+ _ -> {ok, {AccLimit - 1, 0, Resp, AccRevRows}}
+ end
end
end.