summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <rnewson@apache.org>2020-07-28 20:27:50 +0100
committerRobert Newson <rnewson@apache.org>2020-07-28 21:23:05 +0100
commitc7e85389243a188db38dcd6426848838d4dfdc0b (patch)
tree80a00976cf57fc6260907238ba520399921e5a4f
parent0c7c77eb59d626505cf6ec4162e1053837bc3593 (diff)
downloadcouchdb-c7e85389243a188db38dcd6426848838d4dfdc0b.tar.gz
Change collate_fun contract from true|false to -1, 0, 1
-rw-r--r--src/ebtree/src/ebtree.erl71
1 files changed, 40 insertions, 31 deletions
diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl
index f08e1e9be..b227be035 100644
--- a/src/ebtree/src/ebtree.erl
+++ b/src/ebtree/src/ebtree.erl
@@ -881,36 +881,34 @@ in_range(#tree{} = Tree, StartOfRange, Key, EndOfRange) ->
greater_than(#tree{} = Tree, A, B) ->
- not less_than_or_equal(Tree, A, B).
+ collate(Tree, A, B) == 1.
-greater_than_or_equal(#tree{} = _Tree, A, A) ->
- true;
-
greater_than_or_equal(#tree{} = Tree, A, B) ->
- greater_than(Tree, A, B).
-
+ collate(Tree, A, B) > -1.
-less_than(#tree{} = _Tree, A, A) ->
- false;
less_than(#tree{} = Tree, A, B) ->
- less_than_or_equal(Tree, A, B).
+ collate(Tree, A, B) == -1.
+
+less_than_or_equal(#tree{} = Tree, A, B) ->
+ collate(Tree, A, B) < 1.
-less_than_or_equal(#tree{} = _Tree, ?MIN, _B) ->
- true;
-less_than_or_equal(#tree{} = _Tree, _A, ?MIN) ->
- false;
+collate(#tree{} = _Tree, ?MIN, _B) ->
+ -1;
-less_than_or_equal(#tree{} = _Tree, ?MAX, _B) ->
- false;
+collate(#tree{} = _Tree, _A, ?MIN) ->
+ 1;
-less_than_or_equal(#tree{} = _Tree, _A, ?MAX) ->
- true;
+collate(#tree{} = _Tree, ?MAX, _B) ->
+ 1;
-less_than_or_equal(#tree{} = Tree, A, B) ->
+collate(#tree{} = _Tree, _A, ?MAX) ->
+ -1;
+
+collate(#tree{} = Tree, A, B) ->
#tree{collate_fun = CollateFun} = Tree,
CollateFun(A, B).
@@ -919,23 +917,27 @@ umerge_members(#tree{} = Tree, List1, List2) ->
#tree{collate_fun = CollateFun} = Tree,
CollateWrapper = fun
({K1, _V1}, {K2, _V2}) ->
- CollateFun(K1, K2);
+ CollateFun(K1, K2) < 1;
({_F1, L1, _V1, _R1}, {_F2, L2, _V2, _R2}) ->
- CollateFun(L1, L2)
+ CollateFun(L1, L2) < 1
end,
lists:umerge(CollateWrapper, List1, List2).
sort_keys(#tree{} = Tree, List) ->
#tree{collate_fun = CollateFun} = Tree,
- lists:sort(CollateFun, List).
+ CollateWrapper = fun
+ (K1, K2) ->
+ CollateFun(K1, K2) < 1
+ end,
+ lists:sort(CollateWrapper, List).
sort_nodes(#tree{} = Tree, List) ->
#tree{collate_fun = CollateFun} = Tree,
CollateWrapper = fun
(#node{} = N1, #node{} = N2) ->
- CollateFun(first_key(N1), first_key(N2))
+ CollateFun(first_key(N1), first_key(N2)) < 1
end,
lists:sort(CollateWrapper, List).
@@ -944,9 +946,9 @@ sort_members(#tree{} = Tree, List) ->
#tree{collate_fun = CollateFun} = Tree,
CollateWrapper = fun
({K1, _V1}, {K2, _V2}) ->
- CollateFun(K1, K2);
+ CollateFun(K1, K2) < 1;
({_F1, L1, _V1, _R1}, {_F2, L2, _V2, _R2}) ->
- CollateFun(L1, L2)
+ CollateFun(L1, L2) < 1
end,
lists:sort(CollateWrapper, List).
@@ -955,15 +957,22 @@ usort_members(#tree{} = Tree, List) ->
#tree{collate_fun = CollateFun} = Tree,
CollateWrapper = fun
({K1, _V1}, {K2, _V2}) ->
- CollateFun(K1, K2);
+ CollateFun(K1, K2) < 1;
({_F1, L1, _V1, _R1}, {_F2, L2, _V2, _R2}) ->
- CollateFun(L1, L2)
+ CollateFun(L1, L2) < 1
end,
lists:usort(CollateWrapper, List).
-collate_raw(K1, K2) ->
- K1 =< K2.
+collate_raw(K1, K2) when K1 < K2 ->
+ -1;
+
+collate_raw(K1, K2) when K1 > K2 ->
+ 1;
+
+collate_raw(K, K) ->
+ 0.
+
%% encoding function
@@ -1235,7 +1244,7 @@ raw_collation_test() ->
custom_collation_test() ->
Db = erlfdb_util:get_test_db([empty]),
- CollateFun = fun(A, B) -> B =< A end,
+ CollateFun = fun(A, B) -> collate_raw(B, A) end,
Tree = open(Db, <<1,2,3>>, 4, [{collate_fun, CollateFun}]),
insert(Db, Tree, 1, 1),
insert(Db, Tree, 2, 2),
@@ -1299,7 +1308,7 @@ custom_collation_range_test_() ->
Db = erlfdb_util:get_test_db([empty]),
Max = 1000,
Keys = [X || {_, X} <- lists:sort([ {rand:uniform(), N} || N <- lists:seq(1, Max)])],
- CollateFun = fun(A, B) -> B =< A end,
+ CollateFun = fun(A, B) -> collate_raw(B, A) end,
Tree = open(Db, <<1,2,3>>, 10, [{collate_fun, CollateFun}]),
lists:foldl(fun(Key, T) -> insert(Db, T, Key, Key + 1) end, Tree, Keys),
lists:foreach(
@@ -1323,7 +1332,7 @@ custom_collation_reverse_range_test_() ->
Db = erlfdb_util:get_test_db([empty]),
Max = 1000,
Keys = [X || {_, X} <- lists:sort([ {rand:uniform(), N} || N <- lists:seq(1, Max)])],
- CollateFun = fun(A, B) -> B =< A end,
+ CollateFun = fun(A, B) -> collate_raw(B, A) end,
Tree = open(Db, <<1,2,3>>, 10, [{collate_fun, CollateFun}]),
lists:foldl(fun(Key, T) -> insert(Db, T, Key, Key + 1) end, Tree, Keys),
lists:foreach(