]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6465 Enforce use of SortedMap for ES index settings 276/head
authorJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Tue, 5 May 2015 13:47:24 +0000 (15:47 +0200)
committerJean-Baptiste Lievremont <jean-baptiste.lievremont@sonarsource.com>
Wed, 6 May 2015 08:57:07 +0000 (10:57 +0200)
server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java
server/sonar-server/src/main/java/org/sonar/server/user/index/UserIndexDefinition.java

index dd26b7edf84239fc35e04cbb9c62bf188c51a61e..b5768fdec3d45d2813272faf96d2e12f86db7445 100644 (file)
@@ -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<String, Object> 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<String, String> fieldDefinition) {
+    public StringFieldBuilder addSubField(String fieldName, SortedMap<String, String> 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);
       }
     }
index c5b272329b4e26edf3147b3f2ac52437d42ec0fb..64e13256ef338ca95724b16c900e19e28a3481ac 100644 (file)
@@ -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<String, String> buildGramSearchField() {
+  private SortedMap<String, String> buildGramSearchField() {
     return ImmutableSortedMap.of(
       "type", "string",
       "index", "analyzed",