summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Lehnardt <jan@apache.org>2022-06-24 17:28:12 +0200
committerJan Lehnardt <jan@apache.org>2022-12-16 16:56:18 +0100
commitcc05b2bfbe9854e908298c026e9efe2d6aab18e9 (patch)
tree064a53712df27b7190dbb39f36ef027d435c0eca
parent78eb8d800774868f8b8e3f9d961cbdf965c961b1 (diff)
downloadcouchdb-cc05b2bfbe9854e908298c026e9efe2d6aab18e9.tar.gz
feat(access): expand couch_btree / bt_engine to handle access
-rw-r--r--src/couch/src/couch_bt_engine.erl27
-rw-r--r--src/couch/src/couch_btree.erl12
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 0549de566..368425beb 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}}) ->