From cab3a68cc073fd4d9b4db985a271d77a8675694a Mon Sep 17 00:00:00 2001 From: javanna Date: Tue, 30 Jun 2015 15:41:32 +0200 Subject: [PATCH] Query refactoring: unify boost and query name Following the discussion in #11744, move boost and query _name to base class AbstractQueryBuilder with their getters and setters. Unify their serialization code and equals/hashcode handling in the base class too. This guarantess that every query supports both _name and boost and nothing needs to be done around those in subclasses besides properly parsing the fields in the parsers and printing them out as part of the doXContent method in the builders. More specifically, these are the performed changes: - Introduced printBoostAndQueryName utility method in AbstractQueryBuilder that subclasses can use to print out _name and boost in their doXContent method. - readFrom and writeTo are now final methods that take care of _name and boost serialization. Subclasses have to implement doReadFrom and doWriteTo instead. - toQuery is a final method too that takes care of properly applying _name and boost to the lucene query. Subclasses have to implement doToQuery instead. The query returned will have boost and queryName applied automatically. - Removed BoostableQueryBuilder interface, given that every query is boostable after this change. This won't have any negative effect on filters, as the boost simply gets ignored in that case. - Extended equals and hashcode to handle queryName and boost automatically as well. - Update the query test infra so that queryName and boost are tested automatically, and whenever they are forgotten in parser or doXContent tests fail, so this makes things a lot less error-prone - Introduced DEFAULT_BOOST constant to make sure we don't repeat 1.0f all the time for default boost values. SpanQueryBuilder is again a marker interface only. The convenient toQuery that allowed us to override the return type to SpanQuery cannot be supported anymore due to a clash with the toQuery implementation from AbstractQueryBuilder. We have to go back to castin lucene Query to SpanQuery when dealing with span queries unfortunately. Note that this change touches not only the already refactored queries but also the untouched ones, by making sure that we parse _name and boost whenever we need to and that we print them out as part of QueryBuilder#doXContent. This will result in printing out the default boost all the time rather than skipping it in non refactored queries, something that we would have changed anyway as part of the query refactoring. The following are the queries that support boost now while previously they didn't (parser now parses it and builder prints it out): and, exists, fquery, geo_bounding_box, geo_distance, geo_distance_range, geo_hash_cell, geo_polygon, indices, limit, missing, not, or, script, type. The following are the queries that support _name now while previously they didn't (parser now parses it and builder prints it out): boosting, constant_score, function_score, limit, match_all, type. Range query parser supports now _name at the same level as boost too (_name is still supported on the outer object though for bw comp). There are two exceptions that despite have getters and setters for queryName and boost don't really support boost and queryName: query filter and span multi term query. The reason for this is that they only support a single inner object which is another query that they wrap, no other elements. Relates to #11744 Closes #10776 Closes #11974 --- .../classic/ExistsFieldQueryExtension.java | 2 +- .../classic/MissingFieldQueryExtension.java | 7 +- .../index/query/AbstractQueryBuilder.java | 107 ++++++++++++++++-- .../index/query/AndQueryBuilder.java | 41 ++----- .../index/query/AndQueryParser.java | 7 +- .../index/query/BaseTermQueryBuilder.java | 72 ++---------- .../index/query/BoolQueryBuilder.java | 75 ++---------- .../index/query/BoolQueryParser.java | 2 +- .../index/query/BoostableQueryBuilder.java | 33 ------ .../index/query/BoostingQueryBuilder.java | 45 ++------ .../index/query/BoostingQueryParser.java | 7 +- .../index/query/CommonTermsQueryBuilder.java | 67 ++--------- .../index/query/CommonTermsQueryParser.java | 5 +- .../query/ConstantScoreQueryBuilder.java | 47 ++------ .../index/query/ConstantScoreQueryParser.java | 8 +- .../index/query/DisMaxQueryBuilder.java | 70 ++---------- .../index/query/DisMaxQueryParser.java | 2 +- .../index/query/ExistsQueryBuilder.java | 50 ++------ .../index/query/ExistsQueryParser.java | 4 + .../index/query/FQueryFilterBuilder.java | 44 ++----- .../index/query/FQueryFilterParser.java | 4 + .../query/FieldMaskingSpanQueryBuilder.java | 74 +++--------- .../query/FieldMaskingSpanQueryParser.java | 2 +- .../index/query/FilteredQueryBuilder.java | 31 +---- .../index/query/FilteredQueryParser.java | 2 +- .../index/query/FuzzyQueryBuilder.java | 31 +---- .../index/query/FuzzyQueryParser.java | 3 +- .../query/GeoBoundingBoxQueryBuilder.java | 14 +-- .../query/GeoBoundingBoxQueryParser.java | 8 +- .../index/query/GeoDistanceQueryBuilder.java | 14 +-- .../index/query/GeoDistanceQueryParser.java | 5 +- .../query/GeoDistanceRangeQueryBuilder.java | 14 +-- .../query/GeoDistanceRangeQueryParser.java | 5 +- .../index/query/GeoPolygonQueryBuilder.java | 16 +-- .../index/query/GeoPolygonQueryParser.java | 6 +- .../index/query/GeoShapeQueryBuilder.java | 31 +---- .../index/query/GeoShapeQueryParser.java | 3 +- .../index/query/GeohashCellQuery.java | 20 +++- .../index/query/HasChildQueryBuilder.java | 31 +---- .../index/query/HasChildQueryParser.java | 2 +- .../index/query/HasParentQueryBuilder.java | 25 +--- .../index/query/HasParentQueryParser.java | 2 +- .../index/query/IdsQueryBuilder.java | 67 ++--------- .../index/query/IdsQueryParser.java | 2 +- .../index/query/IndicesQueryBuilder.java | 14 +-- .../index/query/IndicesQueryParser.java | 4 + .../index/query/LimitQueryBuilder.java | 14 +-- .../index/query/LimitQueryParser.java | 8 +- .../index/query/MatchAllQueryBuilder.java | 55 +++------ .../index/query/MatchAllQueryParser.java | 8 +- .../index/query/MatchQueryBuilder.java | 32 +----- .../index/query/MatchQueryParser.java | 2 +- .../index/query/MissingQueryBuilder.java | 14 +-- .../index/query/MissingQueryParser.java | 18 ++- .../index/query/MoreLikeThisQueryBuilder.java | 25 +--- .../index/query/MultiMatchQueryBuilder.java | 30 +---- .../index/query/MultiMatchQueryParser.java | 2 +- .../index/query/NestedQueryBuilder.java | 31 +---- .../index/query/NestedQueryParser.java | 2 +- .../index/query/NotQueryBuilder.java | 49 ++------ .../index/query/NotQueryParser.java | 4 + .../index/query/OrQueryBuilder.java | 41 ++----- .../index/query/OrQueryParser.java | 4 + .../index/query/PrefixQueryBuilder.java | 45 ++------ .../index/query/PrefixQueryParser.java | 2 +- .../index/query/QueryBuilder.java | 2 +- .../index/query/QueryFilterBuilder.java | 22 +++- .../index/query/QueryStringQueryBuilder.java | 32 +----- .../query/QueryWrappingQueryBuilder.java | 12 +- .../index/query/RangeQueryBuilder.java | 67 ++--------- .../index/query/RangeQueryParser.java | 4 +- .../index/query/RegexpQueryBuilder.java | 29 +---- .../index/query/RegexpQueryParser.java | 2 +- .../index/query/ScriptQueryBuilder.java | 14 +-- .../index/query/ScriptQueryParser.java | 4 + .../index/query/SimpleQueryStringBuilder.java | 73 ++---------- .../index/query/SimpleQueryStringParser.java | 2 +- .../query/SpanContainingQueryBuilder.java | 34 +----- .../query/SpanContainingQueryParser.java | 2 +- .../index/query/SpanFirstQueryBuilder.java | 34 +----- .../index/query/SpanFirstQueryParser.java | 2 +- .../query/SpanMultiTermQueryBuilder.java | 13 ++- .../index/query/SpanNearQueryBuilder.java | 34 +----- .../index/query/SpanNearQueryParser.java | 2 +- .../index/query/SpanNotQueryBuilder.java | 36 +----- .../index/query/SpanNotQueryParser.java | 2 +- .../index/query/SpanOrQueryBuilder.java | 34 +----- .../index/query/SpanOrQueryParser.java | 2 +- .../index/query/SpanQueryBuilder.java | 8 +- .../index/query/SpanTermQueryBuilder.java | 12 +- .../index/query/SpanTermQueryParser.java | 2 +- .../index/query/SpanWithinQueryBuilder.java | 33 +----- .../index/query/SpanWithinQueryParser.java | 2 +- .../index/query/TermQueryBuilder.java | 10 +- .../index/query/TermQueryParser.java | 2 +- .../index/query/TermsQueryBuilder.java | 28 +---- .../index/query/TypeQueryBuilder.java | 1 + .../index/query/TypeQueryParser.java | 42 ++++--- .../index/query/WildcardQueryBuilder.java | 45 ++------ .../index/query/WildcardQueryParser.java | 3 +- .../FunctionScoreQueryBuilder.java | 21 +--- .../FunctionScoreQueryParser.java | 23 ++-- .../aliases/IndexAliasesTests.java | 4 +- .../index/query/AndQueryBuilderTest.java | 17 +-- .../index/query/BaseQueryTestCase.java | 36 ++++-- .../index/query/BaseTermQueryTestCase.java | 26 +---- .../index/query/BoolQueryBuilderTest.java | 26 +---- .../index/query/BoostingQueryBuilderTest.java | 17 +-- .../query/CommonTermsQueryBuilderTest.java | 23 +--- .../query/ConstantScoreQueryBuilderTest.java | 14 +-- .../index/query/DisMaxQueryBuilderTest.java | 17 +-- .../index/query/ExistsQueryBuilderTest.java | 38 +------ .../index/query/FQueryFilterBuilderTest.java | 16 +-- .../FieldMaskingSpanQueryBuilderTest.java | 32 +----- .../index/query/IdsQueryBuilderTest.java | 21 +--- .../index/query/LimitQueryBuilderTest.java | 8 +- .../index/query/MatchAllQueryBuilderTest.java | 17 +-- .../index/query/NotQueryBuilderTest.java | 20 +--- .../index/query/OrQueryBuilderTest.java | 17 +-- .../index/query/QueryFilterBuilderTest.java | 7 +- .../index/query/RangeQueryBuilderTest.java | 21 +--- .../query/SimpleQueryStringBuilderTest.java | 43 ++----- .../highlight/HighlighterSearchTests.java | 2 +- .../migrate_query_refactoring.asciidoc | 15 ++- 124 files changed, 661 insertions(+), 1977 deletions(-) delete mode 100644 core/src/main/java/org/elasticsearch/index/query/BoostableQueryBuilder.java diff --git a/core/src/main/java/org/apache/lucene/queryparser/classic/ExistsFieldQueryExtension.java b/core/src/main/java/org/apache/lucene/queryparser/classic/ExistsFieldQueryExtension.java index ab924770688..014c2c0c7a4 100644 --- a/core/src/main/java/org/apache/lucene/queryparser/classic/ExistsFieldQueryExtension.java +++ b/core/src/main/java/org/apache/lucene/queryparser/classic/ExistsFieldQueryExtension.java @@ -33,6 +33,6 @@ public class ExistsFieldQueryExtension implements FieldQueryExtension { @Override public Query query(QueryParseContext parseContext, String queryText) { - return new ConstantScoreQuery(ExistsQueryBuilder.newFilter(parseContext, queryText, null)); + return new ConstantScoreQuery(ExistsQueryBuilder.newFilter(parseContext, queryText)); } } diff --git a/core/src/main/java/org/apache/lucene/queryparser/classic/MissingFieldQueryExtension.java b/core/src/main/java/org/apache/lucene/queryparser/classic/MissingFieldQueryExtension.java index ed1b7043bc3..ead4e34e688 100644 --- a/core/src/main/java/org/apache/lucene/queryparser/classic/MissingFieldQueryExtension.java +++ b/core/src/main/java/org/apache/lucene/queryparser/classic/MissingFieldQueryExtension.java @@ -33,7 +33,10 @@ public class MissingFieldQueryExtension implements FieldQueryExtension { @Override public Query query(QueryParseContext parseContext, String queryText) { - return new ConstantScoreQuery(MissingQueryParser.newFilter(parseContext, queryText, - MissingQueryParser.DEFAULT_EXISTENCE_VALUE, MissingQueryParser.DEFAULT_NULL_VALUE, null)); + Query query = MissingQueryParser.newFilter(parseContext, queryText, MissingQueryParser.DEFAULT_EXISTENCE_VALUE, MissingQueryParser.DEFAULT_NULL_VALUE); + if (query != null) { + return new ConstantScoreQuery(query); + } + return null; } } diff --git a/core/src/main/java/org/elasticsearch/index/query/AbstractQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/AbstractQueryBuilder.java index 7cd3c4e3b33..3e2a6aebff8 100644 --- a/core/src/main/java/org/elasticsearch/index/query/AbstractQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/AbstractQueryBuilder.java @@ -27,16 +27,24 @@ import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentType; + import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; /** * Base class for all classes producing lucene queries. * Supports conversion to BytesReference and creation of lucene Query objects. */ -public abstract class AbstractQueryBuilder extends ToXContentToBytes implements QueryBuilder { +public abstract class AbstractQueryBuilder extends ToXContentToBytes implements QueryBuilder { + + /** Default for boost to apply to resulting Lucene query. Defaults to 1.0*/ + public static final float DEFAULT_BOOST = 1.0f; + + protected String queryName; + protected float boost = DEFAULT_BOOST; protected AbstractQueryBuilder() { super(XContentType.JSON); @@ -52,9 +60,27 @@ public abstract class AbstractQueryBuilder extends ToXC protected abstract void doXContent(XContentBuilder builder, Params params) throws IOException; + protected void printBoostAndQueryName(XContentBuilder builder) throws IOException { + builder.field("boost", boost); + if (queryName != null) { + builder.field("_name", queryName); + } + } + @Override - //norelease to be made abstract once all query builders override toQuery providing their own specific implementation. - public Query toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException { + public final Query toQuery(QueryParseContext parseContext) throws IOException { + Query query = doToQuery(parseContext); + if (query != null) { + query.setBoost(boost); + if (queryName != null) { + parseContext.addNamedQuery(queryName, query); + } + } + return query; + } + + //norelease to be made abstract once all query builders override doToQuery providing their own specific implementation. + protected Query doToQuery(QueryParseContext parseContext) throws IOException { return parseContext.indexQueryParserService().queryParser(getName()).parse(parseContext); } @@ -65,15 +91,62 @@ public abstract class AbstractQueryBuilder extends ToXC return null; } - //norelease remove this once all builders implement readFrom themselves - @Override - public QB readFrom(StreamInput in) throws IOException { - return null; + /** + * Returns the query name for the query. + */ + @SuppressWarnings("unchecked") + public QB queryName(String queryName) { + this.queryName = queryName; + return (QB) this; + } + + /** + * Sets the query name for the query. + */ + public final String queryName() { + return queryName; + } + + /** + * Returns the boost for this query. + */ + public final float boost() { + return this.boost; + } + + /** + * Sets the boost for this query. Documents matching this query will (in addition to the normal + * weightings) have their score multiplied by the boost provided. + */ + @SuppressWarnings("unchecked") + public QB boost(float boost) { + this.boost = boost; + return (QB) this; } - //norelease remove this once all builders implement writeTo themselves @Override - public void writeTo(StreamOutput out) throws IOException { + public final QB readFrom(StreamInput in) throws IOException { + QB queryBuilder = doReadFrom(in); + queryBuilder.boost = in.readFloat(); + queryBuilder.queryName = in.readOptionalString(); + return queryBuilder; + } + + //norelease make this abstract once all builders implement doReadFrom themselves + protected QB doReadFrom(StreamInput in) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + public final void writeTo(StreamOutput out) throws IOException { + doWriteTo(out); + out.writeFloat(boost); + out.writeOptionalString(queryName); + } + + //norelease make this abstract once all builders implement doWriteTo themselves + protected void doWriteTo(StreamOutput out) throws IOException { + throw new UnsupportedOperationException(); } protected final QueryValidationException addValidationError(String validationError, QueryValidationException validationException) { @@ -90,7 +163,9 @@ public abstract class AbstractQueryBuilder extends ToXC } @SuppressWarnings("unchecked") QB other = (QB) obj; - return doEquals(other); + return Objects.equals(queryName, other.queryName) && + Objects.equals(boost, other.boost) && + doEquals(other); } /** @@ -98,7 +173,17 @@ public abstract class AbstractQueryBuilder extends ToXC */ //norelease to be made abstract once all queries are refactored protected boolean doEquals(QB other) { - throw new UnsupportedOperationException(); + return super.equals(other); + } + + @Override + public final int hashCode() { + return 31 * Objects.hash(getClass(), queryName, boost) + doHashCode(); + } + + //norelease to be made abstract once all queries are refactored + protected int doHashCode() { + return super.hashCode(); } /** diff --git a/core/src/main/java/org/elasticsearch/index/query/AndQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/AndQueryBuilder.java index b37bd93de87..68a4799f1ac 100644 --- a/core/src/main/java/org/elasticsearch/index/query/AndQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/AndQueryBuilder.java @@ -44,8 +44,6 @@ public class AndQueryBuilder extends AbstractQueryBuilder { private final ArrayList filters = Lists.newArrayList(); - private String queryName; - static final AndQueryBuilder PROTOTYPE = new AndQueryBuilder(); /** @@ -73,21 +71,6 @@ public class AndQueryBuilder extends AbstractQueryBuilder { return this.filters; } - /** - * Sets the filter name for the filter that can be used when searching for matched_filters per hit. - */ - public AndQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - - /** - * @return the query name. - */ - public String queryName() { - return this.queryName; - } - @Override protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); @@ -96,14 +79,12 @@ public class AndQueryBuilder extends AbstractQueryBuilder { filter.toXContent(builder, params); } builder.endArray(); - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); } @Override - public Query toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException { + protected Query doToQuery(QueryParseContext parseContext) throws IOException { if (filters.isEmpty()) { // no filters provided, this should be ignored upstream return null; @@ -117,9 +98,6 @@ public class AndQueryBuilder extends AbstractQueryBuilder { query.add(innerQuery, Occur.MUST); } } - if (queryName != null) { - parseContext.addNamedQuery(queryName, query); - } return query; } @@ -134,31 +112,28 @@ public class AndQueryBuilder extends AbstractQueryBuilder { } @Override - public int hashCode() { - return Objects.hash(filters, queryName); + protected int doHashCode() { + return Objects.hash(filters); } @Override - public boolean doEquals(AndQueryBuilder other) { - return Objects.equals(filters, other.filters) && - Objects.equals(queryName, other.queryName); + protected boolean doEquals(AndQueryBuilder other) { + return Objects.equals(filters, other.filters); } @Override - public AndQueryBuilder readFrom(StreamInput in) throws IOException { + protected AndQueryBuilder doReadFrom(StreamInput in) throws IOException { AndQueryBuilder andQueryBuilder = new AndQueryBuilder(); List queryBuilders = in.readNamedWriteableList(); for (QueryBuilder queryBuilder : queryBuilders) { andQueryBuilder.add(queryBuilder); } - andQueryBuilder.queryName = in.readOptionalString(); return andQueryBuilder; } @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeNamedWriteableList(filters); - out.writeOptionalString(queryName); } } \ No newline at end of file diff --git a/core/src/main/java/org/elasticsearch/index/query/AndQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/AndQueryParser.java index 2db9ca50a06..bad092c1d11 100644 --- a/core/src/main/java/org/elasticsearch/index/query/AndQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/AndQueryParser.java @@ -27,9 +27,6 @@ import java.util.ArrayList; import static com.google.common.collect.Lists.newArrayList; -/** - * - */ @Deprecated public class AndQueryParser extends BaseQueryParser { @@ -51,6 +48,7 @@ public class AndQueryParser extends BaseQueryParser { String queryName = null; String currentFieldName = null; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; XContentParser.Token token = parser.currentToken(); if (token == XContentParser.Token.START_ARRAY) { while ((token = parser.nextToken()) != XContentParser.Token.END_ARRAY) { @@ -87,6 +85,8 @@ public class AndQueryParser extends BaseQueryParser { } else if (token.isValue()) { if ("_name".equals(currentFieldName)) { queryName = parser.text(); + } else if ("boost".equals(currentFieldName)) { + boost = parser.floatValue(); } else { throw new QueryParsingException(parseContext, "[and] query does not support [" + currentFieldName + "]"); } @@ -103,6 +103,7 @@ public class AndQueryParser extends BaseQueryParser { andQuery.add(query); } andQuery.queryName(queryName); + andQuery.boost(boost); return andQuery; } diff --git a/core/src/main/java/org/elasticsearch/index/query/BaseTermQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/BaseTermQueryBuilder.java index 3d5db49bb61..c178335e9c0 100644 --- a/core/src/main/java/org/elasticsearch/index/query/BaseTermQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/BaseTermQueryBuilder.java @@ -27,7 +27,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; import java.util.Objects; -public abstract class BaseTermQueryBuilder> extends AbstractQueryBuilder implements BoostableQueryBuilder { +public abstract class BaseTermQueryBuilder> extends AbstractQueryBuilder { /** Name of field to match against. */ protected final String fieldName; @@ -35,12 +35,6 @@ public abstract class BaseTermQueryBuilder> /** Value to find matches for. */ protected final Object value; - /** Query boost. */ - protected float boost = 1.0f; - - /** Name of the query. */ - protected String queryName; - /** * Constructs a new base term query. * @@ -128,48 +122,13 @@ public abstract class BaseTermQueryBuilder> return convertToStringIfBytesRef(this.value); } - /** Returns the query name for the query. */ - public String queryName() { - return this.queryName; - } - /** - * Sets the query name for the query. - */ - @SuppressWarnings("unchecked") - public QB queryName(String queryName) { - this.queryName = queryName; - return (QB) this; - } - - /** Returns the boost for this query. */ - public float boost() { - return this.boost; - } - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - @SuppressWarnings("unchecked") - @Override - public QB boost(float boost) { - this.boost = boost; - return (QB) this; - } - @Override protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(getName()); - if (boost == 1.0f && queryName == null) { - builder.field(fieldName, convertToStringIfBytesRef(this.value)); - } else { - builder.startObject(fieldName); - builder.field("value", convertToStringIfBytesRef(this.value)); - builder.field("boost", boost); - if (queryName != null) { - builder.field("_name", queryName); - } - builder.endObject(); - } + builder.startObject(fieldName); + builder.field("value", convertToStringIfBytesRef(this.value)); + printBoostAndQueryName(builder); + builder.endObject(); builder.endObject(); } @@ -187,33 +146,26 @@ public abstract class BaseTermQueryBuilder> } @Override - public int hashCode() { - return Objects.hash(getClass(), fieldName, value, boost, queryName); + protected final int doHashCode() { + return Objects.hash(getClass(), fieldName, value); } @Override - public final boolean doEquals(BaseTermQueryBuilder other) { + protected final boolean doEquals(BaseTermQueryBuilder other) { return Objects.equals(fieldName, other.fieldName) && - Objects.equals(value, other.value) && - Objects.equals(boost, other.boost) && - Objects.equals(queryName, other.queryName); + Objects.equals(value, other.value); } @Override - public QB readFrom(StreamInput in) throws IOException { - QB emptyBuilder = createBuilder(in.readString(), in.readGenericValue()); - emptyBuilder.boost = in.readFloat(); - emptyBuilder.queryName = in.readOptionalString(); - return emptyBuilder; + protected final QB doReadFrom(StreamInput in) throws IOException { + return createBuilder(in.readString(), in.readGenericValue()); } protected abstract QB createBuilder(String fieldName, Object value); @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeString(fieldName); out.writeGenericValue(value); - out.writeFloat(boost); - out.writeOptionalString(queryName); } } diff --git a/core/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java index 397e5a473d2..1f604c23bbe 100644 --- a/core/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/BoolQueryBuilder.java @@ -39,7 +39,7 @@ import static org.elasticsearch.common.lucene.search.Queries.fixNegativeQueryIfN /** * A Query that matches documents matching boolean combinations of other queries. */ -public class BoolQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class BoolQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "bool"; @@ -57,16 +57,12 @@ public class BoolQueryBuilder extends AbstractQueryBuilder imp private final List shouldClauses = new ArrayList<>(); - private float boost = 1.0f; - private boolean disableCoord = DISABLE_COORD_DEFAULT; private boolean adjustPureNegative = ADJUST_PURE_NEGATIVE_DEFAULT; private String minimumShouldMatch; - private String queryName; - /** * Adds a query that must appear in the matching documents and will * contribute to scoring. No null value allowed. @@ -137,23 +133,6 @@ public class BoolQueryBuilder extends AbstractQueryBuilder imp return this.shouldClauses; } - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - @Override - public BoolQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - - /** - * Get the boost for this query. - */ - public float boost() { - return this.boost; - } - /** * Disables Similarity#coord(int,int) in scoring. Defaults to false. */ @@ -237,21 +216,6 @@ public class BoolQueryBuilder extends AbstractQueryBuilder imp return this.adjustPureNegative; } - /** - * Sets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public BoolQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - - /** - * Gets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public String queryName() { - return this.queryName; - } - @Override protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); @@ -259,15 +223,12 @@ public class BoolQueryBuilder extends AbstractQueryBuilder imp doXArrayContent("filter", filterClauses, builder, params); doXArrayContent("must_not", mustNotClauses, builder, params); doXArrayContent("should", shouldClauses, builder, params); - builder.field("boost", boost); builder.field("disable_coord", disableCoord); builder.field("adjust_pure_negative", adjustPureNegative); if (minimumShouldMatch != null) { builder.field("minimum_should_match", minimumShouldMatch); } - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); } @@ -293,7 +254,7 @@ public class BoolQueryBuilder extends AbstractQueryBuilder imp } @Override - public Query toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException { + protected Query doToQuery(QueryParseContext parseContext) throws IOException { if (!hasClauses()) { return new MatchAllDocsQuery(); } @@ -304,13 +265,8 @@ public class BoolQueryBuilder extends AbstractQueryBuilder imp addBooleanClauses(parseContext, booleanQuery, shouldClauses, BooleanClause.Occur.SHOULD); addBooleanClauses(parseContext, booleanQuery, filterClauses, BooleanClause.Occur.FILTER); - booleanQuery.setBoost(boost); Queries.applyMinimumShouldMatch(booleanQuery, minimumShouldMatch); - Query query = adjustPureNegative ? fixNegativeQueryIfNeeded(booleanQuery) : booleanQuery; - if (queryName != null) { - parseContext.addNamedQuery(queryName, query); - } - return query; + return adjustPureNegative ? fixNegativeQueryIfNeeded(booleanQuery) : booleanQuery; } @Override @@ -323,8 +279,7 @@ public class BoolQueryBuilder extends AbstractQueryBuilder imp return validationException; } - private static void addBooleanClauses(QueryParseContext parseContext, BooleanQuery booleanQuery, List clauses, Occur occurs) - throws IOException { + private static void addBooleanClauses(QueryParseContext parseContext, BooleanQuery booleanQuery, List clauses, Occur occurs) throws IOException { for (QueryBuilder query : clauses) { Query luceneQuery = query.toQuery(parseContext); if (luceneQuery != null) { @@ -334,18 +289,16 @@ public class BoolQueryBuilder extends AbstractQueryBuilder imp } @Override - public int hashCode() { - return Objects.hash(boost, adjustPureNegative, disableCoord, - minimumShouldMatch, queryName, mustClauses, shouldClauses, mustNotClauses, filterClauses); + protected int doHashCode() { + return Objects.hash(adjustPureNegative, disableCoord, + minimumShouldMatch, mustClauses, shouldClauses, mustNotClauses, filterClauses); } @Override - public boolean doEquals(BoolQueryBuilder other) { - return Objects.equals(boost, other.boost) && - Objects.equals(adjustPureNegative, other.adjustPureNegative) && + protected boolean doEquals(BoolQueryBuilder other) { + return Objects.equals(adjustPureNegative, other.adjustPureNegative) && Objects.equals(disableCoord, other.disableCoord) && Objects.equals(minimumShouldMatch, other.minimumShouldMatch) && - Objects.equals(queryName, other.queryName) && Objects.equals(mustClauses, other.mustClauses) && Objects.equals(shouldClauses, other.shouldClauses) && Objects.equals(mustNotClauses, other.mustNotClauses) && @@ -353,7 +306,7 @@ public class BoolQueryBuilder extends AbstractQueryBuilder imp } @Override - public BoolQueryBuilder readFrom(StreamInput in) throws IOException { + protected BoolQueryBuilder doReadFrom(StreamInput in) throws IOException { BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); List queryBuilders = in.readNamedWriteableList(); boolQueryBuilder.mustClauses.addAll(queryBuilders); @@ -363,25 +316,21 @@ public class BoolQueryBuilder extends AbstractQueryBuilder imp boolQueryBuilder.shouldClauses.addAll(queryBuilders); queryBuilders = in.readNamedWriteableList(); boolQueryBuilder.filterClauses.addAll(queryBuilders); - boolQueryBuilder.boost = in.readFloat(); boolQueryBuilder.adjustPureNegative = in.readBoolean(); boolQueryBuilder.disableCoord = in.readBoolean(); - boolQueryBuilder.queryName = in.readOptionalString(); boolQueryBuilder.minimumShouldMatch = in.readOptionalString(); return boolQueryBuilder; } @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeNamedWriteableList(mustClauses); out.writeNamedWriteableList(mustNotClauses); out.writeNamedWriteableList(shouldClauses); out.writeNamedWriteableList(filterClauses); - out.writeFloat(boost); out.writeBoolean(adjustPureNegative); out.writeBoolean(disableCoord); - out.writeOptionalString(queryName); out.writeOptionalString(minimumShouldMatch); } } diff --git a/core/src/main/java/org/elasticsearch/index/query/BoolQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/BoolQueryParser.java index bc9985a8b20..5fb0f3c9059 100644 --- a/core/src/main/java/org/elasticsearch/index/query/BoolQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/BoolQueryParser.java @@ -50,7 +50,7 @@ public class BoolQueryParser extends BaseQueryParser { boolean disableCoord = BoolQueryBuilder.DISABLE_COORD_DEFAULT; boolean adjustPureNegative = BoolQueryBuilder.ADJUST_PURE_NEGATIVE_DEFAULT; - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; String minimumShouldMatch = null; final List mustClauses = newArrayList(); diff --git a/core/src/main/java/org/elasticsearch/index/query/BoostableQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/BoostableQueryBuilder.java deleted file mode 100644 index 31572ce54a8..00000000000 --- a/core/src/main/java/org/elasticsearch/index/query/BoostableQueryBuilder.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Licensed to Elasticsearch under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.elasticsearch.index.query; - -/** - * Query builder which allow setting some boost - */ -public interface BoostableQueryBuilder> { - - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - B boost(float boost); - -} diff --git a/core/src/main/java/org/elasticsearch/index/query/BoostingQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/BoostingQueryBuilder.java index 70886f7225b..91d79f590e2 100644 --- a/core/src/main/java/org/elasticsearch/index/query/BoostingQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/BoostingQueryBuilder.java @@ -40,7 +40,7 @@ import java.util.Objects; * multiplied by the supplied "boost" parameter, so this should be less than 1 to achieve a * demoting effect */ -public class BoostingQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class BoostingQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "boosting"; @@ -50,8 +50,6 @@ public class BoostingQueryBuilder extends AbstractQueryBuilder */ -public class CommonTermsQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class CommonTermsQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "common"; @@ -77,8 +77,6 @@ public class CommonTermsQueryBuilder extends AbstractQueryBuilder=1) representing the maximum threshold of @@ -211,20 +194,8 @@ public class CommonTermsQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class ConstantScoreQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "constant_score"; private final QueryBuilder filterBuilder; - private float boost = 1.0f; - static final ConstantScoreQueryBuilder PROTOTYPE = new ConstantScoreQueryBuilder(null); /** @@ -59,33 +57,16 @@ public class ConstantScoreQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class DisMaxQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "dis_max"; private final ArrayList queries = new ArrayList<>(); - private float boost = 1.0f; - /** Default multiplication factor for breaking ties in document scores.*/ public static float DEFAULT_TIE_BREAKER = 0.0f; private float tieBreaker = DEFAULT_TIE_BREAKER; - private String queryName; - static final DisMaxQueryBuilder PROTOTYPE = new DisMaxQueryBuilder(); /** @@ -67,23 +63,6 @@ public class DisMaxQueryBuilder extends AbstractQueryBuilder return this.queries; } - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - @Override - public DisMaxQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - - /** - * @return the boost for this query - */ - public float boost() { - return this.boost; - } - /** * The score of each non-maximum disjunct for a document is multiplied by this weight * and added into the final score. If non-zero, the value should be small, on the order of 0.1, which says that @@ -103,51 +82,28 @@ public class DisMaxQueryBuilder extends AbstractQueryBuilder return this.tieBreaker; } - /** - * Sets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public DisMaxQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - - /** - * @return the query name for the filter that can be used when searching for matched_filters per hit. - */ - public String queryName() { - return this.queryName; - } - @Override protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); builder.field("tie_breaker", tieBreaker); - builder.field("boost", boost); - if (queryName != null) { - builder.field("_name", queryName); - } builder.startArray("queries"); for (QueryBuilder queryBuilder : queries) { queryBuilder.toXContent(builder, params); } builder.endArray(); + printBoostAndQueryName(builder); builder.endObject(); } @Override - public Query toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException { + protected Query doToQuery(QueryParseContext parseContext) throws IOException { // return null if there are no queries at all Collection luceneQueries = toQueries(queries, parseContext); if (luceneQueries.isEmpty()) { return null; } - DisjunctionMaxQuery query = new DisjunctionMaxQuery(luceneQueries, tieBreaker); - query.setBoost(boost); - if (queryName != null) { - parseContext.addNamedQuery(queryName, query); - } - return query; + return new DisjunctionMaxQuery(luceneQueries, tieBreaker); } @Override @@ -156,35 +112,29 @@ public class DisMaxQueryBuilder extends AbstractQueryBuilder } @Override - public DisMaxQueryBuilder readFrom(StreamInput in) throws IOException { + protected DisMaxQueryBuilder doReadFrom(StreamInput in) throws IOException { DisMaxQueryBuilder disMax = new DisMaxQueryBuilder(); List queryBuilders = in.readNamedWriteableList(); disMax.queries.addAll(queryBuilders); disMax.tieBreaker = in.readFloat(); - disMax.queryName = in.readOptionalString(); - disMax.boost = in.readFloat(); return disMax; } @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeNamedWriteableList(queries); out.writeFloat(tieBreaker); - out.writeOptionalString(queryName); - out.writeFloat(boost); } @Override - public int hashCode() { - return Objects.hash(queries, tieBreaker, boost, queryName); + protected int doHashCode() { + return Objects.hash(queries, tieBreaker); } @Override - public boolean doEquals(DisMaxQueryBuilder other) { + protected boolean doEquals(DisMaxQueryBuilder other) { return Objects.equals(queries, other.queries) && - Objects.equals(tieBreaker, other.tieBreaker) && - Objects.equals(boost, other.boost) && - Objects.equals(queryName, other.queryName); + Objects.equals(tieBreaker, other.tieBreaker); } @Override diff --git a/core/src/main/java/org/elasticsearch/index/query/DisMaxQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/DisMaxQueryParser.java index 66cb244edb7..94fd5cbd059 100644 --- a/core/src/main/java/org/elasticsearch/index/query/DisMaxQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/DisMaxQueryParser.java @@ -46,7 +46,7 @@ public class DisMaxQueryParser extends BaseQueryParser { public QueryBuilder fromXContent(QueryParseContext parseContext) throws IOException, QueryParsingException { XContentParser parser = parseContext.parser(); - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; float tieBreaker = DisMaxQueryBuilder.DEFAULT_TIE_BREAKER; final List queries = newArrayList(); diff --git a/core/src/main/java/org/elasticsearch/index/query/ExistsQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/ExistsQueryBuilder.java index 7863fdad3f1..3c2b4157157 100644 --- a/core/src/main/java/org/elasticsearch/index/query/ExistsQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/ExistsQueryBuilder.java @@ -41,8 +41,6 @@ public class ExistsQueryBuilder extends AbstractQueryBuilder private final String name; - private String queryName; - static final ExistsQueryBuilder PROTOTYPE = new ExistsQueryBuilder(null); public ExistsQueryBuilder(String name) { @@ -56,35 +54,17 @@ public class ExistsQueryBuilder extends AbstractQueryBuilder return this.name; } - /** - * Sets the query name for the query that can be used when searching for matched_queries per hit. - */ - public ExistsQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - - /** - * @return the query name for the query that can be used when searching for matched_queries per hit. - */ - public String queryName() { - return this.queryName; - } - @Override protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); builder.field("field", name); - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); } - @Override - public Query toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException { - return newFilter(parseContext, name, queryName); + protected Query doToQuery(QueryParseContext parseContext) throws IOException { + return newFilter(parseContext, name); } @Override @@ -93,7 +73,7 @@ public class ExistsQueryBuilder extends AbstractQueryBuilder return null; } - public static Query newFilter(QueryParseContext parseContext, String fieldPattern, String queryName) { + public static Query newFilter(QueryParseContext parseContext, String fieldPattern) { final FieldNamesFieldMapper.FieldNamesFieldType fieldNamesFieldType = (FieldNamesFieldMapper.FieldNamesFieldType)parseContext.mapperService().fullName(FieldNamesFieldMapper.NAME); if (fieldNamesFieldType == null) { // can only happen when no types exist, so no docs exist either @@ -134,35 +114,27 @@ public class ExistsQueryBuilder extends AbstractQueryBuilder } boolFilter.add(filter, BooleanClause.Occur.SHOULD); } - - if (queryName != null) { - parseContext.addNamedQuery(queryName, boolFilter); - } return new ConstantScoreQuery(boolFilter); } @Override - public int hashCode() { - return Objects.hash(name, queryName); + protected int doHashCode() { + return Objects.hash(name); } @Override - public boolean doEquals(ExistsQueryBuilder other) { - return Objects.equals(name, other.name) && - Objects.equals(queryName, other.queryName); + protected boolean doEquals(ExistsQueryBuilder other) { + return Objects.equals(name, other.name); } @Override - public ExistsQueryBuilder readFrom(StreamInput in) throws IOException { - ExistsQueryBuilder newQuery = new ExistsQueryBuilder(in.readString()); - newQuery.queryName = in.readOptionalString(); - return newQuery; + protected ExistsQueryBuilder doReadFrom(StreamInput in) throws IOException { + return new ExistsQueryBuilder(in.readString()); } @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeString(name); - out.writeOptionalString(queryName); } @Override diff --git a/core/src/main/java/org/elasticsearch/index/query/ExistsQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/ExistsQueryParser.java index 16cb46513a0..12cb7f3fe2f 100644 --- a/core/src/main/java/org/elasticsearch/index/query/ExistsQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/ExistsQueryParser.java @@ -44,6 +44,7 @@ public class ExistsQueryParser extends BaseQueryParser { String fieldPattern = null; String queryName = null; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; XContentParser.Token token; String currentFieldName = null; @@ -55,6 +56,8 @@ public class ExistsQueryParser extends BaseQueryParser { fieldPattern = parser.text(); } else if ("_name".equals(currentFieldName)) { queryName = parser.text(); + } else if ("boost".equals(currentFieldName)) { + boost = parser.floatValue(); } else { throw new QueryParsingException(parseContext, "[exists] query does not support [" + currentFieldName + "]"); } @@ -67,6 +70,7 @@ public class ExistsQueryParser extends BaseQueryParser { ExistsQueryBuilder builder = new ExistsQueryBuilder(fieldPattern); builder.queryName(queryName); + builder.boost(boost); return builder; } diff --git a/core/src/main/java/org/elasticsearch/index/query/FQueryFilterBuilder.java b/core/src/main/java/org/elasticsearch/index/query/FQueryFilterBuilder.java index a5bd11f8dc6..64fffe75447 100644 --- a/core/src/main/java/org/elasticsearch/index/query/FQueryFilterBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/FQueryFilterBuilder.java @@ -41,8 +41,6 @@ public class FQueryFilterBuilder extends AbstractQueryBuilder implements SpanQueryBuilder, BoostableQueryBuilder { +public class FieldMaskingSpanQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder{ public static final String NAME = "field_masking_span"; @@ -37,10 +38,6 @@ public class FieldMaskingSpanQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class FilteredQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "filtered"; @@ -37,10 +37,6 @@ public class FilteredQueryBuilder extends AbstractQueryBuilder { +public class FuzzyQueryBuilder extends MultiTermQueryBuilder { public static final String NAME = "fuzzy"; @@ -35,8 +35,6 @@ public class FuzzyQueryBuilder extends MultiTermQueryBuilder implements Boostabl private final Object value; - private float boost = -1; - private Fuzziness fuzziness; private Integer prefixLength; @@ -48,8 +46,6 @@ public class FuzzyQueryBuilder extends MultiTermQueryBuilder implements Boostabl private String rewrite; - private String queryName; - static final FuzzyQueryBuilder PROTOTYPE = new FuzzyQueryBuilder(null, null); /** @@ -63,16 +59,6 @@ public class FuzzyQueryBuilder extends MultiTermQueryBuilder implements Boostabl this.value = value; } - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - @Override - public FuzzyQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - public FuzzyQueryBuilder fuzziness(Fuzziness fuzziness) { this.fuzziness = fuzziness; return this; @@ -98,22 +84,11 @@ public class FuzzyQueryBuilder extends MultiTermQueryBuilder implements Boostabl return this; } - /** - * Sets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public FuzzyQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - @Override public void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); builder.startObject(name); builder.field("value", value); - if (boost != -1) { - builder.field("boost", boost); - } if (transpositions != null) { builder.field("transpositions", transpositions); } @@ -129,9 +104,7 @@ public class FuzzyQueryBuilder extends MultiTermQueryBuilder implements Boostabl if (rewrite != null) { builder.field("rewrite", rewrite); } - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); builder.endObject(); } diff --git a/core/src/main/java/org/elasticsearch/index/query/FuzzyQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/FuzzyQueryParser.java index e601034e98d..8a2d6bed111 100644 --- a/core/src/main/java/org/elasticsearch/index/query/FuzzyQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/FuzzyQueryParser.java @@ -27,7 +27,6 @@ import org.elasticsearch.common.ParseField; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.unit.Fuzziness; import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.query.support.QueryParsers; @@ -62,7 +61,7 @@ public class FuzzyQueryParser extends BaseQueryParserTemp { String fieldName = parser.currentName(); String value = null; - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; Fuzziness fuzziness = DEFAULT_FUZZINESS; int prefixLength = FuzzyQuery.defaultPrefixLength; int maxExpansions = FuzzyQuery.defaultMaxExpansions; diff --git a/core/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxQueryBuilder.java index 6c0b8227854..e5ca83066cc 100644 --- a/core/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/GeoBoundingBoxQueryBuilder.java @@ -41,7 +41,6 @@ public class GeoBoundingBoxQueryBuilder extends AbstractQueryBuilder shell = Lists.newArrayList(); - private String queryName; - static final GeoPolygonQueryBuilder PROTOTYPE = new GeoPolygonQueryBuilder(null); public GeoPolygonQueryBuilder(String name) { @@ -51,7 +49,7 @@ public class GeoPolygonQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class GeoShapeQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "geo_shape"; @@ -41,8 +41,6 @@ public class GeoShapeQueryBuilder extends AbstractQueryBuilder0) { geohash = GeoUtils.parseGeoPoint(parser).geohash(); @@ -267,7 +274,12 @@ public class GeohashCellQuery { } else { filter = create(parseContext, geoFieldType, geohash, null); } - + if (queryName != null) { + parseContext.addNamedQuery(queryName, filter); + } + if (filter != null) { + filter.setBoost(boost); + } return filter; } diff --git a/core/src/main/java/org/elasticsearch/index/query/HasChildQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/HasChildQueryBuilder.java index 7308957a8f2..8604ac5ffe5 100644 --- a/core/src/main/java/org/elasticsearch/index/query/HasChildQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/HasChildQueryBuilder.java @@ -23,7 +23,7 @@ import org.elasticsearch.index.query.support.QueryInnerHitBuilder; import java.io.IOException; -public class HasChildQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class HasChildQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "has_child"; @@ -31,8 +31,6 @@ public class HasChildQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class HasParentQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "has_parent"; private final QueryBuilder queryBuilder; private final String parentType; private String scoreType; - private float boost = 1.0f; - private String queryName; private QueryInnerHitBuilder innerHit = null; static final HasParentQueryBuilder PROTOTYPE = new HasParentQueryBuilder(null, null); @@ -46,12 +44,6 @@ public class HasParentQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class IdsQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "ids"; @@ -46,10 +46,6 @@ public class IdsQueryBuilder extends AbstractQueryBuilder imple private final String[] types; - private float boost = 1.0f; - - private String queryName; - static final IdsQueryBuilder PROTOTYPE = new IdsQueryBuilder(); /** @@ -103,38 +99,6 @@ public class IdsQueryBuilder extends AbstractQueryBuilder imple return this.ids; } - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - @Override - public IdsQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - - /** - * Gets the boost for this query. - */ - public float boost() { - return this.boost; - } - - /** - * Sets the query name for the query that can be used when searching for matched_filters per hit. - */ - public IdsQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - - /** - * Gets the query name for the query. - */ - public String queryName() { - return this.queryName; - } - @Override protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); @@ -150,10 +114,7 @@ public class IdsQueryBuilder extends AbstractQueryBuilder imple builder.value(value); } builder.endArray(); - builder.field("boost", boost); - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); } @@ -163,7 +124,7 @@ public class IdsQueryBuilder extends AbstractQueryBuilder imple } @Override - public Query toQuery(QueryParseContext parseContext) throws IOException, QueryParsingException { + protected Query doToQuery(QueryParseContext parseContext) throws IOException { Query query; if (this.ids.isEmpty()) { query = Queries.newMatchNoDocsQuery(); @@ -179,10 +140,6 @@ public class IdsQueryBuilder extends AbstractQueryBuilder imple query = new TermsQuery(UidFieldMapper.NAME, Uid.createUidsForTypesAndIds(typesForQuery, ids)); } - query.setBoost(boost); - if (queryName != null) { - parseContext.addNamedQuery(queryName, query); - } return query; } @@ -193,32 +150,26 @@ public class IdsQueryBuilder extends AbstractQueryBuilder imple } @Override - public IdsQueryBuilder readFrom(StreamInput in) throws IOException { + protected IdsQueryBuilder doReadFrom(StreamInput in) throws IOException { IdsQueryBuilder idsQueryBuilder = new IdsQueryBuilder(in.readStringArray()); idsQueryBuilder.addIds(in.readStringArray()); - idsQueryBuilder.queryName = in.readOptionalString(); - idsQueryBuilder.boost = in.readFloat(); return idsQueryBuilder; } @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeStringArray(types); out.writeStringArray(ids.toArray(new String[ids.size()])); - out.writeOptionalString(queryName); - out.writeFloat(boost); } @Override - public int hashCode() { - return Objects.hash(ids, Arrays.hashCode(types), boost, queryName); + protected int doHashCode() { + return Objects.hash(ids, Arrays.hashCode(types)); } @Override - public boolean doEquals(IdsQueryBuilder other) { + protected boolean doEquals(IdsQueryBuilder other) { return Objects.equals(ids, other.ids) && - Arrays.equals(types, other.types) && - Objects.equals(boost, other.boost) && - Objects.equals(queryName, other.queryName); + Arrays.equals(types, other.types); } } diff --git a/core/src/main/java/org/elasticsearch/index/query/IdsQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/IdsQueryParser.java index acaeff0a285..54cb8c5afda 100644 --- a/core/src/main/java/org/elasticsearch/index/query/IdsQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/IdsQueryParser.java @@ -49,7 +49,7 @@ public class IdsQueryParser extends BaseQueryParser { XContentParser parser = parseContext.parser(); List ids = new ArrayList<>(); List types = new ArrayList<>(); - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; String queryName = null; String currentFieldName = null; diff --git a/core/src/main/java/org/elasticsearch/index/query/IndicesQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/IndicesQueryBuilder.java index 264195cc669..55ce9eeb47a 100644 --- a/core/src/main/java/org/elasticsearch/index/query/IndicesQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/IndicesQueryBuilder.java @@ -38,8 +38,6 @@ public class IndicesQueryBuilder extends AbstractQueryBuilder { protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); builder.field("value", limit); + printBoostAndQueryName(builder); builder.endObject(); } @Override - public Query toQuery(QueryParseContext parseContext) { + protected Query doToQuery(QueryParseContext parseContext) throws IOException { // this filter is deprecated and parses to a filter that matches everything return Queries.newMatchAllQuery(); } @@ -62,23 +63,22 @@ public class LimitQueryBuilder extends AbstractQueryBuilder { } @Override - public boolean doEquals(LimitQueryBuilder other) { + protected boolean doEquals(LimitQueryBuilder other) { return Integer.compare(other.limit, limit) == 0; } @Override - public int hashCode() { + protected int doHashCode() { return this.limit; } @Override - public LimitQueryBuilder readFrom(StreamInput in) throws IOException { - LimitQueryBuilder limitQueryBuilder = new LimitQueryBuilder(in.readInt()); - return limitQueryBuilder; + protected LimitQueryBuilder doReadFrom(StreamInput in) throws IOException { + return new LimitQueryBuilder(in.readInt()); } @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeInt(limit); } diff --git a/core/src/main/java/org/elasticsearch/index/query/LimitQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/LimitQueryParser.java index ee492553ac0..3b683829be9 100644 --- a/core/src/main/java/org/elasticsearch/index/query/LimitQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/LimitQueryParser.java @@ -41,6 +41,8 @@ public class LimitQueryParser extends BaseQueryParser { XContentParser parser = parseContext.parser(); int limit = -1; + String queryName = null; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; String currentFieldName = null; XContentParser.Token token; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { @@ -49,6 +51,10 @@ public class LimitQueryParser extends BaseQueryParser { } else if (token.isValue()) { if ("value".equals(currentFieldName)) { limit = parser.intValue(); + } else if ("_name".equals(currentFieldName)) { + queryName = parser.text(); + } else if ("boost".equals(currentFieldName)) { + boost = parser.floatValue(); } else { throw new QueryParsingException(parseContext, "[limit] query does not support [" + currentFieldName + "]"); } @@ -59,7 +65,7 @@ public class LimitQueryParser extends BaseQueryParser { throw new QueryParsingException(parseContext, "No value specified for limit query"); } - return new LimitQueryBuilder(limit); + return new LimitQueryBuilder(limit).boost(boost).queryName(queryName); } @Override diff --git a/core/src/main/java/org/elasticsearch/index/query/MatchAllQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/MatchAllQueryBuilder.java index 819d53c095e..fb33209066c 100644 --- a/core/src/main/java/org/elasticsearch/index/query/MatchAllQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/MatchAllQueryBuilder.java @@ -19,7 +19,6 @@ package org.elasticsearch.index.query; -import org.apache.lucene.search.MatchAllDocsQuery; import org.apache.lucene.search.Query; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; @@ -31,48 +30,22 @@ import java.io.IOException; /** * A query that matches on all documents. */ -public class MatchAllQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class MatchAllQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "match_all"; - private float boost = 1.0f; - static final MatchAllQueryBuilder PROTOTYPE = new MatchAllQueryBuilder(); - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ @Override - public MatchAllQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - - /** - * Gets the boost for this query. - */ - public float boost() { - return this.boost; - } - - @Override - public void doXContent(XContentBuilder builder, Params params) throws IOException { + protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); - if (boost != 1.0f) { - builder.field("boost", boost); - } + printBoostAndQueryName(builder); builder.endObject(); } @Override - public Query toQuery(QueryParseContext parseContext) { - if (this.boost == 1.0f) { - return Queries.newMatchAllQuery(); - } - MatchAllDocsQuery query = new MatchAllDocsQuery(); - query.setBoost(boost); - return query; + protected Query doToQuery(QueryParseContext parseContext) throws IOException { + return Queries.newMatchAllQuery(); } @Override @@ -82,25 +55,23 @@ public class MatchAllQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class MatchQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "match"; @@ -63,8 +63,6 @@ public class MatchQueryBuilder extends AbstractQueryBuilder i private String analyzer; - private Float boost; - private Integer slop; private Fuzziness fuzziness; @@ -87,8 +85,6 @@ public class MatchQueryBuilder extends AbstractQueryBuilder i private Float cutoff_Frequency = null; - private String queryName; - static final MatchQueryBuilder PROTOTYPE = new MatchQueryBuilder(null, null); /** @@ -124,15 +120,6 @@ public class MatchQueryBuilder extends AbstractQueryBuilder i return this; } - /** - * Set the boost to apply to the query. - */ - @Override - public MatchQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - /** * Set the phrase slop if evaluated to a phrase query type. */ @@ -207,14 +194,6 @@ public class MatchQueryBuilder extends AbstractQueryBuilder i return this; } - /** - * Sets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public MatchQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - @Override public void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); @@ -230,9 +209,6 @@ public class MatchQueryBuilder extends AbstractQueryBuilder i if (analyzer != null) { builder.field("analyzer", analyzer); } - if (boost != null) { - builder.field("boost", boost); - } if (slop != null) { builder.field("slop", slop); } @@ -267,11 +243,7 @@ public class MatchQueryBuilder extends AbstractQueryBuilder i if (cutoff_Frequency != null) { builder.field("cutoff_frequency", cutoff_Frequency); } - if (queryName != null) { - builder.field("_name", queryName); - } - - + printBoostAndQueryName(builder); builder.endObject(); builder.endObject(); } diff --git a/core/src/main/java/org/elasticsearch/index/query/MatchQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/MatchQueryParser.java index 1296c4965ca..247a4c979de 100644 --- a/core/src/main/java/org/elasticsearch/index/query/MatchQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/MatchQueryParser.java @@ -67,7 +67,7 @@ public class MatchQueryParser extends BaseQueryParserTemp { String fieldName = parser.currentName(); Object value = null; - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; MatchQuery matchQuery = new MatchQuery(parseContext); String minimumShouldMatch = null; String queryName = null; diff --git a/core/src/main/java/org/elasticsearch/index/query/MissingQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/MissingQueryBuilder.java index 9527f003cc3..1d8cb60c47f 100644 --- a/core/src/main/java/org/elasticsearch/index/query/MissingQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/MissingQueryBuilder.java @@ -32,8 +32,6 @@ public class MissingQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class MoreLikeThisQueryBuilder extends AbstractQueryBuilder { /** * A single get item. Pure delegate to multi get. @@ -147,10 +147,8 @@ public class MoreLikeThisQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class MultiMatchQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "multi_match"; @@ -52,8 +52,6 @@ public class MultiMatchQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class NestedQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "nested"; @@ -35,10 +35,6 @@ public class NestedQueryBuilder extends AbstractQueryBuilder private String scoreMode; - private float boost = 1.0f; - - private String queryName; - private QueryInnerHitBuilder innerHit; static final NestedQueryBuilder PROTOTYPE = new NestedQueryBuilder(); @@ -64,24 +60,6 @@ public class NestedQueryBuilder extends AbstractQueryBuilder return this; } - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - @Override - public NestedQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - - /** - * Sets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public NestedQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - /** * Sets inner hit definition in the scope of this nested query and reusing the defined path and query. */ @@ -99,12 +77,7 @@ public class NestedQueryBuilder extends AbstractQueryBuilder if (scoreMode != null) { builder.field("score_mode", scoreMode); } - if (boost != 1.0f) { - builder.field("boost", boost); - } - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); if (innerHit != null) { builder.startObject("inner_hits"); builder.value(innerHit); diff --git a/core/src/main/java/org/elasticsearch/index/query/NestedQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/NestedQueryParser.java index b7a40caa322..a18815f6ab5 100644 --- a/core/src/main/java/org/elasticsearch/index/query/NestedQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/NestedQueryParser.java @@ -58,7 +58,7 @@ public class NestedQueryParser extends BaseQueryParserTemp { XContentParser parser = parseContext.parser(); final ToBlockJoinQueryBuilder builder = new ToBlockJoinQueryBuilder(parseContext); - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; ScoreMode scoreMode = ScoreMode.Avg; String queryName = null; diff --git a/core/src/main/java/org/elasticsearch/index/query/NotQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/NotQueryBuilder.java index 7c1cfdd2d45..c9b4b9b70cb 100644 --- a/core/src/main/java/org/elasticsearch/index/query/NotQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/NotQueryBuilder.java @@ -37,8 +37,6 @@ public class NotQueryBuilder extends AbstractQueryBuilder { private final QueryBuilder filter; - private String queryName; - static final NotQueryBuilder PROTOTYPE = new NotQueryBuilder(null); public NotQueryBuilder(QueryBuilder filter) { @@ -52,47 +50,24 @@ public class NotQueryBuilder extends AbstractQueryBuilder { return this.filter; } - /** - * Sets the filter name for the filter that can be used when searching for matched_filters per hit. - */ - public NotQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - - /** - * @return the query name. - */ - public String queryName() { - return this.queryName; - } - @Override protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); doXContentInnerBuilder(builder, "query", filter, params); - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); } @Override - public Query toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException { + protected Query doToQuery(QueryParseContext parseContext) throws IOException { if (filter == null) { return null; } - Query luceneQuery = filter.toQuery(parseContext); if (luceneQuery == null) { return null; } - - Query notQuery = Queries.not(luceneQuery); - if (queryName != null) { - parseContext.addNamedQuery(queryName, notQuery); - } - return notQuery; + return Queries.not(luceneQuery); } @Override @@ -101,28 +76,24 @@ public class NotQueryBuilder extends AbstractQueryBuilder { } @Override - public int hashCode() { - return Objects.hash(filter, queryName); + protected int doHashCode() { + return Objects.hash(filter); } @Override - public boolean doEquals(NotQueryBuilder other) { - return Objects.equals(filter, other.filter) && - Objects.equals(queryName, other.queryName); + protected boolean doEquals(NotQueryBuilder other) { + return Objects.equals(filter, other.filter); } @Override - public NotQueryBuilder readFrom(StreamInput in) throws IOException { + protected NotQueryBuilder doReadFrom(StreamInput in) throws IOException { QueryBuilder queryBuilder = in.readNamedWriteable(); - NotQueryBuilder notQueryBuilder = new NotQueryBuilder(queryBuilder); - notQueryBuilder.queryName = in.readOptionalString(); - return notQueryBuilder; + return new NotQueryBuilder(queryBuilder); } @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeNamedWriteable(filter); - out.writeOptionalString(queryName); } @Override diff --git a/core/src/main/java/org/elasticsearch/index/query/NotQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/NotQueryParser.java index adddc4c70b1..a3e93c44e71 100644 --- a/core/src/main/java/org/elasticsearch/index/query/NotQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/NotQueryParser.java @@ -50,6 +50,7 @@ public class NotQueryParser extends BaseQueryParser { String queryName = null; String currentFieldName = null; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; XContentParser.Token token; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { if (token == XContentParser.Token.FIELD_NAME) { @@ -72,6 +73,8 @@ public class NotQueryParser extends BaseQueryParser { } else if (token.isValue()) { if ("_name".equals(currentFieldName)) { queryName = parser.text(); + } else if ("boost".equals(currentFieldName)) { + boost = parser.floatValue(); } else { throw new QueryParsingException(parseContext, "[not] query does not support [" + currentFieldName + "]"); } @@ -84,6 +87,7 @@ public class NotQueryParser extends BaseQueryParser { NotQueryBuilder notQueryBuilder = new NotQueryBuilder(query); notQueryBuilder.queryName(queryName); + notQueryBuilder.boost(boost); return notQueryBuilder; } diff --git a/core/src/main/java/org/elasticsearch/index/query/OrQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/OrQueryBuilder.java index 5cbf71c09cb..049821a5eca 100644 --- a/core/src/main/java/org/elasticsearch/index/query/OrQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/OrQueryBuilder.java @@ -44,8 +44,6 @@ public class OrQueryBuilder extends AbstractQueryBuilder { private final ArrayList filters = Lists.newArrayList(); - private String queryName; - static final OrQueryBuilder PROTOTYPE = new OrQueryBuilder(); public OrQueryBuilder(QueryBuilder... filters) { @@ -70,21 +68,6 @@ public class OrQueryBuilder extends AbstractQueryBuilder { return this.filters; } - /** - * Sets the filter name for the filter that can be used when searching for matched_filters per hit. - */ - public OrQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - - /** - * @return the query name. - */ - public String queryName() { - return this.queryName; - } - @Override protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); @@ -93,14 +76,12 @@ public class OrQueryBuilder extends AbstractQueryBuilder { filter.toXContent(builder, params); } builder.endArray(); - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); } @Override - public Query toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException { + protected Query doToQuery(QueryParseContext parseContext) throws IOException { if (filters.isEmpty()) { // no filters provided, this should be ignored upstream return null; @@ -114,9 +95,6 @@ public class OrQueryBuilder extends AbstractQueryBuilder { query.add(innerQuery, Occur.SHOULD); } } - if (queryName != null) { - parseContext.addNamedQuery(queryName, query); - } return query; } @@ -131,31 +109,28 @@ public class OrQueryBuilder extends AbstractQueryBuilder { } @Override - public int hashCode() { - return Objects.hash(filters, queryName); + protected int doHashCode() { + return Objects.hash(filters); } @Override - public boolean doEquals(OrQueryBuilder other) { - return Objects.equals(filters, other.filters) && - Objects.equals(queryName, other.queryName); + protected boolean doEquals(OrQueryBuilder other) { + return Objects.equals(filters, other.filters); } @Override - public OrQueryBuilder readFrom(StreamInput in) throws IOException { + protected OrQueryBuilder doReadFrom(StreamInput in) throws IOException { OrQueryBuilder orQueryBuilder = new OrQueryBuilder(); List queryBuilders = in.readNamedWriteableList(); for (QueryBuilder queryBuilder : queryBuilders) { orQueryBuilder.add(queryBuilder); } - orQueryBuilder.queryName = in.readOptionalString(); return orQueryBuilder; } @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeNamedWriteableList(filters); - out.writeOptionalString(queryName); } } diff --git a/core/src/main/java/org/elasticsearch/index/query/OrQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/OrQueryParser.java index 71e5d164252..f5b5f95ede1 100644 --- a/core/src/main/java/org/elasticsearch/index/query/OrQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/OrQueryParser.java @@ -46,6 +46,7 @@ public class OrQueryParser extends BaseQueryParser { final ArrayList queries = newArrayList(); boolean queriesFound = false; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; String queryName = null; String currentFieldName = null; XContentParser.Token token = parser.currentToken(); @@ -82,6 +83,8 @@ public class OrQueryParser extends BaseQueryParser { } else if (token.isValue()) { if ("_name".equals(currentFieldName)) { queryName = parser.text(); + } else if ("boost".equals(currentFieldName)) { + boost = parser.floatValue(); } else { throw new QueryParsingException(parseContext, "[or] query does not support [" + currentFieldName + "]"); } @@ -98,6 +101,7 @@ public class OrQueryParser extends BaseQueryParser { orQuery.add(query); } orQuery.queryName(queryName); + orQuery.boost(boost); return orQuery; } 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 faecf030e02..4dbdd4ed6d0 100644 --- a/core/src/main/java/org/elasticsearch/index/query/PrefixQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/PrefixQueryBuilder.java @@ -26,7 +26,7 @@ import java.io.IOException; /** * A Query that matches documents containing terms with a specified prefix. */ -public class PrefixQueryBuilder extends MultiTermQueryBuilder implements BoostableQueryBuilder { +public class PrefixQueryBuilder extends MultiTermQueryBuilder { public static final String NAME = "prefix"; @@ -34,12 +34,8 @@ public class PrefixQueryBuilder extends MultiTermQueryBuilder implements Boostab private final String prefix; - private float boost = -1; - private String rewrite; - private String queryName; - static final PrefixQueryBuilder PROTOTYPE = new PrefixQueryBuilder(null, null); /** @@ -53,48 +49,21 @@ public class PrefixQueryBuilder extends MultiTermQueryBuilder implements Boostab this.prefix = prefix; } - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - @Override - public PrefixQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - public PrefixQueryBuilder rewrite(String rewrite) { this.rewrite = rewrite; return this; } - /** - * Sets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public PrefixQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - @Override public void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); - if (boost == -1 && rewrite == null && queryName == null) { - builder.field(name, prefix); - } else { - builder.startObject(name); - builder.field("prefix", prefix); - if (boost != -1) { - builder.field("boost", boost); - } - if (rewrite != null) { - builder.field("rewrite", rewrite); - } - if (queryName != null) { - builder.field("_name", queryName); - } - builder.endObject(); + builder.startObject(name); + builder.field("prefix", prefix); + if (rewrite != null) { + builder.field("rewrite", rewrite); } + printBoostAndQueryName(builder); + builder.endObject(); builder.endObject(); } diff --git a/core/src/main/java/org/elasticsearch/index/query/PrefixQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/PrefixQueryParser.java index c1328629fe8..07ce2f10edb 100644 --- a/core/src/main/java/org/elasticsearch/index/query/PrefixQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/PrefixQueryParser.java @@ -54,7 +54,7 @@ public class PrefixQueryParser extends BaseQueryParserTemp { String queryName = null; Object value = null; - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; String currentFieldName = null; XContentParser.Token token; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { diff --git a/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java index 33630292d2d..567b3169a5c 100644 --- a/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/QueryBuilder.java @@ -47,7 +47,7 @@ public interface QueryBuilder extends NamedWriteable return this.queryBuilder; } + @Override + public QueryFilterBuilder boost(float boost) { + //no-op: QueryFilterParser doesn't support boost, we should be consistent and ignore it here too. + return this; + } + + @Override + public QueryFilterBuilder queryName(String queryName) { + //no-op: QueryFilterParser doesn't support _name, we should be consistent and ignore it here too. + return this; + } + @Override protected void doXContent(XContentBuilder builder, Params params) throws IOException { doXContentInnerBuilder(builder, NAME, queryBuilder, params); } @Override - public Query toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException { + protected Query doToQuery(QueryParseContext parseContext) throws IOException { // inner query builder can potentially be `null`, in that case we ignore it if (this.queryBuilder == null) { return null; @@ -82,23 +94,23 @@ public class QueryFilterBuilder extends AbstractQueryBuilder } @Override - public int hashCode() { + protected int doHashCode() { return Objects.hash(queryBuilder); } @Override - public boolean doEquals(QueryFilterBuilder other) { + protected boolean doEquals(QueryFilterBuilder other) { return Objects.equals(queryBuilder, other.queryBuilder); } @Override - public QueryFilterBuilder readFrom(StreamInput in) throws IOException { + protected QueryFilterBuilder doReadFrom(StreamInput in) throws IOException { QueryBuilder innerQueryBuilder = in.readNamedWriteable(); return new QueryFilterBuilder(innerQueryBuilder); } @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeNamedWriteable(queryBuilder); } diff --git a/core/src/main/java/org/elasticsearch/index/query/QueryStringQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/QueryStringQueryBuilder.java index 3e1cc4add72..a762b7ce01a 100644 --- a/core/src/main/java/org/elasticsearch/index/query/QueryStringQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/QueryStringQueryBuilder.java @@ -38,7 +38,7 @@ import static com.google.common.collect.Lists.newArrayList; * them either using DisMax or a plain boolean query (see {@link #useDisMax(boolean)}). *

