summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J. Davis <paul.joseph.davis@gmail.com>2017-11-15 11:45:54 -0600
committerNick Vatamaniuc <vatamane@apache.org>2018-01-15 17:37:46 -0500
commitb994b3ffaaff3c490f6d72a673d6b91f7894ba2e (patch)
treeded251cbebbf3eaa229831fc79e417ea79098612
parent715378eb99a8d9ae7d2fc03a34f3cb58626ed481 (diff)
downloadcouchdb-b994b3ffaaff3c490f6d72a673d6b91f7894ba2e.tar.gz
Move sorting logic to couch_key_tree.erl
-rw-r--r--src/couch/src/couch_db.erl8
-rw-r--r--src/couch/src/couch_key_tree.erl10
2 files changed, 11 insertions, 7 deletions
diff --git a/src/couch/src/couch_db.erl b/src/couch/src/couch_db.erl
index eb39c56ea..c352f3c0b 100644
--- a/src/couch/src/couch_db.erl
+++ b/src/couch/src/couch_db.erl
@@ -946,13 +946,7 @@ prep_and_validate_replicated_updates(Db, [Bucket|RestBuckets], [OldInfo|RestOldI
OldLeafs = couch_key_tree:get_all_leafs_full(OldTree),
OldLeafsLU = [{Start, RevId} || {Start, [{RevId, _}|_]} <- OldLeafs],
NewPaths = lists:map(fun couch_doc:to_path/1, Bucket),
- SortedPaths = lists:sort(NewPaths),
- NewRevTree = lists:foldl(
- fun(NewPath, AccTree) ->
- {NewTree, _} = couch_key_tree:merge(AccTree, NewPath),
- NewTree
- end,
- OldTree, SortedPaths),
+ NewRevTree = couch_key_tree:multi_merge(OldTree, NewPaths),
Leafs = couch_key_tree:get_all_leafs_full(NewRevTree),
LeafRevsFullDict = dict:from_list( [{{Start, RevId}, FullPath} || {Start, [{RevId, _}|_]}=FullPath <- Leafs]),
{ValidatedBucket, AccErrors3} =
diff --git a/src/couch/src/couch_key_tree.erl b/src/couch/src/couch_key_tree.erl
index eda466467..a4d6d951d 100644
--- a/src/couch/src/couch_key_tree.erl
+++ b/src/couch/src/couch_key_tree.erl
@@ -59,6 +59,7 @@ get_key_leafs/2,
map/2,
map_leafs/2,
mapfold/3,
+multi_merge/2,
merge/3,
merge/2,
remove_leafs/2,
@@ -72,6 +73,15 @@ full_stem/2
-type revtree() :: [tree()].
+%% @doc Merge multiple paths into the given tree.
+-spec multi_merge(revtree(), tree()) -> revtree().
+multi_merge(RevTree, Trees) ->
+ lists:foldl(fun(Tree) ->
+ {NewRevTree, _} = merge(RevTree, Tree),
+ NewRevTree
+ end, RevTree, lists:sort(Trees)).
+
+
%% @doc Merge a path into the given tree and then stem the result.
%% Although Tree is of type tree(), it must not contain any branches.
-spec merge(revtree(), tree(), pos_integer()) ->