summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRandall Leeds <randall@apache.org>2011-07-30 00:37:32 +0000
committerRandall Leeds <randall@apache.org>2011-07-30 00:37:32 +0000
commit2a92b4b41f261a8ddca496d729a39bbd20c41320 (patch)
treeaed9f2696ce665d9a2ae4ec38f06ab9758c87738
parentdaa640b113907bb28fc9b26e38849f239d353363 (diff)
Backport of r1152398 from trunk
Fix COUCHDB-1076 - views skip empty btree branches git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.1.x@1152406 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--src/couchdb/couch_db.erl6
-rw-r--r--src/couchdb/couch_view.erl12
2 files changed, 14 insertions, 4 deletions
diff --git a/src/couchdb/couch_db.erl b/src/couchdb/couch_db.erl
index 85f7e291..3a12e738 100644
--- a/src/couchdb/couch_db.erl
+++ b/src/couchdb/couch_db.erl
@@ -271,7 +271,8 @@ get_db_info(Db) ->
{ok, InfoList}.
get_design_docs(#db{fulldocinfo_by_id_btree=Btree}=Db) ->
- {ok,_, Docs} = couch_btree:fold(Btree,
+ {ok, _, Docs} = couch_view:fold(
+ #view{btree=Btree},
fun(#full_doc_info{id= <<"_design/",_/binary>>}=FullDocInfo, _Reds, AccDocs) ->
{ok, Doc} = couch_db:open_doc_int(Db, FullDocInfo, []),
{ok, [Doc | AccDocs]};
@@ -976,7 +977,8 @@ enum_docs_since(Db, SinceSeq, InFun, Acc, Options) ->
{ok, enum_docs_since_reduce_to_count(LastReduction), AccOut}.
enum_docs(Db, InFun, InAcc, Options) ->
- {ok, LastReduce, OutAcc} = couch_btree:fold(Db#db.fulldocinfo_by_id_btree, InFun, InAcc, Options),
+ {ok, LastReduce, OutAcc} = couch_view:fold(
+ #view{btree=Db#db.fulldocinfo_by_id_btree}, InFun, InAcc, Options),
{ok, enum_docs_reduce_to_count(LastReduce), OutAcc}.
% server functions
diff --git a/src/couchdb/couch_view.erl b/src/couchdb/couch_view.erl
index c9a9b2cc..88cadec7 100644
--- a/src/couchdb/couch_view.erl
+++ b/src/couchdb/couch_view.erl
@@ -252,8 +252,16 @@ fold_fun(Fun, [KV|Rest], {KVReds, Reds}, Acc) ->
fold(#view{btree=Btree}, Fun, Acc, Options) ->
WrapperFun =
- fun(KV, Reds, Acc2) ->
- fold_fun(Fun, expand_dups([KV],[]), Reds, Acc2)
+ fun(visit, KV, Reds, Acc2) ->
+ fold_fun(Fun, expand_dups([KV],[]), Reds, Acc2);
+ (traverse, LK, Red, Acc2)
+ when is_function(Fun, 4) ->
+ Fun(traverse, LK, Red, Acc2);
+ (traverse, _LK, Red, {_, Skip, _, _} = Acc2)
+ when Skip >= element(1, Red) ->
+ {skip, setelement(2, Acc2, Skip - element(1, Red))};
+ (traverse, _, _, Acc2) ->
+ {ok, Acc2}
end,
{ok, _LastReduce, _AccResult} = couch_btree:fold(Btree, WrapperFun, Acc, Options).