Add segment matching function

For when matching between different tree sizes
This commit is contained in:
Martin Sumner 2018-10-23 18:46:10 +01:00
parent 5f5255142d
commit dd9a6f0015

View file

@ -74,7 +74,8 @@
keyto_segment48/1, keyto_segment48/1,
generate_segmentfilter_list/2, generate_segmentfilter_list/2,
merge_binaries/2, merge_binaries/2,
join_segment/2 join_segment/2,
match_segment/2
]). ]).
@ -99,7 +100,7 @@
-define(VALID_SIZES, [xxsmall, xsmall, small, medium, large, xlarge]). -define(VALID_SIZES, [xxsmall, xsmall, small, medium, large, xlarge]).
-record(tictactree, {treeID :: any(), -record(tictactree, {treeID :: any(),
size :: xxsmall|xsmall|small|medium|large|xlarge, size :: tree_size(),
width :: integer(), width :: integer(),
segment_count :: integer(), segment_count :: integer(),
level1 :: binary(), level1 :: binary(),
@ -109,8 +110,9 @@
-type tictactree() :: #tictactree{}. -type tictactree() :: #tictactree{}.
-type segment48() :: {segment_hash, integer(), integer()}. -type segment48() :: {segment_hash, integer(), integer()}.
-type tree_extract() :: {binary(), integer(), integer(), integer(), binary()}. -type tree_extract() :: {binary(), integer(), integer(), integer(), binary()}.
-type tree_size() :: xxsmall|xsmall|small|medium|large|xlarge.
-export_type([tictactree/0, segment48/0]). -export_type([tictactree/0, segment48/0, tree_size/0]).
%%%============================================================================ %%%============================================================================
@ -355,7 +357,7 @@ keyto_segment48(BinKey) ->
crypto:hash(md5, BinKey), crypto:hash(md5, BinKey),
{segment_hash, SegmentID, ExtraHash}. {segment_hash, SegmentID, ExtraHash}.
-spec generate_segmentfilter_list(list(integer()), atom()) -spec generate_segmentfilter_list(list(integer()), tree_size())
-> false|list(integer()). -> false|list(integer()).
%% @doc %% @doc
%% Cannot accelerate segment listing for trees below certain sizes, so check %% Cannot accelerate segment listing for trees below certain sizes, so check
@ -381,6 +383,17 @@ generate_segmentfilter_list(SegmentList, Size) ->
SegmentList SegmentList
end. end.
-spec match_segment({integer(), tree_size()}, {integer(), tree_size()})
-> boolean().
%% @doc
%% Does segment A match segment B - given that segment A was generated using
%% Tree size A and segment B was generated using Tree Size B
match_segment({SegIDA, TreeSizeA}, {SegIDB, TreeSizeB}) ->
SmallestTreeSize =
min(get_size(TreeSizeA), get_size(TreeSizeB)) * ?L2_CHUNKSIZE,
get_segment(SegIDA, SmallestTreeSize)
== get_segment(SegIDB, SmallestTreeSize).
-spec join_segment(integer(), integer()) -> integer(). -spec join_segment(integer(), integer()) -> integer().
%% @doc %% @doc
%% Generate a segment ID for the Branch and Leaf ID co-ordinates %% Generate a segment ID for the Branch and Leaf ID co-ordinates
@ -682,6 +695,17 @@ compare_trees_maxonedelta(Tree0, Tree1) ->
[] []
end. end.
segment_match_test() ->
segment_match_tester(small, large),
segment_match_tester(xlarge, medium).
segment_match_tester(Size1, Size2) ->
HashKey = keyto_segment32(<<"K0">>),
Segment1 = get_segment(HashKey, Size1),
Segment2 = get_segment(HashKey, Size2),
?assertMatch(true, match_segment({Segment1, Size1}, {Segment2, Size2})).
-endif. -endif.