Add bybucket to fold_heads
give fold_heads equivalent functionality to fold_objects - both can now be done for allkeys and bybucket
This commit is contained in:
parent
9375baf636
commit
6d42abbc1a
1 changed files with 81 additions and 1 deletions
|
@ -536,6 +536,10 @@ handle_call({return_folder, FolderType}, _From, State) ->
|
||||||
{reply,
|
{reply,
|
||||||
foldheads_allkeys(State, Tag, FoldHeadsFun),
|
foldheads_allkeys(State, Tag, FoldHeadsFun),
|
||||||
State};
|
State};
|
||||||
|
{foldheads_bybucket, Tag, Bucket, FoldHeadsFun} ->
|
||||||
|
{reply,
|
||||||
|
foldheads_bybucket(State, Tag, Bucket, FoldHeadsFun),
|
||||||
|
State};
|
||||||
{foldobjects_allkeys, Tag, FoldObjectsFun} ->
|
{foldobjects_allkeys, Tag, FoldObjectsFun} ->
|
||||||
{reply,
|
{reply,
|
||||||
foldobjects_allkeys(State, Tag, FoldObjectsFun),
|
foldobjects_allkeys(State, Tag, FoldObjectsFun),
|
||||||
|
@ -830,6 +834,11 @@ foldobjects_bybucket(State, Tag, Bucket, FoldObjectsFun) ->
|
||||||
EndKey = leveled_codec:to_ledgerkey(Bucket, null, Tag),
|
EndKey = leveled_codec:to_ledgerkey(Bucket, null, Tag),
|
||||||
foldobjects(State, Tag, StartKey, EndKey, FoldObjectsFun, false).
|
foldobjects(State, Tag, StartKey, EndKey, FoldObjectsFun, false).
|
||||||
|
|
||||||
|
foldheads_bybucket(State, Tag, Bucket, FoldHeadsFun) ->
|
||||||
|
StartKey = leveled_codec:to_ledgerkey(Bucket, null, Tag),
|
||||||
|
EndKey = leveled_codec:to_ledgerkey(Bucket, null, Tag),
|
||||||
|
foldobjects(State, Tag, StartKey, EndKey, FoldHeadsFun, true).
|
||||||
|
|
||||||
foldobjects_byindex(State, Tag, Bucket,
|
foldobjects_byindex(State, Tag, Bucket,
|
||||||
Field, FromTerm, ToTerm, FoldObjectsFun) ->
|
Field, FromTerm, ToTerm, FoldObjectsFun) ->
|
||||||
StartKey =
|
StartKey =
|
||||||
|
@ -1497,7 +1506,7 @@ foldobjects_vs_hashtree_test() ->
|
||||||
?STD_TAG,
|
?STD_TAG,
|
||||||
false}),
|
false}),
|
||||||
KeyHashList1 = lists:usort(HTFolder1()),
|
KeyHashList1 = lists:usort(HTFolder1()),
|
||||||
io:format("First item ~w~n", [lists:nth(1, KeyHashList1)]),
|
|
||||||
FoldObjectsFun = fun(B, K, V, Acc) ->
|
FoldObjectsFun = fun(B, K, V, Acc) ->
|
||||||
[{B, K, erlang:phash2(term_to_binary(V))}|Acc] end,
|
[{B, K, erlang:phash2(term_to_binary(V))}|Acc] end,
|
||||||
{async, HTFolder2} =
|
{async, HTFolder2} =
|
||||||
|
@ -1542,6 +1551,77 @@ foldobjects_vs_hashtree_test() ->
|
||||||
reset_filestructure().
|
reset_filestructure().
|
||||||
|
|
||||||
|
|
||||||
|
foldobjects_vs_foldheads_bybucket_test() ->
|
||||||
|
RootPath = reset_filestructure(),
|
||||||
|
{ok, Bookie1} = book_start([{root_path, RootPath},
|
||||||
|
{max_journalsize, 1000000},
|
||||||
|
{cache_size, 500}]),
|
||||||
|
ObjL1 = generate_multiple_objects(400, 1),
|
||||||
|
ObjL2 = generate_multiple_objects(400, 1),
|
||||||
|
% Put in all the objects with a TTL in the future
|
||||||
|
Future = leveled_codec:integer_now() + 300,
|
||||||
|
lists:foreach(fun({K, V, S}) -> ok = book_tempput(Bookie1,
|
||||||
|
"BucketA", K, V, S,
|
||||||
|
?STD_TAG,
|
||||||
|
Future) end,
|
||||||
|
ObjL1),
|
||||||
|
lists:foreach(fun({K, V, S}) -> ok = book_tempput(Bookie1,
|
||||||
|
"BucketB", K, V, S,
|
||||||
|
?STD_TAG,
|
||||||
|
Future) end,
|
||||||
|
ObjL2),
|
||||||
|
|
||||||
|
FoldObjectsFun = fun(B, K, V, Acc) ->
|
||||||
|
[{B, K, erlang:phash2(term_to_binary(V))}|Acc] end,
|
||||||
|
{async, HTFolder1A} =
|
||||||
|
book_returnfolder(Bookie1,
|
||||||
|
{foldobjects_bybucket,
|
||||||
|
?STD_TAG,
|
||||||
|
"BucketA",
|
||||||
|
FoldObjectsFun}),
|
||||||
|
KeyHashList1A = HTFolder1A(),
|
||||||
|
{async, HTFolder1B} =
|
||||||
|
book_returnfolder(Bookie1,
|
||||||
|
{foldobjects_bybucket,
|
||||||
|
?STD_TAG,
|
||||||
|
"BucketB",
|
||||||
|
FoldObjectsFun}),
|
||||||
|
KeyHashList1B = HTFolder1B(),
|
||||||
|
?assertMatch(false,
|
||||||
|
lists:usort(KeyHashList1A) == lists:usort(KeyHashList1B)),
|
||||||
|
|
||||||
|
FoldHeadsFun =
|
||||||
|
fun(B, K, ProxyV, Acc) ->
|
||||||
|
{proxy_object,
|
||||||
|
_MDBin,
|
||||||
|
_Size,
|
||||||
|
{FetchFun, Clone, JK}} = ProxyV,
|
||||||
|
V = FetchFun(Clone, JK),
|
||||||
|
[{B, K, erlang:phash2(term_to_binary(V))}|Acc]
|
||||||
|
end,
|
||||||
|
|
||||||
|
{async, HTFolder2A} =
|
||||||
|
book_returnfolder(Bookie1,
|
||||||
|
{foldheads_bybucket,
|
||||||
|
?STD_TAG,
|
||||||
|
"BucketA",
|
||||||
|
FoldHeadsFun}),
|
||||||
|
KeyHashList2A = HTFolder2A(),
|
||||||
|
{async, HTFolder2B} =
|
||||||
|
book_returnfolder(Bookie1,
|
||||||
|
{foldheads_bybucket,
|
||||||
|
?STD_TAG,
|
||||||
|
"BucketB",
|
||||||
|
FoldHeadsFun}),
|
||||||
|
KeyHashList2B = HTFolder2B(),
|
||||||
|
?assertMatch(true,
|
||||||
|
lists:usort(KeyHashList1A) == lists:usort(KeyHashList2A)),
|
||||||
|
?assertMatch(true,
|
||||||
|
lists:usort(KeyHashList1B) == lists:usort(KeyHashList2B)),
|
||||||
|
|
||||||
|
ok = book_close(Bookie1),
|
||||||
|
reset_filestructure().
|
||||||
|
|
||||||
|
|
||||||
scan_table_test() ->
|
scan_table_test() ->
|
||||||
K1 = leveled_codec:to_ledgerkey(<<"B1">>,
|
K1 = leveled_codec:to_ledgerkey(<<"B1">>,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue