diff --git a/core/src/main/java/org/elasticsearch/index/query/CommonTermsQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/CommonTermsQueryBuilder.java index 982b5231b42..c2ad9983290 100644 --- a/core/src/main/java/org/elasticsearch/index/query/CommonTermsQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/CommonTermsQueryBuilder.java @@ -102,7 +102,7 @@ public class CommonTermsQueryBuilder extends AbstractQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException { XContentParser parser = parseContext.parser(); - XContentParser.Token token = parser.nextToken(); - if (token != XContentParser.Token.FIELD_NAME) { - throw new ParsingException(parser.getTokenLocation(), "[" + NAME + "] query malformed, no field"); - } - String fieldName = parser.currentName(); + + String fieldName = null; Object text = null; float boost = AbstractQueryBuilder.DEFAULT_BOOST; String analyzer = null; @@ -280,78 +277,79 @@ public class CommonTermsQueryBuilder extends AbstractQueryBuilder i */ public FuzzyQueryBuilder(String fieldName, Object value) { if (Strings.isEmpty(fieldName)) { - throw new IllegalArgumentException("field name cannot be null or empty."); + throw new IllegalArgumentException("field name cannot be null or empty"); } if (value == null) { throw new IllegalArgumentException("query value cannot be null"); @@ -258,63 +258,60 @@ public class FuzzyQueryBuilder extends AbstractQueryBuilder i public static Optional fromXContent(QueryParseContext parseContext) throws IOException { XContentParser parser = parseContext.parser(); - - XContentParser.Token token = parser.nextToken(); - if (token != XContentParser.Token.FIELD_NAME) { - throw new ParsingException(parser.getTokenLocation(), "[fuzzy] query malformed, no field"); - } - - String fieldName = parser.currentName(); + String fieldName = null; Object value = null; - Fuzziness fuzziness = FuzzyQueryBuilder.DEFAULT_FUZZINESS; int prefixLength = FuzzyQueryBuilder.DEFAULT_PREFIX_LENGTH; int maxExpansions = FuzzyQueryBuilder.DEFAULT_MAX_EXPANSIONS; boolean transpositions = FuzzyQueryBuilder.DEFAULT_TRANSPOSITIONS; String rewrite = null; - String queryName = null; float boost = AbstractQueryBuilder.DEFAULT_BOOST; - - token = parser.nextToken(); - if (token == XContentParser.Token.START_OBJECT) { - String currentFieldName = null; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else { - if (parseContext.getParseFieldMatcher().match(currentFieldName, TERM_FIELD)) { - value = parser.objectBytes(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, VALUE_FIELD)) { - value = parser.objectBytes(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { - boost = parser.floatValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, Fuzziness.FIELD)) { - fuzziness = Fuzziness.parse(parser); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, PREFIX_LENGTH_FIELD)) { - prefixLength = parser.intValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MAX_EXPANSIONS_FIELD)) { - maxExpansions = parser.intValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, TRANSPOSITIONS_FIELD)) { - transpositions = parser.booleanValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, REWRITE_FIELD)) { - rewrite = parser.textOrNull(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { - queryName = parser.text(); + String currentFieldName = null; + XContentParser.Token token; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (parseContext.isDeprecatedSetting(currentFieldName)) { + // skip + } else if (token == XContentParser.Token.START_OBJECT) { + if (fieldName != null) { + throw new ParsingException(parser.getTokenLocation(), "[fuzzy] query doesn't support multiple fields, found [" + + fieldName + "] and [" + currentFieldName + "]"); + } + fieldName = currentFieldName; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); } else { - throw new ParsingException(parser.getTokenLocation(), "[fuzzy] query does not support [" + currentFieldName + "]"); + if (parseContext.getParseFieldMatcher().match(currentFieldName, TERM_FIELD)) { + value = parser.objectBytes(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, VALUE_FIELD)) { + value = parser.objectBytes(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { + boost = parser.floatValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, Fuzziness.FIELD)) { + fuzziness = Fuzziness.parse(parser); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, PREFIX_LENGTH_FIELD)) { + prefixLength = parser.intValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MAX_EXPANSIONS_FIELD)) { + maxExpansions = parser.intValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, TRANSPOSITIONS_FIELD)) { + transpositions = parser.booleanValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, REWRITE_FIELD)) { + rewrite = parser.textOrNull(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { + queryName = parser.text(); + } else { + throw new ParsingException(parser.getTokenLocation(), + "[fuzzy] query does not support [" + currentFieldName + "]"); + } } } + } else { + fieldName = parser.currentName(); + value = parser.objectBytes(); } - parser.nextToken(); - } else { - value = parser.objectBytes(); - // move to the next token - parser.nextToken(); - } - - if (value == null) { - throw new ParsingException(parser.getTokenLocation(), "no value specified for fuzzy query"); } return Optional.of(new FuzzyQueryBuilder(fieldName, value) .fuzziness(fuzziness) diff --git a/core/src/main/java/org/elasticsearch/index/query/GeoDistanceQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/GeoDistanceQueryBuilder.java index 92b30747a14..1233df11714 100644 --- a/core/src/main/java/org/elasticsearch/index/query/GeoDistanceQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/GeoDistanceQueryBuilder.java @@ -359,9 +359,12 @@ public class GeoDistanceQueryBuilder extends AbstractQueryBuilder field : { lat : 30, lon : 12 } String currentName = parser.currentName(); - assert currentFieldName != null; fieldName = currentFieldName; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { diff --git a/core/src/main/java/org/elasticsearch/index/query/MatchPhrasePrefixQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/MatchPhrasePrefixQueryBuilder.java index b53f10989dc..ecce9e66b10 100644 --- a/core/src/main/java/org/elasticsearch/index/query/MatchPhrasePrefixQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/MatchPhrasePrefixQueryBuilder.java @@ -192,62 +192,55 @@ public class MatchPhrasePrefixQueryBuilder extends AbstractQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException { XContentParser parser = parseContext.parser(); - - XContentParser.Token token = parser.nextToken(); - if (token != XContentParser.Token.FIELD_NAME) { - throw new ParsingException(parser.getTokenLocation(), "[" + NAME + "] query malformed, no field"); - } - String fieldName = parser.currentName(); - + String fieldName = null; Object value = null; float boost = AbstractQueryBuilder.DEFAULT_BOOST; String analyzer = null; int slop = MatchQuery.DEFAULT_PHRASE_SLOP; int maxExpansion = FuzzyQuery.defaultMaxExpansions; String queryName = null; - - token = parser.nextToken(); - if (token == XContentParser.Token.START_OBJECT) { - String currentFieldName = null; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if (token.isValue()) { - if (parseContext.getParseFieldMatcher().match(currentFieldName, MatchQueryBuilder.QUERY_FIELD)) { - value = parser.objectText(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MatchQueryBuilder.ANALYZER_FIELD)) { - analyzer = parser.text(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { - boost = parser.floatValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MatchPhraseQueryBuilder.SLOP_FIELD)) { - slop = parser.intValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MAX_EXPANSIONS_FIELD)) { - maxExpansion = parser.intValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { - queryName = parser.text(); + XContentParser.Token token; + String currentFieldName = null; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (parseContext.isDeprecatedSetting(currentFieldName)) { + // skip + } else if (token == XContentParser.Token.START_OBJECT) { + if (fieldName != null) { + throw new ParsingException(parser.getTokenLocation(), "[match_phrase_prefix] query doesn't support multiple " + + "fields, found [" + fieldName + "] and [" + currentFieldName + "]"); + } + fieldName = currentFieldName; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (token.isValue()) { + if (parseContext.getParseFieldMatcher().match(currentFieldName, MatchQueryBuilder.QUERY_FIELD)) { + value = parser.objectText(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MatchQueryBuilder.ANALYZER_FIELD)) { + analyzer = parser.text(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { + boost = parser.floatValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MatchPhraseQueryBuilder.SLOP_FIELD)) { + slop = parser.intValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MAX_EXPANSIONS_FIELD)) { + maxExpansion = parser.intValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { + queryName = parser.text(); + } else { + throw new ParsingException(parser.getTokenLocation(), + "[" + NAME + "] query does not support [" + currentFieldName + "]"); + } } else { throw new ParsingException(parser.getTokenLocation(), - "[" + NAME + "] query does not support [" + currentFieldName + "]"); + "[" + NAME + "] unknown token [" + token + "] after [" + currentFieldName + "]"); } - } else { - throw new ParsingException(parser.getTokenLocation(), - "[" + NAME + "] unknown token [" + token + "] after [" + currentFieldName + "]"); } + } else { + fieldName = parser.currentName(); + value = parser.objectText(); } - parser.nextToken(); - } else { - value = parser.objectText(); - // move to the next token - token = parser.nextToken(); - if (token != XContentParser.Token.END_OBJECT) { - throw new ParsingException(parser.getTokenLocation(), "[" + NAME - + "] query parsed in simplified form, with direct field name, " - + "but included more options than just the field name, possibly use its 'options' form, with 'query' element?"); - } - } - - if (value == null) { - throw new ParsingException(parser.getTokenLocation(), "No text specified for text query"); } MatchPhrasePrefixQueryBuilder matchQuery = new MatchPhrasePrefixQueryBuilder(fieldName, value); diff --git a/core/src/main/java/org/elasticsearch/index/query/MatchPhraseQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/MatchPhraseQueryBuilder.java index 399b036c7b5..c9667c98778 100644 --- a/core/src/main/java/org/elasticsearch/index/query/MatchPhraseQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/MatchPhraseQueryBuilder.java @@ -22,6 +22,7 @@ package org.elasticsearch.index.query; import org.apache.lucene.search.Query; import org.elasticsearch.common.ParseField; import org.elasticsearch.common.ParsingException; +import org.elasticsearch.common.Strings; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.xcontent.XContentBuilder; @@ -49,7 +50,7 @@ public class MatchPhraseQueryBuilder extends AbstractQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException { XContentParser parser = parseContext.parser(); - - XContentParser.Token token = parser.nextToken(); - if (token != XContentParser.Token.FIELD_NAME) { - throw new ParsingException(parser.getTokenLocation(), "[" + NAME + "] query malformed, no field"); - } - String fieldName = parser.currentName(); - + String fieldName = null; Object value = null; float boost = AbstractQueryBuilder.DEFAULT_BOOST; String analyzer = null; int slop = MatchQuery.DEFAULT_PHRASE_SLOP; String queryName = null; - - token = parser.nextToken(); - if (token == XContentParser.Token.START_OBJECT) { - String currentFieldName = null; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if (token.isValue()) { - if (parseContext.getParseFieldMatcher().match(currentFieldName, MatchQueryBuilder.QUERY_FIELD)) { - value = parser.objectText(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MatchQueryBuilder.ANALYZER_FIELD)) { - analyzer = parser.text(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { - boost = parser.floatValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, SLOP_FIELD)) { - slop = parser.intValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { - queryName = parser.text(); + String currentFieldName = null; + XContentParser.Token token; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (parseContext.isDeprecatedSetting(currentFieldName)) { + // skip + } else if (token == XContentParser.Token.START_OBJECT) { + if (fieldName != null) { + throw new ParsingException(parser.getTokenLocation(), "[match_phrase] query doesn't support multiple fields, found [" + + fieldName + "] and [" + currentFieldName + "]"); + } + fieldName = currentFieldName; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (token.isValue()) { + if (parseContext.getParseFieldMatcher().match(currentFieldName, MatchQueryBuilder.QUERY_FIELD)) { + value = parser.objectText(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MatchQueryBuilder.ANALYZER_FIELD)) { + analyzer = parser.text(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { + boost = parser.floatValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, SLOP_FIELD)) { + slop = parser.intValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { + queryName = parser.text(); + } else { + throw new ParsingException(parser.getTokenLocation(), + "[" + NAME + "] query does not support [" + currentFieldName + "]"); + } } else { throw new ParsingException(parser.getTokenLocation(), - "[" + NAME + "] query does not support [" + currentFieldName + "]"); + "[" + NAME + "] unknown token [" + token + "] after [" + currentFieldName + "]"); } - } else { - throw new ParsingException(parser.getTokenLocation(), - "[" + NAME + "] unknown token [" + token + "] after [" + currentFieldName + "]"); } + } else { + fieldName = parser.currentName(); + value = parser.objectText(); } - parser.nextToken(); - } else { - value = parser.objectText(); - // move to the next token - token = parser.nextToken(); - if (token != XContentParser.Token.END_OBJECT) { - throw new ParsingException(parser.getTokenLocation(), "[" + NAME - + "] query parsed in simplified form, with direct field name, " - + "but included more options than just the field name, possibly use its 'options' form, with 'query' element?"); - } - } - - if (value == null) { - throw new ParsingException(parser.getTokenLocation(), "No text specified for text query"); } MatchPhraseQueryBuilder matchQuery = new MatchPhraseQueryBuilder(fieldName, value); diff --git a/core/src/main/java/org/elasticsearch/index/query/MatchQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/MatchQueryBuilder.java index 04fa9120a76..64d025adf71 100644 --- a/core/src/main/java/org/elasticsearch/index/query/MatchQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/MatchQueryBuilder.java @@ -510,13 +510,7 @@ public class MatchQueryBuilder extends AbstractQueryBuilder { public static Optional fromXContent(QueryParseContext parseContext) throws IOException { XContentParser parser = parseContext.parser(); - - XContentParser.Token token = parser.nextToken(); - if (token != XContentParser.Token.FIELD_NAME) { - throw new ParsingException(parser.getTokenLocation(), "[" + MatchQueryBuilder.NAME + "] query malformed, no field"); - } - String fieldName = parser.currentName(); - + String fieldName = null; MatchQuery.Type type = MatchQuery.Type.BOOLEAN; Object value = null; float boost = AbstractQueryBuilder.DEFAULT_BOOST; @@ -533,80 +527,84 @@ public class MatchQueryBuilder extends AbstractQueryBuilder { Float cutOffFrequency = null; ZeroTermsQuery zeroTermsQuery = MatchQuery.DEFAULT_ZERO_TERMS_QUERY; String queryName = null; - - token = parser.nextToken(); - if (token == XContentParser.Token.START_OBJECT) { - String currentFieldName = null; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else if (token.isValue()) { - if (parseContext.getParseFieldMatcher().match(currentFieldName, QUERY_FIELD)) { - value = parser.objectText(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, TYPE_FIELD)) { - String tStr = parser.text(); - if ("boolean".equals(tStr)) { - type = MatchQuery.Type.BOOLEAN; - } else if ("phrase".equals(tStr)) { - type = MatchQuery.Type.PHRASE; - } else if ("phrase_prefix".equals(tStr) || ("phrasePrefix".equals(tStr))) { - type = MatchQuery.Type.PHRASE_PREFIX; - } else { - throw new ParsingException(parser.getTokenLocation(), "[" + NAME + "] query does not support type " + tStr); - } - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, ANALYZER_FIELD)) { - analyzer = parser.text(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { - boost = parser.floatValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, SLOP_FIELD)) { - slop = parser.intValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, Fuzziness.FIELD)) { - fuzziness = Fuzziness.parse(parser); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, PREFIX_LENGTH_FIELD)) { - prefixLength = parser.intValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MAX_EXPANSIONS_FIELD)) { - maxExpansion = parser.intValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, OPERATOR_FIELD)) { - operator = Operator.fromString(parser.text()); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MINIMUM_SHOULD_MATCH_FIELD)) { - minimumShouldMatch = parser.textOrNull(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, FUZZY_REWRITE_FIELD)) { - fuzzyRewrite = parser.textOrNull(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, FUZZY_TRANSPOSITIONS_FIELD)) { - fuzzyTranspositions = parser.booleanValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, LENIENT_FIELD)) { - lenient = parser.booleanValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, CUTOFF_FREQUENCY_FIELD)) { - cutOffFrequency = parser.floatValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, ZERO_TERMS_QUERY_FIELD)) { - String zeroTermsDocs = parser.text(); - if ("none".equalsIgnoreCase(zeroTermsDocs)) { - zeroTermsQuery = MatchQuery.ZeroTermsQuery.NONE; - } else if ("all".equalsIgnoreCase(zeroTermsDocs)) { - zeroTermsQuery = MatchQuery.ZeroTermsQuery.ALL; + String currentFieldName = null; + XContentParser.Token token; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (parseContext.isDeprecatedSetting(currentFieldName)) { + // skip + } else if (token == XContentParser.Token.START_OBJECT) { + if (fieldName != null) { + throw new ParsingException(parser.getTokenLocation(), "[match] query doesn't support multiple fields, found [" + + fieldName + "] and [" + currentFieldName + "]"); + } + fieldName = currentFieldName; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (token.isValue()) { + if (parseContext.getParseFieldMatcher().match(currentFieldName, QUERY_FIELD)) { + value = parser.objectText(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, TYPE_FIELD)) { + String tStr = parser.text(); + if ("boolean".equals(tStr)) { + type = MatchQuery.Type.BOOLEAN; + } else if ("phrase".equals(tStr)) { + type = MatchQuery.Type.PHRASE; + } else if ("phrase_prefix".equals(tStr) || ("phrasePrefix".equals(tStr))) { + type = MatchQuery.Type.PHRASE_PREFIX; + } else { + throw new ParsingException(parser.getTokenLocation(), "[" + NAME + "] query does not support type " + tStr); + } + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, ANALYZER_FIELD)) { + analyzer = parser.text(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { + boost = parser.floatValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, SLOP_FIELD)) { + slop = parser.intValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, Fuzziness.FIELD)) { + fuzziness = Fuzziness.parse(parser); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, PREFIX_LENGTH_FIELD)) { + prefixLength = parser.intValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MAX_EXPANSIONS_FIELD)) { + maxExpansion = parser.intValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, OPERATOR_FIELD)) { + operator = Operator.fromString(parser.text()); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, MINIMUM_SHOULD_MATCH_FIELD)) { + minimumShouldMatch = parser.textOrNull(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, FUZZY_REWRITE_FIELD)) { + fuzzyRewrite = parser.textOrNull(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, FUZZY_TRANSPOSITIONS_FIELD)) { + fuzzyTranspositions = parser.booleanValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, LENIENT_FIELD)) { + lenient = parser.booleanValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, CUTOFF_FREQUENCY_FIELD)) { + cutOffFrequency = parser.floatValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, ZERO_TERMS_QUERY_FIELD)) { + String zeroTermsDocs = parser.text(); + if ("none".equalsIgnoreCase(zeroTermsDocs)) { + zeroTermsQuery = MatchQuery.ZeroTermsQuery.NONE; + } else if ("all".equalsIgnoreCase(zeroTermsDocs)) { + zeroTermsQuery = MatchQuery.ZeroTermsQuery.ALL; + } else { + throw new ParsingException(parser.getTokenLocation(), + "Unsupported zero_terms_docs value [" + zeroTermsDocs + "]"); + } + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { + queryName = parser.text(); } else { throw new ParsingException(parser.getTokenLocation(), - "Unsupported zero_terms_docs value [" + zeroTermsDocs + "]"); + "[" + NAME + "] query does not support [" + currentFieldName + "]"); } - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { - queryName = parser.text(); } else { throw new ParsingException(parser.getTokenLocation(), - "[" + NAME + "] query does not support [" + currentFieldName + "]"); + "[" + NAME + "] unknown token [" + token + "] after [" + currentFieldName + "]"); } - } else { - throw new ParsingException(parser.getTokenLocation(), - "[" + NAME + "] unknown token [" + token + "] after [" + currentFieldName + "]"); } - } - parser.nextToken(); - } else { - value = parser.objectText(); - // move to the next token - token = parser.nextToken(); - if (token != XContentParser.Token.END_OBJECT) { - throw new ParsingException(parser.getTokenLocation(), "[match] query parsed in simplified form, with direct field name, " - + "but included more options than just the field name, possibly use its 'options' form, with 'query' element?"); + } else { + fieldName = parser.currentName(); + value = parser.objectText(); } } diff --git a/core/src/main/java/org/elasticsearch/index/query/PrefixQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/PrefixQueryBuilder.java index e1f679e0c8d..2ebd0dfc6b1 100644 --- a/core/src/main/java/org/elasticsearch/index/query/PrefixQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/PrefixQueryBuilder.java @@ -64,7 +64,7 @@ public class PrefixQueryBuilder extends AbstractQueryBuilder throw new IllegalArgumentException("field name is null or empty"); } if (value == null) { - throw new IllegalArgumentException("value cannot be null."); + throw new IllegalArgumentException("value cannot be null"); } this.fieldName = fieldName; this.value = value; @@ -120,7 +120,7 @@ public class PrefixQueryBuilder extends AbstractQueryBuilder public static Optional fromXContent(QueryParseContext parseContext) throws IOException { XContentParser parser = parseContext.parser(); - String fieldName = parser.currentName(); + String fieldName = null; String value = null; String rewrite = null; @@ -134,6 +134,10 @@ public class PrefixQueryBuilder extends AbstractQueryBuilder } else if (parseContext.isDeprecatedSetting(currentFieldName)) { // skip } else if (token == XContentParser.Token.START_OBJECT) { + if (fieldName != null) { + throw new ParsingException(parser.getTokenLocation(), "[prefix] query doesn't support multiple fields, found [" + + fieldName + "] and [" + currentFieldName + "]"); + } fieldName = currentFieldName; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { @@ -149,19 +153,16 @@ public class PrefixQueryBuilder extends AbstractQueryBuilder rewrite = parser.textOrNull(); } else { throw new ParsingException(parser.getTokenLocation(), - "[regexp] query does not support [" + currentFieldName + "]"); + "[prefix] query does not support [" + currentFieldName + "]"); } } } } else { - fieldName = currentFieldName; - value = parser.textOrNull(); + fieldName = currentFieldName; + value = parser.textOrNull(); } } - if (value == null) { - throw new ParsingException(parser.getTokenLocation(), "No value specified for prefix query"); - } return Optional.of(new PrefixQueryBuilder(fieldName, value) .rewrite(rewrite) .boost(boost) diff --git a/core/src/main/java/org/elasticsearch/index/query/QueryParseContext.java b/core/src/main/java/org/elasticsearch/index/query/QueryParseContext.java index 478bcbc51d4..95fe0094bad 100644 --- a/core/src/main/java/org/elasticsearch/index/query/QueryParseContext.java +++ b/core/src/main/java/org/elasticsearch/index/query/QueryParseContext.java @@ -115,10 +115,11 @@ public class QueryParseContext implements ParseFieldMatcherSupplier { @SuppressWarnings("unchecked") Optional result = (Optional) indicesQueriesRegistry.lookup(queryName, parseFieldMatcher, parser.getTokenLocation()).fromXContent(this); - if (parser.currentToken() == XContentParser.Token.END_OBJECT) { - // if we are at END_OBJECT, move to the next one... - parser.nextToken(); + if (parser.currentToken() != XContentParser.Token.END_OBJECT) { + throw new ParsingException(parser.getTokenLocation(), + "[" + queryName + "] malformed query, expected [END_OBJECT] but found [" + parser.currentToken() + "]"); } + parser.nextToken(); return result; } diff --git a/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java index bfb7fac6b37..8e1326b1988 100644 --- a/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/RangeQueryBuilder.java @@ -318,6 +318,10 @@ public class RangeQueryBuilder extends AbstractQueryBuilder i } else if (parseContext.isDeprecatedSetting(currentFieldName)) { // skip } else if (token == XContentParser.Token.START_OBJECT) { + if (fieldName != null) { + throw new ParsingException(parser.getTokenLocation(), "[range] query doesn't support multiple fields, found [" + + fieldName + "] and [" + currentFieldName + "]"); + } fieldName = currentFieldName; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { diff --git a/core/src/main/java/org/elasticsearch/index/query/RegexpQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/RegexpQueryBuilder.java index 4a68cdecd99..7be77795e82 100644 --- a/core/src/main/java/org/elasticsearch/index/query/RegexpQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/RegexpQueryBuilder.java @@ -77,7 +77,7 @@ public class RegexpQueryBuilder extends AbstractQueryBuilder throw new IllegalArgumentException("field name is null or empty"); } if (value == null) { - throw new IllegalArgumentException("value cannot be null."); + throw new IllegalArgumentException("value cannot be null"); } this.fieldName = fieldName; this.value = value; @@ -180,10 +180,8 @@ public class RegexpQueryBuilder extends AbstractQueryBuilder public static Optional fromXContent(QueryParseContext parseContext) throws IOException { XContentParser parser = parseContext.parser(); - - String fieldName = parser.currentName(); + String fieldName = null; String rewrite = null; - String value = null; float boost = AbstractQueryBuilder.DEFAULT_BOOST; int flagsValue = RegexpQueryBuilder.DEFAULT_FLAGS_VALUE; @@ -197,6 +195,10 @@ public class RegexpQueryBuilder extends AbstractQueryBuilder } else if (parseContext.isDeprecatedSetting(currentFieldName)) { // skip } else if (token == XContentParser.Token.START_OBJECT) { + if (fieldName != null) { + throw new ParsingException(parser.getTokenLocation(), "[regexp] query doesn't support multiple fields, found [" + + fieldName + "] and [" + currentFieldName + "]"); + } fieldName = currentFieldName; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { @@ -233,9 +235,6 @@ public class RegexpQueryBuilder extends AbstractQueryBuilder } } - if (value == null) { - throw new ParsingException(parser.getTokenLocation(), "No value specified for regexp query"); - } return Optional.of(new RegexpQueryBuilder(fieldName, value) .flags(flagsValue) .maxDeterminizedStates(maxDeterminizedStates) diff --git a/core/src/main/java/org/elasticsearch/index/query/SimpleQueryStringBuilder.java b/core/src/main/java/org/elasticsearch/index/query/SimpleQueryStringBuilder.java index c75313f6c44..f408c0f1473 100644 --- a/core/src/main/java/org/elasticsearch/index/query/SimpleQueryStringBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/SimpleQueryStringBuilder.java @@ -186,7 +186,7 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException, ParsingException { XContentParser parser = parseContext.parser(); - - XContentParser.Token token = parser.currentToken(); - if (token == XContentParser.Token.START_OBJECT) { - token = parser.nextToken(); - } - - assert token == XContentParser.Token.FIELD_NAME; - String fieldName = parser.currentName(); - - + String fieldName = null; Object value = null; float boost = AbstractQueryBuilder.DEFAULT_BOOST; String queryName = null; - token = parser.nextToken(); - if (token == XContentParser.Token.START_OBJECT) { - String currentFieldName = null; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else { - if (parseContext.getParseFieldMatcher().match(currentFieldName, TERM_FIELD)) { - value = parser.objectBytes(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, BaseTermQueryBuilder.VALUE_FIELD)) { - value = parser.objectBytes(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { - boost = parser.floatValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { - queryName = parser.text(); + String currentFieldName = null; + XContentParser.Token token; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (token == XContentParser.Token.START_OBJECT) { + if (fieldName != null) { + throw new ParsingException(parser.getTokenLocation(), "[span_term] query doesn't support multiple fields, found [" + + fieldName + "] and [" + currentFieldName + "]"); + } + fieldName = currentFieldName; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); } else { - throw new ParsingException(parser.getTokenLocation(), - "[span_term] query does not support [" + currentFieldName + "]"); + if (parseContext.getParseFieldMatcher().match(currentFieldName, TERM_FIELD)) { + value = parser.objectBytes(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, BaseTermQueryBuilder.VALUE_FIELD)) { + value = parser.objectBytes(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { + boost = parser.floatValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { + queryName = parser.text(); + } else { + throw new ParsingException(parser.getTokenLocation(), + "[span_term] query does not support [" + currentFieldName + "]"); + } } } + } else { + fieldName = parser.currentName(); + value = parser.objectBytes(); } - parser.nextToken(); - } else { - value = parser.objectBytes(); - // move to the next token - parser.nextToken(); - } - - if (value == null) { - throw new ParsingException(parser.getTokenLocation(), "No value specified for term query"); } SpanTermQueryBuilder result = new SpanTermQueryBuilder(fieldName, value); diff --git a/core/src/main/java/org/elasticsearch/index/query/WildcardQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/WildcardQueryBuilder.java index ba223f5b1b6..105acf19a13 100644 --- a/core/src/main/java/org/elasticsearch/index/query/WildcardQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/WildcardQueryBuilder.java @@ -75,7 +75,7 @@ public class WildcardQueryBuilder extends AbstractQueryBuilder fromXContent(QueryParseContext parseContext) throws IOException { XContentParser parser = parseContext.parser(); - - XContentParser.Token token = parser.nextToken(); - if (token != XContentParser.Token.FIELD_NAME) { - throw new ParsingException(parser.getTokenLocation(), "[wildcard] query malformed, no field"); - } - String fieldName = parser.currentName(); + String fieldName = null; String rewrite = null; - String value = null; float boost = AbstractQueryBuilder.DEFAULT_BOOST; String queryName = null; - token = parser.nextToken(); - if (token == XContentParser.Token.START_OBJECT) { - String currentFieldName = null; - while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { - if (token == XContentParser.Token.FIELD_NAME) { - currentFieldName = parser.currentName(); - } else { - if (parseContext.getParseFieldMatcher().match(currentFieldName, WILDCARD_FIELD)) { - value = parser.text(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, VALUE_FIELD)) { - value = parser.text(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { - boost = parser.floatValue(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, REWRITE_FIELD)) { - rewrite = parser.textOrNull(); - } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { - queryName = parser.text(); + String currentFieldName = null; + XContentParser.Token token; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); + } else if (parseContext.isDeprecatedSetting(currentFieldName)) { + // skip + } else if (token == XContentParser.Token.START_OBJECT) { + if (fieldName != null) { + throw new ParsingException(parser.getTokenLocation(), "[wildcard] query doesn't support multiple fields, found [" + + fieldName + "] and [" + currentFieldName + "]"); + } + fieldName = currentFieldName; + while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { + if (token == XContentParser.Token.FIELD_NAME) { + currentFieldName = parser.currentName(); } else { - throw new ParsingException(parser.getTokenLocation(), - "[wildcard] query does not support [" + currentFieldName + "]"); + if (parseContext.getParseFieldMatcher().match(currentFieldName, WILDCARD_FIELD)) { + value = parser.text(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, VALUE_FIELD)) { + value = parser.text(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.BOOST_FIELD)) { + boost = parser.floatValue(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, REWRITE_FIELD)) { + rewrite = parser.textOrNull(); + } else if (parseContext.getParseFieldMatcher().match(currentFieldName, AbstractQueryBuilder.NAME_FIELD)) { + queryName = parser.text(); + } else { + throw new ParsingException(parser.getTokenLocation(), + "[wildcard] query does not support [" + currentFieldName + "]"); + } } } + } else { + fieldName = parser.currentName(); + value = parser.text(); } - parser.nextToken(); - } else { - value = parser.text(); - parser.nextToken(); } - if (value == null) { - throw new ParsingException(parser.getTokenLocation(), "No value specified for wildcard query"); - } return Optional.of(new WildcardQueryBuilder(fieldName, value) .rewrite(rewrite) .boost(boost) diff --git a/core/src/test/java/org/elasticsearch/index/query/AbstractTermQueryTestCase.java b/core/src/test/java/org/elasticsearch/index/query/AbstractTermQueryTestCase.java index a2eec493c9c..60ba7aa3f7b 100644 --- a/core/src/test/java/org/elasticsearch/index/query/AbstractTermQueryTestCase.java +++ b/core/src/test/java/org/elasticsearch/index/query/AbstractTermQueryTestCase.java @@ -30,23 +30,11 @@ public abstract class AbstractTermQueryTestCase createQueryBuilder(null, term)); + assertEquals("field name is null or empty", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> createQueryBuilder("", term)); + assertEquals("field name is null or empty", e.getMessage()); } @Override diff --git a/core/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java index 3839254bf1d..5e911261171 100644 --- a/core/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTests.java @@ -163,30 +163,10 @@ public class BoolQueryBuilderTests extends AbstractQueryTestCase booleanQuery.must(null)); + expectThrows(IllegalArgumentException.class, () -> booleanQuery.mustNot(null)); + expectThrows(IllegalArgumentException.class, () -> booleanQuery.filter(null)); + expectThrows(IllegalArgumentException.class, () -> booleanQuery.should(null)); } // https://github.com/elastic/elasticsearch/issues/7240 diff --git a/core/src/test/java/org/elasticsearch/index/query/BoostingQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/BoostingQueryBuilderTests.java index 343c6270746..86592847e95 100644 --- a/core/src/test/java/org/elasticsearch/index/query/BoostingQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/BoostingQueryBuilderTests.java @@ -54,26 +54,10 @@ public class BoostingQueryBuilderTests extends AbstractQueryTestCase new BoostingQueryBuilder(null, new MatchAllQueryBuilder())); + expectThrows(IllegalArgumentException.class, () -> new BoostingQueryBuilder(new MatchAllQueryBuilder(), null)); + expectThrows(IllegalArgumentException.class, + () -> new BoostingQueryBuilder(new MatchAllQueryBuilder(), new MatchAllQueryBuilder()).negativeBoost(-1.0f)); } public void testFromJson() throws IOException { @@ -103,7 +87,6 @@ public class BoostingQueryBuilderTests extends AbstractQueryTestCase getAlternateVersions() { + Map alternateVersions = new HashMap<>(); + CommonTermsQueryBuilder commonTermsQuery = new CommonTermsQueryBuilder(randomAsciiOfLengthBetween(1, 10), + randomAsciiOfLengthBetween(1, 10)); + String contentString = "{\n" + + " \"common\" : {\n" + + " \"" + commonTermsQuery.fieldName() + "\" : \"" + commonTermsQuery.value() + "\"\n" + + " }\n" + + "}"; + alternateVersions.put(contentString, commonTermsQuery); + return alternateVersions; + } + @Override protected void doAssertLuceneQuery(CommonTermsQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { assertThat(query, instanceOf(ExtendedCommonTermsQuery.class)); @@ -90,23 +107,12 @@ public class CommonTermsQueryBuilderTests extends AbstractQueryTestCase new CommonTermsQueryBuilder(null, "text")); + assertEquals("field name is null or empty", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> new CommonTermsQueryBuilder("", "text")); + assertEquals("field name is null or empty", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> new CommonTermsQueryBuilder("fieldName", null)); + assertEquals("text cannot be null", e.getMessage()); } public void testFromJson() throws IOException { @@ -173,4 +179,20 @@ public class CommonTermsQueryBuilderTests extends AbstractQueryTestCase parseQuery(json)); + assertEquals("[common] query doesn't support multiple fields, found [message1] and [message2]", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/ConstantScoreQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/ConstantScoreQueryBuilderTests.java index 86381c135a5..d716a553a5a 100644 --- a/core/src/test/java/org/elasticsearch/index/query/ConstantScoreQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/ConstantScoreQueryBuilderTests.java @@ -61,12 +61,8 @@ public class ConstantScoreQueryBuilderTests extends AbstractQueryTestCase parseQuery(queryString)); + assertThat(e.getMessage(), containsString("requires a 'filter' element")); } /** @@ -77,12 +73,8 @@ public class ConstantScoreQueryBuilderTests extends AbstractQueryTestCase parseQuery(queryString)); + assertThat(e.getMessage(), containsString("accepts only one 'filter' element")); } /** @@ -93,12 +85,8 @@ public class ConstantScoreQueryBuilderTests extends AbstractQueryTestCase parseQuery(queryString)); + assertThat(e.getMessage(), containsString("unexpected token [START_ARRAY]")); } public void testIllegalArguments() { diff --git a/core/src/test/java/org/elasticsearch/index/query/DisMaxQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/DisMaxQueryBuilderTests.java index ebd6446f80a..8fa8724ae3c 100644 --- a/core/src/test/java/org/elasticsearch/index/query/DisMaxQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/DisMaxQueryBuilderTests.java @@ -102,12 +102,7 @@ public class DisMaxQueryBuilderTests extends AbstractQueryTestCase disMaxQuery.add(null)); } public void testToQueryInnerPrefixQuery() throws Exception { diff --git a/core/src/test/java/org/elasticsearch/index/query/FieldMaskingSpanQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/FieldMaskingSpanQueryBuilderTests.java index 1939f0e6b44..e6cefdb67af 100644 --- a/core/src/test/java/org/elasticsearch/index/query/FieldMaskingSpanQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/FieldMaskingSpanQueryBuilderTests.java @@ -56,24 +56,10 @@ public class FieldMaskingSpanQueryBuilderTests extends AbstractQueryTestCase new FieldMaskingSpanQueryBuilder(null, "maskedField")); + SpanQueryBuilder span = new SpanTermQueryBuilder("name", "value"); + expectThrows(IllegalArgumentException.class, () -> new FieldMaskingSpanQueryBuilder(span, null)); + expectThrows(IllegalArgumentException.class, () -> new FieldMaskingSpanQueryBuilder(span, "")); } public void testFromJson() throws IOException { @@ -93,10 +79,8 @@ public class FieldMaskingSpanQueryBuilderTests extends AbstractQueryTestCase getAlternateVersions() { + Map alternateVersions = new HashMap<>(); + FuzzyQueryBuilder fuzzyQuery = new FuzzyQueryBuilder(randomAsciiOfLengthBetween(1, 10), randomAsciiOfLengthBetween(1, 10)); + String contentString = "{\n" + + " \"fuzzy\" : {\n" + + " \"" + fuzzyQuery.fieldName() + "\" : \"" + fuzzyQuery.value() + "\"\n" + + " }\n" + + "}"; + alternateVersions.put(contentString, fuzzyQuery); + return alternateVersions; + } + @Override protected void doAssertLuceneQuery(FuzzyQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { assertThat(query, instanceOf(FuzzyQuery.class)); } public void testIllegalArguments() { - try { - new FuzzyQueryBuilder(null, "text"); - fail("must not be null"); - } catch (IllegalArgumentException e) { - // expected - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> new FuzzyQueryBuilder(null, "text")); + assertEquals("field name cannot be null or empty", e.getMessage()); - try { - new FuzzyQueryBuilder("", "text"); - fail("must not be empty"); - } catch (IllegalArgumentException e) { - // expected - } + e = expectThrows(IllegalArgumentException.class, () -> new FuzzyQueryBuilder("", "text")); + assertEquals("field name cannot be null or empty", e.getMessage()); - try { - new FuzzyQueryBuilder("field", null); - fail("must not be null"); - } catch (IllegalArgumentException e) { - // expected - } + e = expectThrows(IllegalArgumentException.class, () -> new FuzzyQueryBuilder("field", null)); + assertEquals("query value cannot be null", e.getMessage()); } public void testUnsupportedFuzzinessForStringType() throws IOException { QueryShardContext context = createShardContext(); context.setAllowUnmappedFields(true); - FuzzyQueryBuilder fuzzyQueryBuilder = new FuzzyQueryBuilder(STRING_FIELD_NAME, "text"); fuzzyQueryBuilder.fuzziness(Fuzziness.build(randomFrom("a string which is not auto", "3h", "200s"))); - - try { - fuzzyQueryBuilder.toQuery(context); - fail("should have failed with NumberFormatException"); - } catch (NumberFormatException e) { - assertThat(e.getMessage(), Matchers.containsString("For input string")); - } + NumberFormatException e = expectThrows(NumberFormatException.class, () -> fuzzyQueryBuilder.toQuery(context)); + assertThat(e.getMessage(), containsString("For input string")); } public void testToQueryWithStringField() throws IOException { @@ -119,7 +117,6 @@ public class FuzzyQueryBuilderTests extends AbstractQueryTestCase parseQuery(json)); + assertEquals("[fuzzy] query doesn't support multiple fields, found [message1] and [message2]", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/GeoBoundingBoxQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/GeoBoundingBoxQueryBuilderTests.java index 910de2cf5d9..c9f55fe9992 100644 --- a/core/src/test/java/org/elasticsearch/index/query/GeoBoundingBoxQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/GeoBoundingBoxQueryBuilderTests.java @@ -44,7 +44,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; public class GeoBoundingBoxQueryBuilderTests extends AbstractQueryTestCase { /** Randomly generate either NaN or one of the two infinity values. */ @@ -104,22 +103,14 @@ public class GeoBoundingBoxQueryBuilderTests extends AbstractQueryTestCase qb.type((GeoExecType) null)); + assertEquals("Type is not allowed to be null.", e.getMessage()); } public void testValidationNullTypeString() { GeoBoundingBoxQueryBuilder qb = new GeoBoundingBoxQueryBuilder("teststring"); - try { - qb.type((String) null); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("cannot parse type from null string")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> qb.type((String) null)); + assertEquals("cannot parse type from null string", e.getMessage()); } @Override @@ -130,27 +121,17 @@ public class GeoBoundingBoxQueryBuilderTests extends AbstractQueryTestCase super.testToQuery()); + assertEquals("failed to find geo_point field [mapped_geo_point]", e.getMessage()); } public void testBrokenCoordinateCannotBeSet() { PointTester[] testers = { new TopTester(), new LeftTester(), new BottomTester(), new RightTester() }; - GeoBoundingBoxQueryBuilder builder = createTestQueryBuilder(); builder.setValidationMethod(GeoValidationMethod.STRICT); for (PointTester tester : testers) { - try { - tester.invalidateCoordinate(builder, true); - fail("expected exception for broken " + tester.getClass().getName() + " coordinate"); - } catch (IllegalArgumentException e) { - // expected - } + expectThrows(IllegalArgumentException.class, () -> tester.invalidateCoordinate(builder, true)); } } @@ -215,12 +196,9 @@ public class GeoBoundingBoxQueryBuilderTests extends AbstractQueryTestCase builder.setCorners(bottom, left, top, right)); + assertThat(e.getMessage(), containsString("top is below bottom corner:")); } public void testTopBottomCanBeFlippedOnIgnoreMalformed() { @@ -482,7 +460,7 @@ public class GeoBoundingBoxQueryBuilderTests extends AbstractQueryTestCase parseQuery(deprecatedJson)); + assertEquals("Deprecated field [geo_bbox] used, expected [geo_bounding_box] instead", e.getMessage()); } public void testFromJsonCoerceFails() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/index/query/GeoDistanceQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/GeoDistanceQueryBuilderTests.java index 387df7ac3ca..91bb90dccb9 100644 --- a/core/src/test/java/org/elasticsearch/index/query/GeoDistanceQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/GeoDistanceQueryBuilderTests.java @@ -23,6 +23,7 @@ import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.search.Query; import org.apache.lucene.spatial.geopoint.search.GeoPointDistanceQuery; import org.elasticsearch.Version; +import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.geo.GeoDistance; import org.elasticsearch.common.geo.GeoPoint; import org.elasticsearch.common.geo.GeoUtils; @@ -85,82 +86,41 @@ public class GeoDistanceQueryBuilderTests extends AbstractQueryTestCase new GeoDistanceQueryBuilder("")); + assertEquals("fieldName must not be null or empty", e.getMessage()); + + e = expectThrows(IllegalArgumentException.class, () -> new GeoDistanceQueryBuilder((String) null)); + assertEquals("fieldName must not be null or empty", e.getMessage()); GeoDistanceQueryBuilder query = new GeoDistanceQueryBuilder("fieldName"); - try { - if (randomBoolean()) { - query.distance(""); - } else { - query.distance(null); - } - fail("must not be null or empty"); - } catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), equalTo("distance must not be null or empty")); - } + e = expectThrows(IllegalArgumentException.class, () -> query.distance("")); + assertEquals("distance must not be null or empty", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> query.distance(null)); + assertEquals("distance must not be null or empty", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> query.distance("", DistanceUnit.DEFAULT)); + assertEquals("distance must not be null or empty", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> query.distance(null, DistanceUnit.DEFAULT)); + assertEquals("distance must not be null or empty", e.getMessage()); - try { - if (randomBoolean()) { - query.distance("", DistanceUnit.DEFAULT); - } else { - query.distance(null, DistanceUnit.DEFAULT); - } - fail("distance must not be null or empty"); - } catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), equalTo("distance must not be null or empty")); - } + e = expectThrows(IllegalArgumentException.class, () -> query.distance("1", null)); + assertEquals("distance unit must not be null", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> query.distance(1, null)); + assertEquals("distance unit must not be null", e.getMessage()); - try { - if (randomBoolean()) { - query.distance("1", null); - } else { - query.distance(1, null); - } - fail("distance must not be null"); - } catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), equalTo("distance unit must not be null")); - } + e = expectThrows(IllegalArgumentException.class, () -> query.distance( + randomIntBetween(Integer.MIN_VALUE, 0), DistanceUnit.DEFAULT)); + assertEquals("distance must be greater than zero", e.getMessage()); - try { - query.distance(randomIntBetween(Integer.MIN_VALUE, 0), DistanceUnit.DEFAULT); - fail("distance must be greater than zero"); - } catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), equalTo("distance must be greater than zero")); - } + e = expectThrows(IllegalArgumentException.class, () -> query.geohash(null)); + assertEquals("geohash must not be null or empty", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> query.geohash("")); + assertEquals("geohash must not be null or empty", e.getMessage()); - try { - if (randomBoolean()) { - query.geohash(null); - } else { - query.geohash(""); - } - fail("geohash must not be null"); - } catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), equalTo("geohash must not be null or empty")); - } + e = expectThrows(IllegalArgumentException.class, () -> query.geoDistance(null)); + assertEquals("geoDistance must not be null", e.getMessage()); - try { - query.geoDistance(null); - fail("geodistance must not be null"); - } catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), equalTo("geoDistance must not be null")); - } - - try { - query.optimizeBbox(null); - fail("optimizeBbox must not be null"); - } catch (IllegalArgumentException ex) { - assertThat(ex.getMessage(), equalTo("optimizeBbox must not be null")); - } + e = expectThrows(IllegalArgumentException.class, () -> query.optimizeBbox(null)); + assertEquals("optimizeBbox must not be null", e.getMessage()); } /** @@ -474,4 +434,19 @@ public class GeoDistanceQueryBuilderTests extends AbstractQueryTestCase failingQueryBuilder.toQuery(shardContext)); assertThat(e.getMessage(), containsString("failed to find geo_point field [unmapped]")); } + + public void testParseFailsWithMultipleFields() throws IOException { + String json = "{\n" + + " \"geo_distance\" : {\n" + + " \"point1\" : {\n" + + " \"lat\" : 30, \"lon\" : 12\n" + + " },\n" + + " \"point2\" : {\n" + + " \"lat\" : 30, \"lon\" : 12\n" + + " }\n" + + " }\n" + + "}"; + ParsingException e = expectThrows(ParsingException.class, () -> parseQuery(json)); + assertEquals("[geo_distance] query doesn't support multiple fields, found [point1] and [point2]", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/GeoDistanceRangeQueryTests.java b/core/src/test/java/org/elasticsearch/index/query/GeoDistanceRangeQueryTests.java index 3e10eda34e2..53f3e71a0fc 100644 --- a/core/src/test/java/org/elasticsearch/index/query/GeoDistanceRangeQueryTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/GeoDistanceRangeQueryTests.java @@ -41,7 +41,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; public class GeoDistanceRangeQueryTests extends AbstractQueryTestCase { @@ -213,96 +212,57 @@ public class GeoDistanceRangeQueryTests extends AbstractQueryTestCase new GeoDistanceRangeQueryBuilder(null, new GeoPoint())); + assertEquals("fieldName must not be null", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, + () -> new GeoDistanceRangeQueryBuilder("", new GeoPoint())); + assertEquals("fieldName must not be null", e.getMessage()); } public void testNoPoint() { - try { - if (randomBoolean()) { - new GeoDistanceRangeQueryBuilder(GEO_POINT_FIELD_NAME, (GeoPoint) null); - } else { - new GeoDistanceRangeQueryBuilder(GEO_POINT_FIELD_NAME, (String) null); - } - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("point must not be null")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> new GeoDistanceRangeQueryBuilder(GEO_POINT_FIELD_NAME, (GeoPoint) null)); + assertEquals("point must not be null", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, + () -> new GeoDistanceRangeQueryBuilder(GEO_POINT_FIELD_NAME, (String) null)); + assertEquals("point must not be null", e.getMessage()); } public void testInvalidFrom() { GeoDistanceRangeQueryBuilder builder = new GeoDistanceRangeQueryBuilder(GEO_POINT_FIELD_NAME, new GeoPoint()); - try { - if (randomBoolean()) { - builder.from((String) null); - } else { - builder.from((Number) null); - } - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("[from] must not be null")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> builder.from((String) null)); + assertEquals("[from] must not be null", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> builder.from((Number) null)); + assertEquals("[from] must not be null", e.getMessage()); } public void testInvalidTo() { GeoDistanceRangeQueryBuilder builder = new GeoDistanceRangeQueryBuilder(GEO_POINT_FIELD_NAME, new GeoPoint()); - try { - if (randomBoolean()) { - builder.to((String) null); - } else { - builder.to((Number) null); - } - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("[to] must not be null")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> builder.to((String) null)); + assertEquals("[to] must not be null", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> builder.to((Number) null)); + assertEquals("[to] must not be null", e.getMessage()); } public void testInvalidOptimizeBBox() { GeoDistanceRangeQueryBuilder builder = new GeoDistanceRangeQueryBuilder(GEO_POINT_FIELD_NAME, new GeoPoint()); - if (randomBoolean()) { - try { - builder.optimizeBbox(null); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("optimizeBbox must not be null")); - } - } else { - try { - builder.optimizeBbox("foo"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("optimizeBbox must be one of [none, memory, indexed]")); - } - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> builder.optimizeBbox(null)); + assertEquals("optimizeBbox must not be null", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> builder.optimizeBbox("foo")); + assertEquals("optimizeBbox must be one of [none, memory, indexed]", e.getMessage()); } public void testInvalidGeoDistance() { GeoDistanceRangeQueryBuilder builder = new GeoDistanceRangeQueryBuilder(GEO_POINT_FIELD_NAME, new GeoPoint()); - try { - builder.geoDistance(null); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("geoDistance calculation mode must not be null")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> builder.geoDistance(null)); + assertEquals("geoDistance calculation mode must not be null", e.getMessage()); } public void testInvalidDistanceUnit() { GeoDistanceRangeQueryBuilder builder = new GeoDistanceRangeQueryBuilder(GEO_POINT_FIELD_NAME, new GeoPoint()); - try { - builder.unit(null); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("distance unit must not be null")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> builder.unit(null)); + assertEquals("distance unit must not be null", e.getMessage()); } public void testNestedRangeQuery() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/index/query/GeoPolygonQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/GeoPolygonQueryBuilderTests.java index e6fd5abd05e..9834ea1a1c3 100644 --- a/core/src/test/java/org/elasticsearch/index/query/GeoPolygonQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/GeoPolygonQueryBuilderTests.java @@ -20,7 +20,6 @@ package org.elasticsearch.index.query; import com.vividsolutions.jts.geom.Coordinate; - import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.search.Query; import org.apache.lucene.spatial.geopoint.search.GeoPointInPolygonQuery; @@ -39,6 +38,7 @@ import org.locationtech.spatial4j.shape.jts.JtsGeometry; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static org.elasticsearch.test.StreamsUtils.copyToStringFromClasspath; @@ -47,7 +47,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.closeTo; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; public class GeoPolygonQueryBuilderTests extends AbstractQueryTestCase { @Override @@ -144,25 +143,17 @@ public class GeoPolygonQueryBuilderTests extends AbstractQueryTestCase new GeoPolygonQueryBuilder(null, randomPolygon(5))); + assertEquals("fieldName must not be null", e.getMessage()); } public void testEmptyPolygon() { - try { - if (randomBoolean()) { - new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, new ArrayList()); - } else { - new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, null); - } - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("polygon must not be null or empty")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, Collections.emptyList())); + assertEquals("polygon must not be null or empty", e.getMessage()); + + e = expectThrows(IllegalArgumentException.class, () -> new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, null)); + assertEquals("polygon must not be null or empty", e.getMessage()); } public void testInvalidClosedPolygon() { @@ -170,24 +161,18 @@ public class GeoPolygonQueryBuilderTests extends AbstractQueryTestCase new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, points)); + assertEquals("too few points defined for geo_polygon query", e.getMessage()); } public void testInvalidOpenPolygon() { List points = new ArrayList<>(); points.add(new GeoPoint(0, 90)); points.add(new GeoPoint(90, 90)); - try { - new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, points); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("too few points defined for geo_polygon query")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> new GeoPolygonQueryBuilder(GEO_POINT_FIELD_NAME, points)); + assertEquals("too few points defined for geo_polygon query", e.getMessage()); } public void testDeprecatedXContent() throws IOException { @@ -205,12 +190,8 @@ public class GeoPolygonQueryBuilderTests extends AbstractQueryTestCase parseQuery(builder.string())); + assertEquals("Deprecated field [normalize] used, replaced by [use validation_method instead]", e.getMessage()); } public void testParsingAndToQueryParsingExceptions() throws IOException { @@ -223,12 +204,7 @@ public class GeoPolygonQueryBuilderTests extends AbstractQueryTestCase parseQuery(query)); } } 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 940dbb3242c..993e75724de 100644 --- a/core/src/test/java/org/elasticsearch/index/query/GeoShapeQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/GeoShapeQueryBuilderTests.java @@ -20,7 +20,6 @@ package org.elasticsearch.index.query; import com.vividsolutions.jts.geom.Coordinate; - import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.ConstantScoreQuery; import org.apache.lucene.search.MatchNoDocsQuery; @@ -50,7 +49,6 @@ import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; public class GeoShapeQueryBuilderTests extends AbstractQueryTestCase { @@ -156,70 +154,44 @@ public class GeoShapeQueryBuilderTests extends AbstractQueryTestCase new GeoShapeQueryBuilder(null, shape)); + assertEquals("fieldName is required", e.getMessage()); } public void testNoShape() throws IOException { - try { - new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, (ShapeBuilder) null); - fail("exception expected"); - } catch (IllegalArgumentException e) { - // expected - } + expectThrows(IllegalArgumentException.class, () -> new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, null)); } public void testNoIndexedShape() throws IOException { - try { - new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, null, "type"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("either shapeBytes or indexedShapeId and indexedShapeType are required")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, null, "type")); + assertEquals("either shapeBytes or indexedShapeId and indexedShapeType are required", e.getMessage()); } public void testNoIndexedShapeType() throws IOException { - try { - new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, "id", null); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("indexedShapeType is required if indexedShapeId is specified")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, "id", null)); + assertEquals("indexedShapeType is required if indexedShapeId is specified", e.getMessage()); } public void testNoRelation() throws IOException { ShapeBuilder shape = RandomShapeGenerator.createShapeWithin(random(), null); GeoShapeQueryBuilder builder = new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, shape); - try { - builder.relation(null); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("No Shape Relation defined")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> builder.relation(null)); + assertEquals("No Shape Relation defined", e.getMessage()); } public void testInvalidRelation() throws IOException { ShapeBuilder shape = RandomShapeGenerator.createShapeWithin(random(), null); GeoShapeQueryBuilder builder = new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, shape); - try { - builder.strategy(SpatialStrategy.TERM); - builder.relation(randomFrom(ShapeRelation.DISJOINT, ShapeRelation.WITHIN)); - fail("Illegal combination of strategy and relation setting"); - } catch (IllegalArgumentException e) { - // okay - } - - try { - builder.relation(randomFrom(ShapeRelation.DISJOINT, ShapeRelation.WITHIN)); - builder.strategy(SpatialStrategy.TERM); - fail("Illegal combination of strategy and relation setting"); - } catch (IllegalArgumentException e) { - // okay - } + builder.strategy(SpatialStrategy.TERM); + expectThrows(IllegalArgumentException.class, () -> builder.relation(randomFrom(ShapeRelation.DISJOINT, ShapeRelation.WITHIN))); + GeoShapeQueryBuilder builder2 = new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, shape); + builder2.relation(randomFrom(ShapeRelation.DISJOINT, ShapeRelation.WITHIN)); + expectThrows(IllegalArgumentException.class, () -> builder2.strategy(SpatialStrategy.TERM)); + GeoShapeQueryBuilder builder3 = new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, shape); + builder3.strategy(SpatialStrategy.TERM); + expectThrows(IllegalArgumentException.class, () -> builder3.relation(randomFrom(ShapeRelation.DISJOINT, ShapeRelation.WITHIN))); } // see #3878 @@ -256,16 +228,15 @@ public class GeoShapeQueryBuilderTests extends AbstractQueryTestCase query.toQuery(createShardContext())); + assertEquals("query must be rewritten first", e.getMessage()); + QueryBuilder rewrite = query.rewrite(createShardContext()); GeoShapeQueryBuilder geoShapeQueryBuilder = new GeoShapeQueryBuilder(GEO_SHAPE_FIELD_NAME, indexedShapeToReturn); - geoShapeQueryBuilder.strategy(sqb.strategy()); - geoShapeQueryBuilder.relation(sqb.relation()); + geoShapeQueryBuilder.strategy(query.strategy()); + geoShapeQueryBuilder.relation(query.relation()); assertEquals(geoShapeQueryBuilder, rewrite); } diff --git a/core/src/test/java/org/elasticsearch/index/query/GeohashCellQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/GeohashCellQueryBuilderTests.java index 208b0479209..dbccd700165 100644 --- a/core/src/test/java/org/elasticsearch/index/query/GeohashCellQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/GeohashCellQueryBuilderTests.java @@ -39,7 +39,6 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; public class GeohashCellQueryBuilderTests extends AbstractQueryTestCase { @@ -92,39 +91,23 @@ public class GeohashCellQueryBuilderTests extends AbstractQueryTestCase } public void testNullField() { - try { - if (randomBoolean()) { - new Builder(null, new GeoPoint()); - } else { - new Builder("", new GeoPoint()); - } - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("fieldName must not be null")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> new Builder(null, new GeoPoint())); + assertEquals("fieldName must not be null", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> new Builder("", new GeoPoint())); + assertEquals("fieldName must not be null", e.getMessage()); } public void testNullGeoPoint() { - try { - if (randomBoolean()) { - new Builder(GEO_POINT_FIELD_NAME, (GeoPoint) null); - } else { - new Builder(GEO_POINT_FIELD_NAME, ""); - } - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("geohash or point must be defined")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> new Builder(GEO_POINT_FIELD_NAME, (GeoPoint) null)); + assertEquals("geohash or point must be defined", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> new Builder(GEO_POINT_FIELD_NAME, "")); + assertEquals("geohash or point must be defined", e.getMessage()); } public void testInvalidPrecision() { GeohashCellQuery.Builder builder = new Builder(GEO_POINT_FIELD_NAME, new GeoPoint()); - try { - builder.precision(-1); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), containsString("precision must be greater than 0")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> builder.precision(-1)); + assertThat(e.getMessage(), containsString("precision must be greater than 0")); } public void testLocationParsing() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/index/query/HasChildQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/HasChildQueryBuilderTests.java index d820491c436..4a06ba6d219 100644 --- a/core/src/test/java/org/elasticsearch/index/query/HasChildQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/HasChildQueryBuilderTests.java @@ -21,7 +21,6 @@ package org.elasticsearch.index.query; import com.carrotsearch.randomizedtesting.generators.RandomPicks; import com.fasterxml.jackson.core.JsonParseException; - import org.apache.lucene.queries.TermsQuery; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; @@ -63,7 +62,6 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.startsWith; -import static org.hamcrest.Matchers.is; public class HasChildQueryBuilderTests extends AbstractQueryTestCase { protected static final String PARENT_TYPE = "parent"; @@ -367,24 +365,17 @@ public class HasChildQueryBuilderTests extends AbstractQueryTestCase HasChildQueryBuilder.parseScoreMode(null)); + assertEquals("No score mode for child query [null] found", e.getMessage()); } /** * Failure should not change (and the value should never match anything...). */ public void testThatUnrecognizedFromStringThrowsException() { - try { - HasChildQueryBuilder.parseScoreMode("unrecognized value"); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("No score mode for child query [unrecognized value] found")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, + () -> HasChildQueryBuilder.parseScoreMode("unrecognized value")); + assertEquals("No score mode for child query [unrecognized value] found", e.getMessage()); } public void testIgnoreUnmapped() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/index/query/HasParentQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/HasParentQueryBuilderTests.java index 321521668ea..f4bd9e1ef02 100644 --- a/core/src/test/java/org/elasticsearch/index/query/HasParentQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/HasParentQueryBuilderTests.java @@ -157,12 +157,8 @@ public class HasParentQueryBuilderTests extends AbstractQueryTestCase parseQuery(builder.string())); + assertEquals("Deprecated field [type] used, expected [parent_type] instead", e.getMessage()); HasParentQueryBuilder queryBuilder = (HasParentQueryBuilder) parseQuery(builder.string(), ParseFieldMatcher.EMPTY); assertEquals("foo", queryBuilder.type()); diff --git a/core/src/test/java/org/elasticsearch/index/query/IdsQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/IdsQueryBuilderTests.java index 4ad90edc8cb..723509d775f 100644 --- a/core/src/test/java/org/elasticsearch/index/query/IdsQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/IdsQueryBuilderTests.java @@ -32,7 +32,6 @@ import java.io.IOException; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.is; public class IdsQueryBuilderTests extends AbstractQueryTestCase { /** @@ -40,12 +39,8 @@ public class IdsQueryBuilderTests extends AbstractQueryTestCase */ public void testIdsNotProvided() throws IOException { String noIdsFieldQuery = "{\"ids\" : { \"type\" : \"my_type\" }"; - try { - parseQuery(noIdsFieldQuery); - fail("Expected ParsingException"); - } catch (ParsingException e) { - assertThat(e.getMessage(), containsString("no ids values provided")); - } + ParsingException e = expectThrows(ParsingException.class, () -> parseQuery(noIdsFieldQuery)); + assertThat(e.getMessage(), containsString("no ids values provided")); } @Override @@ -94,30 +89,19 @@ public class IdsQueryBuilderTests extends AbstractQueryTestCase } public void testIllegalArguments() { - try { - new IdsQueryBuilder((String[])null); - fail("must be not null"); - } catch(IllegalArgumentException e) { - //all good - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> new IdsQueryBuilder((String[]) null)); + assertEquals("[ids] types cannot be null", e.getMessage()); - try { - new IdsQueryBuilder().addIds((String[])null); - fail("must be not null"); - } catch(IllegalArgumentException e) { - //all good - } + IdsQueryBuilder idsQueryBuilder = new IdsQueryBuilder(); + e = expectThrows(IllegalArgumentException.class, () -> idsQueryBuilder.addIds((String[])null)); + assertEquals("[ids] ids cannot be null", e.getMessage()); } // see #7686. public void testIdsQueryWithInvalidValues() throws Exception { String query = "{ \"ids\": { \"values\": [[1]] } }"; - try { - parseQuery(query); - fail("Expected ParsingException"); - } catch (ParsingException e) { - assertThat(e.getMessage(), is("Illegal value for id, expecting a string or number, got: START_ARRAY")); - } + ParsingException e = expectThrows(ParsingException.class, () -> parseQuery(query)); + assertEquals("Illegal value for id, expecting a string or number, got: START_ARRAY", e.getMessage()); } public void testFromJson() throws IOException { @@ -143,7 +127,7 @@ public class IdsQueryBuilderTests extends AbstractQueryTestCase IdsQueryBuilder testQuery = new IdsQueryBuilder(type); //single value type can also be called _type - String contentString = "{\n" + + final String contentString = "{\n" + " \"ids\" : {\n" + " \"_type\" : \"" + type + "\",\n" + " \"values\" : []\n" + @@ -153,15 +137,11 @@ public class IdsQueryBuilderTests extends AbstractQueryTestCase IdsQueryBuilder parsed = (IdsQueryBuilder) parseQuery(contentString, ParseFieldMatcher.EMPTY); assertEquals(testQuery, parsed); - try { - parseQuery(contentString); - fail("parse should have failed"); - } catch(IllegalArgumentException e) { - assertEquals("Deprecated field [_type] used, expected [type] instead", e.getMessage()); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> parseQuery(contentString)); + assertEquals("Deprecated field [_type] used, expected [type] instead", e.getMessage()); //array of types can also be called type rather than types - contentString = "{\n" + + final String contentString2 = "{\n" + " \"ids\" : {\n" + " \"types\" : [\"" + type + "\"],\n" + " \"values\" : []\n" + @@ -169,11 +149,8 @@ public class IdsQueryBuilderTests extends AbstractQueryTestCase "}"; parsed = (IdsQueryBuilder) parseQuery(contentString, ParseFieldMatcher.EMPTY); assertEquals(testQuery, parsed); - try { - parseQuery(contentString); - fail("parse should have failed"); - } catch(IllegalArgumentException e) { - assertEquals("Deprecated field [types] used, expected [type] instead", e.getMessage()); - } + + e = expectThrows(IllegalArgumentException.class, () -> parseQuery(contentString2)); + assertEquals("Deprecated field [types] used, expected [type] instead", e.getMessage()); } } diff --git a/core/src/test/java/org/elasticsearch/index/query/IndicesQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/IndicesQueryBuilderTests.java index 12527a927c4..d1c2dcee90c 100644 --- a/core/src/test/java/org/elasticsearch/index/query/IndicesQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/IndicesQueryBuilderTests.java @@ -61,12 +61,7 @@ public class IndicesQueryBuilderTests extends AbstractQueryTestCase new IndicesQueryBuilder(null, "index")); expectThrows(IllegalArgumentException.class, () -> new IndicesQueryBuilder(new MatchAllQueryBuilder(), (String[]) null)); expectThrows(IllegalArgumentException.class, () -> new IndicesQueryBuilder(new MatchAllQueryBuilder(), new String[0])); diff --git a/core/src/test/java/org/elasticsearch/index/query/MatchPhrasePrefixQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/MatchPhrasePrefixQueryBuilderTests.java index f5b2690db64..c6dae00b89b 100644 --- a/core/src/test/java/org/elasticsearch/index/query/MatchPhrasePrefixQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/MatchPhrasePrefixQueryBuilderTests.java @@ -23,11 +23,15 @@ import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.PointRangeQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; +import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.lucene.search.MatchNoDocsQuery; import org.elasticsearch.common.lucene.search.MultiPhrasePrefixQuery; import org.elasticsearch.test.AbstractQueryTestCase; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + import static org.hamcrest.CoreMatchers.either; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.Matchers.containsString; @@ -69,6 +73,20 @@ public class MatchPhrasePrefixQueryBuilderTests extends AbstractQueryTestCase getAlternateVersions() { + Map alternateVersions = new HashMap<>(); + MatchPhrasePrefixQueryBuilder matchPhrasePrefixQuery = new MatchPhrasePrefixQueryBuilder(randomAsciiOfLengthBetween(1, 10), + randomAsciiOfLengthBetween(1, 10)); + String contentString = "{\n" + + " \"match_phrase_prefix\" : {\n" + + " \"" + matchPhrasePrefixQuery.fieldName() + "\" : \"" + matchPhrasePrefixQuery.value() + "\"\n" + + " }\n" + + "}"; + alternateVersions.put(contentString, matchPhrasePrefixQuery); + return alternateVersions; + } + @Override protected void doAssertLuceneQuery(MatchPhrasePrefixQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { @@ -79,39 +97,22 @@ public class MatchPhrasePrefixQueryBuilderTests extends AbstractQueryTestCase new MatchPhrasePrefixQueryBuilder(null, "value")); + assertEquals("[match_phrase_prefix] requires fieldName", e.getMessage()); - try { - new MatchPhrasePrefixQueryBuilder("fieldName", null); - fail("value must not be non-null"); - } catch (IllegalArgumentException ex) { - // expected - } + e = expectThrows(IllegalArgumentException.class, () -> new MatchPhrasePrefixQueryBuilder("fieldName", null)); + assertEquals("[match_phrase_prefix] requires query value", e.getMessage()); MatchPhrasePrefixQueryBuilder matchQuery = new MatchPhrasePrefixQueryBuilder("fieldName", "text"); - - try { - matchQuery.maxExpansions(-1); - fail("must not be positive"); - } catch (IllegalArgumentException ex) { - // expected - } + e = expectThrows(IllegalArgumentException.class, () -> matchQuery.maxExpansions(-1)); } public void testBadAnalyzer() throws IOException { MatchPhrasePrefixQueryBuilder matchQuery = new MatchPhrasePrefixQueryBuilder("fieldName", "text"); matchQuery.analyzer("bogusAnalyzer"); - try { - matchQuery.toQuery(createShardContext()); - fail("Expected QueryShardException"); - } catch (QueryShardException e) { - assertThat(e.getMessage(), containsString("analyzer [bogusAnalyzer] not found")); - } + + QueryShardException e = expectThrows(QueryShardException.class, () -> matchQuery.toQuery(createShardContext())); + assertThat(e.getMessage(), containsString("analyzer [bogusAnalyzer] not found")); } public void testPhrasePrefixMatchQuery() throws IOException { @@ -155,4 +156,20 @@ public class MatchPhrasePrefixQueryBuilderTests extends AbstractQueryTestCase parseQuery(json)); + assertEquals("[match_phrase_prefix] query doesn't support multiple fields, found [message1] and [message2]", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/MatchPhraseQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/MatchPhraseQueryBuilderTests.java index d20bf655e2c..04716b16c4e 100644 --- a/core/src/test/java/org/elasticsearch/index/query/MatchPhraseQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/MatchPhraseQueryBuilderTests.java @@ -24,10 +24,13 @@ import org.apache.lucene.search.PhraseQuery; import org.apache.lucene.search.PointRangeQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; +import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.lucene.search.MatchNoDocsQuery; import org.elasticsearch.test.AbstractQueryTestCase; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import static org.hamcrest.CoreMatchers.either; import static org.hamcrest.CoreMatchers.instanceOf; @@ -66,6 +69,20 @@ public class MatchPhraseQueryBuilderTests extends AbstractQueryTestCase getAlternateVersions() { + Map alternateVersions = new HashMap<>(); + MatchPhraseQueryBuilder matchPhraseQuery = new MatchPhraseQueryBuilder(randomAsciiOfLengthBetween(1, 10), + randomAsciiOfLengthBetween(1, 10)); + String contentString = "{\n" + + " \"match_phrase\" : {\n" + + " \"" + matchPhraseQuery.fieldName() + "\" : \"" + matchPhraseQuery.value() + "\"\n" + + " }\n" + + "}"; + alternateVersions.put(contentString, matchPhraseQuery); + return alternateVersions; + } + @Override protected void doAssertLuceneQuery(MatchPhraseQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { assertThat(query, notNullValue()); @@ -74,30 +91,18 @@ public class MatchPhraseQueryBuilderTests extends AbstractQueryTestCase new MatchPhraseQueryBuilder(null, "value")); + assertEquals("[match_phrase] requires fieldName", e.getMessage()); - try { - new MatchPhraseQueryBuilder("fieldName", null); - fail("value must not be non-null"); - } catch (IllegalArgumentException ex) { - // expected - } + e = expectThrows(IllegalArgumentException.class, () -> new MatchPhraseQueryBuilder("fieldName", null)); + assertEquals("[match_phrase] requires query value", e.getMessage()); } public void testBadAnalyzer() throws IOException { MatchPhraseQueryBuilder matchQuery = new MatchPhraseQueryBuilder("fieldName", "text"); matchQuery.analyzer("bogusAnalyzer"); - try { - matchQuery.toQuery(createShardContext()); - fail("Expected QueryShardException"); - } catch (QueryShardException e) { - assertThat(e.getMessage(), containsString("analyzer [bogusAnalyzer] not found")); - } + QueryShardException e = expectThrows(QueryShardException.class, () -> matchQuery.toQuery(createShardContext())); + assertThat(e.getMessage(), containsString("analyzer [bogusAnalyzer] not found")); } public void testPhraseMatchQuery() throws IOException { @@ -119,4 +124,19 @@ public class MatchPhraseQueryBuilderTests extends AbstractQueryTestCase parseQuery(json)); + assertEquals("[match_phrase] query doesn't support multiple fields, found [message1] and [message2]", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/MatchQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/MatchQueryBuilderTests.java index 6a9a07c59dd..a5cb2fc61c7 100644 --- a/core/src/test/java/org/elasticsearch/index/query/MatchQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/MatchQueryBuilderTests.java @@ -29,6 +29,7 @@ import org.apache.lucene.search.PointRangeQuery; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.elasticsearch.common.ParseFieldMatcher; +import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.lucene.search.MatchNoDocsQuery; import org.elasticsearch.common.lucene.search.MultiPhrasePrefixQuery; import org.elasticsearch.common.lucene.search.Queries; @@ -40,7 +41,9 @@ import org.elasticsearch.test.AbstractQueryTestCase; import org.hamcrest.Matcher; import java.io.IOException; +import java.util.HashMap; import java.util.Locale; +import java.util.Map; import static org.hamcrest.CoreMatchers.either; import static org.hamcrest.CoreMatchers.instanceOf; @@ -118,6 +121,19 @@ public class MatchQueryBuilderTests extends AbstractQueryTestCase getAlternateVersions() { + Map alternateVersions = new HashMap<>(); + MatchQueryBuilder matchQuery = new MatchQueryBuilder(randomAsciiOfLengthBetween(1, 10), randomAsciiOfLengthBetween(1, 10)); + String contentString = "{\n" + + " \"match\" : {\n" + + " \"" + matchQuery.fieldName() + "\" : \"" + matchQuery.value() + "\"\n" + + " }\n" + + "}"; + alternateVersions.put(contentString, matchQuery); + return alternateVersions; + } + @Override protected void doAssertLuceneQuery(MatchQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { assertThat(query, notNullValue()); @@ -297,13 +313,9 @@ public class MatchQueryBuilderTests extends AbstractQueryTestCase parseQuery(json, ParseFieldMatcher.STRICT)); + assertThat(e.getMessage(), + containsString("Deprecated field [type] used, replaced by [match_phrase and match_phrase_prefix query]")); } public void testLegacyMatchPhraseQuery() throws IOException { @@ -334,13 +346,9 @@ public class MatchQueryBuilderTests extends AbstractQueryTestCase parseQuery(json, ParseFieldMatcher.STRICT)); + assertThat(e.getMessage(), + containsString("Deprecated field [type] used, replaced by [match_phrase and match_phrase_prefix query]")); } public void testLegacyFuzzyMatchQuery() throws IOException { @@ -365,13 +373,8 @@ public class MatchQueryBuilderTests extends AbstractQueryTestCase parseQuery(json, ParseFieldMatcher.STRICT)); + assertThat(e.getMessage(), containsString("Deprecated field [" + type + "] used, expected [match] instead")); } public void testFuzzinessOnNonStringField() throws Exception { @@ -399,11 +402,24 @@ public class MatchQueryBuilderTests extends AbstractQueryTestCase 0); MatchQueryBuilder query = new MatchQueryBuilder(GEO_POINT_FIELD_NAME, "2,3"); QueryShardContext context = createShardContext(); - QueryShardException e = expectThrows(QueryShardException.class, - () -> query.toQuery(context)); - assertEquals("Geo fields do not support exact searching, use dedicated geo queries instead: [mapped_geo_point]", - e.getMessage()); + QueryShardException e = expectThrows(QueryShardException.class, () -> query.toQuery(context)); + assertEquals("Geo fields do not support exact searching, use dedicated geo queries instead: [mapped_geo_point]", e.getMessage()); query.lenient(true); query.toQuery(context); // no exception } + + public void testParseFailsWithMultipleFields() throws IOException { + String json = "{\n" + + " \"match\" : {\n" + + " \"message1\" : {\n" + + " \"query\" : \"this is a test\"\n" + + " },\n" + + " \"message2\" : {\n" + + " \"query\" : \"this is a test\"\n" + + " }\n" + + " }\n" + + "}"; + ParsingException e = expectThrows(ParsingException.class, () -> parseQuery(json)); + assertEquals("[match] query doesn't support multiple fields, found [message1] and [message2]", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilderTests.java index 3c5bfed86dd..291bb9f0bd6 100644 --- a/core/src/test/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilderTests.java @@ -245,23 +245,16 @@ public class MoreLikeThisQueryBuilderTests extends AbstractQueryTestCase new MoreLikeThisQueryBuilder(new String[0], new String[]{"likeText"}, null)); + assertThat(e.getMessage(), containsString("requires 'fields' to be specified")); } public void testValidateEmptyLike() { String[] likeTexts = randomBoolean() ? null : new String[0]; Item[] likeItems = randomBoolean() ? null : new Item[0]; - try { - new MoreLikeThisQueryBuilder(likeTexts, likeItems); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), containsString("requires either 'like' texts or items to be specified")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> new MoreLikeThisQueryBuilder(likeTexts, likeItems)); + assertThat(e.getMessage(), containsString("requires either 'like' texts or items to be specified")); } public void testUnsupportedFields() throws IOException { @@ -269,12 +262,8 @@ public class MoreLikeThisQueryBuilderTests extends AbstractQueryTestCase queryBuilder.toQuery(createShardContext())); + assertThat(e.getMessage(), containsString("more_like_this only supports text/keyword fields")); } public void testMoreLikeThisBuilder() throws Exception { @@ -337,7 +326,7 @@ public class MoreLikeThisQueryBuilderTests extends AbstractQueryTestCase parseQuery(deprecatedJson)); + assertEquals("Deprecated field [mlt] used, expected [more_like_this] instead", e.getMessage()); } } diff --git a/core/src/test/java/org/elasticsearch/index/query/MultiMatchQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/MultiMatchQueryBuilderTests.java index 193d82b4c8e..e96c99bdcf6 100644 --- a/core/src/test/java/org/elasticsearch/index/query/MultiMatchQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/MultiMatchQueryBuilderTests.java @@ -154,33 +154,10 @@ public class MultiMatchQueryBuilderTests extends AbstractQueryTestCase new MultiMatchQueryBuilder(null, "field")); + expectThrows(IllegalArgumentException.class, () -> new MultiMatchQueryBuilder("value", (String[]) null)); + expectThrows(IllegalArgumentException.class, () -> new MultiMatchQueryBuilder("value", new String[]{""})); + expectThrows(IllegalArgumentException.class, () -> new MultiMatchQueryBuilder("value", "field").type(null)); } public void testToQueryBoost() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/index/query/PrefixQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/PrefixQueryBuilderTests.java index aba6bec096b..87d3bb2ae83 100644 --- a/core/src/test/java/org/elasticsearch/index/query/PrefixQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/PrefixQueryBuilderTests.java @@ -23,9 +23,12 @@ import org.apache.lucene.index.Term; import org.apache.lucene.search.MultiTermQuery; import org.apache.lucene.search.PrefixQuery; import org.apache.lucene.search.Query; +import org.elasticsearch.common.ParsingException; import org.elasticsearch.test.AbstractQueryTestCase; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import static org.elasticsearch.index.query.QueryBuilders.prefixQuery; import static org.hamcrest.Matchers.equalTo; @@ -35,16 +38,32 @@ public class PrefixQueryBuilderTests extends AbstractQueryTestCase getAlternateVersions() { + Map alternateVersions = new HashMap<>(); + PrefixQueryBuilder prefixQuery = randomPrefixQuery(); + String contentString = "{\n" + + " \"prefix\" : {\n" + + " \"" + prefixQuery.fieldName() + "\" : \"" + prefixQuery.value() + "\"\n" + + " }\n" + + "}"; + alternateVersions.put(contentString, prefixQuery); + return alternateVersions; + } + + private static PrefixQueryBuilder randomPrefixQuery() { + String fieldName = randomBoolean() ? STRING_FIELD_NAME : randomAsciiOfLengthBetween(1, 10); + String value = randomAsciiOfLengthBetween(1, 10); + return new PrefixQueryBuilder(fieldName, value); + } + @Override protected void doAssertLuceneQuery(PrefixQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { assertThat(query, instanceOf(PrefixQuery.class)); @@ -54,23 +73,13 @@ public class PrefixQueryBuilderTests extends AbstractQueryTestCase new PrefixQueryBuilder(null, "text")); + assertEquals("field name is null or empty", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> new PrefixQueryBuilder("", "text")); + assertEquals("field name is null or empty", e.getMessage()); - try { - new PrefixQueryBuilder("field", null); - fail("cannot be null or empty"); - } catch (IllegalArgumentException e) { - // expected - } + e = expectThrows(IllegalArgumentException.class, () -> new PrefixQueryBuilder("field", null)); + assertEquals("value cannot be null", e.getMessage()); } public void testBlendedRewriteMethod() throws IOException { @@ -103,4 +112,20 @@ public class PrefixQueryBuilderTests extends AbstractQueryTestCase parseQuery(json)); + assertEquals("[prefix] query doesn't support multiple fields, found [user1] and [user2]", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/QueryShardContextTests.java b/core/src/test/java/org/elasticsearch/index/query/QueryShardContextTests.java index 9a4c9aece5c..e1a41df4da5 100644 --- a/core/src/test/java/org/elasticsearch/index/query/QueryShardContextTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/QueryShardContextTests.java @@ -54,12 +54,8 @@ public class QueryShardContextTests extends ESTestCase { MappedFieldType fieldType = new TextFieldMapper.TextFieldType(); MappedFieldType result = context.failIfFieldMappingNotFound("name", fieldType); assertThat(result, sameInstance(fieldType)); - try { - context.failIfFieldMappingNotFound("name", null); - fail("exception expected"); - } catch (QueryShardException e) { - assertThat(e.getMessage(), equalTo("No field mapping can be found for the field with name [name]")); - } + QueryShardException e = expectThrows(QueryShardException.class, () -> context.failIfFieldMappingNotFound("name", null)); + assertEquals("No field mapping can be found for the field with name [name]", e.getMessage()); context.setAllowUnmappedFields(true); result = context.failIfFieldMappingNotFound("name", fieldType); diff --git a/core/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java index 4996794775c..be77ba00734 100644 --- a/core/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/QueryStringQueryBuilderTests.java @@ -382,13 +382,12 @@ public class QueryStringQueryBuilderTests extends AbstractQueryTestCase 0); - try { - queryStringQuery("/[ac]*a[ac]{50,200}/").defaultField(STRING_FIELD_NAME).toQuery(createShardContext()); - fail("Expected TooComplexToDeterminizeException"); - } catch (TooComplexToDeterminizeException e) { - assertThat(e.getMessage(), containsString("Determinizing [ac]*")); - assertThat(e.getMessage(), containsString("would result in more than 10000 states")); - } + QueryStringQueryBuilder queryBuilder = queryStringQuery("/[ac]*a[ac]{50,200}/").defaultField(STRING_FIELD_NAME); + + TooComplexToDeterminizeException e = expectThrows(TooComplexToDeterminizeException.class, + () -> queryBuilder.toQuery(createShardContext())); + assertThat(e.getMessage(), containsString("Determinizing [ac]*")); + assertThat(e.getMessage(), containsString("would result in more than 10000 states")); } public void testFuzzyNumeric() throws Exception { @@ -440,18 +439,13 @@ public class QueryStringQueryBuilderTests extends AbstractQueryTestCase parseQuery(invalidQueryAsString)); } public void testToQueryBooleanQueryMultipleBoosts() throws Exception { diff --git a/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java index b30ff61f6f8..b4fda42177e 100644 --- a/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/RangeQueryBuilderTests.java @@ -27,6 +27,7 @@ import org.apache.lucene.search.Query; import org.apache.lucene.search.TermRangeQuery; import org.elasticsearch.ElasticsearchParseException; import org.elasticsearch.common.ParseFieldMatcher; +import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.mapper.MappedFieldType.Relation; @@ -171,27 +172,10 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase new RangeQueryBuilder("")); RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder("test"); - try { - if (randomBoolean()) { - rangeQueryBuilder.timeZone(null); - } else { - rangeQueryBuilder.timeZone("badID"); - } - fail("cannot be null or unknown id"); - } catch (IllegalArgumentException e) { - // expected - } - - try { - if (randomBoolean()) { - rangeQueryBuilder.format(null); - } else { - rangeQueryBuilder.format("badFormat"); - } - fail("cannot be null or bad format"); - } catch (IllegalArgumentException e) { - // expected - } + expectThrows(IllegalArgumentException.class, () -> rangeQueryBuilder.timeZone(null)); + expectThrows(IllegalArgumentException.class, () -> rangeQueryBuilder.timeZone("badID")); + expectThrows(IllegalArgumentException.class, () -> rangeQueryBuilder.format(null)); + expectThrows(IllegalArgumentException.class, () -> rangeQueryBuilder.format("badFormat")); } /** @@ -200,12 +184,8 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase query.toQuery(createShardContext())); + assertThat(e.getMessage(), containsString("[range] time_zone can not be applied")); } /** @@ -214,12 +194,8 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase query.toQuery(createShardContext())); + assertThat(e.getMessage(), containsString("[range] time_zone can not be applied")); } public void testToQueryNumericField() throws IOException { @@ -270,7 +246,7 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase rewrittenQuery.rewrite(null)); } public void testDateRangeBoundaries() throws IOException { @@ -382,12 +354,8 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase queryBuilder.toQuery(createShardContext())); } public void testFromJson() throws IOException { @@ -426,7 +394,7 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase parseQuery(deprecatedJson, ParseFieldMatcher.STRICT)); + assertEquals("Deprecated field [_name] used, replaced by [query name is not supported in short version of range query]", + e.getMessage()); } public void testRewriteDateToMatchAll() throws IOException { @@ -460,8 +426,6 @@ public class RangeQueryBuilderTests extends AbstractQueryTestCase parseQuery(json)); + assertEquals("[range] query doesn't support multiple fields, found [age] and [price]", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/RegexpQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/RegexpQueryBuilderTests.java index 64a62fb766f..41cfc2c63ff 100644 --- a/core/src/test/java/org/elasticsearch/index/query/RegexpQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/RegexpQueryBuilderTests.java @@ -21,11 +21,14 @@ package org.elasticsearch.index.query; import org.apache.lucene.search.Query; import org.apache.lucene.search.RegexpQuery; +import org.elasticsearch.common.ParsingException; import org.elasticsearch.test.AbstractQueryTestCase; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; @@ -34,11 +37,7 @@ public class RegexpQueryBuilderTests extends AbstractQueryTestCase flags = new ArrayList<>(); int iter = randomInt(5); @@ -56,6 +55,26 @@ public class RegexpQueryBuilderTests extends AbstractQueryTestCase getAlternateVersions() { + Map alternateVersions = new HashMap<>(); + RegexpQueryBuilder regexpQuery = randomRegexpQuery(); + String contentString = "{\n" + + " \"regexp\" : {\n" + + " \"" + regexpQuery.fieldName() + "\" : \"" + regexpQuery.value() + "\"\n" + + " }\n" + + "}"; + alternateVersions.put(contentString, regexpQuery); + return alternateVersions; + } + + private static RegexpQueryBuilder randomRegexpQuery() { + // mapped or unmapped fields + String fieldName = randomBoolean() ? STRING_FIELD_NAME : randomAsciiOfLengthBetween(1, 10); + String value = randomAsciiOfLengthBetween(1, 10); + return new RegexpQueryBuilder(fieldName, value); + } + @Override protected void doAssertLuceneQuery(RegexpQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { assertThat(query, instanceOf(RegexpQuery.class)); @@ -64,23 +83,13 @@ public class RegexpQueryBuilderTests extends AbstractQueryTestCase new RegexpQueryBuilder(null, "text")); + assertEquals("field name is null or empty", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> new RegexpQueryBuilder("", "text")); + assertEquals("field name is null or empty", e.getMessage()); - try { - new RegexpQueryBuilder("field", null); - fail("cannot be null or empty"); - } catch (IllegalArgumentException e) { - // expected - } + e = expectThrows(IllegalArgumentException.class, () -> new RegexpQueryBuilder("field", null)); + assertEquals("value cannot be null", e.getMessage()); } public void testFromJson() throws IOException { @@ -107,9 +116,24 @@ public class RegexpQueryBuilderTests extends AbstractQueryTestCase 0); RegexpQueryBuilder query = new RegexpQueryBuilder(INT_FIELD_NAME, "12"); QueryShardContext context = createShardContext(); - QueryShardException e = expectThrows(QueryShardException.class, - () -> query.toQuery(context)); + QueryShardException e = expectThrows(QueryShardException.class, () -> query.toQuery(context)); assertEquals("Can only use regexp queries on keyword and text fields - not on [mapped_int] which is of type [integer]", e.getMessage()); } + + public void testParseFailsWithMultipleFields() throws IOException { + String json = + "{\n" + + " \"regexp\": {\n" + + " \"user1\": {\n" + + " \"value\": \"k.*y\"\n" + + " },\n" + + " \"user2\": {\n" + + " \"value\": \"k.*y\"\n" + + " }\n" + + " }\n" + + "}"; + ParsingException e = expectThrows(ParsingException.class, () -> parseQuery(json)); + assertEquals("[regexp] query doesn't support multiple fields, found [user1] and [user2]", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/SimpleQueryStringBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/SimpleQueryStringBuilderTests.java index 9168b489eb2..93fbcfd930f 100644 --- a/core/src/test/java/org/elasticsearch/index/query/SimpleQueryStringBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/SimpleQueryStringBuilderTests.java @@ -179,42 +179,26 @@ public class SimpleQueryStringBuilderTests extends AbstractQueryTestCase qb.field(null)); + assertEquals("supplied field is null or empty", e.getMessage()); } public void testFieldCannotBeNullAndWeighted() { SimpleQueryStringBuilder qb = createTestQueryBuilder(); - try { - qb.field(null, AbstractQueryBuilder.DEFAULT_BOOST); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("supplied field is null or empty.")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> qb.field(null, AbstractQueryBuilder.DEFAULT_BOOST)); + assertEquals("supplied field is null or empty", e.getMessage()); } public void testFieldCannotBeEmpty() { SimpleQueryStringBuilder qb = createTestQueryBuilder(); - try { - qb.field(""); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("supplied field is null or empty.")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> qb.field("")); + assertEquals("supplied field is null or empty", e.getMessage()); } public void testFieldCannotBeEmptyAndWeighted() { SimpleQueryStringBuilder qb = createTestQueryBuilder(); - try { - qb.field("", AbstractQueryBuilder.DEFAULT_BOOST); - fail("Expected IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), is("supplied field is null or empty.")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> qb.field("", AbstractQueryBuilder.DEFAULT_BOOST)); + assertEquals("supplied field is null or empty", e.getMessage()); } /** @@ -223,12 +207,8 @@ public class SimpleQueryStringBuilderTests extends AbstractQueryTestCase qb.fields(null)); + assertEquals("fields cannot be null", e.getMessage()); } public void testDefaultFieldParsing() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/index/query/SpanContainingQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/SpanContainingQueryBuilderTests.java index 96b89fa521c..abaa35818c9 100644 --- a/core/src/test/java/org/elasticsearch/index/query/SpanContainingQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/SpanContainingQueryBuilderTests.java @@ -40,19 +40,9 @@ public class SpanContainingQueryBuilderTests extends AbstractQueryTestCase new SpanContainingQueryBuilder(null, spanTermQuery)); + expectThrows(IllegalArgumentException.class, () -> new SpanContainingQueryBuilder(spanTermQuery, null)); } public void testFromJson() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/index/query/SpanFirstQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/SpanFirstQueryBuilderTests.java index a0279a7942e..d74ae56fe0f 100644 --- a/core/src/test/java/org/elasticsearch/index/query/SpanFirstQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/SpanFirstQueryBuilderTests.java @@ -56,12 +56,8 @@ public class SpanFirstQueryBuilderTests extends AbstractQueryTestCase parseQuery(builder.string())); + assertTrue(e.getMessage().contains("spanFirst must have [end] set")); } { XContentBuilder builder = XContentFactory.jsonBuilder(); @@ -71,12 +67,8 @@ public class SpanFirstQueryBuilderTests extends AbstractQueryTestCase parseQuery(builder.string())); + assertTrue(e.getMessage().contains("spanFirst must have [match] span query clause")); } } diff --git a/core/src/test/java/org/elasticsearch/index/query/SpanMultiTermQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/SpanMultiTermQueryBuilderTests.java index 81d7598df1d..8abaee66725 100644 --- a/core/src/test/java/org/elasticsearch/index/query/SpanMultiTermQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/SpanMultiTermQueryBuilderTests.java @@ -29,6 +29,7 @@ import org.elasticsearch.test.AbstractQueryTestCase; import java.io.IOException; +import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.instanceOf; @@ -72,15 +73,14 @@ public class SpanMultiTermQueryBuilderTests extends AbstractQueryTestCase 0 && context.fieldMapper(DATE_FIELD_NAME) != null) { - try { - RangeQueryBuilder query = new RangeQueryBuilder(DATE_FIELD_NAME); - new SpanMultiTermQueryBuilder(query).toQuery(createShardContext()); - fail("Exception expected, range query on date fields should not generate a lucene " + MultiTermQuery.class.getName()); - } catch (UnsupportedOperationException e) { - assert(e.getMessage().contains("unsupported inner query, should be " + MultiTermQuery.class.getName())); - } - } + assumeTrue("test runs only if there is a registered type", + getCurrentTypes().length > 0 && context.fieldMapper(DATE_FIELD_NAME) != null); + + RangeQueryBuilder query = new RangeQueryBuilder(DATE_FIELD_NAME); + SpanMultiTermQueryBuilder spamMultiTermQuery = new SpanMultiTermQueryBuilder(query); + UnsupportedOperationException e = expectThrows(UnsupportedOperationException.class, + () -> spamMultiTermQuery.toQuery(createShardContext())); + assertThat(e.getMessage(), containsString("unsupported inner query, should be " + MultiTermQuery.class.getName())); } public void testToQueryInnerSpanMultiTerm() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/index/query/SpanNotQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/SpanNotQueryBuilderTests.java index ccfda9596f3..b8a9dcd2afc 100644 --- a/core/src/test/java/org/elasticsearch/index/query/SpanNotQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/SpanNotQueryBuilderTests.java @@ -62,18 +62,9 @@ public class SpanNotQueryBuilderTests extends AbstractQueryTestCase new SpanNotQueryBuilder(null, spanTermQuery)); + expectThrows(IllegalArgumentException.class, () -> new SpanNotQueryBuilder(spanTermQuery, null)); } public void testDist() { @@ -136,12 +127,8 @@ public class SpanNotQueryBuilderTests extends AbstractQueryTestCase parseQuery(builder.string())); + assertThat(e.getDetailedMessage(), containsString("spanNot must have [include]")); } { XContentBuilder builder = XContentFactory.jsonBuilder(); @@ -154,12 +141,8 @@ public class SpanNotQueryBuilderTests extends AbstractQueryTestCase parseQuery(builder.string())); + assertThat(e.getDetailedMessage(), containsString("spanNot must have [exclude]")); } { XContentBuilder builder = XContentFactory.jsonBuilder(); @@ -175,12 +158,8 @@ public class SpanNotQueryBuilderTests extends AbstractQueryTestCase parseQuery(builder.string())); + assertThat(e.getDetailedMessage(), containsString("spanNot can either use [dist] or [pre] & [post] (or none)")); } } diff --git a/core/src/test/java/org/elasticsearch/index/query/SpanTermQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/SpanTermQueryBuilderTests.java index 546c8536ad9..38be4ea346c 100644 --- a/core/src/test/java/org/elasticsearch/index/query/SpanTermQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/SpanTermQueryBuilderTests.java @@ -23,6 +23,7 @@ import org.apache.lucene.index.Term; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.spans.SpanTermQuery; +import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.index.mapper.MappedFieldType; @@ -99,13 +100,26 @@ public class SpanTermQueryBuilderTests extends AbstractTermQueryTestCase parseQuery(json)); + assertEquals("[span_term] query doesn't support multiple fields, found [message1] and [message2]", e.getMessage()); + } + } diff --git a/core/src/test/java/org/elasticsearch/index/query/SpanWithinQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/SpanWithinQueryBuilderTests.java index a05a2a1af81..ef684412e54 100644 --- a/core/src/test/java/org/elasticsearch/index/query/SpanWithinQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/SpanWithinQueryBuilderTests.java @@ -40,19 +40,9 @@ public class SpanWithinQueryBuilderTests extends AbstractQueryTestCase new SpanWithinQueryBuilder(null, spanTermQuery)); + expectThrows(IllegalArgumentException.class, () -> new SpanWithinQueryBuilder(spanTermQuery, null)); } public void testFromJson() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/index/query/TermQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/TermQueryBuilderTests.java index a632f3803dd..276768183b0 100644 --- a/core/src/test/java/org/elasticsearch/index/query/TermQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/TermQueryBuilderTests.java @@ -19,6 +19,7 @@ package org.elasticsearch.index.query; +import com.fasterxml.jackson.core.io.JsonStringEncoder; import org.apache.lucene.index.Term; import org.apache.lucene.search.PointRangeQuery; import org.apache.lucene.search.Query; @@ -27,14 +28,11 @@ import org.elasticsearch.common.ParsingException; import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.index.mapper.MappedFieldType; -import com.fasterxml.jackson.core.io.JsonStringEncoder; - import java.io.IOException; -import static org.hamcrest.Matchers.either; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.instanceOf; -import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.either; public class TermQueryBuilderTests extends AbstractTermQueryTestCase { @@ -115,12 +113,8 @@ public class TermQueryBuilderTests extends AbstractTermQueryTestCase parseQuery(queryAsString)); + assertEquals("[term] query does not support array of values", e.getMessage()); } public void testFromJson() throws IOException { @@ -136,7 +130,6 @@ public class TermQueryBuilderTests extends AbstractTermQueryTestCase 0); TermQueryBuilder query = new TermQueryBuilder(GEO_POINT_FIELD_NAME, "2,3"); QueryShardContext context = createShardContext(); - QueryShardException e = expectThrows(QueryShardException.class, - () -> query.toQuery(context)); + QueryShardException e = expectThrows(QueryShardException.class, () -> query.toQuery(context)); assertEquals("Geo fields do not support exact searching, use dedicated geo queries instead: [mapped_geo_point]", e.getMessage()); } + + public void testParseFailsWithMultipleFields() throws IOException { + String json = "{\n" + + " \"term\" : {\n" + + " \"message1\" : {\n" + + " \"value\" : \"this\"\n" + + " },\n" + + " \"message2\" : {\n" + + " \"value\" : \"this\"\n" + + " }\n" + + " }\n" + + "}"; + ParsingException e = expectThrows(ParsingException.class, () -> parseQuery(json)); + assertEquals("[term] query does not support different field names, use [bool] query instead", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/TermsQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/TermsQueryBuilderTests.java index 985669394d9..74c55da15b5 100644 --- a/core/src/test/java/org/elasticsearch/index/query/TermsQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/TermsQueryBuilderTests.java @@ -37,7 +37,6 @@ import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.get.GetResult; import org.elasticsearch.indices.TermsLookup; import org.elasticsearch.test.AbstractQueryTestCase; -import org.hamcrest.Matchers; import org.junit.Before; import java.io.IOException; @@ -49,7 +48,6 @@ import java.util.stream.Collectors; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; -import static org.hamcrest.Matchers.is; public class TermsQueryBuilderTests extends AbstractQueryTestCase { private List randomTerms; @@ -146,56 +144,32 @@ public class TermsQueryBuilderTests extends AbstractQueryTestCase new TermsQueryBuilder(null, "term")); + assertEquals("field name cannot be null.", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> new TermsQueryBuilder("", "term")); + assertEquals("field name cannot be null.", e.getMessage()); } public void testEmtpyTermsLookup() { - try { - new TermsQueryBuilder("field", (TermsLookup) null); - fail("Expected IllegalArgumentException"); - } catch(IllegalArgumentException e) { - assertThat(e.getMessage(), is("No value or termsLookup specified for terms query")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> new TermsQueryBuilder("field", (TermsLookup) null)); + assertEquals("No value or termsLookup specified for terms query", e.getMessage()); } public void testNullValues() { - try { - switch (randomInt(6)) { - case 0: - new TermsQueryBuilder("field", (String[]) null); - break; - case 1: - new TermsQueryBuilder("field", (int[]) null); - break; - case 2: - new TermsQueryBuilder("field", (long[]) null); - break; - case 3: - new TermsQueryBuilder("field", (float[]) null); - break; - case 4: - new TermsQueryBuilder("field", (double[]) null); - break; - case 5: - new TermsQueryBuilder("field", (Object[]) null); - break; - default: - new TermsQueryBuilder("field", (Iterable) null); - break; - } - fail("should have failed with IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertThat(e.getMessage(), Matchers.containsString("No value specified for terms query")); - } + IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> new TermsQueryBuilder("field", (String[]) null)); + assertThat(e.getMessage(), containsString("No value specified for terms query")); + e = expectThrows(IllegalArgumentException.class, () -> new TermsQueryBuilder("field", (int[]) null)); + assertThat(e.getMessage(), containsString("No value specified for terms query")); + e = expectThrows(IllegalArgumentException.class, () -> new TermsQueryBuilder("field", (long[]) null)); + assertThat(e.getMessage(), containsString("No value specified for terms query")); + e = expectThrows(IllegalArgumentException.class, () -> new TermsQueryBuilder("field", (float[]) null)); + assertThat(e.getMessage(), containsString("No value specified for terms query")); + e = expectThrows(IllegalArgumentException.class, () -> new TermsQueryBuilder("field", (double[]) null)); + assertThat(e.getMessage(), containsString("No value specified for terms query")); + e = expectThrows(IllegalArgumentException.class, () -> new TermsQueryBuilder("field", (Object[]) null)); + assertThat(e.getMessage(), containsString("No value specified for terms query")); + e = expectThrows(IllegalArgumentException.class, () -> new TermsQueryBuilder("field", (Iterable) null)); + assertThat(e.getMessage(), containsString("No value specified for terms query")); } public void testBothValuesAndLookupSet() throws IOException { @@ -213,12 +187,9 @@ public class TermsQueryBuilderTests extends AbstractQueryTestCase parseQuery(query)); + assertThat(e.getMessage(), containsString("[" + TermsQueryBuilder.NAME + "] query does not support more than one field.")); } @Override @@ -267,12 +238,8 @@ public class TermsQueryBuilderTests extends AbstractQueryTestCase parseQuery(query)); + assertEquals("[" + TermsQueryBuilder.NAME + "] query does not support multiple fields", e.getMessage()); } public void testFromJson() throws IOException { @@ -288,7 +255,7 @@ public class TermsQueryBuilderTests extends AbstractQueryTestCase parseQuery(deprecatedJson)); + assertEquals("Deprecated field [in] used, expected [terms] instead", e.getMessage()); } @Override public void testMustRewrite() throws IOException { TermsQueryBuilder termsQueryBuilder = new TermsQueryBuilder(STRING_FIELD_NAME, randomTermsLookup()); - try { - termsQueryBuilder.toQuery(createShardContext()); - fail(); - } catch (UnsupportedOperationException ex) { - assertEquals("query must be rewritten first", ex.getMessage()); - } + UnsupportedOperationException e = expectThrows(UnsupportedOperationException.class, + () -> termsQueryBuilder.toQuery(createShardContext())); + assertEquals("query must be rewritten first", e.getMessage()); assertEquals(termsQueryBuilder.rewrite(createShardContext()), new TermsQueryBuilder(STRING_FIELD_NAME, randomTerms.stream().filter(x -> x != null).collect(Collectors.toList()))); // terms lookup removes null values } diff --git a/core/src/test/java/org/elasticsearch/index/query/TypeQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/TypeQueryBuilderTests.java index a3265d06d70..5e02aba6ec6 100644 --- a/core/src/test/java/org/elasticsearch/index/query/TypeQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/TypeQueryBuilderTests.java @@ -44,12 +44,7 @@ public class TypeQueryBuilderTests extends AbstractQueryTestCase new TypeQueryBuilder((String) null)); } public void testFromJson() throws IOException { diff --git a/core/src/test/java/org/elasticsearch/index/query/WildcardQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/WildcardQueryBuilderTests.java index 34a006bf8e3..31eee307152 100644 --- a/core/src/test/java/org/elasticsearch/index/query/WildcardQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/WildcardQueryBuilderTests.java @@ -21,9 +21,12 @@ package org.elasticsearch.index.query; import org.apache.lucene.search.Query; import org.apache.lucene.search.WildcardQuery; +import org.elasticsearch.common.ParsingException; import org.elasticsearch.test.AbstractQueryTestCase; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; @@ -32,21 +35,36 @@ public class WildcardQueryBuilderTests extends AbstractQueryTestCase getAlternateVersions() { + Map alternateVersions = new HashMap<>(); + WildcardQueryBuilder wildcardQuery = randomWildcardQuery(); + String contentString = "{\n" + + " \"wildcard\" : {\n" + + " \"" + wildcardQuery.fieldName() + "\" : \"" + wildcardQuery.value() + "\"\n" + + " }\n" + + "}"; + alternateVersions.put(contentString, wildcardQuery); + return alternateVersions; + } + + private static WildcardQueryBuilder randomWildcardQuery() { + // mapped or unmapped field + String text = randomAsciiOfLengthBetween(1, 10); + if (randomBoolean()) { + return new WildcardQueryBuilder(STRING_FIELD_NAME, text); + } else { + return new WildcardQueryBuilder(randomAsciiOfLengthBetween(1, 10), text); + } + } + @Override protected void doAssertLuceneQuery(WildcardQueryBuilder queryBuilder, Query query, QueryShardContext context) throws IOException { assertThat(query, instanceOf(WildcardQuery.class)); @@ -57,41 +75,43 @@ public class WildcardQueryBuilderTests extends AbstractQueryTestCase new WildcardQueryBuilder(null, "text")); + assertEquals("field name is null or empty", e.getMessage()); + e = expectThrows(IllegalArgumentException.class, () -> new WildcardQueryBuilder("", "text")); + assertEquals("field name is null or empty", e.getMessage()); - try { - new WildcardQueryBuilder("field", null); - fail("cannot be null or empty"); - } catch (IllegalArgumentException e) { - // expected - } + e = expectThrows(IllegalArgumentException.class, () -> new WildcardQueryBuilder("field", null)); + assertEquals("value cannot be null", e.getMessage()); } public void testEmptyValue() throws IOException { QueryShardContext context = createShardContext(); context.setAllowUnmappedFields(true); - WildcardQueryBuilder wildcardQueryBuilder = new WildcardQueryBuilder(getRandomType(), ""); assertEquals(wildcardQueryBuilder.toQuery(context).getClass(), WildcardQuery.class); } public void testFromJson() throws IOException { - String json = - "{ \"wildcard\" : { \"user\" : { \"wildcard\" : \"ki*y\", \"boost\" : 2.0 } }}"; - + String json = "{ \"wildcard\" : { \"user\" : { \"wildcard\" : \"ki*y\", \"boost\" : 2.0 } }}"; WildcardQueryBuilder parsed = (WildcardQueryBuilder) parseQuery(json); checkGeneratedJson(json, parsed); - assertEquals(json, "ki*y", parsed.value()); assertEquals(json, 2.0, parsed.boost(), 0.0001); } + + public void testParseFailsWithMultipleFields() throws IOException { + String json = + "{\n" + + " \"wildcard\": {\n" + + " \"user1\": {\n" + + " \"wildcard\": \"ki*y\"\n" + + " },\n" + + " \"user2\": {\n" + + " \"wildcard\": \"ki*y\"\n" + + " }\n" + + " }\n" + + "}"; + ParsingException e = expectThrows(ParsingException.class, () -> parseQuery(json)); + assertEquals("[wildcard] query doesn't support multiple fields, found [user1] and [user2]", e.getMessage()); + } } diff --git a/core/src/test/java/org/elasticsearch/index/query/WrapperQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/WrapperQueryBuilderTests.java index 492b27f4957..ee507365c56 100644 --- a/core/src/test/java/org/elasticsearch/index/query/WrapperQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/WrapperQueryBuilderTests.java @@ -61,38 +61,12 @@ public class WrapperQueryBuilderTests extends AbstractQueryTestCase new WrapperQueryBuilder((byte[]) null)); + expectThrows(IllegalArgumentException.class, () -> new WrapperQueryBuilder(new byte[0])); + expectThrows(IllegalArgumentException.class, () -> new WrapperQueryBuilder((String) null)); + expectThrows(IllegalArgumentException.class, () -> new WrapperQueryBuilder("")); + expectThrows(IllegalArgumentException.class, () -> new WrapperQueryBuilder((BytesReference) null)); + expectThrows(IllegalArgumentException.class, () -> new WrapperQueryBuilder(new BytesArray(new byte[0]))); } /** @@ -102,12 +76,9 @@ public class WrapperQueryBuilderTests extends AbstractQueryTestCase parseQuery(json)); + assertTrue(e.getMessage().contains("bogusField")); } public void testFromJson() throws IOException { @@ -133,12 +104,8 @@ public class WrapperQueryBuilderTests extends AbstractQueryTestCase qb.toQuery(createShardContext())); + assertEquals("this query must be rewritten first", e.getMessage()); QueryBuilder rewrite = qb.rewrite(createShardContext()); assertEquals(tqb, rewrite); } diff --git a/core/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilderTests.java b/core/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilderTests.java index bd841a05ca1..62f3cf4504e 100644 --- a/core/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilderTests.java +++ b/core/src/test/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilderTests.java @@ -414,12 +414,8 @@ public class FunctionScoreQueryBuilderTests extends AbstractQueryTestCase parseQuery(functionScoreQuery)); + assertThat(e.getMessage(), containsString("use [functions] array if you want to define several functions.")); } public void testProperErrorMessageWhenTwoFunctionsDefinedInFunctionsArray() throws IOException { diff --git a/test/framework/src/main/java/org/elasticsearch/test/AbstractQueryTestCase.java b/test/framework/src/main/java/org/elasticsearch/test/AbstractQueryTestCase.java index f59afcb40d8..64baa359447 100644 --- a/test/framework/src/main/java/org/elasticsearch/test/AbstractQueryTestCase.java +++ b/test/framework/src/main/java/org/elasticsearch/test/AbstractQueryTestCase.java @@ -281,13 +281,9 @@ public abstract class AbstractQueryTestCase> } while (testQuery.toString().contains(marker)); testQuery.queryName(marker); // to find root query to add additional bogus field there String queryAsString = testQuery.toString().replace("\"" + marker + "\"", "\"" + marker + "\", \"bogusField\" : \"someValue\""); - try { - parseQuery(queryAsString); - fail("ParsingException expected."); - } catch (ParsingException e) { - // we'd like to see the offending field name here - assertThat(e.getMessage(), containsString("bogusField")); - } + ParsingException e = expectThrows(ParsingException.class, () -> parseQuery(queryAsString)); + // we'd like to see the offending field name here + assertThat(e.getMessage(), containsString("bogusField")); } /** @@ -344,12 +340,8 @@ public abstract class AbstractQueryTestCase> validQuery.substring(insertionPosition, endArrayPosition) + "]" + validQuery.substring(endArrayPosition, validQuery.length()); - try { - parseQuery(testQuery); - fail("some parsing exception expected for query: " + testQuery); - } catch (ParsingException e) { - assertEquals("[" + queryName + "] query malformed, no start_object after query name", e.getMessage()); - } + ParsingException e = expectThrows(ParsingException.class, () -> parseQuery(testQuery)); + assertEquals("[" + queryName + "] query malformed, no start_object after query name", e.getMessage()); } /**