summaryrefslogtreecommitdiff
path: root/src/couch_mrview
diff options
context:
space:
mode:
authorChristian Kruse <cjk@defunct.ch>2023-02-21 20:45:19 +0100
committerNick Vatamaniuc <nickva@users.noreply.github.com>2023-02-24 17:07:28 -0500
commitb702a5edff969abac0628e0cf16ef6412ba5c292 (patch)
tree84ed894c2175a5fd20745fbbcfa6ab3af59f91a1 /src/couch_mrview
parent7a2705ac67fe4ac6072224f87174fa41da7e274e (diff)
downloadcouchdb-b702a5edff969abac0628e0cf16ef6412ba5c292.tar.gz
inspect the document more precisely to avoid skipping user docs
Diffstat (limited to 'src/couch_mrview')
-rw-r--r--src/couch_mrview/src/couch_mrview.erl27
1 files changed, 22 insertions, 5 deletions
diff --git a/src/couch_mrview/src/couch_mrview.erl b/src/couch_mrview/src/couch_mrview.erl
index 3616af7df..c0f6ff49b 100644
--- a/src/couch_mrview/src/couch_mrview.erl
+++ b/src/couch_mrview/src/couch_mrview.erl
@@ -531,13 +531,11 @@ map_fold({{Key, Id}, Val}, _Offset, Acc) ->
user_acc = UAcc1,
last_go = Go
}};
-map_fold(#doc{id = <<"_local/", IdTail/binary>>} = Doc, _Offset, #mracc{} = Acc) ->
+map_fold(#doc{id = <<"_local/", _/binary>>} = Doc, _Offset, #mracc{} = Acc) ->
IncludeSys = couch_util:get_value(include_system, Acc#mracc.args#mrargs.extra),
- case {IncludeSys, IdTail} of
- {false, <<"purge-", _/binary>>} ->
- {ok, Acc};
- {false, <<"shard-sync", _/binary>>} ->
+ case should_skip_local_document(IncludeSys, Doc) of
+ true ->
{ok, Acc};
_ ->
#mracc{
@@ -571,6 +569,25 @@ map_fold(#doc{id = <<"_local/", IdTail/binary>>} = Doc, _Offset, #mracc{} = Acc)
}}
end.
+should_skip_local_document(_IncludeSys = false, #doc{
+ id = <<"_local/purge-", _/binary>>, body = {Props}
+}) ->
+ contains_fields([<<"purge_seq">>], Props);
+should_skip_local_document(_IncludeSys = false, #doc{
+ id = <<"_local/shard-sync", _/binary>>, body = {Props}
+}) ->
+ contains_fields([<<"target_uuid">>, <<"seq">>], Props);
+should_skip_local_document(_IncludeSys, _Doc) ->
+ false.
+
+contains_fields([], _Props) ->
+ true;
+contains_fields([Field | Fields], Props) ->
+ case couch_util:get_value(Field, Props) of
+ undefined -> false;
+ _ -> contains_fields(Fields, Props)
+ end.
+
red_fold(Db, {NthRed, _Lang, View} = RedView, Args, Callback, UAcc) ->
Finalizer =
case couch_util:get_value(finalizer, Args#mrargs.extra) of