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)};

Reply via email to