summaryrefslogtreecommitdiff
path: root/src/couchdb/couch_view.erl
diff options
context:
space:
mode:
authorDamien F. Katz <damien@apache.org>2008-05-29 20:51:14 +0000
committerDamien F. Katz <damien@apache.org>2008-05-29 20:51:14 +0000
commit7e897a21ca5fa417b63abce023e775d55d3b6641 (patch)
treef5bbcad9f631755b21d3fbe68409021da351f4f0 /src/couchdb/couch_view.erl
parent333d18cf62273159fe6c86e0f11d35511e6f8fb3 (diff)
Grouped reduce support. Needs performance work.
git-svn-id: https://svn.apache.org/repos/asf/incubator/couchdb/trunk@661476 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src/couchdb/couch_view.erl')
-rw-r--r--src/couchdb/couch_view.erl32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/couchdb/couch_view.erl b/src/couchdb/couch_view.erl
index d106fdc2..c44a9ba8 100644
--- a/src/couchdb/couch_view.erl
+++ b/src/couchdb/couch_view.erl
@@ -17,7 +17,7 @@
-export([start_link/1,fold/4,fold/5,less_json/2, start_update_loop/3, start_temp_update_loop/5]).
-export([init/1,terminate/2,handle_call/3,handle_cast/2,handle_info/2,code_change/3]).
--export([get_reduce_view/1, get_map_view/1,get_row_count/1,reduce_to_count/1, reduce/3]).
+-export([get_reduce_view/1, get_map_view/1,get_row_count/1,reduce_to_count/1, fold_reduce/7]).
-include("couch_db.hrl").
@@ -79,8 +79,8 @@ get_updated_group(Pid) ->
end.
get_row_count(#view{btree=Bt}) ->
- {ok, Reds} = couch_btree:partial_reduce(Bt, nil, nil),
- {ok, reduce_to_count(Reds)}.
+ {ok, {Count, _Reds}} = couch_btree:full_reduce(Bt),
+ {ok, Count}.
get_reduce_view({temp, DbName, Type, MapSrc, RedSrc}) ->
{ok, #group{views=[View]}} = get_updated_group(get_temp_updater(DbName, Type, MapSrc, RedSrc)),
@@ -98,16 +98,20 @@ get_reduce_view0(Name, Lang, [#view{reduce_funs=RedFuns}=View|Rest]) ->
N -> {ok, {reduce, N, Lang, View}}
end.
-reduce({temp_reduce, #view{btree=Bt}}, Key1, Key2) ->
- {ok, {_Count, [Reduction]}} = couch_btree:reduce(Bt, Key1, Key2),
- {ok, Reduction};
+fold_reduce({temp_reduce, #view{btree=Bt}}, Dir, StartKey, EndKey, GroupFun, Fun, Acc) ->
-reduce({reduce, NthRed, Lang, #view{btree=Bt, reduce_funs=RedFuns}}, Key1, Key2) ->
- {ok, PartialReductions} = couch_btree:partial_reduce(Bt, Key1, Key2),
+ WrapperFun = fun({GroupedKey, _}, PartialReds, Acc0) ->
+ {_, [Red]} = couch_btree:final_reduce(Bt, PartialReds),
+ Fun(GroupedKey, Red, Acc0)
+ end,
+ couch_btree:fold_reduce(Bt, Dir, StartKey, EndKey, GroupFun,
+ WrapperFun, Acc);
+
+fold_reduce({reduce, NthRed, Lang, #view{btree=Bt, reduce_funs=RedFuns}}, Dir, StartKey, EndKey, GroupFun, Fun, Acc) ->
PreResultPadding = lists:duplicate(NthRed - 1, []),
PostResultPadding = lists:duplicate(length(RedFuns) - NthRed, []),
{_Name, FunSrc} = lists:nth(NthRed,RedFuns),
- ReduceFun =
+ ReduceFun =
fun(reduce, KVs) ->
{ok, Reduced} = couch_query_servers:reduce(Lang, [FunSrc], KVs),
{0, PreResultPadding ++ Reduced ++ PostResultPadding};
@@ -116,8 +120,12 @@ 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,
- {_, FinalReds} = couch_btree:final_reduce(ReduceFun, PartialReductions),
- {ok, lists:nth(NthRed, FinalReds)}.
+ WrapperFun = fun({GroupedKey, _}, PartialReds, Acc0) ->
+ {_, Reds} = couch_btree:final_reduce(ReduceFun, PartialReds),
+ Fun(GroupedKey, lists:nth(NthRed, Reds), Acc0)
+ end,
+ couch_btree:fold_reduce(Bt, Dir, StartKey, EndKey, GroupFun,
+ WrapperFun, Acc).
get_key_pos(_Key, [], _N) ->
0;
@@ -365,7 +373,7 @@ start_update_loop(RootDir, DbName, GroupId, NotifyPids) ->
Group =
case couch_file:open(FileName) of
{ok, Fd} ->
- case couch_file:read_header(Fd, <<$r, $c, $k, 0>>) of
+ case (catch couch_file:read_header(Fd, <<$r, $c, $k, 0>>)) of
{ok, ExistingDiskGroup} ->
% validate all the view definitions in the index are correct.
case reset_group(ExistingDiskGroup) == reset_group(DbGroup) of