summaryrefslogtreecommitdiff
path: root/src
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 /src
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
Diffstat (limited to 'src')
-rw-r--r--src/couchdb/couch_btree.erl21
-rw-r--r--src/couchdb/couch_httpd.erl2
2 files changed, 13 insertions, 10 deletions
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),