diff options
author | Garren Smith <garren.smith@gmail.com> | 2020-03-16 16:21:33 +0200 |
---|---|---|
committer | garren smith <garren.smith@gmail.com> | 2020-03-17 17:47:00 +0200 |
commit | 3bac80479bd57535e5748dd4e6c3bc53d1ef7bb0 (patch) | |
tree | 87ffd44f83358d5d58b63514e1bee75805d9cf85 | |
parent | f28a1ad439ffd1a2df3a715a2b696c0f4886bddf (diff) | |
download | couchdb-3bac80479bd57535e5748dd4e6c3bc53d1ef7bb0.tar.gz |
add _conflicts field to docs for views
-rw-r--r-- | src/couch_views/src/couch_views_indexer.erl | 10 | ||||
-rw-r--r-- | src/fabric/src/fabric2_db.erl | 4 | ||||
-rw-r--r-- | test/elixir/test/map_test.exs | 35 |
3 files changed, 47 insertions, 2 deletions
diff --git a/src/couch_views/src/couch_views_indexer.erl b/src/couch_views/src/couch_views_indexer.erl index fb732a698..04dbcf815 100644 --- a/src/couch_views/src/couch_views_indexer.erl +++ b/src/couch_views/src/couch_views_indexer.erl @@ -348,7 +348,15 @@ fetch_docs(Db, Changes) -> ChangesWithDocs = lists:map(fun (BodyFuture) -> {Id, RevInfo, Change} = maps:get(BodyFuture, BodyState), Doc = fabric2_fdb:get_doc_body_wait(Db, Id, RevInfo, BodyFuture), - Change#{doc => Doc} + + BranchCount = maps:get(branch_count, RevInfo, 1), + Doc1 = if BranchCount == 1 -> Doc; true -> + RevConflicts = fabric2_fdb:get_all_revs(Db, Id), + {ok, DocWithConflicts} = fabric2_db:apply_open_doc_opts(Doc, + RevConflicts, [conflicts]), + DocWithConflicts + end, + Change#{doc => Doc1} end, erlfdb:wait_for_all(BodyFutures)), % This combines the deleted changes with the changes that contain docs diff --git a/src/fabric/src/fabric2_db.erl b/src/fabric/src/fabric2_db.erl index 791282f63..4d65f306f 100644 --- a/src/fabric/src/fabric2_db.erl +++ b/src/fabric/src/fabric2_db.erl @@ -126,7 +126,9 @@ validate_dbname/1, %% make_doc/5, - new_revid/2 + new_revid/2, + + apply_open_doc_opts/3 ]). diff --git a/test/elixir/test/map_test.exs b/test/elixir/test/map_test.exs index d2a79449f..84325659d 100644 --- a/test/elixir/test/map_test.exs +++ b/test/elixir/test/map_test.exs @@ -551,6 +551,41 @@ defmodule ViewMapTest do assert ids == ["doc-id-8", "doc-id-7", "doc-id-6"] end + test "_conflict is supported", context do + db_name = context[:db_name] + conflict = %{ + :_id => "doc-id-1", + :value => 10, + :some => "field", + :group => false, + :_rev => "1-7cc2eea421141064893681a1582148d8" + } + ddoc = %{ + _id: "_design/conflicts", + views: %{ + view: %{ + map: """ + function (doc) { + if (!doc._conflicts) { + return; + } + emit(doc._id, doc._conflicts); + } + """ + } + } + } + + resp = Couch.post("/#{db_name}/_bulk_docs", body: %{:docs => [ddoc]}) + assert resp.status_code == 201 + resp = Couch.post("/#{db_name}/_bulk_docs", body: %{:docs => [conflict], :new_edits => false}) + assert resp.status_code == 201 + + url = "/#{db_name}/_design/conflicts/_view/view" + resp = Couch.get(url) + assert get_ids(resp) == ["doc-id-1"] + end + def update_doc_value(db_name, id, value) do resp = Couch.get("/#{db_name}/#{id}") doc = convert(resp.body) |