*/ -public class QueryStringQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class QueryStringQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "query_string"; @@ -65,9 +65,6 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder { private Query query; public QueryWrappingQueryBuilder(Query query) { this.query = query; + //hack to make sure that the boost from the wrapped query is used, otherwise it gets overwritten. + if (query != null) { + this.boost = query.getBoost(); + } } @Override @@ -43,8 +47,8 @@ public class QueryWrappingQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class RangeQueryBuilder extends MultiTermQueryBuilder { public static final boolean DEFAULT_INCLUDE_UPPER = true; @@ -58,10 +58,6 @@ public class RangeQueryBuilder extends MultiTermQueryBuilder private boolean includeUpper = DEFAULT_INCLUDE_UPPER; - private float boost = 1.0f; - - private String queryName; - private String format; static final RangeQueryBuilder PROTOTYPE = new RangeQueryBuilder(null); @@ -192,38 +188,6 @@ public class RangeQueryBuilder extends MultiTermQueryBuilder return this.includeUpper; } - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - @Override - public RangeQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - - /** - * Gets the boost factor for the query. - */ - public float boost() { - return this.boost; - } - - /** - * Sets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public RangeQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - - /** - * Gets the query name for the query. - */ - public String queryName() { - return this.queryName; - } - /** * In case of date field, we can adjust the from/to fields using a timezone */ @@ -262,17 +226,14 @@ public class RangeQueryBuilder extends MultiTermQueryBuilder builder.field("to", convertToStringIfBytesRef(this.to)); builder.field("include_lower", includeLower); builder.field("include_upper", includeUpper); - builder.field("boost", boost); if (timeZone != null) { builder.field("time_zone", timeZone); } if (format != null) { builder.field("format", format); } + printBoostAndQueryName(builder); builder.endObject(); - if (queryName != null) { - builder.field("_name", queryName); - } builder.endObject(); } @@ -282,7 +243,7 @@ public class RangeQueryBuilder extends MultiTermQueryBuilder } @Override - public Query toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException { + protected Query doToQuery(QueryParseContext parseContext) throws IOException { Query query = null; MappedFieldType mapper = parseContext.fieldMapper(this.fieldName); if (mapper != null) { @@ -314,11 +275,6 @@ public class RangeQueryBuilder extends MultiTermQueryBuilder if (query == null) { query = new TermRangeQuery(this.fieldName, BytesRefs.toBytesRef(from), BytesRefs.toBytesRef(to), includeLower, includeUpper); } - - query.setBoost(boost); - if (queryName != null) { - parseContext.addNamedQuery(queryName, query); - } return query; } @@ -348,7 +304,7 @@ public class RangeQueryBuilder extends MultiTermQueryBuilder } @Override - public RangeQueryBuilder readFrom(StreamInput in) throws IOException { + protected RangeQueryBuilder doReadFrom(StreamInput in) throws IOException { RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder(in.readString()); rangeQueryBuilder.from = in.readGenericValue(); rangeQueryBuilder.to = in.readGenericValue(); @@ -356,13 +312,11 @@ public class RangeQueryBuilder extends MultiTermQueryBuilder rangeQueryBuilder.includeUpper = in.readBoolean(); rangeQueryBuilder.timeZone = in.readOptionalString(); rangeQueryBuilder.format = in.readOptionalString(); - rangeQueryBuilder.boost = in.readFloat(); - rangeQueryBuilder.queryName = in.readOptionalString(); return rangeQueryBuilder; } @Override - public void writeTo(StreamOutput out) throws IOException { + protected void doWriteTo(StreamOutput out) throws IOException { out.writeString(this.fieldName); out.writeGenericValue(this.from); out.writeGenericValue(this.to); @@ -370,26 +324,21 @@ public class RangeQueryBuilder extends MultiTermQueryBuilder out.writeBoolean(this.includeUpper); out.writeOptionalString(this.timeZone); out.writeOptionalString(this.format); - out.writeFloat(this.boost); - out.writeOptionalString(this.queryName); } @Override - public int hashCode() { - return Objects.hash(fieldName, from, to, timeZone, includeLower, includeUpper, - boost, queryName, format); + protected int doHashCode() { + return Objects.hash(fieldName, from, to, timeZone, includeLower, includeUpper, format); } @Override - public boolean doEquals(RangeQueryBuilder other) { + protected boolean doEquals(RangeQueryBuilder other) { return Objects.equals(fieldName, other.fieldName) && Objects.equals(from, other.from) && Objects.equals(to, other.to) && Objects.equals(timeZone, other.timeZone) && Objects.equals(includeLower, other.includeLower) && Objects.equals(includeUpper, other.includeUpper) && - Objects.equals(boost, other.boost) && - Objects.equals(queryName, other.queryName) && Objects.equals(format, other.format); } } diff --git a/core/src/main/java/org/elasticsearch/index/query/RangeQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/RangeQueryParser.java index b75b1024bea..b1ef6c743d0 100644 --- a/core/src/main/java/org/elasticsearch/index/query/RangeQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/RangeQueryParser.java @@ -51,7 +51,7 @@ public class RangeQueryParser extends BaseQueryParser { boolean includeLower = RangeQueryBuilder.DEFAULT_INCLUDE_LOWER; boolean includeUpper = RangeQueryBuilder.DEFAULT_INCLUDE_UPPER; String timeZone = null; - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; String queryName = null; String format = null; @@ -94,6 +94,8 @@ public class RangeQueryParser extends BaseQueryParser { timeZone = parser.text(); } else if ("format".equals(currentFieldName)) { format = parser.text(); + } else if ("_name".equals(currentFieldName)) { + queryName = parser.text(); } else { throw new QueryParsingException(parseContext, "[range] query does not support [" + currentFieldName + "]"); } 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 f5a3b133356..006beafdd37 100644 --- a/core/src/main/java/org/elasticsearch/index/query/RegexpQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/RegexpQueryBuilder.java @@ -27,16 +27,14 @@ import java.io.IOException; /** * A Query that does fuzzy matching for a specific value. */ -public class RegexpQueryBuilder extends MultiTermQueryBuilder implements BoostableQueryBuilder { +public class RegexpQueryBuilder extends MultiTermQueryBuilder { public static final String NAME = "regexp"; private final String name; private final String regexp; private int flags = -1; - private float boost = -1; private String rewrite; - private String queryName; private int maxDeterminizedStates = Operations.DEFAULT_MAX_DETERMINIZED_STATES; private boolean maxDetermizedStatesSet; static final RegexpQueryBuilder PROTOTYPE = new RegexpQueryBuilder(null, null); @@ -52,16 +50,6 @@ public class RegexpQueryBuilder extends MultiTermQueryBuilder implements Boostab this.regexp = regexp; } - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - @Override - public RegexpQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - public RegexpQueryBuilder flags(RegexpFlag... flags) { int value = 0; if (flags.length == 0) { @@ -89,14 +77,6 @@ public class RegexpQueryBuilder extends MultiTermQueryBuilder implements Boostab return this; } - /** - * Sets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public RegexpQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - @Override public void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); @@ -108,15 +88,10 @@ public class RegexpQueryBuilder extends MultiTermQueryBuilder implements Boostab if (maxDetermizedStatesSet) { builder.field("max_determinized_states", maxDeterminizedStates); } - if (boost != -1) { - builder.field("boost", boost); - } if (rewrite != null) { builder.field("rewrite", rewrite); } - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); builder.endObject(); } diff --git a/core/src/main/java/org/elasticsearch/index/query/RegexpQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/RegexpQueryParser.java index 6ca531b0b7b..5843b59eec3 100644 --- a/core/src/main/java/org/elasticsearch/index/query/RegexpQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/RegexpQueryParser.java @@ -54,7 +54,7 @@ public class RegexpQueryParser extends BaseQueryParserTemp { String rewriteMethod = null; Object value = null; - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; int flagsValue = -1; int maxDeterminizedStates = Operations.DEFAULT_MAX_DETERMINIZED_STATES; String queryName = null; diff --git a/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java index 20e29c281b2..ea2e03e049c 100644 --- a/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/ScriptQueryBuilder.java @@ -33,27 +33,15 @@ public class ScriptQueryBuilder extends AbstractQueryBuilder private Script script; - private String queryName; - public ScriptQueryBuilder(Script script) { this.script = script; } - /** - * Sets the filter name for the filter that can be used when searching for matched_filters per hit. - */ - public ScriptQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - @Override protected void doXContent(XContentBuilder builder, Params builderParams) throws IOException { builder.startObject(NAME); builder.field(ScriptField.SCRIPT.getPreferredName(), script); - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); } diff --git a/core/src/main/java/org/elasticsearch/index/query/ScriptQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/ScriptQueryParser.java index 1f5d86544a6..95cc9934286 100644 --- a/core/src/main/java/org/elasticsearch/index/query/ScriptQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/ScriptQueryParser.java @@ -69,6 +69,7 @@ public class ScriptQueryParser extends BaseQueryParserTemp { Script script = null; Map params = null; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; String queryName = null; String currentFieldName = null; @@ -88,6 +89,8 @@ public class ScriptQueryParser extends BaseQueryParserTemp { } else if (token.isValue()) { if ("_name".equals(currentFieldName)) { queryName = parser.text(); + } else if ("boost".equals(currentFieldName)) { + boost = parser.floatValue(); } else if (!scriptParameterParser.token(currentFieldName, token, parser)) { throw new QueryParsingException(parseContext, "[script] query does not support [" + currentFieldName + "]"); } @@ -114,6 +117,7 @@ public class ScriptQueryParser extends BaseQueryParserTemp { if (queryName != null) { parseContext.addNamedQuery(queryName, query); } + query.setBoost(boost); return query; } 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 f88aecd6d5b..a93a4b78190 100644 --- a/core/src/main/java/org/elasticsearch/index/query/SimpleQueryStringBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/SimpleQueryStringBuilder.java @@ -45,7 +45,7 @@ import java.util.TreeMap; * "https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html" * > online documentation. */ -public class SimpleQueryStringBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class SimpleQueryStringBuilder extends AbstractQueryBuilder { /** Default locale used for parsing.*/ public static final Locale DEFAULT_LOCALE = Locale.ROOT; /** Default for lowercasing parsed terms.*/ @@ -54,18 +54,15 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder fieldsAndWeights = new TreeMap<>(); /** If specified, analyzer to use to parse the query text, defaults to registered default in toQuery. */ private String analyzer; - /** Name of the query. Optional.*/ - private String queryName; /** Default operator to use for linking boolean clauses. Defaults to OR according to docs. */ private Operator defaultOperator = DEFAULT_OPERATOR; /** If result is a boolean query, minimumShouldMatch parameter to apply. Ignored otherwise. */ @@ -96,16 +91,6 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder fields = new HashMap<>(); for (int i = 0; i < size; i++) { @@ -384,28 +344,21 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder entry : fieldsAndWeights.entrySet()) { out.writeString(entry.getKey()); @@ -418,21 +371,19 @@ public class SimpleQueryStringBuilder extends AbstractQueryBuilder implements SpanQueryBuilder, BoostableQueryBuilder { +public class SpanContainingQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder { public static final String NAME = "span_containing"; private SpanQueryBuilder big; private SpanQueryBuilder little; - private float boost = -1; - private String queryName; static final SpanContainingQueryBuilder PROTOTYPE = new SpanContainingQueryBuilder(); /** @@ -52,20 +49,6 @@ public class SpanContainingQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder, BoostableQueryBuilder { +public class SpanFirstQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder{ public static final String NAME = "span_first"; @@ -32,10 +31,6 @@ public class SpanFirstQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder, BoostableQueryBuilder { +public class SpanNearQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder { public static final String NAME = "span_near"; @@ -37,10 +36,6 @@ public class SpanNearQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder, BoostableQueryBuilder { +public class SpanNotQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder { public static final String NAME = "span_not"; @@ -38,10 +37,6 @@ public class SpanNotQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder, BoostableQueryBuilder { +public class SpanOrQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder { public static final String NAME = "span_or"; private ArrayList clauses = new ArrayList<>(); - private float boost = -1; - - private String queryName; - static final SpanOrQueryBuilder PROTOTYPE = new SpanOrQueryBuilder(); public SpanOrQueryBuilder clause(SpanQueryBuilder clause) { @@ -42,20 +37,6 @@ public class SpanOrQueryBuilder extends AbstractQueryBuilder return this; } - @Override - public SpanOrQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - - /** - * Sets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public SpanOrQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - @Override protected void doXContent(XContentBuilder builder, Params params) throws IOException { if (clauses.isEmpty()) { @@ -67,12 +48,7 @@ public class SpanOrQueryBuilder extends AbstractQueryBuilder clause.toXContent(builder, params); } builder.endArray(); - if (boost != -1) { - builder.field("boost", boost); - } - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); } @@ -80,10 +56,4 @@ public class SpanOrQueryBuilder extends AbstractQueryBuilder public String getName() { return NAME; } - - @Override - public SpanQuery toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException { - //norelease just a temporary implementation, will go away once this query is refactored and properly overrides toQuery - return (SpanQuery)super.toQuery(parseContext); - } } diff --git a/core/src/main/java/org/elasticsearch/index/query/SpanOrQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/SpanOrQueryParser.java index 346004bfdf7..11bd821f0cd 100644 --- a/core/src/main/java/org/elasticsearch/index/query/SpanOrQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/SpanOrQueryParser.java @@ -49,7 +49,7 @@ public class SpanOrQueryParser extends BaseQueryParserTemp { public Query parse(QueryParseContext parseContext) throws IOException, QueryParsingException { XContentParser parser = parseContext.parser(); - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; String queryName = null; List clauses = newArrayList(); diff --git a/core/src/main/java/org/elasticsearch/index/query/SpanQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/SpanQueryBuilder.java index 0ee2c65e945..d35dcbc536a 100644 --- a/core/src/main/java/org/elasticsearch/index/query/SpanQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/SpanQueryBuilder.java @@ -19,15 +19,9 @@ package org.elasticsearch.index.query; -import org.apache.lucene.search.spans.SpanQuery; - -import java.io.IOException; - /** - * Interface for a specific type of {@link QueryBuilder} that allows to build span queries + * Marker interface for a specific type of {@link QueryBuilder} that allows to build span queries */ public interface SpanQueryBuilder extends QueryBuilder { - @Override - SpanQuery toQuery(QueryParseContext parseContext) throws QueryParsingException, IOException; } diff --git a/core/src/main/java/org/elasticsearch/index/query/SpanTermQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/SpanTermQueryBuilder.java index 7927d1d459b..54305ec90d9 100644 --- a/core/src/main/java/org/elasticsearch/index/query/SpanTermQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/SpanTermQueryBuilder.java @@ -26,6 +26,8 @@ import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.index.mapper.MappedFieldType; +import java.io.IOException; + /** * A Span Query that matches documents containing a term. * @see SpanTermQuery @@ -66,7 +68,7 @@ public class SpanTermQueryBuilder extends BaseTermQueryBuilder implements SpanQueryBuilder, BoostableQueryBuilder { +public class SpanWithinQueryBuilder extends AbstractQueryBuilder implements SpanQueryBuilder { public static final String NAME = "span_within"; private SpanQueryBuilder big; private SpanQueryBuilder little; - private float boost = -1; - private String queryName; static final SpanWithinQueryBuilder PROTOTYPE = new SpanWithinQueryBuilder(); /** @@ -52,20 +49,6 @@ public class SpanWithinQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class TermQueryBuilder extends BaseTermQueryBuilder { public static final String NAME = "term"; static final TermQueryBuilder PROTOTYPE = new TermQueryBuilder(null, null); @@ -69,7 +71,7 @@ public class TermQueryBuilder extends BaseTermQueryBuilder imp } @Override - public Query toQuery(QueryParseContext parseContext) { + public Query doToQuery(QueryParseContext parseContext) throws IOException { Query query = null; MappedFieldType mapper = parseContext.fieldMapper(this.fieldName); if (mapper != null) { @@ -78,10 +80,6 @@ public class TermQueryBuilder extends BaseTermQueryBuilder imp if (query == null) { query = new TermQuery(new Term(this.fieldName, BytesRefs.toBytesRef(this.value))); } - query.setBoost(this.boost); - if (this.queryName != null) { - parseContext.addNamedQuery(queryName, query); - } return query; } diff --git a/core/src/main/java/org/elasticsearch/index/query/TermQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/TermQueryParser.java index 1cd7ed65ddc..625c78c8037 100644 --- a/core/src/main/java/org/elasticsearch/index/query/TermQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/TermQueryParser.java @@ -45,7 +45,7 @@ public class TermQueryParser extends BaseQueryParser { String queryName = null; String fieldName = null; Object value = null; - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; String currentFieldName = null; XContentParser.Token token; while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) { diff --git a/core/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java index b163bfb27dc..b7d2b61dad9 100644 --- a/core/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/TermsQueryBuilder.java @@ -26,7 +26,7 @@ import java.io.IOException; /** * A filter for a field based on several terms matching on any of them. */ -public class TermsQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class TermsQueryBuilder extends AbstractQueryBuilder { public static final String NAME = "terms"; @@ -36,8 +36,6 @@ public class TermsQueryBuilder extends AbstractQueryBuilder i private final Object values; - private String queryName; - private String execution; private String lookupIndex; @@ -47,8 +45,6 @@ public class TermsQueryBuilder extends AbstractQueryBuilder i private String lookupPath; private Boolean lookupCache; - private float boost = -1; - /** * A filter for a field based on several terms matching on any of them. * @@ -136,14 +132,6 @@ public class TermsQueryBuilder extends AbstractQueryBuilder i return this; } - /** - * Sets the filter name for the filter that can be used when searching for matched_filters per hit. - */ - public TermsQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - /** * Sets the index name to lookup the terms from. */ @@ -186,12 +174,6 @@ public class TermsQueryBuilder extends AbstractQueryBuilder i return this; } - @Override - public TermsQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - @Override public void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); @@ -217,13 +199,7 @@ public class TermsQueryBuilder extends AbstractQueryBuilder i builder.field("execution", execution); } - if (boost != -1) { - builder.field("boost", boost); - } - - if (queryName != null) { - builder.field("_name", queryName); - } + printBoostAndQueryName(builder); builder.endObject(); } diff --git a/core/src/main/java/org/elasticsearch/index/query/TypeQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/TypeQueryBuilder.java index bd5e28319bf..a86b9c7496d 100644 --- a/core/src/main/java/org/elasticsearch/index/query/TypeQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/TypeQueryBuilder.java @@ -37,6 +37,7 @@ public class TypeQueryBuilder extends AbstractQueryBuilder { protected void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); builder.field("value", type); + printBoostAndQueryName(builder); builder.endObject(); } diff --git a/core/src/main/java/org/elasticsearch/index/query/TypeQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/TypeQueryParser.java index 979a712da6e..b81da6266e3 100644 --- a/core/src/main/java/org/elasticsearch/index/query/TypeQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/TypeQueryParser.java @@ -44,22 +44,30 @@ public class TypeQueryParser extends BaseQueryParserTemp { @Override public Query parse(QueryParseContext parseContext) throws IOException, QueryParsingException { XContentParser parser = parseContext.parser(); + String queryName = null; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; + BytesRef type = null; + 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.isValue()) { + if ("_name".equals(currentFieldName)) { + queryName = parser.text(); + } else if ("boost".equals(currentFieldName)) { + boost = parser.floatValue(); + } else if ("value".equals(currentFieldName)) { + type = parser.utf8Bytes(); + } + } else { + throw new QueryParsingException(parseContext, "[type] filter doesn't support [" + currentFieldName + "]"); + } + } - XContentParser.Token token = parser.nextToken(); - if (token != XContentParser.Token.FIELD_NAME) { - throw new QueryParsingException(parseContext, "[type] filter should have a value field, and the type name"); + if (type == null) { + throw new QueryParsingException(parseContext, "[type] filter needs to be provided with a value for the type"); } - String fieldName = parser.currentName(); - if (!fieldName.equals("value")) { - throw new QueryParsingException(parseContext, "[type] filter should have a value field, and the type name"); - } - token = parser.nextToken(); - if (token != XContentParser.Token.VALUE_STRING) { - throw new QueryParsingException(parseContext, "[type] filter should have a value field, and the type name"); - } - BytesRef type = parser.utf8Bytes(); - // move to the next token - parser.nextToken(); Query filter; //LUCENE 4 UPGRADE document mapper should use bytesref as well? @@ -69,6 +77,12 @@ public class TypeQueryParser extends BaseQueryParserTemp { } else { filter = documentMapper.typeFilter(); } + if (queryName != null) { + parseContext.addNamedQuery(queryName, filter); + } + if (filter != null) { + filter.setBoost(boost); + } return filter; } 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 87b2ba02b44..781fdb78d43 100644 --- a/core/src/main/java/org/elasticsearch/index/query/WildcardQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/WildcardQueryBuilder.java @@ -31,7 +31,7 @@ import java.io.IOException; * a Wildcard term should not start with one of the wildcards * or * ?. */ -public class WildcardQueryBuilder extends MultiTermQueryBuilder implements BoostableQueryBuilder { +public class WildcardQueryBuilder extends MultiTermQueryBuilder { public static final String NAME = "wildcard"; @@ -39,12 +39,8 @@ public class WildcardQueryBuilder extends MultiTermQueryBuilder implements Boost private final String wildcard; - private float boost = -1; - private String rewrite; - private String queryName; - static final WildcardQueryBuilder PROTOTYPE = new WildcardQueryBuilder(null, null); /** @@ -68,43 +64,16 @@ public class WildcardQueryBuilder extends MultiTermQueryBuilder implements Boost return this; } - /** - * Sets the boost for this query. Documents matching this query will (in addition to the normal - * weightings) have their score multiplied by the boost provided. - */ - @Override - public WildcardQueryBuilder boost(float boost) { - this.boost = boost; - return this; - } - - /** - * Sets the query name for the filter that can be used when searching for matched_filters per hit. - */ - public WildcardQueryBuilder queryName(String queryName) { - this.queryName = queryName; - return this; - } - @Override public void doXContent(XContentBuilder builder, Params params) throws IOException { builder.startObject(NAME); - if (boost == -1 && rewrite == null && queryName == null) { - builder.field(name, wildcard); - } else { - builder.startObject(name); - builder.field("wildcard", wildcard); - if (boost != -1) { - builder.field("boost", boost); - } - if (rewrite != null) { - builder.field("rewrite", rewrite); - } - if (queryName != null) { - builder.field("_name", queryName); - } - builder.endObject(); + builder.startObject(name); + builder.field("wildcard", wildcard); + if (rewrite != null) { + builder.field("rewrite", rewrite); } + printBoostAndQueryName(builder); + builder.endObject(); builder.endObject(); } diff --git a/core/src/main/java/org/elasticsearch/index/query/WildcardQueryParser.java b/core/src/main/java/org/elasticsearch/index/query/WildcardQueryParser.java index 76cfc24deef..17109860dca 100644 --- a/core/src/main/java/org/elasticsearch/index/query/WildcardQueryParser.java +++ b/core/src/main/java/org/elasticsearch/index/query/WildcardQueryParser.java @@ -25,7 +25,6 @@ import org.apache.lucene.search.WildcardQuery; import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.inject.Inject; import org.elasticsearch.common.xcontent.XContentParser; -import org.elasticsearch.index.mapper.FieldMapper; import org.elasticsearch.index.mapper.MappedFieldType; import org.elasticsearch.index.query.support.QueryParsers; @@ -57,7 +56,7 @@ public class WildcardQueryParser extends BaseQueryParserTemp { String rewriteMethod = null; String value = null; - float boost = 1.0f; + float boost = AbstractQueryBuilder.DEFAULT_BOOST; String queryName = null; token = parser.nextToken(); if (token == XContentParser.Token.START_OBJECT) { diff --git a/core/src/main/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilder.java b/core/src/main/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilder.java index 727d3619615..89deddceffe 100644 --- a/core/src/main/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilder.java +++ b/core/src/main/java/org/elasticsearch/index/query/functionscore/FunctionScoreQueryBuilder.java @@ -21,7 +21,6 @@ package org.elasticsearch.index.query.functionscore; import org.elasticsearch.common.lucene.search.function.CombineFunction; import org.elasticsearch.common.xcontent.XContentBuilder; -import org.elasticsearch.index.query.BoostableQueryBuilder; import org.elasticsearch.index.query.AbstractQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; @@ -32,14 +31,12 @@ import java.util.ArrayList; * A query that uses a filters with a script associated with them to compute the * score. */ -public class FunctionScoreQueryBuilder extends AbstractQueryBuilder implements BoostableQueryBuilder { +public class FunctionScoreQueryBuilder extends AbstractQueryBuilder { private final QueryBuilder queryBuilder; private final QueryBuilder filterBuilder; - private Float boost; - private Float maxBoost; private String scoreMode; @@ -146,17 +143,6 @@ public class FunctionScoreQueryBuilder extends AbstractQueryBuilder filterFunctions = new ArrayList<>(); @@ -119,6 +116,8 @@ public class FunctionScoreQueryParser implements QueryParser { maxBoost = parser.floatValue(); } else if ("boost".equals(currentFieldName)) { boost = parser.floatValue(); + } else if ("_name".equals(currentFieldName)) { + queryName = parser.text(); } else if ("min_score".equals(currentFieldName) || "minScore".equals(currentFieldName)) { minScore = parser.floatValue(); } else if ("functions".equals(currentFieldName)) { @@ -169,6 +168,7 @@ public class FunctionScoreQueryParser implements QueryParser { if (maxBoost == null) { maxBoost = Float.MAX_VALUE; } + Query result; // handle cases where only one score function and no filter was // provided. In this case we create a FunctionScoreQuery. if (filterFunctions.size() == 0 || filterFunctions.size() == 1 && (filterFunctions.get(0).filter == null || Queries.isConstantMatchAllQuery(filterFunctions.get(0).filter))) { @@ -177,9 +177,8 @@ public class FunctionScoreQueryParser implements QueryParser { if (combineFunction != null) { theQuery.setCombineFunction(combineFunction); } - theQuery.setBoost(boost); theQuery.setMaxBoost(maxBoost); - return theQuery; + result = theQuery; // in all other cases we create a FiltersFunctionScoreQuery. } else { FiltersFunctionScoreQuery functionScoreQuery = new FiltersFunctionScoreQuery(query, scoreMode, @@ -187,9 +186,13 @@ public class FunctionScoreQueryParser implements QueryParser { if (combineFunction != null) { functionScoreQuery.setCombineFunction(combineFunction); } - functionScoreQuery.setBoost(boost); - return functionScoreQuery; + result = functionScoreQuery; } + result.setBoost(boost); + if (queryName != null) { + parseContext.addNamedQuery(queryName, query); + } + return result; } private void handleMisplacedFunctionsDeclaration(String errorString, String functionName) { diff --git a/core/src/test/java/org/elasticsearch/aliases/IndexAliasesTests.java b/core/src/test/java/org/elasticsearch/aliases/IndexAliasesTests.java index 63e6771b01a..f6ef9031259 100644 --- a/core/src/test/java/org/elasticsearch/aliases/IndexAliasesTests.java +++ b/core/src/test/java/org/elasticsearch/aliases/IndexAliasesTests.java @@ -139,7 +139,7 @@ public class IndexAliasesTests extends ElasticsearchIntegrationTest { logger.info("--> making sure that filter was stored with alias [alias1] and filter [user:kimchy]"); ClusterState clusterState = admin().cluster().prepareState().get().getState(); IndexMetaData indexMd = clusterState.metaData().index("test"); - assertThat(indexMd.aliases().get("alias1").filter().string(), equalTo("{\"term\":{\"user\":\"kimchy\"}}")); + assertThat(indexMd.aliases().get("alias1").filter().string(), equalTo("{\"term\":{\"user\":{\"value\":\"kimchy\",\"boost\":1.0}}}")); } @@ -520,7 +520,7 @@ public class IndexAliasesTests extends ElasticsearchIntegrationTest { logger.info("--> verify that filter was updated"); AliasMetaData aliasMetaData = internalCluster().clusterService().state().metaData().aliases().get("alias1").get("test"); - assertThat(aliasMetaData.getFilter().toString(), equalTo("{\"term\":{\"name\":\"bar\"}}")); + assertThat(aliasMetaData.getFilter().toString(), equalTo("{\"term\":{\"name\":{\"value\":\"bar\",\"boost\":1.0}}}")); logger.info("--> deleting alias1"); stopWatch.start(); diff --git a/core/src/test/java/org/elasticsearch/index/query/AndQueryBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/AndQueryBuilderTest.java index 6b7605890b4..5ac0d69b270 100644 --- a/core/src/test/java/org/elasticsearch/index/query/AndQueryBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/AndQueryBuilderTest.java @@ -28,13 +28,11 @@ import org.junit.Test; import java.io.IOException; -import static org.hamcrest.Matchers.equalTo; - @SuppressWarnings("deprecation") public class AndQueryBuilderTest extends BaseQueryTestCase { @Override - protected Query createExpectedQuery(AndQueryBuilder queryBuilder, QueryParseContext context) throws QueryParsingException, IOException { + protected Query doCreateExpectedQuery(AndQueryBuilder queryBuilder, QueryParseContext context) throws QueryParsingException, IOException { if (queryBuilder.filters().isEmpty()) { return null; } @@ -52,26 +50,15 @@ public class AndQueryBuilderTest extends BaseQueryTestCase { * @return a AndQueryBuilder with random limit between 0 and 20 */ @Override - protected AndQueryBuilder createTestQueryBuilder() { + protected AndQueryBuilder doCreateTestQueryBuilder() { AndQueryBuilder query = new AndQueryBuilder(); int subQueries = randomIntBetween(1, 5); for (int i = 0; i < subQueries; i++ ) { query.add(RandomQueryBuilder.createQuery(random())); } - if (randomBoolean()) { - query.queryName(randomAsciiOfLengthBetween(1, 10)); - } return query; } - @Override - protected void assertLuceneQuery(AndQueryBuilder queryBuilder, Query query, QueryParseContext context) { - if (queryBuilder.queryName() != null) { - Query namedQuery = context.copyNamedFilters().get(queryBuilder.queryName()); - assertThat(namedQuery, equalTo(query)); - } - } - /** * test corner case where no inner queries exist */ diff --git a/core/src/test/java/org/elasticsearch/index/query/BaseQueryTestCase.java b/core/src/test/java/org/elasticsearch/index/query/BaseQueryTestCase.java index f6d7f6a9df7..b7647ea2f58 100644 --- a/core/src/test/java/org/elasticsearch/index/query/BaseQueryTestCase.java +++ b/core/src/test/java/org/elasticsearch/index/query/BaseQueryTestCase.java @@ -65,7 +65,7 @@ import java.io.IOException; import static org.hamcrest.Matchers.*; @Ignore -public abstract class BaseQueryTestCase> extends ElasticsearchTestCase { +public abstract class BaseQueryTestCase> extends ElasticsearchTestCase { protected static final String OBJECT_FIELD_NAME = "mapped_object"; protected static final String DATE_FIELD_NAME = "mapped_date"; @@ -187,10 +187,21 @@ public abstract class BaseQueryTestCase> extends Ela SearchContext.removeCurrent(); } + protected final QB createTestQueryBuilder() { + QB query = doCreateTestQueryBuilder(); + if (randomBoolean()) { + query.boost(2.0f / randomIntBetween(1, 20)); + } + if (randomBoolean()) { + query.queryName(randomAsciiOfLengthBetween(1, 10)); + } + return query; + } + /** * Create the query that is being tested */ - protected abstract QB createTestQueryBuilder(); + protected abstract QB doCreateTestQueryBuilder(); /** * Generic test that creates new query from the test query and checks both for equality @@ -207,8 +218,8 @@ public abstract class BaseQueryTestCase> extends Ela QueryBuilder newQuery = queryParserService.queryParser(testQuery.getName()).fromXContent(context); assertNotSame(newQuery, testQuery); - assertEquals("Queries should be equal: " + newQuery + " vs. " + testQuery, newQuery, testQuery); - assertEquals("Queries should have equal hashcodes: " + newQuery + " vs. " + testQuery, newQuery.hashCode(), testQuery.hashCode()); + assertEquals("Queries should be equal", testQuery, newQuery); + assertEquals("Queries should have equal hashcodes", testQuery.hashCode(), newQuery.hashCode()); } /** @@ -228,18 +239,27 @@ public abstract class BaseQueryTestCase> extends Ela assertLuceneQuery(testQuery, actualQuery, context); } + protected final Query createExpectedQuery(QB queryBuilder, QueryParseContext context) throws IOException { + Query expectedQuery = doCreateExpectedQuery(queryBuilder, context); + expectedQuery.setBoost(queryBuilder.boost()); + return expectedQuery; + } + /** * Creates the expected lucene query given the current {@link QueryBuilder} and {@link QueryParseContext}. * The returned query will be compared with the result of {@link QueryBuilder#toQuery(QueryParseContext)} to test its behaviour. */ - protected abstract Query createExpectedQuery(QB queryBuilder, QueryParseContext context) throws IOException; + protected abstract Query doCreateExpectedQuery(QB queryBuilder, QueryParseContext context) throws IOException; /** * Run after default equality comparison between lucene expected query and result of {@link QueryBuilder#toQuery(QueryParseContext)}. - * Can contain additional assertions that are query specific. Empty default implementation. + * Can contain additional assertions that are query specific. Default implementation verifies that names queries are properly handled. */ - protected void assertLuceneQuery(QB queryBuilder, Query query, QueryParseContext context) { - + protected final void assertLuceneQuery(QB queryBuilder, Query query, QueryParseContext context) { + if (queryBuilder.queryName() != null) { + Query namedQuery = context.copyNamedFilters().get(queryBuilder.queryName()); + assertThat(namedQuery, equalTo(query)); + } } /** diff --git a/core/src/test/java/org/elasticsearch/index/query/BaseTermQueryTestCase.java b/core/src/test/java/org/elasticsearch/index/query/BaseTermQueryTestCase.java index 92046a55691..d8df0aba19f 100644 --- a/core/src/test/java/org/elasticsearch/index/query/BaseTermQueryTestCase.java +++ b/core/src/test/java/org/elasticsearch/index/query/BaseTermQueryTestCase.java @@ -27,13 +27,12 @@ import org.elasticsearch.index.mapper.MappedFieldType; import org.junit.Ignore; import org.junit.Test; -import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; @Ignore public abstract class BaseTermQueryTestCase> extends BaseQueryTestCase { - protected final QB createTestQueryBuilder() { + protected final QB doCreateTestQueryBuilder() { String fieldName = null; Object value; switch (randomIntBetween(0, 3)) { @@ -73,14 +72,7 @@ public abstract class BaseTermQueryTestCase> if (fieldName == null) { fieldName = randomAsciiOfLengthBetween(1, 10); } - QB query = createQueryBuilder(fieldName, value); - if (randomBoolean()) { - query.boost(2.0f / randomIntBetween(1, 20)); - } - if (randomBoolean()) { - query.queryName(randomAsciiOfLengthBetween(1, 10)); - } - return query; + return createQueryBuilder(fieldName, value); } protected abstract QB createQueryBuilder(String fieldName, Object value); @@ -105,7 +97,7 @@ public abstract class BaseTermQueryTestCase> } @Override - protected Query createExpectedQuery(QB queryBuilder, QueryParseContext context) { + protected Query doCreateExpectedQuery(QB queryBuilder, QueryParseContext context) { BytesRef value = null; if (getCurrentTypes().length > 0) { if (queryBuilder.fieldName().equals(BOOLEAN_FIELD_NAME) || queryBuilder.fieldName().equals(INT_FIELD_NAME) || queryBuilder.fieldName().equals(DOUBLE_FIELD_NAME)) { @@ -116,18 +108,8 @@ public abstract class BaseTermQueryTestCase> if (value == null) { value = BytesRefs.toBytesRef(queryBuilder.value); } - Query termQuery = createLuceneTermQuery(new Term(queryBuilder.fieldName(), value)); - termQuery.setBoost(queryBuilder.boost()); - return termQuery; + return createLuceneTermQuery(new Term(queryBuilder.fieldName(), value)); } protected abstract Query createLuceneTermQuery(Term term); - - @Override - protected void assertLuceneQuery(QB queryBuilder, Query query, QueryParseContext context) { - if (queryBuilder.queryName() != null) { - Query namedQuery = context.copyNamedFilters().get(queryBuilder.queryName()); - assertThat(namedQuery, equalTo(query)); - } - } } diff --git a/core/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTest.java index 51f71bbee97..bc379157736 100644 --- a/core/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/BoolQueryBuilderTest.java @@ -31,28 +31,12 @@ import java.io.IOException; import java.util.List; import static org.elasticsearch.common.lucene.search.Queries.fixNegativeQueryIfNeeded; -import static org.hamcrest.Matchers.equalTo; public class BoolQueryBuilderTest extends BaseQueryTestCase { @Override - protected void assertLuceneQuery(BoolQueryBuilder queryBuilder, Query query, QueryParseContext context) { - if (queryBuilder.queryName() != null) { - Query namedQuery = context.copyNamedFilters().get(queryBuilder.queryName()); - if (queryBuilder.hasClauses()) { - assertThat(namedQuery, equalTo(query)); - } else { - assertNull(namedQuery); - } - } - } - - @Override - protected BoolQueryBuilder createTestQueryBuilder() { + protected BoolQueryBuilder doCreateTestQueryBuilder() { BoolQueryBuilder query = new BoolQueryBuilder(); - if (randomBoolean()) { - query.boost(2.0f / randomIntBetween(1, 20)); - } if (randomBoolean()) { query.adjustPureNegative(randomBoolean()); } @@ -78,14 +62,11 @@ public class BoolQueryBuilderTest extends BaseQueryTestCase { for (int i = 0; i < filterClauses; i++) { query.filter(RandomQueryBuilder.createQuery(random())); } - if (randomBoolean()) { - query.queryName(randomUnicodeOfLengthBetween(3, 15)); - } return query; } @Override - protected Query createExpectedQuery(BoolQueryBuilder queryBuilder, QueryParseContext context) throws IOException { + protected Query doCreateExpectedQuery(BoolQueryBuilder queryBuilder, QueryParseContext context) throws IOException { if (!queryBuilder.hasClauses()) { return new MatchAllDocsQuery(); } @@ -98,8 +79,7 @@ public class BoolQueryBuilderTest extends BaseQueryTestCase { addBooleanClauses(context, boolQuery, queryBuilder.filter(), BooleanClause.Occur.FILTER); Queries.applyMinimumShouldMatch(boolQuery, queryBuilder.minimumNumberShouldMatch()); - Query returnedQuery = queryBuilder.adjustPureNegative() ? fixNegativeQueryIfNeeded(boolQuery) : boolQuery; - return returnedQuery; + return queryBuilder.adjustPureNegative() ? fixNegativeQueryIfNeeded(boolQuery) : boolQuery; } private static void addBooleanClauses(QueryParseContext parseContext, BooleanQuery booleanQuery, List clauses, Occur occurs) diff --git a/core/src/test/java/org/elasticsearch/index/query/BoostingQueryBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/BoostingQueryBuilderTest.java index 017cfde8505..1db0f7305c8 100644 --- a/core/src/test/java/org/elasticsearch/index/query/BoostingQueryBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/BoostingQueryBuilderTest.java @@ -31,26 +31,19 @@ import java.io.IOException; public class BoostingQueryBuilderTest extends BaseQueryTestCase { @Override - protected BoostingQueryBuilder createTestQueryBuilder() { + protected BoostingQueryBuilder doCreateTestQueryBuilder() { BoostingQueryBuilder query = new BoostingQueryBuilder(); query.positive(RandomQueryBuilder.createQuery(random())); query.negative(RandomQueryBuilder.createQuery(random())); query.negativeBoost(2.0f / randomIntBetween(1, 20)); - if (randomBoolean()) { - query.boost(2.0f / randomIntBetween(1, 20)); - } return query; } @Override - protected Query createExpectedQuery(BoostingQueryBuilder queryBuilder, QueryParseContext context) throws IOException { + protected Query doCreateExpectedQuery(BoostingQueryBuilder queryBuilder, QueryParseContext context) throws IOException { Query positive = queryBuilder.positive().toQuery(context); Query negative = queryBuilder.negative().toQuery(context); - BoostingQuery boostingQuery = new BoostingQuery(positive, negative, queryBuilder.negativeBoost()); - if (queryBuilder.boost() != 1.0f) { - boostingQuery.setBoost(queryBuilder.boost()); - } - return boostingQuery; + return new BoostingQuery(positive, negative, queryBuilder.negativeBoost()); } /** @@ -92,7 +85,7 @@ public class BoostingQueryBuilderTest extends BaseQueryTestCase() { + QueryBuilder noOpBuilder = new AbstractQueryBuilder() { @Override public String getName() { @@ -104,7 +97,7 @@ public class BoostingQueryBuilderTest extends BaseQueryTestCase { @Override - protected CommonTermsQueryBuilder createTestQueryBuilder() { + protected CommonTermsQueryBuilder doCreateTestQueryBuilder() { CommonTermsQueryBuilder query; // mapped or unmapped field @@ -74,19 +73,11 @@ public class CommonTermsQueryBuilderTest extends BaseQueryTestCase { @Override - protected Query createExpectedQuery(ConstantScoreQueryBuilder testBuilder, QueryParseContext context) throws QueryParsingException, IOException { - Query expectedQuery = new ConstantScoreQuery(testBuilder.query().toQuery(context)); - expectedQuery.setBoost(testBuilder.boost()); - return expectedQuery; + protected Query doCreateExpectedQuery(ConstantScoreQueryBuilder testBuilder, QueryParseContext context) throws QueryParsingException, IOException { + return new ConstantScoreQuery(testBuilder.query().toQuery(context)); } /** * @return a {@link ConstantScoreQueryBuilder} with random boost between 0.1f and 2.0f */ @Override - protected ConstantScoreQueryBuilder createTestQueryBuilder() { - ConstantScoreQueryBuilder query = new ConstantScoreQueryBuilder(RandomQueryBuilder.createQuery(random())); - if (randomBoolean()) { - query.boost(2.0f / randomIntBetween(1, 20)); - } - return query; + protected ConstantScoreQueryBuilder doCreateTestQueryBuilder() { + return new ConstantScoreQueryBuilder(RandomQueryBuilder.createQuery(random())); } /** diff --git a/core/src/test/java/org/elasticsearch/index/query/DisMaxQueryBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/DisMaxQueryBuilderTest.java index f4ad98c04d5..87e081f48c6 100644 --- a/core/src/test/java/org/elasticsearch/index/query/DisMaxQueryBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/DisMaxQueryBuilderTest.java @@ -30,34 +30,23 @@ import java.io.IOException; public class DisMaxQueryBuilderTest extends BaseQueryTestCase { @Override - protected Query createExpectedQuery(DisMaxQueryBuilder testBuilder, QueryParseContext context) throws QueryParsingException, IOException { - Query query = new DisjunctionMaxQuery(AbstractQueryBuilder.toQueries(testBuilder.queries(), context), testBuilder.tieBreaker()); - query.setBoost(testBuilder.boost()); - if (testBuilder.queryName() != null) { - context.addNamedQuery(testBuilder.queryName(), query); - } - return query; + protected Query doCreateExpectedQuery(DisMaxQueryBuilder testBuilder, QueryParseContext context) throws QueryParsingException, IOException { + return new DisjunctionMaxQuery(AbstractQueryBuilder.toQueries(testBuilder.queries(), context), testBuilder.tieBreaker()); } /** * @return a {@link DisMaxQueryBuilder} with random inner queries */ @Override - protected DisMaxQueryBuilder createTestQueryBuilder() { + protected DisMaxQueryBuilder doCreateTestQueryBuilder() { DisMaxQueryBuilder dismax = new DisMaxQueryBuilder(); int clauses = randomIntBetween(1, 5); for (int i = 0; i < clauses; i++) { dismax.add(RandomQueryBuilder.createQuery(random())); } - if (randomBoolean()) { - dismax.boost(2.0f / randomIntBetween(1, 20)); - } if (randomBoolean()) { dismax.tieBreaker(2.0f / randomIntBetween(1, 20)); } - if (randomBoolean()) { - dismax.queryName(randomUnicodeOfLengthBetween(3, 15)); - } return dismax; } diff --git a/core/src/test/java/org/elasticsearch/index/query/ExistsQueryBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/ExistsQueryBuilderTest.java index 47924432e33..4863cdfff46 100644 --- a/core/src/test/java/org/elasticsearch/index/query/ExistsQueryBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/ExistsQueryBuilderTest.java @@ -19,11 +19,7 @@ package org.elasticsearch.index.query; -import org.apache.lucene.search.BooleanClause; -import org.apache.lucene.search.BooleanQuery; -import org.apache.lucene.search.ConstantScoreQuery; -import org.apache.lucene.search.Query; -import org.apache.lucene.search.TermRangeQuery; +import org.apache.lucene.search.*; import org.elasticsearch.cluster.metadata.MetaData; import org.elasticsearch.common.lucene.search.Queries; import org.elasticsearch.index.mapper.MappedFieldType; @@ -32,8 +28,6 @@ import org.elasticsearch.index.mapper.internal.FieldNamesFieldMapper; import java.io.IOException; import java.util.Collection; -import static org.hamcrest.Matchers.equalTo; - public class ExistsQueryBuilderTest extends BaseQueryTestCase { private static Collection getFieldNamePattern(String fieldName, QueryParseContext context) { @@ -47,7 +41,7 @@ public class ExistsQueryBuilderTest extends BaseQueryTestCase fields = getFieldNamePattern(queryBuilder.name(), context); @@ -57,7 +51,7 @@ public class ExistsQueryBuilderTest extends BaseQueryTestCase fields = getFieldNamePattern(queryBuilder.name(), context); - final FieldNamesFieldMapper.FieldNamesFieldType fieldNamesFieldType = (FieldNamesFieldMapper.FieldNamesFieldType) - context.mapperService().fullName(FieldNamesFieldMapper.NAME); - - if (fieldNamesFieldType == null || fields.isEmpty()) { - assertNull(namedQuery); - } else { - query = ((ConstantScoreQuery) query).getQuery(); - assertThat(namedQuery, equalTo(query)); - } - } - } - - @Override - protected ExistsQueryBuilder createTestQueryBuilder() { + protected ExistsQueryBuilder doCreateTestQueryBuilder() { String fieldPattern; if (randomBoolean()) { fieldPattern = randomFrom(mappedFieldNames); @@ -104,11 +81,6 @@ public class ExistsQueryBuilderTest extends BaseQueryTestCase { @Override - protected Query createExpectedQuery(FQueryFilterBuilder queryBuilder, QueryParseContext context) throws QueryParsingException, IOException { + protected Query doCreateExpectedQuery(FQueryFilterBuilder queryBuilder, QueryParseContext context) throws QueryParsingException, IOException { return new ConstantScoreQuery(queryBuilder.innerQuery().toQuery(context)); } @@ -41,17 +39,9 @@ public class FQueryFilterBuilderTest extends BaseQueryTestCase { @Override - protected Query createExpectedQuery(FieldMaskingSpanQueryBuilder testQueryBuilder, QueryParseContext context) throws IOException { + protected Query doCreateExpectedQuery(FieldMaskingSpanQueryBuilder testQueryBuilder, QueryParseContext context) throws IOException { String fieldInQuery = testQueryBuilder.fieldName(); MappedFieldType fieldType = context.fieldMapper(fieldInQuery); if (fieldType != null) { fieldInQuery = fieldType.names().indexName(); } - SpanQuery innerQuery = testQueryBuilder.innerQuery().toQuery(context); + SpanQuery innerQuery = (SpanQuery) testQueryBuilder.innerQuery().toQuery(context); - Query expectedQuery = new FieldMaskingSpanQuery(innerQuery, fieldInQuery); - expectedQuery.setBoost(testQueryBuilder.boost()); - if (testQueryBuilder.queryName() != null) { - context.addNamedQuery(testQueryBuilder.queryName(), expectedQuery); - } - return expectedQuery; + return new FieldMaskingSpanQuery(innerQuery, fieldInQuery); } @Override - protected void assertLuceneQuery(FieldMaskingSpanQueryBuilder queryBuilder, Query query, QueryParseContext context) { - if (queryBuilder.queryName() != null) { - Query namedQuery = context.copyNamedFilters().get(queryBuilder.queryName()); - assertThat(namedQuery, equalTo(query)); - } - } - - @Override - protected FieldMaskingSpanQueryBuilder createTestQueryBuilder() { + protected FieldMaskingSpanQueryBuilder doCreateTestQueryBuilder() { String fieldName; if (randomBoolean()) { fieldName = randomFrom(mappedFieldNames); @@ -65,14 +50,7 @@ public class FieldMaskingSpanQueryBuilderTest extends BaseQueryTestCase { /** @@ -53,7 +51,7 @@ public class IdsQueryBuilderTest extends BaseQueryTestCase { } @Override - protected Query createExpectedQuery(IdsQueryBuilder queryBuilder, QueryParseContext context) throws IOException { + protected Query doCreateExpectedQuery(IdsQueryBuilder queryBuilder, QueryParseContext context) throws IOException { Query expectedQuery; if (queryBuilder.ids().size() == 0) { expectedQuery = Queries.newMatchNoDocsQuery(); @@ -69,20 +67,11 @@ public class IdsQueryBuilderTest extends BaseQueryTestCase { } expectedQuery = new TermsQuery(UidFieldMapper.NAME, Uid.createUidsForTypesAndIds(Sets.newHashSet(typesForQuery), queryBuilder.ids())); } - expectedQuery.setBoost(queryBuilder.boost()); return expectedQuery; } @Override - protected void assertLuceneQuery(IdsQueryBuilder queryBuilder, Query query, QueryParseContext context) { - if (queryBuilder.queryName() != null) { - Query namedQuery = context.copyNamedFilters().get(queryBuilder.queryName()); - assertThat(namedQuery, equalTo(query)); - } - } - - @Override - protected IdsQueryBuilder createTestQueryBuilder() { + protected IdsQueryBuilder doCreateTestQueryBuilder() { String[] types; if (getCurrentTypes().length > 0 && randomBoolean()) { int numberOfTypes = randomIntBetween(1, getCurrentTypes().length); @@ -114,12 +103,6 @@ public class IdsQueryBuilderTest extends BaseQueryTestCase { query = new IdsQueryBuilder(); query.addIds(ids); } - if (randomBoolean()) { - query.boost(2.0f / randomIntBetween(1, 20)); - } - if (randomBoolean()) { - query.queryName(randomAsciiOfLengthBetween(1, 10)); - } return query; } } diff --git a/core/src/test/java/org/elasticsearch/index/query/LimitQueryBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/LimitQueryBuilderTest.java index 99255ec1cb7..06adde306e3 100644 --- a/core/src/test/java/org/elasticsearch/index/query/LimitQueryBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/LimitQueryBuilderTest.java @@ -25,7 +25,7 @@ import org.elasticsearch.common.lucene.search.Queries; public class LimitQueryBuilderTest extends BaseQueryTestCase { @Override - protected Query createExpectedQuery(LimitQueryBuilder queryBuilder, QueryParseContext context) { + protected Query doCreateExpectedQuery(LimitQueryBuilder queryBuilder, QueryParseContext context) { // this filter is deprecated and parses to a filter that matches everything return Queries.newMatchAllQuery(); } @@ -34,9 +34,7 @@ public class LimitQueryBuilderTest extends BaseQueryTestCase * @return a LimitQueryBuilder with random limit between 0 and 20 */ @Override - protected LimitQueryBuilder createTestQueryBuilder() { - LimitQueryBuilder query = new LimitQueryBuilder(randomIntBetween(0, 20)); - return query; + protected LimitQueryBuilder doCreateTestQueryBuilder() { + return new LimitQueryBuilder(randomIntBetween(0, 20)); } - } diff --git a/core/src/test/java/org/elasticsearch/index/query/MatchAllQueryBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/MatchAllQueryBuilderTest.java index de3734001d8..d05ec6cbc94 100644 --- a/core/src/test/java/org/elasticsearch/index/query/MatchAllQueryBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/MatchAllQueryBuilderTest.java @@ -25,22 +25,13 @@ import org.apache.lucene.search.Query; public class MatchAllQueryBuilderTest extends BaseQueryTestCase { @Override - protected Query createExpectedQuery(MatchAllQueryBuilder queryBuilder, QueryParseContext context) { - MatchAllDocsQuery matchAllDocsQuery = new MatchAllDocsQuery(); - matchAllDocsQuery.setBoost(queryBuilder.boost()); - return matchAllDocsQuery; + protected Query doCreateExpectedQuery(MatchAllQueryBuilder queryBuilder, QueryParseContext context) { + return new MatchAllDocsQuery(); } - /** - * @return a MatchAllQuery with random boost between 0.1f and 2.0f - */ @Override - protected MatchAllQueryBuilder createTestQueryBuilder() { - MatchAllQueryBuilder query = new MatchAllQueryBuilder(); - if (randomBoolean()) { - query.boost(2.0f / randomIntBetween(1, 20)); - } - return query; + protected MatchAllQueryBuilder doCreateTestQueryBuilder() { + return new MatchAllQueryBuilder(); } } \ No newline at end of file diff --git a/core/src/test/java/org/elasticsearch/index/query/NotQueryBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/NotQueryBuilderTest.java index 09a37f7f4e1..742216ebc13 100644 --- a/core/src/test/java/org/elasticsearch/index/query/NotQueryBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/NotQueryBuilderTest.java @@ -27,12 +27,10 @@ import org.junit.Test; import java.io.IOException; -import static org.hamcrest.Matchers.equalTo; - public class NotQueryBuilderTest extends BaseQueryTestCase { @Override - protected Query createExpectedQuery(NotQueryBuilder queryBuilder, QueryParseContext context) throws QueryParsingException, IOException { + protected Query doCreateExpectedQuery(NotQueryBuilder queryBuilder, QueryParseContext context) throws QueryParsingException, IOException { if (queryBuilder.filter() == null) { return null; } @@ -43,20 +41,8 @@ public class NotQueryBuilderTest extends BaseQueryTestCase { * @return a NotQueryBuilder with random limit between 0 and 20 */ @Override - protected NotQueryBuilder createTestQueryBuilder() { - NotQueryBuilder query = new NotQueryBuilder(RandomQueryBuilder.createQuery(random())); - if (randomBoolean()) { - query.queryName(randomAsciiOfLengthBetween(1, 10)); - } - return query; - } - - @Override - protected void assertLuceneQuery(NotQueryBuilder queryBuilder, Query query, QueryParseContext context) { - if (queryBuilder.queryName() != null) { - Query namedQuery = context.copyNamedFilters().get(queryBuilder.queryName()); - assertThat(namedQuery, equalTo(query)); - } + protected NotQueryBuilder doCreateTestQueryBuilder() { + return new NotQueryBuilder(RandomQueryBuilder.createQuery(random())); } /** diff --git a/core/src/test/java/org/elasticsearch/index/query/OrQueryBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/OrQueryBuilderTest.java index 78feca5b37b..e9222576d8c 100644 --- a/core/src/test/java/org/elasticsearch/index/query/OrQueryBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/OrQueryBuilderTest.java @@ -28,13 +28,11 @@ import org.junit.Test; import java.io.IOException; -import static org.hamcrest.Matchers.equalTo; - @SuppressWarnings("deprecation") public class OrQueryBuilderTest extends BaseQueryTestCase { @Override - protected Query createExpectedQuery(OrQueryBuilder queryBuilder, QueryParseContext context) throws QueryParsingException, IOException { + protected Query doCreateExpectedQuery(OrQueryBuilder queryBuilder, QueryParseContext context) throws QueryParsingException, IOException { if (queryBuilder.filters().isEmpty()) { return null; } @@ -53,26 +51,15 @@ public class OrQueryBuilderTest extends BaseQueryTestCase { * @return an OrQueryBuilder with random limit between 0 and 20 */ @Override - protected OrQueryBuilder createTestQueryBuilder() { + protected OrQueryBuilder doCreateTestQueryBuilder() { OrQueryBuilder query = new OrQueryBuilder(); int subQueries = randomIntBetween(1, 5); for (int i = 0; i < subQueries; i++ ) { query.add(RandomQueryBuilder.createQuery(random())); } - if (randomBoolean()) { - query.queryName(randomAsciiOfLengthBetween(1, 10)); - } return query; } - @Override - protected void assertLuceneQuery(OrQueryBuilder queryBuilder, Query query, QueryParseContext context) { - if (queryBuilder.queryName() != null) { - Query namedQuery = context.copyNamedFilters().get(queryBuilder.queryName()); - assertThat(namedQuery, equalTo(query)); - } - } - /** * test corner case where no inner queries exist */ diff --git a/core/src/test/java/org/elasticsearch/index/query/QueryFilterBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/QueryFilterBuilderTest.java index 85b3912da2e..696d61c35c0 100644 --- a/core/src/test/java/org/elasticsearch/index/query/QueryFilterBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/QueryFilterBuilderTest.java @@ -31,7 +31,7 @@ import java.io.IOException; public class QueryFilterBuilderTest extends BaseQueryTestCase { @Override - protected Query createExpectedQuery(QueryFilterBuilder queryBuilder, QueryParseContext context) throws QueryParsingException, IOException { + protected Query doCreateExpectedQuery(QueryFilterBuilder queryBuilder, QueryParseContext context) throws QueryParsingException, IOException { return new ConstantScoreQuery(queryBuilder.innerQuery().toQuery(context)); } @@ -39,10 +39,9 @@ public class QueryFilterBuilderTest extends BaseQueryTestCase { @@ -43,7 +42,7 @@ public class RangeQueryBuilderTest extends BaseQueryTestCase private static final List TIMEZONE_IDS = new ArrayList<>(DateTimeZone.getAvailableIDs()); @Override - protected RangeQueryBuilder createTestQueryBuilder() { + protected RangeQueryBuilder doCreateTestQueryBuilder() { RangeQueryBuilder query; // switch between numeric and date ranges if (randomBoolean()) { @@ -74,13 +73,6 @@ public class RangeQueryBuilderTest extends BaseQueryTestCase } } query.includeLower(randomBoolean()).includeUpper(randomBoolean()); - if (randomBoolean()) { - query.boost(2.0f / randomIntBetween(1, 20)); - } - if (randomBoolean()) { - query.queryName(randomAsciiOfLengthBetween(1, 10)); - } - if (randomBoolean()) { query.from(null); } @@ -91,7 +83,7 @@ public class RangeQueryBuilderTest extends BaseQueryTestCase } @Override - protected Query createExpectedQuery(RangeQueryBuilder queryBuilder, QueryParseContext context) throws IOException { + protected Query doCreateExpectedQuery(RangeQueryBuilder queryBuilder, QueryParseContext context) throws IOException { Query expectedQuery; String fieldName = queryBuilder.fieldName(); if (getCurrentTypes().length == 0 || (fieldName.equals(DATE_FIELD_NAME) == false && fieldName.equals(INT_FIELD_NAME) == false)) { @@ -116,18 +108,9 @@ public class RangeQueryBuilderTest extends BaseQueryTestCase } else { throw new UnsupportedOperationException(); } - expectedQuery.setBoost(queryBuilder.boost()); return expectedQuery; } - @Override - protected void assertLuceneQuery(RangeQueryBuilder queryBuilder, Query query, QueryParseContext context) { - if (queryBuilder.queryName() != null) { - Query namedQuery = context.copyNamedFilters().get(queryBuilder.queryName()); - assertThat(namedQuery, equalTo(query)); - } - } - @Test public void testValidate() { RangeQueryBuilder rangeQueryBuilder = new RangeQueryBuilder(""); diff --git a/core/src/test/java/org/elasticsearch/index/query/SimpleQueryStringBuilderTest.java b/core/src/test/java/org/elasticsearch/index/query/SimpleQueryStringBuilderTest.java index d2b0f8211a8..b48e41e527e 100644 --- a/core/src/test/java/org/elasticsearch/index/query/SimpleQueryStringBuilderTest.java +++ b/core/src/test/java/org/elasticsearch/index/query/SimpleQueryStringBuilderTest.java @@ -29,13 +29,8 @@ import org.elasticsearch.index.query.SimpleQueryParser.Settings; import org.junit.Test; import java.io.IOException; -import java.util.HashSet; -import java.util.Locale; -import java.util.Map; -import java.util.Set; -import java.util.TreeMap; +import java.util.*; -import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; @@ -44,12 +39,8 @@ public class SimpleQueryStringBuilderTest extends BaseQueryTestCase flagSet = new HashSet<>(); int size = randomIntBetween(0, SimpleQueryStringFlag.values().length); @@ -90,7 +77,7 @@ public class SimpleQueryStringBuilderTest extends BaseQueryTestCase fields = new TreeMap<>(); for (int i = 0; i < fieldCount; i++) { if (randomBoolean()) { - fields.put(randomAsciiOfLengthBetween(1, 10), 1.0f); + fields.put(randomAsciiOfLengthBetween(1, 10), AbstractQueryBuilder.DEFAULT_BOOST); } else { fields.put(randomAsciiOfLengthBetween(1, 10), 2.0f / randomIntBetween(1, 20)); } @@ -104,8 +91,8 @@ public class SimpleQueryStringBuilderTest extends BaseQueryTestCase fields = new TreeMap<>(); // Use the default field (_all) if no fields specified if (queryBuilder.fields().isEmpty()) { String field = context.defaultField(); - fields.put(field, 1.0F); + fields.put(field, AbstractQueryBuilder.DEFAULT_BOOST); } else { fields.putAll(queryBuilder.fields()); } @@ -284,11 +263,9 @@ public class SimpleQueryStringBuilderTest extends BaseQueryTestCase> void + private

> void phraseBoostTestCaseForClauses(String highlighterType, float boost, QueryBuilder terms, P phrase) { Matcher highlightedMatcher = Matchers.either(containsString("highlight words together")).or( containsString("highlight words together")); diff --git a/docs/reference/migration/migrate_query_refactoring.asciidoc b/docs/reference/migration/migrate_query_refactoring.asciidoc index 0d1bee10492..ba425d78fd5 100644 --- a/docs/reference/migration/migrate_query_refactoring.asciidoc +++ b/docs/reference/migration/migrate_query_refactoring.asciidoc @@ -12,7 +12,16 @@ Removed the setter `queryName(String queryName)` since this field is not support in this type of query. Use `FQueryFilterBuilder.queryName(String queryName)` instead when in need to wrap a named query as a filter. -Removed the enums called "Operator" from MatchQueryBuilder, QueryStringQueryBuilder, -SimpleQueryStringBuilder, and CommonTermsQueryBuilder in favour of using the enum -defined in org.elasticsearch.index.query.Operator in an effort to consolidate the +==== Operator + +Removed the enums called `Operator` from `MatchQueryBuilder`, `QueryStringQueryBuilder`, +`SimpleQueryStringBuilder`, and `CommonTermsQueryBuilder` in favour of using the enum +defined in `org.elasticsearch.index.query.Operator` in an effort to consolidate the codebase and avoid duplication. + +==== queryName and boost support + +Support for `queryName` and `boost` has been streamlined to all of the queries. That is +a breaking change till queries get sent over the network as serialized json rather +than in `Streamable` format. In fact whenever additional fields are added to the json +representation of the query, older nodes might throw error when they find unknown fields.pd