diff options
author | Christian Kruse <cjk@defunct.ch> | 2023-02-21 20:45:19 +0100 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2023-02-24 17:07:28 -0500 |
commit | b702a5edff969abac0628e0cf16ef6412ba5c292 (patch) | |
tree | 84ed894c2175a5fd20745fbbcfa6ab3af59f91a1 /src/couch_mrview | |
parent | 7a2705ac67fe4ac6072224f87174fa41da7e274e (diff) | |
download | couchdb-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.erl | 27 |
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 |