Add key range to fold_heads queries

This commit is contained in:
Martin Sumner 2017-10-06 15:02:14 +01:00
parent 7912742a84
commit 0c5f5cdb65
2 changed files with 47 additions and 4 deletions

View file

@ -604,10 +604,11 @@ handle_call({return_folder, FolderType}, _From, State) ->
CheckPresence, CheckPresence,
SnapPreFold), SnapPreFold),
State}; State};
{foldheads_bybucket, Tag, Bucket, FoldHeadsFun, {foldheads_bybucket, Tag, Bucket, KeyRange, FoldHeadsFun,
CheckPresence, SnapPreFold} -> CheckPresence, SnapPreFold} ->
{reply, {reply,
foldheads_bybucket(State, Tag, Bucket, foldheads_bybucket(State, Tag, Bucket,
KeyRange,
FoldHeadsFun, FoldHeadsFun,
CheckPresence, CheckPresence,
SnapPreFold), SnapPreFold),
@ -1000,9 +1001,20 @@ foldobjects_bybucket(State, Tag, Bucket, FoldObjectsFun) ->
foldobjects(State, Tag, StartKey, EndKey, FoldObjectsFun, foldobjects(State, Tag, StartKey, EndKey, FoldObjectsFun,
false, true). false, true).
foldheads_bybucket(State, Tag, Bucket, FoldHeadsFun, CheckPresence, SnapPreFold) -> foldheads_bybucket(State, Tag, Bucket, KeyRange, FoldHeadsFun,
StartKey = leveled_codec:to_ledgerkey(Bucket, null, Tag), CheckPresence, SnapPreFold) ->
EndKey = leveled_codec:to_ledgerkey(Bucket, null, Tag), {StartKey, EndKey} =
case KeyRange of
all ->
{leveled_codec:to_ledgerkey(Bucket, null, Tag),
leveled_codec:to_ledgerkey(Bucket, null, Tag)};
{StartTerm, <<"$all">>} ->
{leveled_codec:to_ledgerkey(Bucket, StartTerm, Tag),
leveled_codec:to_ledgerkey(Bucket, null, Tag)};
{StartTerm, EndTerm} ->
{leveled_codec:to_ledgerkey(Bucket, StartTerm, Tag),
leveled_codec:to_ledgerkey(Bucket, EndTerm, Tag)}
end,
foldobjects(State, Tag, StartKey, EndKey, FoldHeadsFun, foldobjects(State, Tag, StartKey, EndKey, FoldHeadsFun,
{true, CheckPresence}, SnapPreFold). {true, CheckPresence}, SnapPreFold).
@ -1876,6 +1888,7 @@ foldobjects_vs_foldheads_bybucket_testto() ->
{foldheads_bybucket, {foldheads_bybucket,
?STD_TAG, ?STD_TAG,
"BucketA", "BucketA",
all,
FoldHeadsFun, FoldHeadsFun,
true, true,
true}), true}),
@ -1885,15 +1898,42 @@ foldobjects_vs_foldheads_bybucket_testto() ->
{foldheads_bybucket, {foldheads_bybucket,
?STD_TAG, ?STD_TAG,
"BucketB", "BucketB",
all,
FoldHeadsFun, FoldHeadsFun,
false, false,
false}), false}),
KeyHashList2B = HTFolder2B(), KeyHashList2B = HTFolder2B(),
?assertMatch(true, ?assertMatch(true,
lists:usort(KeyHashList1A) == lists:usort(KeyHashList2A)), lists:usort(KeyHashList1A) == lists:usort(KeyHashList2A)),
?assertMatch(true, ?assertMatch(true,
lists:usort(KeyHashList1B) == lists:usort(KeyHashList2B)), lists:usort(KeyHashList1B) == lists:usort(KeyHashList2B)),
{async, HTFolder2C} =
book_returnfolder(Bookie1,
{foldheads_bybucket,
?STD_TAG,
"BucketB",
{"Key", <<"$all">>},
FoldHeadsFun,
false,
false}),
KeyHashList2C = HTFolder2C(),
{async, HTFolder2D} =
book_returnfolder(Bookie1,
{foldheads_bybucket,
?STD_TAG,
"BucketB",
{"Key", "Keyzzzzz"},
FoldHeadsFun,
false,
false}),
KeyHashList2D = HTFolder2D(),
?assertMatch(true,
lists:usort(KeyHashList2B) == lists:usort(KeyHashList2C)),
?assertMatch(true,
lists:usort(KeyHashList2B) == lists:usort(KeyHashList2D)),
ok = book_close(Bookie1), ok = book_close(Bookie1),
reset_filestructure(). reset_filestructure().

View file

@ -129,6 +129,7 @@ many_put_compare(_Config) ->
FoldQ0 = {foldheads_bybucket, FoldQ0 = {foldheads_bybucket,
o_rkv, o_rkv,
"Bucket", "Bucket",
all,
{FoldObjectsFun, leveled_tictac:new_tree(0, TreeSize)}, {FoldObjectsFun, leveled_tictac:new_tree(0, TreeSize)},
false, true}, false, true},
{async, TreeAObjFolder0} = {async, TreeAObjFolder0} =
@ -143,6 +144,7 @@ many_put_compare(_Config) ->
FoldQ1 = {foldheads_bybucket, FoldQ1 = {foldheads_bybucket,
o_rkv, o_rkv,
"Bucket", "Bucket",
all,
{FoldObjectsFun, leveled_tictac:new_tree(0, TreeSize)}, {FoldObjectsFun, leveled_tictac:new_tree(0, TreeSize)},
true, true}, true, true},
{async, TreeAObjFolder1} = {async, TreeAObjFolder1} =
@ -170,6 +172,7 @@ many_put_compare(_Config) ->
AltFoldQ0 = {foldheads_bybucket, AltFoldQ0 = {foldheads_bybucket,
o_rkv, o_rkv,
"Bucket", "Bucket",
all,
{AltFoldObjectsFun, leveled_tictac:new_tree(0, TreeSize)}, {AltFoldObjectsFun, leveled_tictac:new_tree(0, TreeSize)},
false, false,
true}, true},