This is an automated email from the ASF dual-hosted git repository. jiahuili430 pushed a commit to branch fix-changes-stats in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit fb45a2938512e2fdb306ae7f11db9c7355fd4021 Author: Jiahui Li <[email protected]> AuthorDate: Sat Dec 2 20:23:37 2023 -0600 refactor `get_changes_row` --- src/couch/src/couch_changes.erl | 3 +- src/couch/test/eunit/couch_changes_tests.erl | 1 - src/fabric/src/fabric_rpc.erl | 54 +++++++++++++--------------- 3 files changed, 25 insertions(+), 33 deletions(-) diff --git a/src/couch/src/couch_changes.erl b/src/couch/src/couch_changes.erl index e20e86b70..cd6d55eb7 100644 --- a/src/couch/src/couch_changes.erl +++ b/src/couch/src/couch_changes.erl @@ -19,7 +19,6 @@ wait_updated/3, get_rest_updated/1, configure_filter/4, - filter/3, filter/4, handle_db_event/3, handle_view_event/3, @@ -283,7 +282,7 @@ filter(Db, DocInfo, {custom, Style, Req0, DDoc, FName}, IncludeDocs) when Includ {ok, Passes} = couch_query_servers:filter_docs(Req, Db, DDoc, FName, Docs), {Docs, filter_revs(Passes, Docs)}; filter(Db, DocInfo, Filter, _IncludeDocs) -> - filter(Db, DocInfo, Filter). + {[], filter(Db, DocInfo, Filter)}. get_view_qs({json_req, {Props}}) -> {Query} = couch_util:get_value(<<"query">>, Props, {[]}), diff --git a/src/couch/test/eunit/couch_changes_tests.erl b/src/couch/test/eunit/couch_changes_tests.erl index 293f49e2e..a9af0dee5 100644 --- a/src/couch/test/eunit/couch_changes_tests.erl +++ b/src/couch/test/eunit/couch_changes_tests.erl @@ -460,7 +460,6 @@ t_select_with_continuous({DbName, Revs}) -> ?assertEqual(ok, wait_row_notifications(1)), ok = pause(Consumer), NewRows = get_rows(Consumer), - ?debugVal(NewRows), ?assertMatch([#row{seq = _, id = <<"doc8">>, deleted = false}], NewRows), ?assertEqual([#row{seq = 12, id = <<"doc8">>, deleted = false}], NewRows). diff --git a/src/fabric/src/fabric_rpc.erl b/src/fabric/src/fabric_rpc.erl index 42544ac40..a75143bc3 100644 --- a/src/fabric/src/fabric_rpc.erl +++ b/src/fabric/src/fabric_rpc.erl @@ -539,36 +539,38 @@ changes_enumerator(DocInfo, Acc) -> db = Db, args = #changes_args{ include_docs = IncludeDocs, - filter_fun = Filter + conflicts = Conflicts, + filter_fun = Filter, + doc_options = DocOptions }, pending = Pending } = Acc, + Opts = + if + Conflicts -> [conflicts | DocOptions]; + true -> DocOptions + end, #doc_info{high_seq = Seq} = DocInfo, - RevsOrDocRevs = couch_changes:filter(Db, DocInfo, Filter, IncludeDocs), - % include_docs = false, call `filter/3`, use `couch_changes:open_revs/3` to read docs. - % include_docs = true, call `filter/4`, it will return [revs] or {docs, revs}. - % - {}: use `couch_changes:open_revs/3` to open docs - % - []: use `fabric_rpc:doc_member/3` to open docs + {Docs, Revs} = couch_changes:filter(Db, DocInfo, Filter, IncludeDocs), + io:format("+++ Docs:~p~n", [Docs]), + io:format("+++ Revs:~p~n", [Revs]), ChangesRow = - case is_tuple(RevsOrDocRevs) of - true -> - {Docs, Revs} = RevsOrDocRevs, - get_changes_row(Revs, Acc, DocInfo, fun get_json_docs/3, Docs); - false -> - get_changes_row(RevsOrDocRevs, Acc, DocInfo, fun doc_member/3, {Db, DocInfo}) + case {Docs, IncludeDocs} of + {_, false} -> + get_changes_row(Revs, Acc, DocInfo, []); + {[], true} -> + Docs1 = [doc_member(Db, DocInfo, Opts, Filter)], + get_changes_row(Revs, Acc, DocInfo, Docs1); + {[Doc], true} -> + Docs1 = [get_json_doc(Doc, Opts, Filter)], + get_changes_row(Revs, Acc, DocInfo, Docs1) end, ok = rexi:stream2(ChangesRow), {ok, Acc#fabric_changes_acc{seq = Seq, pending = Pending - 1}}. -get_changes_row(Revs, Acc, DocInfo, Fun, Args) -> +get_changes_row(Revs, Acc, DocInfo, Docs) -> #fabric_changes_acc{ db = Db, - args = #changes_args{ - include_docs = IncludeDocs, - conflicts = Conflicts, - filter_fun = Filter, - doc_options = DocOptions - }, pending = Pending, epochs = Epochs } = Acc, @@ -580,28 +582,20 @@ get_changes_row(Revs, Acc, DocInfo, Fun, Args) -> {seq, {Seq, uuid(Db), couch_db:owner_of(Epochs, Seq)}} ]}; Results -> - Opts = - if - Conflicts -> [conflicts | DocOptions]; - true -> DocOptions - end, {change, [ {pending, Pending - 1}, {seq, {Seq, uuid(Db), couch_db:owner_of(Epochs, Seq)}}, {id, Id}, {changes, Results}, {deleted, Del} - | if - IncludeDocs -> [Fun(Args, Opts, Filter)]; - true -> [] - end + | Docs ]} end. -get_json_docs([Doc], Opts, Filter) -> +get_json_doc(Doc, Opts, Filter) -> {doc, maybe_filtered_json_doc(Doc, Opts, Filter)}. -doc_member({Shard, DocInfo}, Opts, Filter) -> +doc_member(Shard, DocInfo, Opts, Filter) -> case couch_db:open_doc(Shard, DocInfo, [deleted | Opts]) of {ok, Doc} -> {doc, maybe_filtered_json_doc(Doc, Opts, Filter)};
