diff options
author | Christoph Büscher <christoph@elastic.co> | 2016-03-29 18:45:07 +0200 |
---|---|---|
committer | Christoph Büscher <christoph@elastic.co> | 2016-04-15 17:13:01 +0200 |
commit | fbd558382d0bb96acb7986f48297c645d1a70c41 (patch) | |
tree | f2071331ed3a5563426beb8f05250ec95d58bf99 /core/src/test/java | |
parent | 068df5f8aa5642432c77962768b17046a86ddbc4 (diff) |
Clean up QueryParseContext and don't hold it inside QueryRewrite/ShardContext
This change cleans up a few things in QueryParseContext and QueryShardContext
that make it hard to reason about the state of these context objects and are
thus error prone and should be simplified.
Currently the parser that used in QueryParseContext can be set and reset any
time from the outside, which makes reasoning about it hard. This change makes
the parser a mandatory constructor argument removes ability to later set a
different ParseFieldMatcher. If none is provided at construction time, the
one set inside the parser is used. If a ParseFieldMatcher is specified at
construction time, it is implicitely set on the parser that is beeing used.
The ParseFieldMatcher is only kept inside the parser.
Also currently the QueryShardContext historically holds an inner QueryParseContext
(in the super class QueryRewriteContext), that is mainly used to hold the parser
and parseFieldMatcher. For that reason, the parser can also be reset, which leads
to the same problems as above. This change removes the QueryParseContext from
QueryRewriteContext and removes the ability to reset or retrieve it from the
QueryShardContext. Instead, `QueryRewriteContext#newParseContext(parser)` can be
used to create new parse contexts with the given parser from a shard context
when needed.
Diffstat (limited to 'core/src/test/java')
27 files changed, 232 insertions, 374 deletions
diff --git a/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java b/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java index aa6aa51982..0f373d3664 100644 --- a/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java +++ b/core/src/test/java/org/elasticsearch/index/query/AbstractQueryTestCase.java @@ -524,9 +524,7 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>> } private QueryBuilder<?> parseQuery(XContentParser parser, ParseFieldMatcher matcher) throws IOException { - QueryParseContext context = createParseContext(); - context.reset(parser); - context.parseFieldMatcher(matcher); + QueryParseContext context = createParseContext(parser, matcher); QueryBuilder<?> parseInnerQueryBuilder = context.parseInnerQueryBuilder(); assertNull(parser.nextToken()); return parseInnerQueryBuilder; @@ -728,19 +726,14 @@ public abstract class AbstractQueryTestCase<QB extends AbstractQueryBuilder<QB>> * @return a new {@link QueryShardContext} based on the base test index and queryParserService */ protected static QueryShardContext createShardContext() { - QueryShardContext queryCreationContext = new QueryShardContext(queryShardContext); - queryCreationContext.reset(); - queryCreationContext.parseFieldMatcher(ParseFieldMatcher.STRICT); - return queryCreationContext; + return new QueryShardContext(queryShardContext); } /** * @return a new {@link QueryParseContext} based on the base test index and queryParserService */ - protected static QueryParseContext createParseContext() { - QueryParseContext queryParseContext = new QueryParseContext(indicesQueriesRegistry); - queryParseContext.reset(null); - queryParseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); + protected static QueryParseContext createParseContext(XContentParser parser, ParseFieldMatcher matcher) { + QueryParseContext queryParseContext = new QueryParseContext(indicesQueriesRegistry, parser, matcher); return queryParseContext; } diff --git a/core/src/test/java/org/elasticsearch/index/query/GeoShapeQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/GeoShapeQueryBuilderTests.java index b4e0e0f18c..b335cfabb6 100644 --- a/core/src/test/java/org/elasticsearch/index/query/GeoShapeQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/GeoShapeQueryBuilderTests.java @@ -256,12 +256,12 @@ public class GeoShapeQueryBuilderTests extends AbstractQueryTestCase<GeoShapeQue // do this until we get one without a shape } while (sqb.shape() != null); try { - sqb.toQuery(queryShardContext()); + sqb.toQuery(createShardContext()); fail(); } catch (UnsupportedOperationException e) { assertEquals("query must be rewritten first", e.getMessage()); } - QueryBuilder<?> rewrite = sqb.rewrite(queryShardContext()); + QueryBuilder<?> rewrite = sqb.rewrite(createShardContext()); GeoShapeQueryBuilder geoShapeQueryBuilder = new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, indexedShapeToReturn); geoShapeQueryBuilder.strategy(sqb.strategy()); geoShapeQueryBuilder.relation(sqb.relation()); diff --git a/core/src/test/java/org/elasticsearch/index/query/support/InnerHitBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/support/InnerHitBuilderTests.java index d3d9c5f7cd..e85baee232 100644 --- a/core/src/test/java/org/elasticsearch/index/query/support/InnerHitBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/support/InnerHitBuilderTests.java @@ -18,6 +18,17 @@ */ package org.elasticsearch.index.query.support; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.sameInstance; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput; @@ -46,17 +57,6 @@ import org.elasticsearch.test.ESTestCase; import org.junit.AfterClass; import org.junit.BeforeClass; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.function.Supplier; - -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.sameInstance; - public class InnerHitBuilderTests extends ESTestCase { private static final int NUMBER_OF_TESTBUILDERS = 20; @@ -86,8 +86,6 @@ public class InnerHitBuilderTests extends ESTestCase { } public void testFromAndToXContent() throws Exception { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); for (int runs = 0; runs < NUMBER_OF_TESTBUILDERS; runs++) { InnerHitBuilder innerHit = randomInnerHits(); XContentBuilder builder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); @@ -97,7 +95,7 @@ public class InnerHitBuilderTests extends ESTestCase { innerHit.toXContent(builder, ToXContent.EMPTY_PARAMS); XContentParser parser = XContentHelper.createParser(builder.bytes()); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.EMPTY); InnerHitBuilder secondInnerHits = InnerHitBuilder.fromXContent(context); assertThat(innerHit, not(sameInstance(secondInnerHits))); assertThat(innerHit, equalTo(secondInnerHits)); diff --git a/core/src/test/java/org/elasticsearch/index/query/support/InnerHitsBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/support/InnerHitsBuilderTests.java index 533416d918..c095573b5a 100644 --- a/core/src/test/java/org/elasticsearch/index/query/support/InnerHitsBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/support/InnerHitsBuilderTests.java @@ -72,8 +72,6 @@ public class InnerHitsBuilderTests extends ESTestCase { } public void testFromAndToXContent() throws Exception { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); for (int runs = 0; runs < NUMBER_OF_TESTBUILDERS; runs++) { InnerHitsBuilder innerHits = randomInnerHits(); XContentBuilder builder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); @@ -83,7 +81,7 @@ public class InnerHitsBuilderTests extends ESTestCase { innerHits.toXContent(builder, ToXContent.EMPTY_PARAMS); XContentParser parser = XContentHelper.createParser(builder.bytes()); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.EMPTY); parser.nextToken(); InnerHitsBuilder secondInnerHits = InnerHitsBuilder.fromXContent(context); assertThat(innerHits, not(sameInstance(secondInnerHits))); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/AggregationCollectorTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/AggregationCollectorTests.java index a1a6bc830e..f2b16c3e3e 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/AggregationCollectorTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/AggregationCollectorTests.java @@ -63,9 +63,7 @@ public class AggregationCollectorTests extends ESSingleNodeTestCase { AggregatorParsers parser = getInstanceFromNode(AggregatorParsers.class); IndicesQueriesRegistry queriesRegistry = getInstanceFromNode(IndicesQueriesRegistry.class); XContentParser aggParser = JsonXContent.jsonXContent.createParser(agg); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(aggParser); - parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, aggParser, ParseFieldMatcher.STRICT); aggParser.nextToken(); SearchContext searchContext = createSearchContext(index); AggregationContext aggContext = new AggregationContext(searchContext); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/AggregatorParsingTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/AggregatorParsingTests.java index 12cfd10c29..a7b8ed064b 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/AggregatorParsingTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/AggregatorParsingTests.java @@ -210,9 +210,7 @@ public class AggregatorParsingTests extends ESTestCase { .endObject().string(); try { XContentParser parser = XContentFactory.xContent(source).createParser(source); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(parser); - parseContext.parseFieldMatcher(parseFieldMatcher); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); aggParsers.parseAggregators(parseContext); fail(); @@ -246,9 +244,7 @@ public class AggregatorParsingTests extends ESTestCase { .endObject().string(); try { XContentParser parser = XContentFactory.xContent(source).createParser(source); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(parser); - parseContext.parseFieldMatcher(parseFieldMatcher); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); aggParsers.parseAggregators(parseContext); fail(); @@ -286,9 +282,7 @@ public class AggregatorParsingTests extends ESTestCase { .endObject().string(); try { XContentParser parser = XContentFactory.xContent(source).createParser(source); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(parser); - parseContext.parseFieldMatcher(parseFieldMatcher); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); aggParsers.parseAggregators(parseContext); fail(); @@ -314,9 +308,7 @@ public class AggregatorParsingTests extends ESTestCase { .endObject().string(); try { XContentParser parser = XContentFactory.xContent(source).createParser(source); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(parser); - parseContext.parseFieldMatcher(parseFieldMatcher); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); aggParsers.parseAggregators(parseContext); fail(); @@ -344,9 +336,7 @@ public class AggregatorParsingTests extends ESTestCase { .endObject().string(); try { XContentParser parser = XContentFactory.xContent(source).createParser(source); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(parser); - parseContext.parseFieldMatcher(parseFieldMatcher); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); aggParsers.parseAggregators(parseContext); fail(); @@ -374,9 +364,7 @@ public class AggregatorParsingTests extends ESTestCase { .endObject().string(); try { XContentParser parser = XContentFactory.xContent(source).createParser(source); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(parser); - parseContext.parseFieldMatcher(parseFieldMatcher); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); aggParsers.parseAggregators(parseContext); fail(); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/BaseAggregationTestCase.java b/core/src/test/java/org/elasticsearch/search/aggregations/BaseAggregationTestCase.java index 3833d59ef3..5e5dc92393 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/BaseAggregationTestCase.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/BaseAggregationTestCase.java @@ -225,9 +225,7 @@ public abstract class BaseAggregationTestCase<AB extends AggregatorBuilder<AB>> factoriesBuilder.toXContent(builder, ToXContent.EMPTY_PARAMS); XContentBuilder shuffled = shuffleXContent(builder, Collections.emptySet()); XContentParser parser = XContentFactory.xContent(shuffled.bytes()).createParser(shuffled.bytes()); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(parser); - parseContext.parseFieldMatcher(parseFieldMatcher); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); assertSame(XContentParser.Token.FIELD_NAME, parser.nextToken()); assertEquals(testAgg.name, parser.currentName()); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/BasePipelineAggregationTestCase.java b/core/src/test/java/org/elasticsearch/search/aggregations/BasePipelineAggregationTestCase.java index 4c9311bb11..29db7aee5e 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/BasePipelineAggregationTestCase.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/BasePipelineAggregationTestCase.java @@ -227,9 +227,9 @@ public abstract class BasePipelineAggregationTestCase<AF extends PipelineAggrega factoriesBuilder.toXContent(builder, ToXContent.EMPTY_PARAMS); XContentBuilder shuffled = shuffleXContent(builder, Collections.emptySet()); XContentParser parser = XContentFactory.xContent(shuffled.bytes()).createParser(shuffled.bytes()); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(parser); - parseContext.parseFieldMatcher(parseFieldMatcher); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); + String contentString = factoriesBuilder.toString(); + logger.info("Content string: {}", contentString); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); assertSame(XContentParser.Token.FIELD_NAME, parser.nextToken()); assertEquals(testAgg.name(), parser.currentName()); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/GeoHashGridParserTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/GeoHashGridParserTests.java index b47227ceb0..9f2ecfec3e 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/GeoHashGridParserTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/geogrid/GeoHashGridParserTests.java @@ -23,16 +23,18 @@ import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.json.JsonXContent; import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.test.ESTestCase; public class GeoHashGridParserTests extends ESTestCase { + private static final IndicesQueriesRegistry mockRegistry = new IndicesQueriesRegistry(); + public void testParseValidFromInts() throws Exception { int precision = randomIntBetween(1, 12); XContentParser stParser = JsonXContent.jsonXContent.createParser( "{\"field\":\"my_loc\", \"precision\":" + precision + ", \"size\": 500, \"shard_size\": 550}"); - QueryParseContext parseContext = new QueryParseContext(null); - parseContext.reset(stParser); - parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); + QueryParseContext parseContext = new QueryParseContext(mockRegistry, + stParser, ParseFieldMatcher.STRICT); XContentParser.Token token = stParser.nextToken(); assertSame(XContentParser.Token.START_OBJECT, token); GeoHashGridParser parser = new GeoHashGridParser(); @@ -44,9 +46,7 @@ public class GeoHashGridParserTests extends ESTestCase { int precision = randomIntBetween(1, 12); XContentParser stParser = JsonXContent.jsonXContent.createParser( "{\"field\":\"my_loc\", \"precision\":\"" + precision + "\", \"size\": \"500\", \"shard_size\": \"550\"}"); - QueryParseContext parseContext = new QueryParseContext(null); - parseContext.reset(stParser); - parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); + QueryParseContext parseContext = new QueryParseContext(mockRegistry, stParser, ParseFieldMatcher.STRICT); XContentParser.Token token = stParser.nextToken(); assertSame(XContentParser.Token.START_OBJECT, token); GeoHashGridParser parser = new GeoHashGridParser(); @@ -56,9 +56,7 @@ public class GeoHashGridParserTests extends ESTestCase { public void testParseErrorOnNonIntPrecision() throws Exception { XContentParser stParser = JsonXContent.jsonXContent.createParser("{\"field\":\"my_loc\", \"precision\":\"2.0\"}"); - QueryParseContext parseContext = new QueryParseContext(null); - parseContext.reset(stParser); - parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); + QueryParseContext parseContext = new QueryParseContext(mockRegistry, stParser, ParseFieldMatcher.STRICT); XContentParser.Token token = stParser.nextToken(); assertSame(XContentParser.Token.START_OBJECT, token); GeoHashGridParser parser = new GeoHashGridParser(); @@ -72,9 +70,7 @@ public class GeoHashGridParserTests extends ESTestCase { public void testParseErrorOnBooleanPrecision() throws Exception { XContentParser stParser = JsonXContent.jsonXContent.createParser("{\"field\":\"my_loc\", \"precision\":false}"); - QueryParseContext parseContext = new QueryParseContext(null); - parseContext.reset(stParser); - parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); + QueryParseContext parseContext = new QueryParseContext(mockRegistry, stParser, ParseFieldMatcher.STRICT); XContentParser.Token token = stParser.nextToken(); assertSame(XContentParser.Token.START_OBJECT, token); GeoHashGridParser parser = new GeoHashGridParser(); @@ -88,9 +84,7 @@ public class GeoHashGridParserTests extends ESTestCase { public void testParseErrorOnPrecisionOutOfRange() throws Exception { XContentParser stParser = JsonXContent.jsonXContent.createParser("{\"field\":\"my_loc\", \"precision\":\"13\"}"); - QueryParseContext parseContext = new QueryParseContext(null); - parseContext.reset(stParser); - parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); + QueryParseContext parseContext = new QueryParseContext(mockRegistry, stParser, ParseFieldMatcher.STRICT); XContentParser.Token token = stParser.nextToken(); assertSame(XContentParser.Token.START_OBJECT, token); GeoHashGridParser parser = new GeoHashGridParser(); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/significant/SignificanceHeuristicTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/significant/SignificanceHeuristicTests.java index 14b408ca40..02094f4faf 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/bucket/significant/SignificanceHeuristicTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/bucket/significant/SignificanceHeuristicTests.java @@ -249,9 +249,7 @@ public class SignificanceHeuristicTests extends ESTestCase { IndicesQueriesRegistry registry = new IndicesQueriesRegistry(); try { XContentParser stParser = JsonXContent.jsonXContent.createParser("{\"field\":\"text\", " + faultyHeuristicDefinition + ",\"min_doc_count\":200}"); - QueryParseContext parseContext = new QueryParseContext(registry); - parseContext.reset(stParser); - parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); + QueryParseContext parseContext = new QueryParseContext(registry, stParser, ParseFieldMatcher.STRICT); stParser.nextToken(); new SignificantTermsParser(heuristicParserMapper, registry).parse("testagg", parseContext); fail(); @@ -272,9 +270,7 @@ public class SignificanceHeuristicTests extends ESTestCase { private SignificanceHeuristic parseSignificanceHeuristic(SignificanceHeuristicParserMapper heuristicParserMapper, SearchContext searchContext, XContentParser stParser) throws IOException { IndicesQueriesRegistry registry = new IndicesQueriesRegistry(); - QueryParseContext parseContext = new QueryParseContext(registry); - parseContext.reset(stParser); - parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); + QueryParseContext parseContext = new QueryParseContext(registry, stParser, ParseFieldMatcher.STRICT); stParser.nextToken(); SignificantTermsAggregatorBuilder aggregatorFactory = (SignificantTermsAggregatorBuilder) new SignificantTermsParser( heuristicParserMapper, registry).parse("testagg", parseContext); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/metrics/TopHitsTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/metrics/TopHitsTests.java index bd84853d93..00bb04dde9 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/metrics/TopHitsTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/metrics/TopHitsTests.java @@ -173,9 +173,7 @@ public class TopHitsTests extends BaseAggregationTestCase<TopHitsAggregatorBuild "}"; try { XContentParser parser = XContentFactory.xContent(source).createParser(source); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(parser); - parseContext.parseFieldMatcher(parseFieldMatcher); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); aggParsers.parseAggregators(parseContext); fail(); diff --git a/core/src/test/java/org/elasticsearch/search/aggregations/pipeline/moving/avg/MovAvgTests.java b/core/src/test/java/org/elasticsearch/search/aggregations/pipeline/moving/avg/MovAvgTests.java index e4d134b8e3..0bfebf0807 100644 --- a/core/src/test/java/org/elasticsearch/search/aggregations/pipeline/moving/avg/MovAvgTests.java +++ b/core/src/test/java/org/elasticsearch/search/aggregations/pipeline/moving/avg/MovAvgTests.java @@ -107,9 +107,7 @@ public class MovAvgTests extends BasePipelineAggregationTestCase<MovAvgPipelineA " }" + "}"; XContentParser parser = XContentFactory.xContent(json).createParser(json); - QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(parser); - parseContext.parseFieldMatcher(parseFieldMatcher); + QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); assertSame(XContentParser.Token.FIELD_NAME, parser.nextToken()); assertEquals(expected.name(), parser.currentName()); diff --git a/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java b/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java index 30f6aa1787..3df4e88e87 100644 --- a/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/builder/SearchSourceBuilderTests.java @@ -450,7 +450,6 @@ public class SearchSourceBuilderTests extends ESTestCase { private void assertParseSearchSource(SearchSourceBuilder testBuilder, BytesReference searchSourceAsBytes) throws IOException { XContentParser parser = XContentFactory.xContent(searchSourceAsBytes).createParser(searchSourceAsBytes); QueryParseContext parseContext = createParseContext(parser); - parseContext.reset(parser); if (randomBoolean()) { parser.nextToken(); // sometimes we move it on the START_OBJECT to test the embedded case } @@ -461,9 +460,7 @@ public class SearchSourceBuilderTests extends ESTestCase { } private static QueryParseContext createParseContext(XContentParser parser) { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.reset(parser); - context.parseFieldMatcher(parseFieldMatcher); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, parseFieldMatcher); return context; } diff --git a/core/src/test/java/org/elasticsearch/search/highlight/HighlightBuilderTests.java b/core/src/test/java/org/elasticsearch/search/highlight/HighlightBuilderTests.java index 322e6e2c9a..bc674c19a8 100644 --- a/core/src/test/java/org/elasticsearch/search/highlight/HighlightBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/highlight/HighlightBuilderTests.java @@ -143,8 +143,6 @@ public class HighlightBuilderTests extends ESTestCase { * creates random highlighter, renders it to xContent and back to new instance that should be equal to original */ public void testFromXContent() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); for (int runs = 0; runs < NUMBER_OF_TESTBUILDERS; runs++) { HighlightBuilder highlightBuilder = randomHighlighterBuilder(); XContentBuilder builder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); @@ -155,7 +153,7 @@ public class HighlightBuilderTests extends ESTestCase { XContentBuilder shuffled = shuffleXContent(builder, Collections.emptySet()); XContentParser parser = XContentHelper.createParser(shuffled.bytes()); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.EMPTY); parser.nextToken(); HighlightBuilder secondHighlightBuilder; try { @@ -194,10 +192,9 @@ public class HighlightBuilderTests extends ESTestCase { } } - private <T extends Throwable> T expectParseThrows(Class<T> exceptionClass, String highlightElement) throws IOException { + private static <T extends Throwable> T expectParseThrows(Class<T> exceptionClass, String highlightElement) throws IOException { XContentParser parser = XContentFactory.xContent(highlightElement).createParser(highlightElement); - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); return expectThrows(exceptionClass, () -> HighlightBuilder.fromXContent(context)); } @@ -401,14 +398,13 @@ public class HighlightBuilderTests extends ESTestCase { * adds a simple json test for this. */ public void testParsingTagsSchema() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); + String highlightElement = "{\n" + " \"tags_schema\" : \"styled\"\n" + "}\n"; XContentParser parser = XContentFactory.xContent(highlightElement).createParser(highlightElement); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.EMPTY); HighlightBuilder highlightBuilder = HighlightBuilder.fromXContent(context); assertArrayEquals("setting tags_schema 'styled' should alter pre_tags", HighlightBuilder.DEFAULT_STYLED_PRE_TAG, highlightBuilder.preTags()); @@ -420,7 +416,7 @@ public class HighlightBuilderTests extends ESTestCase { "}\n"; parser = XContentFactory.xContent(highlightElement).createParser(highlightElement); - context.reset(parser); + context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.EMPTY); highlightBuilder = HighlightBuilder.fromXContent(context); assertArrayEquals("setting tags_schema 'default' should alter pre_tags", HighlightBuilder.DEFAULT_PRE_TAGS, highlightBuilder.preTags()); @@ -438,26 +434,24 @@ public class HighlightBuilderTests extends ESTestCase { * test parsing empty highlight or empty fields blocks */ public void testParsingEmptyStructure() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); String highlightElement = "{ }"; XContentParser parser = XContentFactory.xContent(highlightElement).createParser(highlightElement); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.EMPTY); HighlightBuilder highlightBuilder = HighlightBuilder.fromXContent(context); assertEquals("expected plain HighlightBuilder", new HighlightBuilder(), highlightBuilder); highlightElement = "{ \"fields\" : { } }"; parser = XContentFactory.xContent(highlightElement).createParser(highlightElement); - context.reset(parser); + context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.EMPTY); highlightBuilder = HighlightBuilder.fromXContent(context); assertEquals("defining no field should return plain HighlightBuilder", new HighlightBuilder(), highlightBuilder); highlightElement = "{ \"fields\" : { \"foo\" : { } } }"; parser = XContentFactory.xContent(highlightElement).createParser(highlightElement); - context.reset(parser); + context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.EMPTY); highlightBuilder = HighlightBuilder.fromXContent(context); assertEquals("expected HighlightBuilder with field", new HighlightBuilder().field(new Field("foo")), highlightBuilder); } diff --git a/core/src/test/java/org/elasticsearch/search/rescore/QueryRescoreBuilderTests.java b/core/src/test/java/org/elasticsearch/search/rescore/QueryRescoreBuilderTests.java index 102b4850bd..1b221e3199 100644 --- a/core/src/test/java/org/elasticsearch/search/rescore/QueryRescoreBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/rescore/QueryRescoreBuilderTests.java @@ -130,8 +130,6 @@ public class QueryRescoreBuilderTests extends ESTestCase { * creates random rescorer, renders it to xContent and back to new instance that should be equal to original */ public void testFromXContent() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); for (int runs = 0; runs < NUMBER_OF_TESTBUILDERS; runs++) { RescoreBuilder<?> rescoreBuilder = randomRescoreBuilder(); XContentBuilder builder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); @@ -143,7 +141,7 @@ public class QueryRescoreBuilderTests extends ESTestCase { XContentParser parser = XContentHelper.createParser(shuffled.bytes()); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); parser.nextToken(); RescoreBuilder<?> secondRescoreBuilder = RescoreBuilder.parseFromXContent(context); assertNotSame(rescoreBuilder, secondRescoreBuilder); @@ -188,14 +186,12 @@ public class QueryRescoreBuilderTests extends ESTestCase { * test parsing exceptions for incorrect rescorer syntax */ public void testUnknownFieldsExpection() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); String rescoreElement = "{\n" + " \"window_size\" : 20,\n" + " \"bad_rescorer_name\" : { }\n" + "}\n"; - prepareContext(context, rescoreElement); + QueryParseContext context = createContext(rescoreElement); try { RescoreBuilder.parseFromXContent(context); fail("expected a parsing exception"); @@ -206,7 +202,7 @@ public class QueryRescoreBuilderTests extends ESTestCase { rescoreElement = "{\n" + " \"bad_fieldName\" : 20\n" + "}\n"; - prepareContext(context, rescoreElement); + context = createContext(rescoreElement); try { RescoreBuilder.parseFromXContent(context); fail("expected a parsing exception"); @@ -218,7 +214,7 @@ public class QueryRescoreBuilderTests extends ESTestCase { " \"window_size\" : 20,\n" + " \"query\" : [ ]\n" + "}\n"; - prepareContext(context, rescoreElement); + context = createContext(rescoreElement); try { RescoreBuilder.parseFromXContent(context); fail("expected a parsing exception"); @@ -227,7 +223,7 @@ public class QueryRescoreBuilderTests extends ESTestCase { } rescoreElement = "{ }"; - prepareContext(context, rescoreElement); + context = createContext(rescoreElement); try { RescoreBuilder.parseFromXContent(context); fail("expected a parsing exception"); @@ -239,7 +235,7 @@ public class QueryRescoreBuilderTests extends ESTestCase { " \"window_size\" : 20,\n" + " \"query\" : { \"bad_fieldname\" : 1.0 } \n" + "}\n"; - prepareContext(context, rescoreElement); + context = createContext(rescoreElement); try { RescoreBuilder.parseFromXContent(context); fail("expected a parsing exception"); @@ -251,7 +247,7 @@ public class QueryRescoreBuilderTests extends ESTestCase { " \"window_size\" : 20,\n" + " \"query\" : { \"rescore_query\" : { \"unknown_queryname\" : { } } } \n" + "}\n"; - prepareContext(context, rescoreElement); + context = createContext(rescoreElement); try { RescoreBuilder.parseFromXContent(context); fail("expected a parsing exception"); @@ -263,18 +259,19 @@ public class QueryRescoreBuilderTests extends ESTestCase { " \"window_size\" : 20,\n" + " \"query\" : { \"rescore_query\" : { \"match_all\" : { } } } \n" + "}\n"; - prepareContext(context, rescoreElement); + context = createContext(rescoreElement); RescoreBuilder.parseFromXContent(context); } /** * create a new parser from the rescorer string representation and reset context with it */ - private static void prepareContext(QueryParseContext context, String rescoreElement) throws IOException { + private static QueryParseContext createContext(String rescoreElement) throws IOException { XContentParser parser = XContentFactory.xContent(rescoreElement).createParser(rescoreElement); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); // move to first token, this is where the internal fromXContent assertTrue(parser.nextToken() == XContentParser.Token.START_OBJECT); + return context; } private static RescoreBuilder<?> mutate(RescoreBuilder<?> original) throws IOException { diff --git a/core/src/test/java/org/elasticsearch/search/searchafter/SearchAfterBuilderTests.java b/core/src/test/java/org/elasticsearch/search/searchafter/SearchAfterBuilderTests.java index d15c88dc82..14bf8eac7e 100644 --- a/core/src/test/java/org/elasticsearch/search/searchafter/SearchAfterBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/searchafter/SearchAfterBuilderTests.java @@ -25,7 +25,6 @@ import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.text.Text; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; @@ -212,8 +211,6 @@ public class SearchAfterBuilderTests extends ESTestCase { } public void testFromXContent() throws Exception { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); for (int runs = 0; runs < 20; runs++) { SearchAfterBuilder searchAfterBuilder = randomJsonSearchFromBuilder(); XContentBuilder builder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); @@ -224,7 +221,7 @@ public class SearchAfterBuilderTests extends ESTestCase { searchAfterBuilder.innerToXContent(builder); builder.endObject(); XContentParser parser = XContentHelper.createParser(builder.bytes()); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); parser.nextToken(); parser.nextToken(); parser.nextToken(); @@ -234,7 +231,7 @@ public class SearchAfterBuilderTests extends ESTestCase { assertEquals(searchAfterBuilder.hashCode(), secondSearchAfterBuilder.hashCode()); } } - + public void testWithNullArray() throws Exception { SearchAfterBuilder builder = new SearchAfterBuilder(); try { diff --git a/core/src/test/java/org/elasticsearch/search/sort/AbstractSortTestCase.java b/core/src/test/java/org/elasticsearch/search/sort/AbstractSortTestCase.java index d25abd12f3..fecc048f29 100644 --- a/core/src/test/java/org/elasticsearch/search/sort/AbstractSortTestCase.java +++ b/core/src/test/java/org/elasticsearch/search/sort/AbstractSortTestCase.java @@ -21,6 +21,7 @@ package org.elasticsearch.search.sort; import org.apache.lucene.search.SortField; import org.apache.lucene.util.Accountable; +import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; @@ -141,8 +142,7 @@ public abstract class AbstractSortTestCase<T extends SortBuilder<T>> extends EST String elementName = itemParser.currentName(); itemParser.nextToken(); - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.reset(itemParser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, itemParser, ParseFieldMatcher.STRICT); T parsedItem = fromXContent(context, elementName); assertNotSame(testItem, parsedItem); assertEquals(testItem, parsedItem); diff --git a/core/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java b/core/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java index 1ea2180f5e..5ca9aef658 100644 --- a/core/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/sort/FieldSortBuilderTests.java @@ -22,7 +22,6 @@ package org.elasticsearch.search.sort; import org.apache.lucene.search.SortField; import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.ParsingException; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; @@ -109,10 +108,8 @@ public class FieldSortBuilderTests extends AbstractSortTestCase<FieldSortBuilder assertEquals(builder.getFieldName(), sortField.getField()); } } - + public void testReverseOptionFails() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); String json = "{ \"post_date\" : {\"reverse\" : true} },\n"; XContentParser parser = XContentFactory.xContent(json).createParser(json); @@ -121,7 +118,7 @@ public class FieldSortBuilderTests extends AbstractSortTestCase<FieldSortBuilder parser.nextToken(); parser.nextToken(); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); try { FieldSortBuilder.fromXContent(context, ""); diff --git a/core/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java b/core/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java index f13518dc3f..87fd183f1c 100644 --- a/core/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/sort/GeoDistanceSortBuilderTests.java @@ -22,21 +22,26 @@ package org.elasticsearch.search.sort; import org.apache.lucene.search.SortField; import org.elasticsearch.ElasticsearchParseException; +import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.unit.DistanceUnit; +import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.geo.GeoPointFieldMapper; import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.test.geo.RandomGeoGenerator; import java.io.IOException; import java.util.Arrays; +import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; + public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanceSortBuilder> { @Override @@ -215,8 +220,7 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc XContentParser itemParser = XContentHelper.createParser(new BytesArray(json)); itemParser.nextToken(); - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.reset(itemParser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, itemParser, ParseFieldMatcher.STRICT); try { GeoDistanceSortBuilder.fromXContent(context, ""); @@ -237,8 +241,7 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc XContentParser itemParser = XContentHelper.createParser(new BytesArray(json)); itemParser.nextToken(); - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.reset(itemParser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, itemParser, ParseFieldMatcher.STRICT); try { GeoDistanceSortBuilder.fromXContent(context, ""); @@ -255,14 +258,13 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc XContentParser itemParser = XContentHelper.createParser(new BytesArray(json)); itemParser.nextToken(); - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.reset(itemParser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, itemParser, ParseFieldMatcher.STRICT); try { GeoDistanceSortBuilder item = GeoDistanceSortBuilder.fromXContent(context, ""); item.ignoreMalformed(false); item.build(createMockShardContext()); - + fail("adding reverse sorting option should fail with an exception"); } catch (ElasticsearchParseException e) { assertEquals("illegal latitude value [269.384765625] for [GeoDistanceSort] for field [reverse].", e.getMessage()); @@ -284,8 +286,7 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc XContentParser itemParser = XContentHelper.createParser(new BytesArray(json)); itemParser.nextToken(); - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.reset(itemParser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, itemParser, ParseFieldMatcher.STRICT); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> GeoDistanceSortBuilder.fromXContent(context, "")); assertEquals("sort_mode [sum] isn't supported for sorting by geo distance", e.getMessage()); @@ -311,8 +312,7 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc XContentParser itemParser = XContentHelper.createParser(new BytesArray(json)); itemParser.nextToken(); - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.reset(itemParser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, itemParser, ParseFieldMatcher.STRICT); GeoDistanceSortBuilder result = GeoDistanceSortBuilder.fromXContent(context, json); assertEquals("[-19.700583312660456, -2.8225036337971687, " @@ -323,6 +323,122 @@ public class GeoDistanceSortBuilderTests extends AbstractSortTestCase<GeoDistanc + "-39.03717711567879, 44.74099852144718]", Arrays.toString(result.points())); } + public void testGeoDistanceSortParserManyPointsNoException() throws Exception { + XContentBuilder sortBuilder = jsonBuilder(); + sortBuilder.startObject(); + sortBuilder.startArray("location"); + sortBuilder.startArray().value(1.2).value(3).endArray().startArray().value(5).value(6).endArray(); + sortBuilder.endArray(); + sortBuilder.field("order", "desc"); + sortBuilder.field("unit", "km"); + sortBuilder.field("mode", "max"); + sortBuilder.endObject(); + parse(sortBuilder); + + sortBuilder = jsonBuilder(); + sortBuilder.startObject(); + sortBuilder.startArray("location"); + sortBuilder.value(new GeoPoint(1.2, 3)).value(new GeoPoint(1.2, 3)); + sortBuilder.endArray(); + sortBuilder.field("order", "desc"); + sortBuilder.field("unit", "km"); + sortBuilder.field("mode", "max"); + sortBuilder.endObject(); + parse(sortBuilder); + + sortBuilder = jsonBuilder(); + sortBuilder.startObject(); + sortBuilder.startArray("location"); + sortBuilder.value("1,2").value("3,4"); + sortBuilder.endArray(); + sortBuilder.field("order", "desc"); + sortBuilder.field("unit", "km"); + sortBuilder.field("mode", "max"); + sortBuilder.endObject(); + parse(sortBuilder); + + sortBuilder = jsonBuilder(); + sortBuilder.startObject(); + sortBuilder.startArray("location"); + sortBuilder.value("s3y0zh7w1z0g").value("s6wjr4et3f8v"); + sortBuilder.endArray(); + sortBuilder.field("order", "desc"); + sortBuilder.field("unit", "km"); + sortBuilder.field("mode", "max"); + sortBuilder.endObject(); + parse(sortBuilder); + + sortBuilder = jsonBuilder(); + sortBuilder.startObject(); + sortBuilder.startArray("location"); + sortBuilder.value(1.2).value(3); + sortBuilder.endArray(); + sortBuilder.field("order", "desc"); + sortBuilder.field("unit", "km"); + sortBuilder.field("mode", "max"); + sortBuilder.endObject(); + parse(sortBuilder); + + sortBuilder = jsonBuilder(); + sortBuilder.startObject(); + sortBuilder.field("location", new GeoPoint(1, 2)); + sortBuilder.field("order", "desc"); + sortBuilder.field("unit", "km"); + sortBuilder.field("mode", "max"); + sortBuilder.endObject(); + parse(sortBuilder); + + sortBuilder = jsonBuilder(); + sortBuilder.startObject(); + sortBuilder.field("location", "1,2"); + sortBuilder.field("order", "desc"); + sortBuilder.field("unit", "km"); + sortBuilder.field("mode", "max"); + sortBuilder.endObject(); + parse(sortBuilder); + + sortBuilder = jsonBuilder(); + sortBuilder.startObject(); + sortBuilder.field("location", "s3y0zh7w1z0g"); + sortBuilder.field("order", "desc"); + sortBuilder.field("unit", "km"); + sortBuilder.field("mode", "max"); + sortBuilder.endObject(); + parse(sortBuilder); + + sortBuilder = jsonBuilder(); + sortBuilder.startObject(); + sortBuilder.startArray("location"); + sortBuilder.value(new GeoPoint(1, 2)).value("s3y0zh7w1z0g").startArray().value(1).value(2).endArray().value("1,2"); + sortBuilder.endArray(); + sortBuilder.field("order", "desc"); + sortBuilder.field("unit", "km"); + sortBuilder.field("mode", "max"); + sortBuilder.endObject(); + parse(sortBuilder); + } + + public void testGeoDistanceSortDeprecatedSortModeException() throws Exception { + XContentBuilder sortBuilder = jsonBuilder(); + sortBuilder.startObject(); + sortBuilder.startArray("location"); + sortBuilder.startArray().value(1.2).value(3).endArray().startArray().value(5).value(6).endArray(); + sortBuilder.endArray(); + sortBuilder.field("order", "desc"); + sortBuilder.field("unit", "km"); + sortBuilder.field("sort_mode", "max"); + sortBuilder.endObject(); + IllegalArgumentException ex = expectThrows(IllegalArgumentException.class, () -> parse(sortBuilder)); + assertEquals("Deprecated field [sort_mode] used, expected [mode] instead", ex.getMessage()); + } + + private static GeoDistanceSortBuilder parse(XContentBuilder sortBuilder) throws Exception { + XContentParser parser = XContentHelper.createParser(sortBuilder.bytes()); + QueryParseContext parseContext = new QueryParseContext(new IndicesQueriesRegistry(), parser, ParseFieldMatcher.STRICT); + parser.nextToken(); + return GeoDistanceSortBuilder.fromXContent(parseContext, null); + } + @Override protected GeoDistanceSortBuilder fromXContent(QueryParseContext context, String fieldName) throws IOException { return GeoDistanceSortBuilder.fromXContent(context, fieldName); diff --git a/core/src/test/java/org/elasticsearch/search/sort/ScoreSortBuilderTests.java b/core/src/test/java/org/elasticsearch/search/sort/ScoreSortBuilderTests.java index 2a99c8318d..142a88c403 100644 --- a/core/src/test/java/org/elasticsearch/search/sort/ScoreSortBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/sort/ScoreSortBuilderTests.java @@ -23,7 +23,6 @@ package org.elasticsearch.search.sort; import org.apache.lucene.search.SortField; import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.ParsingException; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; @@ -67,8 +66,6 @@ public class ScoreSortBuilderTests extends AbstractSortTestCase<ScoreSortBuilder * instead of the `reverse` field that we render in toXContent */ public void testParseOrder() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); SortOrder order = randomBoolean() ? SortOrder.ASC : SortOrder.DESC; String scoreSortString = "{ \"_score\": { \"order\": \""+ order.toString() +"\" }}"; XContentParser parser = XContentFactory.xContent(scoreSortString).createParser(scoreSortString); @@ -77,14 +74,12 @@ public class ScoreSortBuilderTests extends AbstractSortTestCase<ScoreSortBuilder parser.nextToken(); parser.nextToken(); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); ScoreSortBuilder scoreSort = ScoreSortBuilder.fromXContent(context, "_score"); assertEquals(order, scoreSort.order()); } public void testReverseOptionFails() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); String json = "{ \"_score\": { \"reverse\": true }}"; XContentParser parser = XContentFactory.xContent(json).createParser(json); // need to skip until parser is located on second START_OBJECT @@ -92,7 +87,7 @@ public class ScoreSortBuilderTests extends AbstractSortTestCase<ScoreSortBuilder parser.nextToken(); parser.nextToken(); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.EMPTY); try { ScoreSortBuilder.fromXContent(context, "_score"); diff --git a/core/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java b/core/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java index 0e04dc9e4d..a1a24632f0 100644 --- a/core/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/sort/ScriptSortBuilderTests.java @@ -23,7 +23,6 @@ package org.elasticsearch.search.sort; import org.apache.lucene.search.SortField; import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.ParsingException; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.index.query.QueryParseContext; @@ -160,8 +159,6 @@ public class ScriptSortBuilderTests extends AbstractSortTestCase<ScriptSortBuild } public void testParseJson() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); String scriptSort = "{\n" + "\"_script\" : {\n" + "\"type\" : \"number\",\n" + @@ -179,7 +176,7 @@ public class ScriptSortBuilderTests extends AbstractSortTestCase<ScriptSortBuild parser.nextToken(); parser.nextToken(); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); ScriptSortBuilder builder = ScriptSortBuilder.fromXContent(context, null); assertEquals("doc['field_name'].value * factor", builder.script().getScript()); assertNull(builder.script().getLang()); @@ -193,8 +190,6 @@ public class ScriptSortBuilderTests extends AbstractSortTestCase<ScriptSortBuild } public void testParseJsonOldStyle() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); String scriptSort = "{\n" + "\"_script\" : {\n" + "\"type\" : \"number\",\n" + @@ -210,7 +205,7 @@ public class ScriptSortBuilderTests extends AbstractSortTestCase<ScriptSortBuild parser.nextToken(); parser.nextToken(); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); ScriptSortBuilder builder = ScriptSortBuilder.fromXContent(context, null); assertEquals("doc['field_name'].value * factor", builder.script().getScript()); assertNull(builder.script().getLang()); @@ -224,23 +219,19 @@ public class ScriptSortBuilderTests extends AbstractSortTestCase<ScriptSortBuild } public void testParseBadFieldNameExceptions() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); String scriptSort = "{\"_script\" : {" + "\"bad_field\" : \"number\"" + "} }"; XContentParser parser = XContentFactory.xContent(scriptSort).createParser(scriptSort); parser.nextToken(); parser.nextToken(); parser.nextToken(); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); exceptionRule.expect(ParsingException.class); exceptionRule.expectMessage("failed to parse field [bad_field]"); ScriptSortBuilder.fromXContent(context, null); } public void testParseBadFieldNameExceptionsOnStartObject() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); String scriptSort = "{\"_script\" : {" + "\"bad_field\" : { \"order\" : \"asc\" } } }"; XContentParser parser = XContentFactory.xContent(scriptSort).createParser(scriptSort); @@ -248,23 +239,20 @@ public class ScriptSortBuilderTests extends AbstractSortTestCase<ScriptSortBuild parser.nextToken(); parser.nextToken(); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); exceptionRule.expect(ParsingException.class); exceptionRule.expectMessage("failed to parse field [bad_field]"); ScriptSortBuilder.fromXContent(context, null); } public void testParseUnexpectedToken() throws IOException { - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); - String scriptSort = "{\"_script\" : {" + "\"script\" : [ \"order\" : \"asc\" ] } }"; XContentParser parser = XContentFactory.xContent(scriptSort).createParser(scriptSort); parser.nextToken(); parser.nextToken(); parser.nextToken(); - context.reset(parser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, parser, ParseFieldMatcher.STRICT); exceptionRule.expect(ParsingException.class); exceptionRule.expectMessage("unexpected token [START_ARRAY]"); ScriptSortBuilder.fromXContent(context, null); diff --git a/core/src/test/java/org/elasticsearch/search/sort/SortBuilderTests.java b/core/src/test/java/org/elasticsearch/search/sort/SortBuilderTests.java index 61447d8add..f31158ff34 100644 --- a/core/src/test/java/org/elasticsearch/search/sort/SortBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/sort/SortBuilderTests.java @@ -19,6 +19,7 @@ x * Licensed to Elasticsearch under one or more contributor package org.elasticsearch.search.sort; +import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.bytes.BytesArray; import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; @@ -236,8 +237,7 @@ public class SortBuilderTests extends ESTestCase { private static List<SortBuilder<?>> parseSort(String jsonString) throws IOException { XContentParser itemParser = XContentHelper.createParser(new BytesArray(jsonString)); - QueryParseContext context = new QueryParseContext(indicesQueriesRegistry); - context.reset(itemParser); + QueryParseContext context = new QueryParseContext(indicesQueriesRegistry, itemParser, ParseFieldMatcher.STRICT); assertEquals(XContentParser.Token.START_OBJECT, itemParser.nextToken()); assertEquals(XContentParser.Token.FIELD_NAME, itemParser.nextToken()); diff --git a/core/src/test/java/org/elasticsearch/search/sort/SortParserTests.java b/core/src/test/java/org/elasticsearch/search/sort/SortParserTests.java deleted file mode 100644 index a5ef892bf1..0000000000 --- a/core/src/test/java/org/elasticsearch/search/sort/SortParserTests.java +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.search.sort; - -import org.elasticsearch.common.ParseFieldMatcher; -import org.elasticsearch.common.geo.GeoPoint; -import org.elasticsearch.common.settings.Settings; -import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.common.xcontent.XContentHelper; -import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.index.IndexService; -import org.elasticsearch.index.query.QueryParseContext; -import org.elasticsearch.test.ESSingleNodeTestCase; -import org.elasticsearch.test.TestSearchContext; - -import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder; - -public class SortParserTests extends ESSingleNodeTestCase { - public void testGeoDistanceSortParserManyPointsNoException() throws Exception { - XContentBuilder mapping = jsonBuilder(); - mapping.startObject().startObject("type").startObject("properties").startObject("location").field("type", "geo_point").endObject().endObject().endObject().endObject(); - IndexService indexService = createIndex("testidx", Settings.builder().build(), "type", mapping); - TestSearchContext context = (TestSearchContext) createSearchContext(indexService); - context.getQueryShardContext().setTypes("type"); - - XContentBuilder sortBuilder = jsonBuilder(); - sortBuilder.startObject(); - sortBuilder.startArray("location"); - sortBuilder.startArray().value(1.2).value(3).endArray().startArray().value(5).value(6).endArray(); - sortBuilder.endArray(); - sortBuilder.field("order", "desc"); - sortBuilder.field("unit", "km"); - sortBuilder.field("mode", "max"); - sortBuilder.endObject(); - parse(context, sortBuilder); - - sortBuilder = jsonBuilder(); - sortBuilder.startObject(); - sortBuilder.startArray("location"); - sortBuilder.value(new GeoPoint(1.2, 3)).value(new GeoPoint(1.2, 3)); - sortBuilder.endArray(); - sortBuilder.field("order", "desc"); - sortBuilder.field("unit", "km"); - sortBuilder.field("mode", "max"); - sortBuilder.endObject(); - parse(context, sortBuilder); - - sortBuilder = jsonBuilder(); - sortBuilder.startObject(); - sortBuilder.startArray("location"); - sortBuilder.value("1,2").value("3,4"); - sortBuilder.endArray(); - sortBuilder.field("order", "desc"); - sortBuilder.field("unit", "km"); - sortBuilder.field("mode", "max"); - sortBuilder.endObject(); - parse(context, sortBuilder); - - sortBuilder = jsonBuilder(); - sortBuilder.startObject(); - sortBuilder.startArray("location"); - sortBuilder.value("s3y0zh7w1z0g").value("s6wjr4et3f8v"); - sortBuilder.endArray(); - sortBuilder.field("order", "desc"); - sortBuilder.field("unit", "km"); - sortBuilder.field("mode", "max"); - sortBuilder.endObject(); - parse(context, sortBuilder); - - sortBuilder = jsonBuilder(); - sortBuilder.startObject(); - sortBuilder.startArray("location"); - sortBuilder.value(1.2).value(3); - sortBuilder.endArray(); - sortBuilder.field("order", "desc"); - sortBuilder.field("unit", "km"); - sortBuilder.field("mode", "max"); - sortBuilder.endObject(); - parse(context, sortBuilder); - - sortBuilder = jsonBuilder(); - sortBuilder.startObject(); - sortBuilder.field("location", new GeoPoint(1, 2)); - sortBuilder.field("order", "desc"); - sortBuilder.field("unit", "km"); - sortBuilder.field("mode", "max"); - sortBuilder.endObject(); - parse(context, sortBuilder); - - sortBuilder = jsonBuilder(); - sortBuilder.startObject(); - sortBuilder.field("location", "1,2"); - sortBuilder.field("order", "desc"); - sortBuilder.field("unit", "km"); - sortBuilder.field("mode", "max"); - sortBuilder.endObject(); - parse(context, sortBuilder); - - sortBuilder = jsonBuilder(); - sortBuilder.startObject(); - sortBuilder.field("location", "s3y0zh7w1z0g"); - sortBuilder.field("order", "desc"); - sortBuilder.field("unit", "km"); - sortBuilder.field("mode", "max"); - sortBuilder.endObject(); - parse(context, sortBuilder); - - sortBuilder = jsonBuilder(); - sortBuilder.startObject(); - sortBuilder.startArray("location"); - sortBuilder.value(new GeoPoint(1, 2)).value("s3y0zh7w1z0g").startArray().value(1).value(2).endArray().value("1,2"); - sortBuilder.endArray(); - sortBuilder.field("order", "desc"); - sortBuilder.field("unit", "km"); - sortBuilder.field("mode", "max"); - sortBuilder.endObject(); - parse(context, sortBuilder); - } - - public void testGeoDistanceSortDeprecatedSortModeException() throws Exception { - XContentBuilder mapping = jsonBuilder(); - mapping.startObject().startObject("type").startObject("properties").startObject("location").field("type", "geo_point").endObject().endObject().endObject().endObject(); - IndexService indexService = createIndex("testidx", Settings.builder().build(), "type", mapping); - TestSearchContext context = (TestSearchContext) createSearchContext(indexService); - context.getQueryShardContext().setTypes("type"); - - XContentBuilder sortBuilder = jsonBuilder(); - sortBuilder.startObject(); - sortBuilder.startArray("location"); - sortBuilder.startArray().value(1.2).value(3).endArray().startArray().value(5).value(6).endArray(); - sortBuilder.endArray(); - sortBuilder.field("order", "desc"); - sortBuilder.field("unit", "km"); - sortBuilder.field("sort_mode", "max"); - sortBuilder.endObject(); - IllegalArgumentException ex = expectThrows(IllegalArgumentException.class, () -> parse(context, sortBuilder)); - assertEquals("Deprecated field [sort_mode] used, expected [mode] instead", ex.getMessage()); - } - - protected void parse(TestSearchContext context, XContentBuilder sortBuilder) throws Exception { - QueryParseContext parseContext = context.getQueryShardContext().parseContext(); - XContentParser parser = XContentHelper.createParser(sortBuilder.bytes()); - parseContext.reset(parser); - parseContext.parseFieldMatcher(ParseFieldMatcher.STRICT); - parser.nextToken(); - GeoDistanceSortBuilder.fromXContent(parseContext, null); - } -} diff --git a/core/src/test/java/org/elasticsearch/search/suggest/AbstractSuggestionBuilderTestCase.java b/core/src/test/java/org/elasticsearch/search/suggest/AbstractSuggestionBuilderTestCase.java index ccf8700af0..710f001a27 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/AbstractSuggestionBuilderTestCase.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/AbstractSuggestionBuilderTestCase.java @@ -146,8 +146,6 @@ public abstract class AbstractSuggestionBuilderTestCase<SB extends SuggestionBui * instance that should be equal to original */ public void testFromXContent() throws IOException { - QueryParseContext context = new QueryParseContext(null); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); for (int runs = 0; runs < NUMBER_OF_TESTBUILDERS; runs++) { SB suggestionBuilder = randomTestBuilder(); XContentBuilder xContentBuilder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); @@ -160,7 +158,7 @@ public abstract class AbstractSuggestionBuilderTestCase<SB extends SuggestionBui XContentBuilder shuffled = shuffleXContent(xContentBuilder, shuffleProtectedFields()); XContentParser parser = XContentHelper.createParser(shuffled.bytes()); - context.reset(parser); + QueryParseContext context = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); // we need to skip the start object and the name, those will be parsed by outer SuggestBuilder parser.nextToken(); @@ -227,9 +225,8 @@ public abstract class AbstractSuggestionBuilderTestCase<SB extends SuggestionBui } protected static QueryParseContext newParseContext(final String xcontent) throws IOException { - final QueryParseContext parseContext = new QueryParseContext(queriesRegistry); - parseContext.reset(XContentFactory.xContent(xcontent).createParser(xcontent)); - parseContext.parseFieldMatcher(parseFieldMatcher); + XContentParser parser = XContentFactory.xContent(xcontent).createParser(xcontent); + final QueryParseContext parseContext = new QueryParseContext(queriesRegistry, parser, parseFieldMatcher); return parseContext; } } diff --git a/core/src/test/java/org/elasticsearch/search/suggest/SuggestBuilderTests.java b/core/src/test/java/org/elasticsearch/search/suggest/SuggestBuilderTests.java index 2ce075cc60..77dc2e01b5 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/SuggestBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/SuggestBuilderTests.java @@ -22,7 +22,6 @@ package org.elasticsearch.search.suggest; import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; @@ -30,6 +29,7 @@ import org.elasticsearch.common.xcontent.XContentHelper; import org.elasticsearch.common.xcontent.XContentParser; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryParseContext; +import org.elasticsearch.indices.query.IndicesQueriesRegistry; import org.elasticsearch.search.suggest.completion.CompletionSuggesterBuilderTests; import org.elasticsearch.search.suggest.completion.WritableTestCase; import org.elasticsearch.search.suggest.phrase.PhraseSuggestionBuilderTests; @@ -69,8 +69,6 @@ public class SuggestBuilderTests extends WritableTestCase<SuggestBuilder> { * creates random suggestion builder, renders it to xContent and back to new instance that should be equal to original */ public void testFromXContent() throws IOException { - QueryParseContext context = new QueryParseContext(null); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); for (int runs = 0; runs < NUMBER_OF_RUNS; runs++) { SuggestBuilder suggestBuilder = createTestModel(); XContentBuilder xContentBuilder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); @@ -79,8 +77,7 @@ public class SuggestBuilderTests extends WritableTestCase<SuggestBuilder> { } suggestBuilder.toXContent(xContentBuilder, ToXContent.EMPTY_PARAMS); XContentParser parser = XContentHelper.createParser(xContentBuilder.bytes()); - context.reset(parser); - + QueryParseContext context = new QueryParseContext(new IndicesQueriesRegistry(), parser, ParseFieldMatcher.STRICT); SuggestBuilder secondSuggestBuilder = SuggestBuilder.fromXContent(context, suggesters); assertNotSame(suggestBuilder, secondSuggestBuilder); assertEquals(suggestBuilder, secondSuggestBuilder); diff --git a/core/src/test/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorTests.java b/core/src/test/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorTests.java index b0fc550968..a3a5ea01c3 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorTests.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorTests.java @@ -23,7 +23,6 @@ import org.elasticsearch.common.ParseFieldMatcher; import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.io.stream.BytesStreamOutput; import org.elasticsearch.common.io.stream.StreamInput; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; @@ -41,6 +40,7 @@ import static org.hamcrest.Matchers.equalTo; public class DirectCandidateGeneratorTests extends ESTestCase{ + private static final IndicesQueriesRegistry mockRegistry = new IndicesQueriesRegistry(); private static final int NUMBER_OF_RUNS = 20; @@ -110,8 +110,6 @@ public class DirectCandidateGeneratorTests extends ESTestCase{ * creates random candidate generator, renders it to xContent and back to new instance that should be equal to original */ public void testFromXContent() throws IOException { - QueryParseContext context = new QueryParseContext(new IndicesQueriesRegistry()); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); for (int runs = 0; runs < NUMBER_OF_RUNS; runs++) { DirectCandidateGeneratorBuilder generator = randomCandidateGenerator(); XContentBuilder builder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); @@ -121,7 +119,7 @@ public class DirectCandidateGeneratorTests extends ESTestCase{ generator.toXContent(builder, ToXContent.EMPTY_PARAMS); XContentParser parser = XContentHelper.createParser(builder.bytes()); - context.reset(parser); + QueryParseContext context = new QueryParseContext(mockRegistry, parser, ParseFieldMatcher.STRICT); parser.nextToken(); DirectCandidateGeneratorBuilder secondGenerator = DirectCandidateGeneratorBuilder.fromXContent(context); assertNotSame(generator, secondGenerator); @@ -152,43 +150,38 @@ public class DirectCandidateGeneratorTests extends ESTestCase{ * test that bad xContent throws exception */ public void testIllegalXContent() throws IOException { - QueryParseContext context = new QueryParseContext(new IndicesQueriesRegistry()); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); - // test missing fieldname String directGenerator = "{ }"; - XContentParser parser = XContentFactory.xContent(directGenerator).createParser(directGenerator); - context.reset(parser); - Exception e = expectThrows(IllegalArgumentException.class, () -> DirectCandidateGeneratorBuilder.fromXContent(context)); - assertEquals("[direct_generator] expects exactly one field parameter, but found []", e.getMessage()); + assertIllegalXContent(directGenerator, IllegalArgumentException.class, + "[direct_generator] expects exactly one field parameter, but found []"); // test two fieldnames directGenerator = "{ \"field\" : \"f1\", \"field\" : \"f2\" }"; - parser = XContentFactory.xContent(directGenerator).createParser(directGenerator); - context.reset(parser); - e = expectThrows(IllegalArgumentException.class, () -> DirectCandidateGeneratorBuilder.fromXContent(context)); - assertEquals("[direct_generator] expects exactly one field parameter, but found [f2, f1]", e.getMessage()); + assertIllegalXContent(directGenerator, IllegalArgumentException.class, + "[direct_generator] expects exactly one field parameter, but found [f2, f1]"); // test unknown field directGenerator = "{ \"unknown_param\" : \"f1\" }"; - parser = XContentFactory.xContent(directGenerator).createParser(directGenerator); - context.reset(parser); - e = expectThrows(IllegalArgumentException.class, () -> DirectCandidateGeneratorBuilder.fromXContent(context)); - assertEquals("[direct_generator] unknown field [unknown_param], parser not found", e.getMessage()); + assertIllegalXContent(directGenerator, IllegalArgumentException.class, + "[direct_generator] unknown field [unknown_param], parser not found"); // test bad value for field (e.g. size expects an int) directGenerator = "{ \"size\" : \"xxl\" }"; - parser = XContentFactory.xContent(directGenerator).createParser(directGenerator); - context.reset(parser); - e = expectThrows(ParsingException.class, () -> DirectCandidateGeneratorBuilder.fromXContent(context)); - assertEquals("[direct_generator] failed to parse field [size]", e.getMessage()); + assertIllegalXContent(directGenerator, ParsingException.class, + "[direct_generator] failed to parse field [size]"); // test unexpected token directGenerator = "{ \"size\" : [ \"xxl\" ] }"; - parser = XContentFactory.xContent(directGenerator).createParser(directGenerator); - context.reset(parser); - e = expectThrows(IllegalArgumentException.class, () -> DirectCandidateGeneratorBuilder.fromXContent(context)); - assertEquals("[direct_generator] size doesn't support values of type: START_ARRAY", e.getMessage()); + assertIllegalXContent(directGenerator, IllegalArgumentException.class, + "[direct_generator] size doesn't support values of type: START_ARRAY"); + } + + private static void assertIllegalXContent(String directGenerator, Class<? extends Exception> exceptionClass, String exceptionMsg) + throws IOException { + XContentParser parser = XContentFactory.xContent(directGenerator).createParser(directGenerator); + QueryParseContext context = new QueryParseContext(mockRegistry, parser, ParseFieldMatcher.STRICT); + Exception e = expectThrows(exceptionClass, () -> DirectCandidateGeneratorBuilder.fromXContent(context)); + assertEquals(exceptionMsg, e.getMessage()); } /** diff --git a/core/src/test/java/org/elasticsearch/search/suggest/phrase/SmoothingModelTestCase.java b/core/src/test/java/org/elasticsearch/search/suggest/phrase/SmoothingModelTestCase.java index c91e157178..1731ddd7c4 100644 --- a/core/src/test/java/org/elasticsearch/search/suggest/phrase/SmoothingModelTestCase.java +++ b/core/src/test/java/org/elasticsearch/search/suggest/phrase/SmoothingModelTestCase.java @@ -36,7 +36,6 @@ import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput; import org.elasticsearch.common.io.stream.NamedWriteableRegistry; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.lucene.BytesRefs; -import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; @@ -93,9 +92,6 @@ public abstract class SmoothingModelTestCase extends ESTestCase { * Test that creates new smoothing model from a random test smoothing model and checks both for equality */ public void testFromXContent() throws IOException { - QueryParseContext context = new QueryParseContext(new IndicesQueriesRegistry()); - context.parseFieldMatcher(new ParseFieldMatcher(Settings.EMPTY)); - SmoothingModel testModel = createTestModel(); XContentBuilder contentBuilder = XContentFactory.contentBuilder(randomFrom(XContentType.values())); if (randomBoolean()) { @@ -105,7 +101,7 @@ public abstract class SmoothingModelTestCase extends ESTestCase { testModel.innerToXContent(contentBuilder, ToXContent.EMPTY_PARAMS); contentBuilder.endObject(); XContentParser parser = XContentHelper.createParser(contentBuilder.bytes()); - context.reset(parser); + QueryParseContext context = new QueryParseContext(new IndicesQueriesRegistry(), parser, ParseFieldMatcher.STRICT); parser.nextToken(); // go to start token, real parsing would do that in the outer element parser SmoothingModel parsedModel = fromXContent(context); assertNotSame(testModel, parsedModel); |