summaryrefslogtreecommitdiff
path: root/src/couchdb
diff options
context:
space:
mode:
authorDamien F. Katz <damien@apache.org>2008-05-23 16:51:46 +0000
committerDamien F. Katz <damien@apache.org>2008-05-23 16:51:46 +0000
commitb5c7b8bcfff3e361507b8ddb64edc94f90c13514 (patch)
tree11692916ee8d79824f72c52fe9b92427cde3e246 /src/couchdb
parentda666b43ed1f2f28223fd5eb6568f5df60b0547e (diff)
fix for bug with reusing map btree indexes when multiple views have the same map function
git-svn-id: https://svn.apache.org/repos/asf/incubator/couchdb/trunk@659596 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/couchdb')
-rw-r--r--src/couchdb/couch_btree.erl56
-rw-r--r--src/couchdb/couch_view.erl4
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;