summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarren Smith <garren.smith@gmail.com>2020-02-11 14:33:32 +0200
committerGarren Smith <garren.smith@gmail.com>2020-02-17 14:04:49 +0200
commited0accfcf97f43d60015d8dbac412ff15c8a2d13 (patch)
treefc0f82171115a0ec1d5b0e58ef3822b8a9a6f010
parent12c269aca4f9ccd967634c7e2e6856116384d325 (diff)
downloadcouchdb-ed0accfcf97f43d60015d8dbac412ff15c8a2d13.tar.gz
basic loading of conflicts for docs
-rw-r--r--src/fabric/src/fabric2_db.erl1
-rw-r--r--src/fabric/src/fabric2_fdb.erl23
-rw-r--r--src/mango/test/19-find-conflicts.py2
3 files changed, 24 insertions, 2 deletions
diff --git a/src/fabric/src/fabric2_db.erl b/src/fabric/src/fabric2_db.erl
index 7e08e56bd..ce3d24807 100644
--- a/src/fabric/src/fabric2_db.erl
+++ b/src/fabric/src/fabric2_db.erl
@@ -75,6 +75,7 @@
open_doc/2,
open_doc/3,
open_doc_revs/4,
+ apply_open_doc_opts/3,
%% open_doc_int/3,
get_doc_info/2,
get_full_doc_info/2,
diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl
index 0a5bf9b5e..e28d0b493 100644
--- a/src/fabric/src/fabric2_fdb.erl
+++ b/src/fabric/src/fabric2_fdb.erl
@@ -787,7 +787,25 @@ write_doc(#{} = Db0, Doc, NewWinner0, OldWinner, ToUpdate, ToRemove) ->
incr_stat(Db, <<"doc_del_count">>, 1),
mango_indexer:delete_doc(Db, PrevDoc);
updated ->
- mango_indexer:update_doc(Db, Doc, PrevDoc)
+ DocRev = extract_rev(Doc#doc.revs),
+ {WinnerRevPos, _} = WinnerRevId = maps:get(rev_id, NewWinner),
+ {WinnerDoc, OldWinnerDoc} = case WinnerRevId == DocRev of
+ true -> {Doc, PrevDoc};
+ false -> {PrevDoc, PrevDoc}
+ end,
+
+ RevConflicts = lists:foldl(fun (UpdateRev, Acc) ->
+ {RevPos, _} = maps:get(rev_id, UpdateRev),
+ case RevPos == WinnerRevPos of
+ true ->
+ Acc ++ [UpdateRev#{winner := false}];
+ false ->
+ Acc
+ end
+ end, [], ToUpdate),
+
+ {ok, WinnerDoc1} = fabric2_db:apply_open_doc_opts(WinnerDoc, RevConflicts, [conflicts]),
+ mango_indexer:update_doc(Db, WinnerDoc1, OldWinnerDoc)
end,
% Update database size
@@ -797,6 +815,9 @@ write_doc(#{} = Db0, Doc, NewWinner0, OldWinner, ToUpdate, ToRemove) ->
ok.
+extract_rev({RevPos, [Rev | _]}) ->
+ {RevPos, Rev}.
+
write_local_doc(#{} = Db0, Doc) ->
#{
diff --git a/src/mango/test/19-find-conflicts.py b/src/mango/test/19-find-conflicts.py
index 45a1e3122..bf865d6ea 100644
--- a/src/mango/test/19-find-conflicts.py
+++ b/src/mango/test/19-find-conflicts.py
@@ -25,7 +25,7 @@ class ChooseCorrectIndexForDocs(mango.DbPerClass):
self.db.save_docs_with_conflicts(copy.deepcopy(CONFLICT))
def test_retrieve_conflicts(self):
- self.db.create_index(["_conflicts"], wait_for_built_index=False)
+ self.db.create_index(["_conflicts"])
result = self.db.find({"_conflicts": {"$exists": True}}, conflicts=True)
self.assertEqual(
result[0]["_conflicts"][0], "1-23202479633c2b380f79507a776743d5"