Expand fold objects support

Fold over bucket and fold over index added
This commit is contained in:
martinsumner 2016-11-04 11:01:37 +00:00
parent 9ea74836ee
commit 68b17c71b3
4 changed files with 100 additions and 22 deletions

View file

@ -372,7 +372,23 @@ handle_call({return_folder, FolderType}, _From, State) ->
{foldobjects_allkeys, Tag, FoldObjectsFun} ->
{reply,
foldobjects_allkeys(State, Tag, FoldObjectsFun),
State};
{foldobjects_bybucket, Tag, Bucket, FoldObjectsFun} ->
{reply,
foldobjects_bybucket(State, Tag, Bucket, FoldObjectsFun),
State};
{foldobjects_byindex,
Tag,
Bucket,
{Field, FromTerm, ToTerm},
FoldObjectsFun} ->
{reply,
foldobjects_byindex(State,
Tag, Bucket,
Field, FromTerm, ToTerm,
FoldObjectsFun),
State}
end;
handle_call({compact_journal, Timeout}, _From, State) ->
ok = leveled_inker:ink_compactjournal(State#state.inker,
@ -492,6 +508,23 @@ hashtree_query(State, Tag, JournalCheck) ->
foldobjects_allkeys(State, Tag, FoldObjectsFun) ->
StartKey = leveled_codec:to_ledgerkey(null, null, Tag),
EndKey = leveled_codec:to_ledgerkey(null, null, Tag),
foldobjects(State, Tag, StartKey, EndKey, FoldObjectsFun).
foldobjects_bybucket(State, Tag, Bucket, FoldObjectsFun) ->
StartKey = leveled_codec:to_ledgerkey(Bucket, null, Tag),
EndKey = leveled_codec:to_ledgerkey(Bucket, null, Tag),
foldobjects(State, Tag, StartKey, EndKey, FoldObjectsFun).
foldobjects_byindex(State, Tag, Bucket, Field, FromTerm, ToTerm, FoldObjectsFun) ->
StartKey = leveled_codec:to_ledgerkey(Bucket, null, ?IDX_TAG, Field,
FromTerm),
EndKey = leveled_codec:to_ledgerkey(Bucket, null, ?IDX_TAG, Field,
ToTerm),
foldobjects(State, Tag, StartKey, EndKey, FoldObjectsFun).
foldobjects(State, Tag, StartKey, EndKey, FoldObjectsFun) ->
{ok,
{LedgerSnapshot, LedgerCache},
JournalSnapshot} = snapshot_store(State, store),
@ -499,9 +532,7 @@ foldobjects_allkeys(State, Tag, FoldObjectsFun) ->
leveled_log:log("B0004", [gb_trees:size(LedgerCache)]),
ok = leveled_penciller:pcl_loadsnapshot(LedgerSnapshot,
LedgerCache),
StartKey = leveled_codec:to_ledgerkey(null, null, Tag),
EndKey = leveled_codec:to_ledgerkey(null, null, Tag),
AccFun = accumulate_objects(FoldObjectsFun, JournalSnapshot),
AccFun = accumulate_objects(FoldObjectsFun, JournalSnapshot, Tag),
Acc = leveled_penciller:pcl_fetchkeys(LedgerSnapshot,
StartKey,
EndKey,
@ -513,6 +544,7 @@ foldobjects_allkeys(State, Tag, FoldObjectsFun) ->
end,
{async, Folder}.
allkey_query(State, Tag) ->
{ok,
{LedgerSnapshot, LedgerCache},
@ -643,14 +675,18 @@ accumulate_hashes(JournalCheck, InkerClone) ->
end,
AccFun.
accumulate_objects(FoldObjectsFun, InkerClone) ->
accumulate_objects(FoldObjectsFun, InkerClone, Tag) ->
Now = leveled_codec:integer_now(),
AccFun = fun(LK, V, Acc) ->
case leveled_codec:is_active(LK, V, Now) of
true ->
SQN = leveled_codec:strip_to_seqonly({LK, V}),
{B, K} = leveled_codec:from_ledgerkey(LK),
R = leveled_inker:ink_fetch(InkerClone, LK, SQN),
{B, K} = case leveled_codec:from_ledgerkey(LK) of
{B0, K0} -> {B0, K0};
{B0, K0, _T0} -> {B0, K0}
end,
QK = leveled_codec:to_ledgerkey(B, K, Tag),
R = leveled_inker:ink_fetch(InkerClone, QK, SQN),
case R of
{ok, Value} ->
FoldObjectsFun(B, K, Value, Acc);
@ -663,6 +699,9 @@ accumulate_objects(FoldObjectsFun, InkerClone) ->
end,
AccFun.
check_presence(Key, Value, InkerClone) ->
{LedgerKey, SQN} = leveled_codec:strip_to_keyseqonly({Key, Value}),
case leveled_inker:ink_keycheck(InkerClone, LedgerKey, SQN) of