From 6c8db21f61d8dce4f83598661703583a2908ea74 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Lievremont Date: Mon, 4 May 2015 10:43:53 +0200 Subject: [PATCH] SONAR-6465 Prevent side effect of multi-field mapping creation --- .../main/java/org/sonar/server/es/NewIndex.java | 15 +++++++++++++-- .../server/user/index/UserIndexDefinition.java | 4 ++-- .../java/org/sonar/server/es/NewIndexTest.java | 5 +++++ 3 files changed, 20 insertions(+), 4 deletions(-) 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 ece5f4d0804..8af1cb72770 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 @@ -174,7 +174,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 multiField = false, sortable = false, wordSearch = false, gramSearch = false, docValues = false, disableSearch = false; private StringFieldBuilder(NewIndexType indexType, String fieldName) { this.indexType = indexType; @@ -186,10 +186,19 @@ public class NewIndex { return this; } + /** + * Prepare the structure to add sub-fields + */ + public StringFieldBuilder enableMultiField() { + this.multiField = true; + return this; + } + /** * Create an inner-field named "sort" with analyzer "sortable" */ public StringFieldBuilder enableSorting() { + this.enableMultiField(); this.sortable = true; return this; } @@ -198,6 +207,7 @@ public class NewIndex { * Create an inner-field named "words" with analyzer "words" */ public StringFieldBuilder enableWordSearch() { + this.enableMultiField(); this.wordSearch = true; return this; } @@ -206,6 +216,7 @@ public class NewIndex { * Create a inner-field named "grams" with analyzer "grams" */ public StringFieldBuilder enableGramSearch() { + this.enableMultiField(); this.gramSearch = true; return this; } @@ -223,7 +234,7 @@ public class NewIndex { public void build() { validate(); Map hash = new TreeMap<>(); - if (wordSearch || sortable || gramSearch) { + if (multiField) { hash.put("type", "multi_field"); Map multiFields = new TreeMap<>(); 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 923502cf2a3..5b88a695edb 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 @@ -80,9 +80,9 @@ public class UserIndexDefinition implements IndexDefinition { NewIndex.NewIndexType mapping = index.createType(TYPE_USER); mapping.setAttribute("_id", ImmutableMap.of("path", FIELD_LOGIN)); - mapping.stringFieldBuilder(FIELD_LOGIN).enableGramSearch().build(); + mapping.stringFieldBuilder(FIELD_LOGIN).enableMultiField().build(); addSubSearchField(mapping, FIELD_LOGIN); - mapping.stringFieldBuilder(FIELD_NAME).enableGramSearch().build(); + mapping.stringFieldBuilder(FIELD_NAME).enableMultiField().build(); addSubSearchField(mapping, FIELD_NAME); mapping.stringFieldBuilder(FIELD_EMAIL).enableSorting().build(); mapping.createDateTimeField(FIELD_CREATED_AT); diff --git a/server/sonar-server/src/test/java/org/sonar/server/es/NewIndexTest.java b/server/sonar-server/src/test/java/org/sonar/server/es/NewIndexTest.java index 28c7a00750a..20310ec57f8 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/es/NewIndexTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/es/NewIndexTest.java @@ -91,6 +91,7 @@ public class NewIndexTest { .enableWordSearch() .enableSorting() .build(); + mapping.stringFieldBuilder("just_multi_field").enableMultiField().build(); Map props = (Map) mapping.getProperty("basic_field"); assertThat(props.get("type")).isEqualTo("string"); @@ -106,6 +107,10 @@ public class NewIndexTest { assertThat(props.get("type")).isEqualTo("multi_field"); // no need to test values, it's not the scope of this test assertThat((Map) props.get("fields")).isNotEmpty(); + + props = (Map) mapping.getProperty("just_multi_field"); + assertThat(props.get("type")).isEqualTo("multi_field"); + assertThat((Map) props.get("fields")).isNotEmpty(); } @Test -- 2.39.5