AbstractElasticIndex: Fix representation of repeated fields
Currently, the JSON passed to ES when updating a document represents
repeated fields with an array-of-arrays containing exactly one outer
element:
"submit_record": [
[
"NOT_READY",
"NEED,code-review"
]
],
This was not intended. The correct representation should be a single
array:
"submit_record": [
"NOT_READY",
"NEED,code-review"
],
Convert the values to a single array. Also filter out strings with
empty values.
Change-Id: I72b56428ed620c34bf110c57cdda450c493be2f8
diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
index 5feb918..98d8d4c 100644
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
+++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
@@ -16,12 +16,14 @@
import static com.google.common.base.Preconditions.checkState;
import static com.google.gson.FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES;
+import static java.util.stream.Collectors.toList;
import static org.apache.commons.codec.binary.Base64.decodeBase64;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Iterables;
+import com.google.common.collect.Streams;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.index.FieldDef.FillArgs;
@@ -183,15 +185,21 @@
return new io.searchbox.core.Index.Builder(doc).index(indexName).type(type).id(id).build();
}
+ private static boolean shouldAddElement(Object element) {
+ return !(element instanceof String) || !((String) element).isEmpty();
+ }
+
private String toDoc(V v) throws IOException {
XContentBuilder builder = jsonBuilder().startObject();
for (Values<V> values : schema.buildFields(v, fillArgs)) {
String name = values.getField().getName();
if (values.getField().isRepeatable()) {
- builder.array(name, values.getValues());
+ builder.field(
+ name,
+ Streams.stream(values.getValues()).filter(e -> shouldAddElement(e)).collect(toList()));
} else {
Object element = Iterables.getOnlyElement(values.getValues(), "");
- if (!(element instanceof String) || !((String) element).isEmpty()) {
+ if (shouldAddElement(element)) {
builder.field(name, element);
}
}