Skip to content

Commit eaa1f62

Browse files
committed
tests
1 parent 077daa7 commit eaa1f62

File tree

6 files changed

+80
-153
lines changed

6 files changed

+80
-153
lines changed

server/src/main/java/org/elasticsearch/index/mapper/TextFieldMapper.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,7 @@ public Builder(String name, Version indexCreatedVersion, IndexAnalyzers indexAna
285285
super(name);
286286
this.indexCreatedVersion = indexCreatedVersion;
287287
this.indexAnalyzers = indexAnalyzers;
288-
this.analyzers = new TextParams.AnalyzerParameters(
289-
m -> ((TextFieldMapper) m).analyzerConfiguration,
290-
indexCreatedVersion
291-
);
288+
this.analyzers = new TextParams.AnalyzerParameters(m -> ((TextFieldMapper) m).analyzerConfiguration, indexCreatedVersion);
292289
}
293290

294291
public Builder index(boolean index) {
@@ -384,7 +381,12 @@ private KeywordFieldMapper.KeywordFieldType syntheticSourceDelegate(FieldType fi
384381
return null;
385382
}
386383

387-
private SubFieldInfo buildPrefixInfo(MapperBuilderContext context, TextParams.Analyzers analyzers, FieldType fieldType, TextFieldType tft) {
384+
private SubFieldInfo buildPrefixInfo(
385+
MapperBuilderContext context,
386+
TextParams.Analyzers analyzers,
387+
FieldType fieldType,
388+
TextFieldType tft
389+
) {
388390
if (indexPrefixes.get() == null) {
389391
return null;
390392
}
@@ -444,7 +446,12 @@ private SubFieldInfo buildPhraseInfo(TextParams.Analyzers analyzers, FieldType f
444446
return new SubFieldInfo(parent.name() + FAST_PHRASE_SUFFIX, phraseFieldType, a);
445447
}
446448

447-
private Map<String, NamedAnalyzer> indexAnalyzers(String name, NamedAnalyzer main, SubFieldInfo phraseFieldInfo, SubFieldInfo prefixFieldInfo) {
449+
private Map<String, NamedAnalyzer> indexAnalyzers(
450+
String name,
451+
NamedAnalyzer main,
452+
SubFieldInfo phraseFieldInfo,
453+
SubFieldInfo prefixFieldInfo
454+
) {
448455
Map<String, NamedAnalyzer> analyzers = new HashMap<>();
449456
analyzers.put(name, main);
450457
if (phraseFieldInfo != null) {

server/src/main/java/org/elasticsearch/index/mapper/TextParams.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -131,18 +131,16 @@ public static final class AnalyzerParameters {
131131

132132
private final Version indexCreatedVersion;
133133

134-
public AnalyzerParameters(
135-
Function<FieldMapper, AnalyzerConfiguration> analyzerInitFunction,
136-
Version indexCreatedVersion
137-
) {
134+
public AnalyzerParameters(Function<FieldMapper, AnalyzerConfiguration> analyzerInitFunction, Version indexCreatedVersion) {
138135
this.indexCreatedVersion = indexCreatedVersion;
139136
this.indexAnalyzer = Parameter.stringParam(
140137
"analyzer",
141138
false, // sort of - see merge validator!
142139
mapper -> analyzerInitFunction.apply(mapper).indexAnalyzer,
143-
null
140+
null,
141+
// serializer check means that if value is null then we're being asked for defaults
142+
(builder, name, value) -> builder.field(name, value == null ? "default" : value)
144143
)
145-
.acceptsNull()
146144
.setSerializerCheck((includeDefaults, isConfigured, value) -> includeDefaults || value != null)
147145
.setMergeValidator(
148146
// special cases
@@ -156,18 +154,18 @@ public AnalyzerParameters(
156154
"search_analyzer",
157155
true,
158156
mapper -> analyzerInitFunction.apply(mapper).searchAnalyzer,
159-
null
160-
)
161-
.acceptsNull()
162-
.setSerializerCheck((includeDefaults, isConfigured, value) -> includeDefaults || value != null);
157+
null,
158+
// serializer check means that if value is null then we're being asked for defaults
159+
(builder, name, value) -> builder.field(name, value == null ? "default" : value)
160+
).setSerializerCheck((includeDefaults, isConfigured, value) -> includeDefaults || value != null);
163161
this.searchQuoteAnalyzer = Parameter.stringParam(
164162
"search_quote_analyzer",
165163
true,
166164
mapper -> analyzerInitFunction.apply(mapper).searchQuoteAnalyzer,
167-
null
168-
)
169-
.acceptsNull()
170-
.setSerializerCheck((includeDefaults, isConfigured, value) -> includeDefaults || value != null);
165+
null,
166+
// serializer check means that if value is null then we're being asked for defaults
167+
(builder, name, value) -> builder.field(name, value == null ? "default" : value)
168+
).setSerializerCheck((includeDefaults, isConfigured, value) -> includeDefaults || value != null);
171169
this.positionIncrementGap = Parameter.intParam(
172170
"position_increment_gap",
173171
false,

server/src/test/java/org/elasticsearch/index/mapper/DynamicTemplatesTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ public void testIllegalDynamicTemplateInvalidAttribute() throws Exception {
531531
mapping.endObject();
532532
MapperParsingException e = expectThrows(MapperParsingException.class, () -> createMapperService(mapping));
533533
assertThat(e.getRootCause(), instanceOf(IllegalArgumentException.class));
534-
assertThat(e.getRootCause().getMessage(), equalTo("analyzer [foobar] has not been configured in mappings"));
534+
assertThat(e.getRootCause().getMessage(), equalTo("Unknown analyzer [foobar]"));
535535
}
536536

537537
public void testIllegalDynamicTemplateNoMappingType() throws Exception {

server/src/test/java/org/elasticsearch/index/mapper/TextFieldAnalyzerModeTests.java

Lines changed: 44 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,9 @@
88

99
package org.elasticsearch.index.mapper;
1010

11-
import org.apache.lucene.analysis.Analyzer;
1211
import org.apache.lucene.analysis.TokenStream;
13-
import org.apache.lucene.analysis.standard.StandardAnalyzer;
14-
import org.elasticsearch.Version;
15-
import org.elasticsearch.cluster.metadata.IndexMetadata;
1612
import org.elasticsearch.common.settings.Settings;
13+
import org.elasticsearch.index.IndexSettings;
1714
import org.elasticsearch.index.analysis.AbstractTokenFilterFactory;
1815
import org.elasticsearch.index.analysis.AnalysisMode;
1916
import org.elasticsearch.index.analysis.AnalyzerScope;
@@ -22,31 +19,30 @@
2219
import org.elasticsearch.index.analysis.IndexAnalyzers;
2320
import org.elasticsearch.index.analysis.NamedAnalyzer;
2421
import org.elasticsearch.index.analysis.TokenFilterFactory;
25-
import org.elasticsearch.test.ESTestCase;
2622

27-
import java.util.HashMap;
23+
import java.io.IOException;
2824
import java.util.Map;
2925

30-
import static org.elasticsearch.index.analysis.AnalysisRegistry.DEFAULT_ANALYZER_NAME;
3126
import static org.hamcrest.Matchers.containsString;
32-
import static org.mockito.Mockito.mock;
33-
import static org.mockito.Mockito.when;
34-
35-
public class TextFieldAnalyzerModeTests extends ESTestCase {
36-
37-
private static Map<String, NamedAnalyzer> defaultAnalyzers() {
38-
Map<String, NamedAnalyzer> analyzers = new HashMap<>();
39-
analyzers.put(DEFAULT_ANALYZER_NAME, new NamedAnalyzer("default", AnalyzerScope.INDEX, null));
40-
return analyzers;
27+
import static org.hamcrest.Matchers.equalTo;
28+
29+
public class TextFieldAnalyzerModeTests extends MapperServiceTestCase {
30+
31+
@Override
32+
protected IndexAnalyzers createIndexAnalyzers(IndexSettings indexSettings) {
33+
return IndexAnalyzers.of(
34+
Map.of(
35+
"all",
36+
createAnalyzerWithMode("all", AnalysisMode.ALL),
37+
"index",
38+
createAnalyzerWithMode("index", AnalysisMode.INDEX_TIME),
39+
"search",
40+
createAnalyzerWithMode("search", AnalysisMode.SEARCH_TIME)
41+
)
42+
);
4143
}
4244

43-
private static final IndexMetadata EMPTY_INDEX_METADATA = IndexMetadata.builder("")
44-
.settings(Settings.builder().put(IndexMetadata.SETTING_VERSION_CREATED, Version.CURRENT))
45-
.numberOfShards(1)
46-
.numberOfReplicas(0)
47-
.build();
48-
49-
private Analyzer createAnalyzerWithMode(AnalysisMode mode) {
45+
private static NamedAnalyzer createAnalyzerWithMode(String name, AnalysisMode mode) {
5046
TokenFilterFactory tokenFilter = new AbstractTokenFilterFactory("my_analyzer", Settings.EMPTY) {
5147
@Override
5248
public AnalysisMode getAnalysisMode() {
@@ -58,118 +54,39 @@ public TokenStream create(TokenStream tokenStream) {
5854
return null;
5955
}
6056
};
61-
return new CustomAnalyzer(null, new CharFilterFactory[0], new TokenFilterFactory[] { tokenFilter });
62-
}
63-
64-
public void testParseTextFieldCheckAnalyzerAnalysisMode() {
65-
66-
Map<String, Object> fieldNode = new HashMap<>();
67-
fieldNode.put("analyzer", "my_analyzer");
68-
MappingParserContext parserContext = mock(MappingParserContext.class);
69-
when(parserContext.indexVersionCreated()).thenReturn(Version.CURRENT);
70-
71-
// check AnalysisMode.ALL works
72-
Map<String, NamedAnalyzer> analyzers = defaultAnalyzers();
73-
analyzers.put("my_analyzer", new NamedAnalyzer("my_named_analyzer", AnalyzerScope.INDEX, createAnalyzerWithMode(AnalysisMode.ALL)));
74-
75-
IndexAnalyzers indexAnalyzers = IndexAnalyzers.of(analyzers);
76-
when(parserContext.getIndexAnalyzers()).thenReturn(indexAnalyzers);
77-
78-
TextFieldMapper.PARSER.parse("field", fieldNode, parserContext);
79-
80-
// check that "analyzer" set to something that only supports AnalysisMode.SEARCH_TIME or AnalysisMode.INDEX_TIME is blocked
81-
AnalysisMode mode = randomFrom(AnalysisMode.SEARCH_TIME, AnalysisMode.INDEX_TIME);
82-
analyzers = defaultAnalyzers();
83-
analyzers.put("my_analyzer", new NamedAnalyzer("my_named_analyzer", AnalyzerScope.INDEX, createAnalyzerWithMode(mode)));
84-
indexAnalyzers = IndexAnalyzers.of(analyzers);
85-
when(parserContext.getIndexAnalyzers()).thenReturn(indexAnalyzers);
86-
fieldNode.put("analyzer", "my_analyzer");
87-
MapperException ex = expectThrows(MapperException.class, () -> { TextFieldMapper.PARSER.parse("name", fieldNode, parserContext); });
88-
assertThat(
89-
ex.getMessage(),
90-
containsString("analyzer [my_named_analyzer] contains filters [my_analyzer] that are not allowed to run")
57+
return new NamedAnalyzer(
58+
name,
59+
AnalyzerScope.INDEX,
60+
new CustomAnalyzer(null, new CharFilterFactory[0], new TokenFilterFactory[] { tokenFilter })
9161
);
9262
}
9363

94-
public void testParseTextFieldCheckSearchAnalyzerAnalysisMode() {
95-
96-
for (String settingToTest : new String[] { "search_analyzer", "search_quote_analyzer" }) {
97-
Map<String, Object> fieldNode = new HashMap<>();
98-
fieldNode.put(settingToTest, "my_analyzer");
99-
fieldNode.put("analyzer", "standard");
100-
if (settingToTest.equals("search_quote_analyzer")) {
101-
fieldNode.put("search_analyzer", "standard");
102-
}
103-
MappingParserContext parserContext = mock(MappingParserContext.class);
104-
when(parserContext.indexVersionCreated()).thenReturn(Version.CURRENT);
105-
106-
// check AnalysisMode.ALL and AnalysisMode.SEARCH_TIME works
107-
Map<String, NamedAnalyzer> analyzers = defaultAnalyzers();
108-
AnalysisMode mode = randomFrom(AnalysisMode.ALL, AnalysisMode.SEARCH_TIME);
109-
analyzers.put("my_analyzer", new NamedAnalyzer("my_named_analyzer", AnalyzerScope.INDEX, createAnalyzerWithMode(mode)));
110-
analyzers.put("standard", new NamedAnalyzer("standard", AnalyzerScope.INDEX, new StandardAnalyzer()));
111-
112-
IndexAnalyzers indexAnalyzers = IndexAnalyzers.of(analyzers);
113-
when(parserContext.getIndexAnalyzers()).thenReturn(indexAnalyzers);
114-
TextFieldMapper.PARSER.parse("textField", fieldNode, parserContext);
64+
public void testParseTextFieldCheckAnalyzerAnalysisMode() throws IOException {
11565

116-
// check that "analyzer" set to AnalysisMode.INDEX_TIME is blocked
117-
mode = AnalysisMode.INDEX_TIME;
118-
analyzers = defaultAnalyzers();
119-
analyzers.put("my_analyzer", new NamedAnalyzer("my_named_analyzer", AnalyzerScope.INDEX, createAnalyzerWithMode(mode)));
120-
analyzers.put("standard", new NamedAnalyzer("standard", AnalyzerScope.INDEX, new StandardAnalyzer()));
121-
indexAnalyzers = IndexAnalyzers.of(analyzers);
122-
when(parserContext.getIndexAnalyzers()).thenReturn(indexAnalyzers);
123-
fieldNode.clear();
124-
fieldNode.put(settingToTest, "my_analyzer");
125-
fieldNode.put("analyzer", "standard");
126-
if (settingToTest.equals("search_quote_analyzer")) {
127-
fieldNode.put("search_analyzer", "standard");
128-
}
129-
MapperException ex = expectThrows(
130-
MapperException.class,
131-
() -> { TextFieldMapper.PARSER.parse("field", fieldNode, parserContext); }
132-
);
133-
assertEquals(
134-
"analyzer [my_named_analyzer] contains filters [my_analyzer] that are not allowed to run in search time mode.",
135-
ex.getMessage()
136-
);
137-
}
138-
}
139-
140-
public void testParseTextFieldCheckAnalyzerWithSearchAnalyzerAnalysisMode() {
66+
MapperService mapperService = createMapperService("""
67+
{ "_doc" : { "properties" : {
68+
"text1" : { "type" : "text", "analyzer" : "all" },
69+
"text2" : { "type" : "text", "analyzer" : "index", "search_analyzer" : "search" }
70+
}}}
71+
""");
14172

142-
Map<String, Object> fieldNode = new HashMap<>();
143-
fieldNode.put("analyzer", "my_analyzer");
144-
MappingParserContext parserContext = mock(MappingParserContext.class);
145-
when(parserContext.indexVersionCreated()).thenReturn(Version.CURRENT);
73+
assertThat(mapperService.mappingLookup().indexAnalyzer("text1", field -> null).name(), equalTo("all"));
74+
assertThat(mapperService.mappingLookup().indexAnalyzer("text2", field -> null).name(), equalTo("index"));
14675

147-
// check that "analyzer" set to AnalysisMode.INDEX_TIME is blocked if there is no search analyzer
148-
AnalysisMode mode = AnalysisMode.INDEX_TIME;
149-
Map<String, NamedAnalyzer> analyzers = defaultAnalyzers();
150-
analyzers.put("my_analyzer", new NamedAnalyzer("my_named_analyzer", AnalyzerScope.INDEX, createAnalyzerWithMode(mode)));
151-
IndexAnalyzers indexAnalyzers = IndexAnalyzers.of(analyzers);
152-
when(parserContext.getIndexAnalyzers()).thenReturn(indexAnalyzers);
153-
MapperException ex = expectThrows(
154-
MapperException.class,
155-
() -> { TextFieldMapper.PARSER.parse("field", fieldNode, parserContext); }
156-
);
157-
assertThat(
158-
ex.getMessage(),
159-
containsString("analyzer [my_named_analyzer] contains filters [my_analyzer] that are not allowed to run")
160-
);
76+
Exception e = expectThrows(MapperException.class, () -> createMapperService("""
77+
{ "_doc" : { "properties" : { "text" : { "type" : "text", "analyzer" : "search" } } } }
78+
"""));
79+
assertThat(e.getMessage(), containsString("analyzer [search] contains filters [my_analyzer] that are not allowed to run"));
16180

162-
// check AnalysisMode.INDEX_TIME is okay if search analyzer is also set
163-
fieldNode.put("analyzer", "my_analyzer");
164-
fieldNode.put("search_analyzer", "standard");
165-
analyzers = defaultAnalyzers();
166-
mode = randomFrom(AnalysisMode.ALL, AnalysisMode.INDEX_TIME);
167-
analyzers.put("my_analyzer", new NamedAnalyzer("my_named_analyzer", AnalyzerScope.INDEX, createAnalyzerWithMode(mode)));
168-
analyzers.put("standard", new NamedAnalyzer("standard", AnalyzerScope.INDEX, new StandardAnalyzer()));
81+
Exception e2 = expectThrows(MapperException.class, () -> createMapperService("""
82+
{ "_doc" : { "properties" : { "text" : { "type" : "text", "analyzer" : "index" } } } }
83+
"""));
84+
assertThat(e2.getMessage(), containsString("analyzer [index] contains filters [my_analyzer] that are not allowed to run"));
16985

170-
indexAnalyzers = IndexAnalyzers.of(analyzers);
171-
when(parserContext.getIndexAnalyzers()).thenReturn(indexAnalyzers);
172-
TextFieldMapper.PARSER.parse("field", fieldNode, parserContext);
86+
Exception e3 = expectThrows(MapperException.class, () -> createMapperService("""
87+
{ "_doc" : { "properties" : { "text" : { "type" : "text", "analyzer" : "index", "search_quote_analyzer" : "search" } } } }
88+
"""));
89+
assertThat(e.getMessage(), containsString("analyzer [search] contains filters [my_analyzer] that are not allowed to run"));
17390
}
17491

17592
}

server/src/test/java/org/elasticsearch/index/mapper/TextFieldMapperTests.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -569,10 +569,12 @@ public void testFrequencyFilter() throws IOException {
569569
assertThat(fieldType.fielddataMinSegmentSize(), equalTo(1000));
570570
}
571571

572-
public void testNullConfigValuesUseDefaults() throws IOException {
573-
MapperService mapperService = createMapperService(fieldMapping(b -> b.field("type", "text").field("analyzer", (String) null)));
574-
TextFieldMapper m = (TextFieldMapper) mapperService.mappingLookup().getMapper("field");
575-
assertEquals("default", m.indexAnalyzers().get("field").name());
572+
public void testNullConfigValuesFail() throws MapperParsingException {
573+
Exception e = expectThrows(
574+
MapperParsingException.class,
575+
() -> createDocumentMapper(fieldMapping(b -> b.field("type", "text").field("analyzer", (String) null)))
576+
);
577+
assertThat(e.getMessage(), containsString("[analyzer] on mapper [field] of type [text] must not have a [null] value"));
576578
}
577579

578580
public void testNotIndexedFieldPositionIncrement() {

server/src/test/java/org/elasticsearch/index/query/SearchExecutionContextTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88
package org.elasticsearch.index.query;
99

10+
import org.apache.lucene.analysis.standard.StandardAnalyzer;
1011
import org.apache.lucene.document.Field;
1112
import org.apache.lucene.document.StringField;
1213
import org.apache.lucene.index.DirectoryReader;
@@ -475,7 +476,9 @@ private static SearchExecutionContext createSearchExecutionContext(
475476
}
476477

477478
private static MapperService createMapperService(IndexSettings indexSettings, MappingLookup mappingLookup) {
478-
IndexAnalyzers indexAnalyzers = IndexAnalyzers.of(singletonMap("default", new NamedAnalyzer("default", AnalyzerScope.INDEX, null)));
479+
IndexAnalyzers indexAnalyzers = IndexAnalyzers.of(
480+
singletonMap("default", new NamedAnalyzer("default", AnalyzerScope.INDEX, new StandardAnalyzer()))
481+
);
479482
IndicesModule indicesModule = new IndicesModule(Collections.emptyList());
480483
MapperRegistry mapperRegistry = indicesModule.getMapperRegistry();
481484
Supplier<SearchExecutionContext> searchExecutionContextSupplier = () -> { throw new UnsupportedOperationException(); };

0 commit comments

Comments
 (0)