diff options
author | Garren Smith <garren.smith@gmail.com> | 2020-02-11 14:33:32 +0200 |
---|---|---|
committer | Garren Smith <garren.smith@gmail.com> | 2020-02-17 14:04:49 +0200 |
commit | ed0accfcf97f43d60015d8dbac412ff15c8a2d13 (patch) | |
tree | fc0f82171115a0ec1d5b0e58ef3822b8a9a6f010 | |
parent | 12c269aca4f9ccd967634c7e2e6856116384d325 (diff) | |
download | couchdb-ed0accfcf97f43d60015d8dbac412ff15c8a2d13.tar.gz |
basic loading of conflicts for docs
-rw-r--r-- | src/fabric/src/fabric2_db.erl | 1 | ||||
-rw-r--r-- | src/fabric/src/fabric2_fdb.erl | 23 | ||||
-rw-r--r-- | src/mango/test/19-find-conflicts.py | 2 |
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" |