You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2020/09/03 18:31:51 UTC
[couchdb] 04/05: Optimize umerge_members
This is an automated email from the ASF dual-hosted git repository.
davisp pushed a commit to branch prototype/fdb-layer
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 2dd85afd59d409617b974ca07924c22ec2979c50
Author: Paul J. Davis <pa...@gmail.com>
AuthorDate: Thu Aug 27 11:26:33 2020 -0500
Optimize umerge_members
Using lists:umerge/3 adds extra invocations of the collation algorithm
because its using `=<` semantics when ebtree collations are capable of
producing `lt, eq, gt` results.
---
src/ebtree/src/ebtree.erl | 24 ++++++++++++++++++++----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/src/ebtree/src/ebtree.erl b/src/ebtree/src/ebtree.erl
index 680bf1d..ea445ea 100644
--- a/src/ebtree/src/ebtree.erl
+++ b/src/ebtree/src/ebtree.erl
@@ -1161,13 +1161,29 @@ collate(#tree{} = Tree, A, B, Allowed) ->
umerge_members(#tree{} = Tree, Level, List1, List2) ->
- CollateWrapper = fun
+ Collate = fun
({K1, _V1}, {K2, _V2}) when Level == 0 ->
- collate(Tree, K1, K2, [lt, eq]);
+ collate(Tree, K1, K2);
({_F1, L1, _V1, _R1}, {_F2, L2, _V2, _R2}) when Level > 0 ->
- collate(Tree, L1, L2, [lt, eq])
+ collate(Tree, L1, L2)
end,
- lists:umerge(CollateWrapper, List1, List2).
+ umerge_members_int(Collate, List1, List2, []).
+
+
+umerge_members_int(Collate, [], [H2 | T2], [HAcc | _] = Acc) ->
+ case Collate(H2, HAcc) of
+ lt -> erlang:error(unsorted_members);
+ eq -> lists:reverse(Acc, T2);
+ gt -> lists:reverse(Acc, [H2 | T2])
+ end;
+umerge_members_int(_Collate, List1, [], Acc) ->
+ lists:reverse(Acc, List1);
+umerge_members_int(Collate, [H1 | T1], [H2 | T2], Acc) ->
+ case Collate(H1, H2) of
+ lt -> umerge_members_int(Collate, T1, [H2 | T2], [H1 | Acc]);
+ eq -> umerge_members_int(Collate, T1, [H2 | T2], [H1 | Acc]);
+ gt -> umerge_members_int(Collate, [H1 | T1], T2, [H2 | Acc])
+ end.
sort_keys(#tree{} = Tree, List) ->