summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien F. Katz <damien@apache.org>2008-07-29 18:23:42 +0000
committerDamien F. Katz <damien@apache.org>2008-07-29 18:23:42 +0000
commit34b12e7537d8bc020023c15bde9789d3bf29e8e1 (patch)
tree166dcc65354ef2e89e00a8f1b4e6fd30c39ad38c
parent69228815a04443a7a9063a75608117c674a9a822 (diff)
Fix for problem with count query arg in grouped reduce views. Previous fix would keep enumerating over subsequent view results despite not returning them.
git-svn-id: https://svn.apache.org/repos/asf/incubator/couchdb/trunk@680796 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--share/www/script/couch_tests.js6
-rw-r--r--src/couchdb/couch_btree.erl21
-rw-r--r--src/couchdb/couch_httpd.erl2
3 files changed, 19 insertions, 10 deletions
diff --git a/share/www/script/couch_tests.js b/share/www/script/couch_tests.js
index 28afeaa9..0308ed8d 100644
--- a/share/www/script/couch_tests.js
+++ b/share/www/script/couch_tests.js
@@ -290,6 +290,12 @@ var tests = {
result = db.query(map, reduce, {startkey: 4, endkey: 6});
T(result.rows[0].value == 15);
+ result = db.query(map, reduce, {group:true, count:3});
+ T(result.rows.length == 3);
+ T(result.rows[0].value == 1);
+ T(result.rows[1].value == 2);
+ T(result.rows[2].value == 3);
+
for(var i=1; i<numDocs/2; i+=30) {
result = db.query(map, reduce, {startkey: i, endkey: numDocs - i});
T(result.rows[0].value == summate(numDocs-i) - summate(i-1));
diff --git a/src/couchdb/couch_btree.erl b/src/couchdb/couch_btree.erl
index ac19b4e9..563e6040 100644
--- a/src/couchdb/couch_btree.erl
+++ b/src/couchdb/couch_btree.erl
@@ -78,17 +78,20 @@ fold_reduce(#btree{root=Root}=Bt, Dir, StartKey, EndKey, KeyGroupFun, Fun, Acc)
rev -> {EndKey, StartKey};
fwd -> {StartKey, EndKey}
end,
- {ok, Acc2, GroupedRedsAcc2, GroupedKVsAcc2, GroupedKey2} =
- reduce_stream_node(Bt, Dir, Root, StartKey2, EndKey2, nil, [], [],
- KeyGroupFun, Fun, Acc),
- if GroupedKey2 == nil ->
- {ok, Acc2};
- true ->
- case (catch Fun(GroupedKey2, {GroupedKVsAcc2, GroupedRedsAcc2}, Acc2)) of
+ try
+ {ok, Acc2, GroupedRedsAcc2, GroupedKVsAcc2, GroupedKey2} =
+ reduce_stream_node(Bt, Dir, Root, StartKey2, EndKey2, nil, [], [],
+ KeyGroupFun, Fun, Acc),
+ if GroupedKey2 == nil ->
+ {ok, Acc2};
+ true ->
+ case Fun(GroupedKey2, {GroupedKVsAcc2, GroupedRedsAcc2}, Acc2) of
{ok, Acc3} -> {ok, Acc3};
- {stop, Acc3} -> {ok, Acc3};
- Else -> throw(Else)
+ {stop, Acc3} -> {ok, Acc3}
+ end
end
+ catch
+ throw:{stop, AccDone} -> {ok, AccDone}
end.
full_reduce(#btree{root=nil,reduce=Reduce}) ->
diff --git a/src/couchdb/couch_httpd.erl b/src/couchdb/couch_httpd.erl
index 49b8e9bc..88271390 100644
--- a/src/couchdb/couch_httpd.erl
+++ b/src/couchdb/couch_httpd.erl
@@ -465,7 +465,7 @@ output_reduce_view(Req, View) ->
fun(_Key, _Red, {AccSeparator,AccSkip,AccCount}) when AccSkip > 0 ->
{ok, {AccSeparator,AccSkip-1,AccCount}};
(_Key, _Red, {AccSeparator,0,AccCount}) when AccCount == 0 ->
- {ok, {AccSeparator,0,AccCount}};
+ {stop, {AccSeparator,0,AccCount}};
(_Key, Red, {AccSeparator,0,AccCount}) when GroupLevel == 0 ->
Json = lists:flatten(cjson:encode({obj, [{key, null}, {value, Red}]})),
Resp:write_chunk(AccSeparator ++ Json),