This is an automated email from the ASF dual-hosted git repository. jan pushed a commit to branch rebase/access-2023 in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 506a550f6d533120f50565bb4970b219ccf018b7 Author: Jan Lehnardt <[email protected]> AuthorDate: Fri Jun 24 17:28:12 2022 +0200 feat(access): expand couch_btree / bt_engine to handle access --- src/couch/src/couch_bt_engine.erl | 27 +++++++++++++++++---------- src/couch/src/couch_btree.erl | 12 ++++++++++++ 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/couch/src/couch_bt_engine.erl b/src/couch/src/couch_bt_engine.erl index 7bc02146e..e3620283b 100644 --- a/src/couch/src/couch_bt_engine.erl +++ b/src/couch/src/couch_bt_engine.erl @@ -664,20 +664,22 @@ id_tree_split(#full_doc_info{} = Info) -> update_seq = Seq, deleted = Deleted, sizes = SizeInfo, - rev_tree = Tree + rev_tree = Tree, + access = Access } = Info, - {Id, {Seq, ?b2i(Deleted), split_sizes(SizeInfo), disk_tree(Tree)}}. + {Id, {Seq, ?b2i(Deleted), split_sizes(SizeInfo), disk_tree(Tree), split_access(Access)}}. id_tree_join(Id, {HighSeq, Deleted, DiskTree}) -> % Handle old formats before data_size was added - id_tree_join(Id, {HighSeq, Deleted, #size_info{}, DiskTree}); -id_tree_join(Id, {HighSeq, Deleted, Sizes, DiskTree}) -> + id_tree_join(Id, {HighSeq, Deleted, #size_info{}, DiskTree, []}); +id_tree_join(Id, {HighSeq, Deleted, Sizes, DiskTree, Access}) -> #full_doc_info{ id = Id, update_seq = HighSeq, deleted = ?i2b(Deleted), sizes = couch_db_updater:upgrade_sizes(Sizes), - rev_tree = rev_tree(DiskTree) + rev_tree = rev_tree(DiskTree), + access = join_access(Access) }. id_tree_reduce(reduce, FullDocInfos) -> @@ -714,19 +716,21 @@ seq_tree_split(#full_doc_info{} = Info) -> update_seq = Seq, deleted = Del, sizes = SizeInfo, - rev_tree = Tree + rev_tree = Tree, + access = Access } = Info, - {Seq, {Id, ?b2i(Del), split_sizes(SizeInfo), disk_tree(Tree)}}. + {Seq, {Id, ?b2i(Del), split_sizes(SizeInfo), disk_tree(Tree), split_access(Access)}}. seq_tree_join(Seq, {Id, Del, DiskTree}) when is_integer(Del) -> - seq_tree_join(Seq, {Id, Del, {0, 0}, DiskTree}); -seq_tree_join(Seq, {Id, Del, Sizes, DiskTree}) when is_integer(Del) -> + seq_tree_join(Seq, {Id, Del, {0, 0}, DiskTree, []}); +seq_tree_join(Seq, {Id, Del, Sizes, DiskTree, Access}) when is_integer(Del) -> #full_doc_info{ id = Id, update_seq = Seq, deleted = ?i2b(Del), sizes = join_sizes(Sizes), - rev_tree = rev_tree(DiskTree) + rev_tree = rev_tree(DiskTree), + access = join_access(Access) }; seq_tree_join(KeySeq, {Id, RevInfos, DeletedRevInfos}) -> % Older versions stored #doc_info records in the seq_tree. @@ -755,6 +759,9 @@ seq_tree_reduce(reduce, DocInfos) -> seq_tree_reduce(rereduce, Reds) -> lists:sum(Reds). +join_access(Access) -> Access. +split_access(Access) -> Access. + local_tree_split(#doc{revs = {0, [Rev]}} = Doc) when is_binary(Rev) -> #doc{ id = Id, diff --git a/src/couch/src/couch_btree.erl b/src/couch/src/couch_btree.erl index b974a22ee..d7ca7bab4 100644 --- a/src/couch/src/couch_btree.erl +++ b/src/couch/src/couch_btree.erl @@ -16,6 +16,7 @@ -export([fold/4, full_reduce/1, final_reduce/2, size/1, foldl/3, foldl/4]). -export([fold_reduce/4, lookup/2, get_state/1, set_options/2]). -export([extract/2, assemble/3, less/3]). +-export([full_reduce_with_options/2]). -include_lib("couch/include/couch_db.hrl"). @@ -109,6 +110,17 @@ full_reduce(#btree{root = nil, reduce = Reduce}) -> full_reduce(#btree{root = Root}) -> {ok, element(2, Root)}. +full_reduce_with_options(Bt, Options0) -> + CountFun = fun(_SeqStart, PartialReds, 0) -> + {ok, couch_btree:final_reduce(Bt, PartialReds)} + end, + [UserName] = proplists:get_value(start_key, Options0, <<"">>), + EndKey = {[UserName, {[]}]}, + Options = Options0 ++ [ + {end_key, EndKey} + ], + fold_reduce(Bt, CountFun, 0, Options). + size(#btree{root = nil}) -> 0; size(#btree{root = {_P, _Red}}) ->
