Created
April 1, 2015 08:43
-
-
Save EikeDehling/2e34a78a54de646b71ca to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
--- a/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java | |
+++ b/src/main/java/org/elasticsearch/index/mapper/core/AbstractFieldMapper.java | |
@@ -24,7 +24,6 @@ import com.carrotsearch.hppc.cursors.ObjectCursor; | |
import com.carrotsearch.hppc.cursors.ObjectObjectCursor; | |
import com.google.common.base.Objects; | |
import com.google.common.collect.ImmutableList; | |
- | |
import org.apache.lucene.analysis.Analyzer; | |
import org.apache.lucene.document.Field; | |
import org.apache.lucene.document.FieldType; | |
@@ -763,10 +762,17 @@ public abstract class AbstractFieldMapper<T> implements FieldMapper<T> { | |
builder.field("similarity", SimilarityLookupService.DEFAULT_SIMILARITY); | |
} | |
+ TreeMap<String, Object> orderedFielddataSettings = new TreeMap<String, Object>(new Comparator<String>() { | |
+ public int compare(String o1, String o2) { | |
+ return o1.toLowerCase().compareTo(o2.toLowerCase()); | |
+ } | |
+ }); | |
if (customFieldDataSettings != null) { | |
- builder.field("fielddata", (Map) customFieldDataSettings.getAsMap()); | |
+ orderedFielddataSettings.putAll(customFieldDataSettings.getAsMap()); | |
+ builder.field("fielddata", orderedFielddataSettings); | |
} else if (includeDefaults) { | |
- builder.field("fielddata", (Map) fieldDataType.getSettings().getAsMap()); | |
+ orderedFielddataSettings.putAll((Map) fieldDataType.getSettings().getAsMap()); | |
+ builder.field("fielddata", orderedFielddataSettings); | |
} | |
multiFields.toXContent(builder, params); | |
diff --git a/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java b/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java | |
index 7f4366d..5dc32d3 100644 | |
--- a/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java | |
+++ b/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java | |
@@ -445,4 +445,37 @@ public class MultiFieldTests extends ElasticsearchSingleNodeTest { | |
assertThat(field, equalTo(multiFieldNames[i++])); | |
} | |
} | |
+ | |
+ @Test | |
+ @SuppressWarnings("unchecked") | |
+ // The fielddata settings need to be in consistent order, else unneccesary mapping sync's can be triggered | |
+ public void testMultiFieldsFieldDataSettingsInConsistentOrder() throws Exception { | |
+ final String MY_MULTI_FIELD = "multi_field"; | |
+ | |
+ // Generate a mapping with (un-/wrong-)ordered fielddata settings | |
+ XContentBuilder builder = jsonBuilder().startObject().startObject("type").startObject("properties") | |
+ .startObject("my_field").field("type", "string").startObject("fields").startObject(MY_MULTI_FIELD) | |
+ .field("type", "string").startObject("fielddata").field("filter.frequency.min", 2) | |
+ .field("filter.frequency.max", 2).field("filter.regex.pattern", ".*").endObject().endObject() | |
+ .endObject().endObject().endObject().endObject().endObject(); | |
+ | |
+ String mapping = builder.string(); | |
+ DocumentMapper docMapper = createIndex("test").mapperService().documentMapperParser().parse(mapping); | |
+ | |
+ // Extract the fielddata settings of our field from the mapping | |
+ Map<String, Object> sourceAsMap = XContentHelper.convertToMap(docMapper.mappingSource().compressed(), true).v2(); | |
+ Map<String, Object> fieldDataSettings = (Map<String, Object>) | |
+ XContentMapValues.extractValue("type.properties.my_field.fields." + MY_MULTI_FIELD + ".fielddata", sourceAsMap); | |
+ | |
+ // Extract/sort the keys of field data settings | |
+ String[] expectedKeys = fieldDataSettings.keySet().toArray(new String[]{}); | |
+ Arrays.sort(expectedKeys); | |
+ | |
+ // The keySet of fieldDataSettings is in order of data that was in the XContent object, | |
+ // so we expect the keySet to be ordered just as our sorted array | |
+ int i = 0; | |
+ for (String key : fieldDataSettings.keySet()) { | |
+ assertThat(key, equalTo(expectedKeys[i++])); | |
+ } | |
+ } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment