summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarren Smith <garren.smith@gmail.com>2020-03-16 16:21:33 +0200
committergarren smith <garren.smith@gmail.com>2020-03-17 17:47:00 +0200
commit3bac80479bd57535e5748dd4e6c3bc53d1ef7bb0 (patch)
tree87ffd44f83358d5d58b63514e1bee75805d9cf85
parentf28a1ad439ffd1a2df3a715a2b696c0f4886bddf (diff)
downloadcouchdb-3bac80479bd57535e5748dd4e6c3bc53d1ef7bb0.tar.gz
add _conflicts field to docs for views
-rw-r--r--src/couch_views/src/couch_views_indexer.erl10
-rw-r--r--src/fabric/src/fabric2_db.erl4
-rw-r--r--test/elixir/test/map_test.exs35
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)