Skip to content

Commit 2d64dd1

Browse files
committed
Randomizing and extending toQuery test setup
1 parent 9173478 commit 2d64dd1

File tree

3 files changed

+61
-11
lines changed

3 files changed

+61
-11
lines changed

src/main/java/org/elasticsearch/index/query/ExistsQueryBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public ExistsQueryBuilder(String name) {
5454
}
5555

5656
/**
57-
* @return the field name has to exists for this query to match
57+
* @return the field name that has to exists for this query to match
5858
*/
5959
public String name() {
6060
return this.name;
@@ -113,7 +113,7 @@ public static Query newFilter(QueryParseContext parseContext, String fieldPatter
113113
if (fieldNamesMapper!= null && fieldNamesMapper.enabled()) {
114114
final String f;
115115
if (mapper != null) {
116-
f = mapper.names().indexName();
116+
f = mapper.fieldType().names().indexName();
117117
} else {
118118
f = field;
119119
}

src/test/java/org/elasticsearch/index/query/BaseQueryTestCase.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,11 @@
4444
import org.elasticsearch.index.IndexNameModule;
4545
import org.elasticsearch.index.analysis.AnalysisModule;
4646
import org.elasticsearch.index.cache.IndexCacheModule;
47+
import org.elasticsearch.index.mapper.ContentPath;
48+
import org.elasticsearch.index.mapper.Mapper.BuilderContext;
4749
import org.elasticsearch.index.mapper.MapperService;
50+
import org.elasticsearch.index.mapper.MapperUtils;
51+
import org.elasticsearch.index.mapper.internal.FieldNamesFieldMapper;
4852
import org.elasticsearch.index.query.functionscore.FunctionScoreModule;
4953
import org.elasticsearch.index.settings.IndexSettingsModule;
5054
import org.elasticsearch.index.similarity.SimilarityModule;
@@ -78,6 +82,8 @@ public abstract class BaseQueryTestCase<QB extends QueryBuilder<QB>> extends Ela
7882
protected static final String STRING_FIELD_NAME = "text";
7983
protected static final String DOUBLE_FIELD_NAME = "double";
8084
protected static final String BOOLEAN_FIELD_NAME = "boolean";
85+
protected static final String[] mappedFieldNames = new String[]{DATE_FIELD_NAME, INT_FIELD_NAME,
86+
STRING_FIELD_NAME, DOUBLE_FIELD_NAME, BOOLEAN_FIELD_NAME};
8187

8288
private static Injector injector;
8389
private static IndexQueryParserService queryParserService;
@@ -137,6 +143,14 @@ protected void configure() {
137143
STRING_FIELD_NAME, "type=string").string()), false);
138144
currentTypes[i] = type;
139145
}
146+
147+
// randomly disable FieldNamesFieldMapper (enabled by default) to be able to test bwc cases
148+
FieldNamesFieldMapper fieldNamesMapper = (FieldNamesFieldMapper) mapperService.fullName(FieldNamesFieldMapper.NAME);
149+
if (fieldNamesMapper != null) {
150+
boolean randomEnabled = randomBoolean();
151+
FieldNamesFieldMapper alternativeFieldMapper = new FieldNamesFieldMapper.Builder().enabled(randomEnabled).build(new BuilderContext(settings, new ContentPath(1)));
152+
MapperUtils.merge(fieldNamesMapper, alternativeFieldMapper);
153+
}
140154
}
141155

