diff options
author | Robert Newson <rnewson@apache.org> | 2020-07-28 20:27:50 +0100 |
---|---|---|
committer | Robert Newson <rnewson@apache.org> | 2020-07-28 21:23:05 +0100 |
commit | c7e85389243a188db38dcd6426848838d4dfdc0b (patch) | |
tree | 80a00976cf57fc6260907238ba520399921e5a4f | |
parent | 0c7c77eb59d626505cf6ec4162e1053837bc3593 (diff) | |
download | couchdb-c7e85389243a188db38dcd6426848838d4dfdc0b.tar.gz |
Change collate_fun contract from true|false to -1, 0, 1
-rw-r--r-- | src/ebtree/src/ebtree.erl | 71 |
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( |