Skip to content

Commit 3603fac

Browse files
author
eberhardtj
committed
Fix issue malformed solr documents when on field receives two updates
An issue occurred, when a field received two different modifications (e.g. add and remove). The malformed solr document added a new field, for each update.
1 parent db36fa3 commit 3603fac

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

src/main/java/org/metafacture/contrib/solr/SolrDocumentBuilder.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.metafacture.contrib.solr;
1717

1818
import org.apache.solr.common.SolrInputDocument;
19+
import org.apache.solr.common.SolrInputField;
1920
import org.metafacture.contrib.framework.SolrDocumentReceiver;
2021
import org.metafacture.framework.FluxCommand;
2122
import org.metafacture.framework.MetafactureException;
@@ -79,11 +80,24 @@ public void startEntity(String name) {
7980
}
8081

8182
@Override
83+
@SuppressWarnings("unchecked")
8284
public void endEntity() {
8385
if (!updateMethod.isEmpty()) {
84-
Map<String,Object> atomicUpdateAction = new HashMap<>();
85-
atomicUpdateAction.put(updateMethod, new ArrayList<>(updateFieldValues));
86-
document.addField(updateFieldName, atomicUpdateAction);
86+
87+
SolrInputField field = document.getField(updateFieldName);
88+
if (field == null) {
89+
// New field
90+
Map<String,Object> atomicUpdateAction = new HashMap<>();
91+
atomicUpdateAction.put(updateMethod, new ArrayList<>(updateFieldValues));
92+
document.addField(updateFieldName, atomicUpdateAction);
93+
} else {
94+
// Modify field
95+
Object o = field.getValue();
96+
if (o instanceof Map) {
97+
Map<String,Object> atomicUpdateAction = (Map<String,Object>) o;
98+
atomicUpdateAction.put(updateMethod, new ArrayList<>(updateFieldValues));
99+
}
100+
}
87101
}
88102
updateMethod = "";
89103
updateFieldValues = new ArrayList<>();

src/test/java/org/metafacture/contrib/solr/SolrDocumentBuilderTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,24 @@ public void shouldContainTwoAtomicUpdates() {
147147
assertThat(valueMap2.keySet(), hasItem("set"));
148148
assertThat(valueMap2.get("set"), hasItem("New Title"));
149149
}
150+
151+
@Test
152+
@SuppressWarnings("unchecked")
153+
public void shouldContainTwoAtomicUpdatesForOneField() {
154+
builder.startRecord("id1");
155+
builder.startEntity("add");
156+
builder.literal("name", "alice");
157+
builder.literal("name", "bob");
158+
builder.endEntity();
159+
builder.startEntity("remove");
160+
builder.literal("name", "claire");
161+
builder.endEntity();
162+
builder.endRecord();
163+
builder.closeStream();
164+
165+
SolrInputDocument document = buffer.getObject();
166+
167+
assertThat(document.toString(),
168+
is(equalTo("SolrInputDocument(fields: [name={add=[alice, bob], remove=[claire]}])")));
169+
}
150170
}

0 commit comments

Comments
 (0)