From: Jean-Baptiste Lievremont Date: Tue, 5 May 2015 13:47:24 +0000 (+0200) Subject: SONAR-6465 Enforce use of SortedMap for ES index settings X-Git-Tag: 5.2-RC1~2035 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fpull%2F276%2Fhead;p=sonarqube.git SONAR-6465 Enforce use of SortedMap for ES index settings --- diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java b/server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java index dd26b7edf84..b5768fdec3d 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java +++ b/server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java @@ -175,7 +175,7 @@ public class NewIndex { public static class StringFieldBuilder { private final NewIndexType indexType; private final String fieldName; - private boolean sortable = false, wordSearch = false, gramSearch = false, docValues = false, disableSearch = false; + private boolean docValues = false, disableSearch = false, hasAnalyzedField = false; private SortedMap subFields = Maps.newTreeMap(); private StringFieldBuilder(NewIndexType indexType, String fieldName) { @@ -189,10 +189,12 @@ public class NewIndex { } /** - * Add a sub-field + * Add a sub-field. A {@code SortedMap} is required for consistency of the index settings hash. + * @see IndexDefinitionHash */ - public StringFieldBuilder addSubField(String fieldName, Map fieldDefinition) { + public StringFieldBuilder addSubField(String fieldName, SortedMap fieldDefinition) { subFields.put(fieldName, fieldDefinition); + hasAnalyzedField |= "analyzed".equals(fieldDefinition.get("index")); return this; } @@ -200,7 +202,6 @@ public class NewIndex { * Create an inner-field named "sort" with analyzer "sortable" */ public StringFieldBuilder enableSorting() { - this.sortable = true; addSubField(IndexField.SORT_SUFFIX, ImmutableSortedMap.of( "type", "string", "index", "analyzed", @@ -212,7 +213,6 @@ public class NewIndex { * Create an inner-field named "words" with analyzer "words" */ public StringFieldBuilder enableWordSearch() { - this.wordSearch = true; addSubField(IndexField.SEARCH_WORDS_SUFFIX, ImmutableSortedMap.of( "type", "string", "index", "analyzed", @@ -225,7 +225,6 @@ public class NewIndex { * Create a inner-field named "grams" with analyzer "grams" */ public StringFieldBuilder enableGramSearch() { - this.gramSearch = true; addSubField(IndexField.SEARCH_PARTIAL_SUFFIX, ImmutableSortedMap.of( "type", "string", "index", "analyzed", @@ -268,10 +267,10 @@ public class NewIndex { } private void validate() { - if (docValues && (gramSearch || wordSearch || sortable)) { + if (docValues && hasAnalyzedField) { throw new IllegalStateException("Doc values are not supported on analyzed strings of field: " + fieldName); } - if (disableSearch && (gramSearch || wordSearch || sortable)) { + if (disableSearch && hasAnalyzedField) { throw new IllegalStateException("Can't mix searchable and non-searchable arguments on field: " + fieldName); } } diff --git a/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexDefinition.java b/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexDefinition.java index c5b272329b4..64e13256ef3 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexDefinition.java +++ b/server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexDefinition.java @@ -25,7 +25,7 @@ import org.sonar.api.config.Settings; import org.sonar.server.es.IndexDefinition; import org.sonar.server.es.NewIndex; -import java.util.Map; +import java.util.SortedMap; /** * Definition of ES index "users", including settings and fields. @@ -88,7 +88,7 @@ public class UserIndexDefinition implements IndexDefinition { mapping.stringFieldBuilder(FIELD_SCM_ACCOUNTS).build(); } - private Map buildGramSearchField() { + private SortedMap buildGramSearchField() { return ImmutableSortedMap.of( "type", "string", "index", "analyzed",