diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/couchdb/couch_btree.erl | 56 | ||||
| -rw-r--r-- | src/couchdb/couch_view.erl | 4 | 
2 files changed, 31 insertions, 29 deletions
| diff --git a/src/couchdb/couch_btree.erl b/src/couchdb/couch_btree.erl index 57013ee9..3d95ae5c 100644 --- a/src/couchdb/couch_btree.erl +++ b/src/couchdb/couch_btree.erl @@ -390,40 +390,42 @@ modify_kvnode(Bt, [{Key, Value} | RestKVs], [{ActionType, ActionKey, ActionValue      end. +collect_node(_Bt, {P, R}, nil, nil) -> +    {[], [{nil, {P,R}}]};  collect_node(Bt, {P, R}, KeyStart, KeyEnd) ->      case get_node(Bt, P) of      {kp_node, NodeList} ->          collect_kp_node(Bt, NodeList, KeyStart, KeyEnd);      {kv_node, KVs} -> -        GTEKeyStartKVs = -        case KeyStart of -        nil -> -            KVs; -        _ -> -            lists:dropwhile( -                fun({Key,_}) -> -                    less(Bt, Key, KeyStart) -                end, KVs) -        end, -        KVs2 = -        case KeyEnd of -        nil -> -            GTEKeyStartKVs; -        _ -> -            lists:dropwhile( -                fun({Key,_}) ->  -                    less(Bt, KeyEnd, Key) -                end, lists:reverse(GTEKeyStartKVs)) -        end, -        case length(KVs2) == length(KVs) of -        true -> % got full node, return the already calculated reduction -            {[], [{nil, {P, R}}]}; -        false -> % otherwise return the keyvalues for later reduction -            {[assemble(Bt,K,V) || {K,V} <- KVs2], []} -        end +        collect_kv_node(Bt, {P,R}, KVs, KeyStart, KeyEnd)      end. - +collect_kv_node(Bt, {P,R}, KVs, KeyStart, KeyEnd) -> +    GTEKeyStartKVs = +    case KeyStart of +    nil -> +        KVs; +    _ -> +        lists:dropwhile(fun({Key,_}) -> less(Bt, Key, KeyStart) end, KVs) +    end, +    KVs2 = +    case KeyEnd of +    nil -> +        GTEKeyStartKVs; +    _ -> +        lists:dropwhile( +            fun({Key,_}) ->  +                less(Bt, KeyEnd, Key) +            end, lists:reverse(GTEKeyStartKVs)) +    end, +    case length(KVs2) == length(KVs) of +    true -> % got full node, return the already calculated reduction +        {[], [{nil, {P, R}}]}; +    false -> % otherwise return the keyvalues for later reduction +        {[assemble(Bt,K,V) || {K,V} <- KVs2], []} +    end. +         +          collect_kp_node(Bt, NodeList, KeyStart, KeyEnd) ->         Nodes =      case KeyStart of diff --git a/src/couchdb/couch_view.erl b/src/couchdb/couch_view.erl index b14f4564..d106fdc2 100644 --- a/src/couchdb/couch_view.erl +++ b/src/couchdb/couch_view.erl @@ -116,8 +116,8 @@ reduce({reduce, NthRed, Lang, #view{btree=Bt, reduce_funs=RedFuns}}, Key1, Key2)              {ok, Reduced} = couch_query_servers:combine(Lang, [FunSrc], UserReds),              {0, PreResultPadding ++ Reduced ++ PostResultPadding}          end, -    {_, [FinalReduction]} = couch_btree:final_reduce(ReduceFun, PartialReductions), -    {ok, FinalReduction}. +    {_, FinalReds} = couch_btree:final_reduce(ReduceFun, PartialReductions), +    {ok, lists:nth(NthRed, FinalReds)}.  get_key_pos(_Key, [], _N) ->      0; | 
