diff options
author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2017-11-15 11:45:54 -0600 |
---|---|---|
committer | Nick Vatamaniuc <vatamane@apache.org> | 2018-01-15 17:37:46 -0500 |
commit | b994b3ffaaff3c490f6d72a673d6b91f7894ba2e (patch) | |
tree | ded251cbebbf3eaa229831fc79e417ea79098612 | |
parent | 715378eb99a8d9ae7d2fc03a34f3cb58626ed481 (diff) | |
download | couchdb-b994b3ffaaff3c490f6d72a673d6b91f7894ba2e.tar.gz |
Move sorting logic to couch_key_tree.erl
-rw-r--r-- | src/couch/src/couch_db.erl | 8 | ||||
-rw-r--r-- | src/couch/src/couch_key_tree.erl | 10 |
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()) -> |