couchdb-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From rand...@apache.org
Subject svn commit: r1152405 - /couchdb/branches/1.1.x/src/couchdb/couch_btree.erl
Date Sat, 30 Jul 2011 00:37:28 GMT
Author: randall
Date: Sat Jul 30 00:37:28 2011
New Revision: 1152405

URL: http://svn.apache.org/viewvc?rev=1152405&view=rev
Log:
Backport of r1152397 from trunk

Call traversal handlers in btree folds

Previously the fold function was only invoked for leafs.
With this change it's possible to define a fold function which is called
for inner nodes and can return a tuple {skip, Acc} in order to skip
exploration of the branch.

Modified:
    couchdb/branches/1.1.x/src/couchdb/couch_btree.erl

Modified: couchdb/branches/1.1.x/src/couchdb/couch_btree.erl
URL: http://svn.apache.org/viewvc/couchdb/branches/1.1.x/src/couchdb/couch_btree.erl?rev=1152405&r1=1152404&r2=1152405&view=diff
==============================================================================
--- couchdb/branches/1.1.x/src/couchdb/couch_btree.erl (original)
+++ couchdb/branches/1.1.x/src/couchdb/couch_btree.erl Sat Jul 30 00:37:28 2011
@@ -105,9 +105,17 @@ full_reduce(#btree{root={_P, Red}}) ->
 
 % wraps a 2 arity function with the proper 3 arity function
 convert_fun_arity(Fun) when is_function(Fun, 2) ->
-    fun(KV, _Reds, AccIn) -> Fun(KV, AccIn) end;
+    fun
+        (visit, KV, _Reds, AccIn) -> Fun(KV, AccIn);
+        (traverse, _K, _Red, AccIn) -> {ok, AccIn}
+    end;
 convert_fun_arity(Fun) when is_function(Fun, 3) ->
-    Fun.    % Already arity 3
+    fun
+        (visit, KV, Reds, AccIn) -> Fun(KV, Reds, AccIn);
+        (traverse, _K, _Red, AccIn) -> {ok, AccIn}
+    end;
+convert_fun_arity(Fun) when is_function(Fun, 4) ->
+    Fun.    % Already arity 4
 
 make_key_in_end_range_function(#btree{less=Less}, fwd, Options) ->
     case couch_util:get_value(end_key_gt, Options) of
@@ -604,12 +612,17 @@ stream_node(Bt, Reds, {Pointer, _Reds}, 
 
 stream_kp_node(_Bt, _Reds, [], _InRange, _Dir, _Fun, Acc) ->
     {ok, Acc};
-stream_kp_node(Bt, Reds, [{_Key, {Pointer, Red}} | Rest], InRange, Dir, Fun, Acc) ->
-    case stream_node(Bt, Reds, {Pointer, Red}, InRange, Dir, Fun, Acc) of
+stream_kp_node(Bt, Reds, [{Key, {Pointer, Red}} | Rest], InRange, Dir, Fun, Acc) ->
+    case Fun(traverse, Key, Red, Acc) of
     {ok, Acc2} ->
-        stream_kp_node(Bt, [Red | Reds], Rest, InRange, Dir, Fun, Acc2);
-    {stop, LastReds, Acc2} ->
-        {stop, LastReds, Acc2}
+        case stream_node(Bt, Reds, {Pointer, Red}, InRange, Dir, Fun, Acc2) of
+        {ok, Acc3} ->
+            stream_kp_node(Bt, [Red | Reds], Rest, InRange, Dir, Fun, Acc3);
+        {stop, LastReds, Acc3} ->
+            {stop, LastReds, Acc3}
+        end;
+    {skip, Acc2} ->
+        stream_kp_node(Bt, [Red | Reds], Rest, InRange, Dir, Fun, Acc2)
     end.
 
 drop_nodes(_Bt, Reds, _StartKey, []) ->
@@ -670,7 +683,7 @@ stream_kv_node2(Bt, Reds, PrevKVs, [{K,V
         {stop, {PrevKVs, Reds}, Acc};
     true ->
         AssembledKV = assemble(Bt, K, V),
-        case Fun(AssembledKV, {PrevKVs, Reds}, Acc) of
+        case Fun(visit, AssembledKV, {PrevKVs, Reds}, Acc) of
         {ok, Acc2} ->
             stream_kv_node2(Bt, Reds, [AssembledKV | PrevKVs], RestKVs, InRange, Dir, Fun,
Acc2);
         {stop, Acc2} ->



Mime
View raw message