142156
@AfterClass
@@ -266,7 +280,10 @@ public void testSerialization() throws IOException {
266280
* @return a new {@link QueryParseContext} based on the base test index and queryParserService
267281
*/
268282
protected static QueryParseContext createContext() {
269-
return new QueryParseContext(index, queryParserService);
283+
QueryParseContext context = new QueryParseContext(index, queryParserService);
284+
QueryParseContext.setTypes(currentTypes);
285+
return context;
286+
270287
}
271288

272289
protected static void assertQueryHeader(XContentParser parser, String expectedParserName) throws IOException {

src/test/java/org/elasticsearch/index/query/ExistsQueryBuilderTest.java

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,18 @@
1919

2020
package org.elasticsearch.index.query;
2121

22+
import org.apache.lucene.search.BooleanClause;
23+
import org.apache.lucene.search.BooleanQuery;
2224
import org.apache.lucene.search.ConstantScoreQuery;
2325
import org.apache.lucene.search.Query;
26+
import org.apache.lucene.search.TermRangeQuery;
2427
import org.elasticsearch.cluster.metadata.MetaData;
28+
import org.elasticsearch.common.lucene.search.Queries;
29+
import org.elasticsearch.index.mapper.FieldMapper;
30+
import org.elasticsearch.index.mapper.internal.FieldNamesFieldMapper;
2531

2632
import java.io.IOException;
33+
import java.util.Collection;
2734

2835
import static org.hamcrest.Matchers.equalTo;
2936

@@ -36,7 +43,27 @@ protected ExistsQueryBuilder createEmptyQueryBuilder() {
3643

3744
@Override
3845
protected Query createExpectedQuery(ExistsQueryBuilder queryBuilder, QueryParseContext context) throws IOException {
39-
return ExistsQueryBuilder.newFilter(context, queryBuilder.name(), queryBuilder.queryName());
46+
final FieldNamesFieldMapper fieldNamesMapper = (FieldNamesFieldMapper)context.mapperService().fullName(FieldNamesFieldMapper.NAME);
47+
Collection<String> fields = context.simpleMatchToIndexNames(queryBuilder.name());
48+
49+
if (fields.isEmpty()) {
50+
return Queries.newMatchNoDocsQuery();
51+
}
52+
53+
BooleanQuery boolFilter = new BooleanQuery();
54+
for (String field : fields) {
55+
if (fieldNamesMapper == null || !fieldNamesMapper.enabled()) {
56+
FieldMapper mapper = context.fieldMapper(field);
57+
if (mapper == null) {
58+
boolFilter.add(new TermRangeQuery(field, null, null, true, true), BooleanClause.Occur.SHOULD);
59+
} else {
60+
boolFilter.add(mapper.rangeQuery(null, null, true, true, context), BooleanClause.Occur.SHOULD);
61+
}
62+
} else {
63+
boolFilter.add(fieldNamesMapper.termQuery(field, context), BooleanClause.Occur.SHOULD);
64+
}
65+
}
66+
return new ConstantScoreQuery(boolFilter);
4067
}
4168

4269
@Override
@@ -46,25 +73,31 @@ protected void assertLuceneQuery(ExistsQueryBuilder queryBuilder, Query query, Q
4673
if (query instanceof ConstantScoreQuery) {
4774
// get the inner filter which is the one stored unter query_name
4875
query = ((ConstantScoreQuery) query).getQuery();
76+
assertThat(namedQuery, equalTo(query));
77+
} else {
78+
assertNull(namedQuery);
4979
}
50-
assertThat(namedQuery, equalTo(query));
5180
}
5281
}
5382

5483
@Override
5584
protected ExistsQueryBuilder createTestQueryBuilder() {
56-
ExistsQueryBuilder query;
85+
String fieldPattern;
5786
if (frequently()) {
58-
// simple field pattern
59-
query = new ExistsQueryBuilder(randomAsciiOfLengthBetween(1, 10));
87+
fieldPattern = mappedFieldNames[randomIntBetween(0, mappedFieldNames.length - 1)];
6088
} else {
61-
// All or wildcard pattern
89+
fieldPattern = randomAsciiOfLengthBetween(1, 10);
90+
}
91+
// also sometimes test wildcard patterns
92+
if (randomBoolean()) {
6293
if (randomBoolean()) {
63-
query = new ExistsQueryBuilder(MetaData.ALL);
94+
fieldPattern = fieldPattern+"*";
6495
} else {
65-
query = new ExistsQueryBuilder(randomAsciiOfLengthBetween(1, 3) + "*");
96+
fieldPattern = MetaData.ALL;
6697
}
6798
}
99+
ExistsQueryBuilder query = new ExistsQueryBuilder(fieldPattern);
100+
68101
if (randomBoolean()) {
69102
query.queryName(randomAsciiOfLengthBetween(1, 10));
70103
}

0 commit comments

Comments
 (0)