This is an automated email from the ASF dual-hosted git repository. rnewson pushed a commit to branch user-partitioned-dbs-6 in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 807c9227d5c41db888bd8e9a097387562745b444 Author: Robert Newson <[email protected]> AuthorDate: Tue Aug 14 18:58:30 2018 +0100 explicit term shape for partitioned rows --- src/couch/src/couch_btree.erl | 14 ++++++++++++++ src/couch/src/couch_ejson_compare.erl | 4 ++++ src/couch_mrview/src/couch_mrview.erl | 2 ++ src/couch_mrview/src/couch_mrview_updater.erl | 2 +- src/couch_mrview/src/couch_mrview_util.erl | 14 +++++++------- src/fabric/src/fabric_view.erl | 4 +--- 6 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/couch/src/couch_btree.erl b/src/couch/src/couch_btree.erl index ea224b1..d11d7e6 100644 --- a/src/couch/src/couch_btree.erl +++ b/src/couch/src/couch_btree.erl @@ -133,6 +133,20 @@ make_group_fun(Bt, exact) -> end; make_group_fun(Bt, GroupLevel) when is_integer(GroupLevel), GroupLevel > 0 -> fun + ({{p, _Partition, Key1}, _}, {{p, _Partition, Key2}, _}) -> + SL1 = lists:sublist(Key1, GroupLevel), + SL2 = lists:sublist(Key2, GroupLevel), + case less(Bt, {SL1, nil}, {SL2, nil}) of + false -> + case less(Bt, {SL2, nil}, {SL1, nil}) of + false -> + true; + _ -> + false + end; + _ -> + false + end; ({[_|_] = Key1, _}, {[_|_] = Key2, _}) -> SL1 = lists:sublist(Key1, GroupLevel), SL2 = lists:sublist(Key2, GroupLevel), diff --git a/src/couch/src/couch_ejson_compare.erl b/src/couch/src/couch_ejson_compare.erl index 81adbb8..ca36c86 100644 --- a/src/couch/src/couch_ejson_compare.erl +++ b/src/couch/src/couch_ejson_compare.erl @@ -22,6 +22,10 @@ init() -> Dir = code:priv_dir(couch), ok = erlang:load_nif(filename:join(Dir, ?MODULE), NumScheds). +% partitioned row comparison +less({p, PA, A}, {p, PB, B}) -> + less([PA, A], [PB, B]); + less(A, B) -> try less_nif(A, B) diff --git a/src/couch_mrview/src/couch_mrview.erl b/src/couch_mrview/src/couch_mrview.erl index e1db906..f5963e7 100644 --- a/src/couch_mrview/src/couch_mrview.erl +++ b/src/couch_mrview/src/couch_mrview.erl @@ -615,6 +615,8 @@ red_fold(Db, {NthRed, _Lang, View}=RedView, Args, Callback, UAcc) -> end, Acc, OptList), finish_fold(Acc2, []). +red_fold({p, _Partition, Key}, Red, Acc) -> + red_fold(Key, Red, Acc); red_fold(_Key, _Red, #mracc{skip=N}=Acc) when N > 0 -> {ok, Acc#mracc{skip=N-1, last_go=ok}}; red_fold(Key, Red, #mracc{meta_sent=false}=Acc) -> diff --git a/src/couch_mrview/src/couch_mrview_updater.erl b/src/couch_mrview/src/couch_mrview_updater.erl index a922eb5..0c1a17c 100644 --- a/src/couch_mrview/src/couch_mrview_updater.erl +++ b/src/couch_mrview/src/couch_mrview_updater.erl @@ -384,7 +384,7 @@ write_kvs(State, UpdateSeq, ViewKVs, DocIdKeys, Seqs, Log0) -> }. inject_partition(KVs) -> - [{{[partition(DocId), Key], DocId}, Value} || {{Key, DocId}, Value} <- KVs]. + [{{{p, partition(DocId), Key}, DocId}, Value} || {{Key, DocId}, Value} <- KVs]. partition(DocId) -> [Partition, _Rest] = binary:split(DocId, <<":">>), diff --git a/src/couch_mrview/src/couch_mrview_util.erl b/src/couch_mrview/src/couch_mrview_util.erl index 8b66755..acfb282 100644 --- a/src/couch_mrview/src/couch_mrview_util.erl +++ b/src/couch_mrview/src/couch_mrview_util.erl @@ -649,25 +649,25 @@ apply_partition(#mrargs{} = Args0, Style) -> end; apply_partition(Partition, #mrargs{direction=fwd, start_key=undefined, end_key=undefined} = Args) -> - Args#mrargs{start_key=[Partition, ?LOWEST_KEY], end_key=[Partition, ?HIGHEST_KEY]}; + Args#mrargs{start_key={p, Partition, ?LOWEST_KEY}, end_key={p, Partition, ?HIGHEST_KEY}}; apply_partition(Partition, #mrargs{direction=rev, start_key=undefined, end_key=undefined} = Args) -> - Args#mrargs{start_key=[Partition, ?HIGHEST_KEY], end_key=[Partition, ?LOWEST_KEY]}; + Args#mrargs{start_key={p, Partition, ?HIGHEST_KEY}, end_key={p, Partition, ?LOWEST_KEY}}; apply_partition(Partition, #mrargs{direction=fwd, start_key=SK0, end_key=undefined} = Args) -> - Args#mrargs{start_key=[Partition, SK0], end_key=[Partition, ?HIGHEST_KEY]}; + Args#mrargs{start_key={p, Partition, SK0}, end_key={p, Partition, ?HIGHEST_KEY}}; apply_partition(Partition, #mrargs{direction=rev, start_key=SK0, end_key=undefined} = Args) -> - Args#mrargs{start_key=[Partition, SK0], end_key=[Partition, ?LOWEST_KEY]}; + Args#mrargs{start_key={p, Partition, SK0}, end_key={p, Partition, ?LOWEST_KEY}}; apply_partition(Partition, #mrargs{direction=fwd, start_key=undefined, end_key=EK0} = Args) -> - Args#mrargs{start_key=[Partition, ?LOWEST_KEY], end_key=[Partition, EK0]}; + Args#mrargs{start_key={p, Partition, ?LOWEST_KEY}, end_key={p, Partition, EK0}}; apply_partition(Partition, #mrargs{direction=rev, start_key=undefined, end_key=EK0} = Args) -> - Args#mrargs{start_key=[Partition, ?HIGHEST_KEY], end_key=[Partition, EK0]}; + Args#mrargs{start_key={p, Partition, ?HIGHEST_KEY}, end_key={p, Partition, EK0}}; apply_partition(Partition, #mrargs{start_key=SK0, end_key=EK0} = Args) -> - Args#mrargs{start_key=[Partition, SK0], end_key=[Partition, EK0]}. + Args#mrargs{start_key={p, Partition, SK0}, end_key={p, Partition, EK0}}. %% all_docs is special as it's not really a view and is already diff --git a/src/fabric/src/fabric_view.erl b/src/fabric/src/fabric_view.erl index 9224132..1b01e83 100644 --- a/src/fabric/src/fabric_view.erl +++ b/src/fabric/src/fabric_view.erl @@ -202,10 +202,8 @@ possibly_embed_doc(#collector{db_name=DbName, query_args=Args}, _ -> Row end. -detach_partition(#view_row{key=[_Partition, Key]} = Row) -> +detach_partition(#view_row{key={p, _Partition, Key}} = Row) -> Row#view_row{key = Key}; -detach_partition(#view_row{key=null} = Row) -> - Row#view_row{key = null}; detach_partition(#view_row{} = Row) -> Row.
