1919
2020package org .elasticsearch .index .query ;
2121
22+ import org .apache .lucene .search .ConstantScoreQuery ;
2223import org .apache .lucene .search .Query ;
24+ import org .elasticsearch .common .io .stream .StreamInput ;
25+ import org .elasticsearch .common .io .stream .StreamOutput ;
2326import org .elasticsearch .common .xcontent .XContentBuilder ;
2427
2528import java .io .IOException ;
2932 * A query that wraps a filter and simply returns a constant score equal to the
3033 * query boost for every document in the filter.
3134 */
32- public class ConstantScoreQueryBuilder extends QueryBuilder implements BoostableQueryBuilder <ConstantScoreQueryBuilder > {
35+ public class ConstantScoreQueryBuilder extends QueryBuilder < ConstantScoreQueryBuilder > implements BoostableQueryBuilder <ConstantScoreQueryBuilder > {
3336
3437 public static final String NAME = "constant_score" ;
3538
3639 private final QueryBuilder filterBuilder ;
3740
38- private float boost = - 1 ;
41+ private float boost = 1.0f ;
3942
40- static final ConstantScoreQueryBuilder PROTOTYPE = new ConstantScoreQueryBuilder ();
43+ static final ConstantScoreQueryBuilder PROTOTYPE = new ConstantScoreQueryBuilder (null );
4144
4245 /**
43- * A query that wraps a query and simply returns a constant score equal to the
46+ * A query that wraps another query and simply returns a constant score equal to the
4447 * query boost for every document in the query.
4548 *
4649 * @param filterBuilder The query to wrap in a constant score query
4750 */
4851 public ConstantScoreQueryBuilder (QueryBuilder filterBuilder ) {
49- this .filterBuilder = Objects . requireNonNull ( filterBuilder ) ;
52+ this .filterBuilder = filterBuilder ;
5053 }
5154
5255 /**
53- * private constructor only used for serialization
56+ * @return the query that was wrapped in this constant score query
5457 */
55- private ConstantScoreQueryBuilder () {
56- this .filterBuilder = null ;
58+ public QueryBuilder query () {
59+ return this .filterBuilder ;
5760 }
5861
5962 /**
@@ -66,20 +69,74 @@ public ConstantScoreQueryBuilder boost(float boost) {
6669 return this ;
6770 }
6871
72+ /**
73+ * @return the boost factor
74+ */
75+ public float boost () {
76+ return this .boost ;
77+ }
78+
6979 @ Override
7080 protected void doXContent (XContentBuilder builder , Params params ) throws IOException {
7181 builder .startObject (NAME );
7282 builder .field ("filter" );
7383 filterBuilder .toXContent (builder , params );
84+ builder .field ("boost" , boost );
85+ builder .endObject ();
86+ }
7487
75- if (boost != -1 ) {
76- builder .field ("boost" , boost );
88+ @ Override
89+ public Query toQuery (QueryParseContext parseContext ) throws QueryParsingException , IOException {
90+ // current DSL allows empty inner filter clauses, we ignore them
91+ if (filterBuilder == null ) {
92+ return null ;
7793 }
78- builder .endObject ();
94+
95+ Query innerFilter = filterBuilder .toQuery (parseContext );
96+ if (innerFilter == null ) {
97+ // return null so that parent queries (e.g. bool) also ignore this
98+ return null ;
99+ }
100+
101+ Query filter = new ConstantScoreQuery (filterBuilder .toQuery (parseContext ));
102+ filter .setBoost (boost );
103+ return filter ;
79104 }
80105
81106 @ Override
82107 public String queryId () {
83108 return NAME ;
84109 }
110+
111+ @ Override
112+ public int hashCode () {
113+ return Objects .hash (boost , filterBuilder );
114+ }
115+
116+ @ Override
117+ public boolean equals (Object obj ) {
118+ if (this == obj ) {
119+ return true ;
120+ }
121+ if (obj == null || getClass () != obj .getClass ()) {
122+ return false ;
123+ }
124+ ConstantScoreQueryBuilder other = (ConstantScoreQueryBuilder ) obj ;
125+ return Objects .equals (boost , other .boost ) &&
126+ Objects .equals (filterBuilder , other .filterBuilder );
127+ }
128+
129+ @ Override
130+ public ConstantScoreQueryBuilder readFrom (StreamInput in ) throws IOException {
131+ QueryBuilder innerFilterBuilder = in .readNamedWriteable ();
132+ ConstantScoreQueryBuilder constantScoreQueryBuilder = new ConstantScoreQueryBuilder (innerFilterBuilder );
133+ constantScoreQueryBuilder .boost = in .readFloat ();
134+ return constantScoreQueryBuilder ;
135+ }
136+
137+ @ Override
138+ public void writeTo (StreamOutput out ) throws IOException {
139+ out .writeNamedWriteable (this .filterBuilder );
140+ out .writeFloat (boost );
141+ }
85142}
0 commit comments