Union test with bigger cardinality.
diff --git a/src/hyper.erl b/src/hyper.erl
index 9ce1f27..efd02a0 100644
--- a/src/hyper.erl
+++ b/src/hyper.erl
@@ -58,10 +58,13 @@
-spec union([filter()]) -> filter().
union(Filters) when is_list(Filters) ->
- %% Must have the same P
- case lists:usort(lists:map(fun (H) -> H#hyper.p end, Filters)) of
- [P] ->
- lists:foldl(fun union/2, hyper:new(P), Filters)
+ %% Must have the same P and backend
+ case lists:usort(lists:map(fun (#hyper{p = P, registers = {Mod, _}}) ->
+ {P, Mod}
+ end, Filters)) of
+ [{_P, _Mod}] ->
+ [First | Rest] = Filters,
+ lists:foldl(fun union/2, First, Rest)
end.
union(#hyper{registers = {Mod, LeftRegisters}} = Left,
@@ -273,12 +276,14 @@
many_union_test() ->
random:seed(1, 2, 3),
- Card = 100,
+ Card = 100000,
NumSets = 3,
Sets = [sets:from_list(generate_unique(Card)) || _ <- lists:seq(1, NumSets)],
- Filters = lists:map(fun (S) -> insert_many(sets:to_list(S), new(14)) end,
- Sets),
+ Filters = lists:map(fun (S) ->
+ insert_many(sets:to_list(S),
+ new(10, hyper_bisect))
+ end, Sets),
?assert(abs(sets:size(sets:union(Sets)) - card(union(Filters)))
< (Card * NumSets) * 0.1).
diff --git a/src/hyper_bisect.erl b/src/hyper_bisect.erl
index 578978f..e9b4cf0 100644
--- a/src/hyper_bisect.erl
+++ b/src/hyper_bisect.erl
@@ -68,7 +68,14 @@
{sparse, bisect:merge(fun (_Index, L, R) -> max(L, R) end, Left, Right), P, T};
max_merge({dense, Left}, {dense, Right}) ->
- {dense, iolist_to_binary(lists:reverse(do_dense_merge(Left, Right)))}.
+ {dense, iolist_to_binary(
+ lists:reverse(
+ do_dense_merge(Left, Right)))};
+
+max_merge({dense, Left}, {sparse, Right, P, _}) ->
+ {dense, iolist_to_binary(
+ lists:reverse(
+ do_dense_merge(Left, bisect2dense(Right, P))))}.
%%