Remove `numeric_range` filter

As done with #4034, `numeric_range` filter has been deprecated since 1.0.0.

Closes #7108.
This commit is contained in:
David Pilato 2014-08-12 16:21:28 +02:00
parent 270b109e65
commit 655282a2c6
7 changed files with 3 additions and 586 deletions

View File

@ -296,19 +296,6 @@ public abstract class FilterBuilders {
return new RangeFilterBuilder(name);
}
/**
* A filter that restricts search results to values that are within the given numeric range. Uses the
* field data cache (loading all the values for the specified field into memory)
*
* @param name The field name
* @deprecated The numeric_range filter will be removed at some point in time in favor for the range filter with
* the execution mode <code>fielddata</code>.
*/
@Deprecated
public static NumericRangeFilterBuilder numericRangeFilter(String name) {
return new NumericRangeFilterBuilder(name);
}
/**
* A filter that simply wraps a query.
*

View File

@ -1,381 +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;
import org.elasticsearch.common.xcontent.XContentBuilder;
import java.io.IOException;
/**
* A filter that restricts search results to values that are within the given numeric range.
* <p/>
* <p>Uses the field data cache (loading all the values for the specified field into memory).
*
* @deprecated This filter will be removed at some point in time in favor for the range filter with the execution
* mode <code>fielddata</code>.
*/
@Deprecated
public class NumericRangeFilterBuilder extends BaseFilterBuilder {
private final String name;
private Object from;
private Object to;
private boolean includeLower = true;
private boolean includeUpper = true;
private Boolean cache;
private String cacheKey;
private String filterName;
/**
* A filter that restricts search results to values that are within the given range.
*
* @param name The field name
*/
public NumericRangeFilterBuilder(String name) {
this.name = name;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder from(Object from) {
this.from = from;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder from(int from) {
this.from = from;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder from(long from) {
this.from = from;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder from(float from) {
this.from = from;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder from(double from) {
this.from = from;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder gt(Object from) {
this.from = from;
this.includeLower = false;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder gt(int from) {
this.from = from;
this.includeLower = false;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder gt(long from) {
this.from = from;
this.includeLower = false;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder gt(float from) {
this.from = from;
this.includeLower = false;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder gt(double from) {
this.from = from;
this.includeLower = false;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder gte(Object from) {
this.from = from;
this.includeLower = true;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder gte(int from) {
this.from = from;
this.includeLower = true;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder gte(long from) {
this.from = from;
this.includeLower = true;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder gte(float from) {
this.from = from;
this.includeLower = true;
return this;
}
/**
* The from part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder gte(double from) {
this.from = from;
this.includeLower = true;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder to(Object to) {
this.to = to;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder to(int to) {
this.to = to;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder to(long to) {
this.to = to;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder to(float to) {
this.to = to;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder to(double to) {
this.to = to;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder lt(Object to) {
this.to = to;
this.includeUpper = false;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder lt(int to) {
this.to = to;
this.includeUpper = false;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder lt(long to) {
this.to = to;
this.includeUpper = false;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder lt(float to) {
this.to = to;
this.includeUpper = false;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder lt(double to) {
this.to = to;
this.includeUpper = false;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder lte(Object to) {
this.to = to;
this.includeUpper = true;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder lte(int to) {
this.to = to;
this.includeUpper = true;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder lte(long to) {
this.to = to;
this.includeUpper = true;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder lte(float to) {
this.to = to;
this.includeUpper = true;
return this;
}
/**
* The to part of the filter query. Null indicates unbounded.
*/
public NumericRangeFilterBuilder lte(double to) {
this.to = to;
this.includeUpper = true;
return this;
}
/**
* Should the lower bound be included or not. Defaults to <tt>true</tt>.
*/
public NumericRangeFilterBuilder includeLower(boolean includeLower) {
this.includeLower = includeLower;
return this;
}
/**
* Should the upper bound be included or not. Defaults to <tt>true</tt>.
*/
public NumericRangeFilterBuilder includeUpper(boolean includeUpper) {
this.includeUpper = includeUpper;
return this;
}
/**
* Sets the filter name for the filter that can be used when searching for matched_filters per hit.
*/
public NumericRangeFilterBuilder filterName(String filterName) {
this.filterName = filterName;
return this;
}
/**
* Should the filter be cached or not. Defaults to <tt>false</tt>.
*/
public NumericRangeFilterBuilder cache(boolean cache) {
this.cache = cache;
return this;
}
public NumericRangeFilterBuilder cacheKey(String cacheKey) {
this.cacheKey = cacheKey;
return this;
}
@Override
protected void doXContent(XContentBuilder builder, Params params) throws IOException {
builder.startObject(NumericRangeFilterParser.NAME);
builder.startObject(name);
builder.field("from", from);
builder.field("to", to);
builder.field("include_lower", includeLower);
builder.field("include_upper", includeUpper);
builder.endObject();
if (filterName != null) {
builder.field("_name", filterName);
}
if (cache != null) {
builder.field("_cache", cache);
}
if (cacheKey != null) {
builder.field("_cache_key", cacheKey);
}
builder.endObject();
}
}

View File

@ -1,134 +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;
import org.apache.lucene.search.Filter;
import org.elasticsearch.common.inject.Inject;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.cache.filter.support.CacheKeyFilter;
import org.elasticsearch.index.mapper.FieldMapper;
import org.elasticsearch.index.mapper.MapperService;
import org.elasticsearch.index.mapper.core.NumberFieldMapper;
import java.io.IOException;
import static org.elasticsearch.index.query.support.QueryParsers.wrapSmartNameFilter;
/**
*
*/
@Deprecated
public class NumericRangeFilterParser implements FilterParser {
public static final String NAME = "numeric_range";
@Inject
public NumericRangeFilterParser() {
}
@Override
public String[] names() {
return new String[]{NAME, "numericRange"};
}
@Override
public Filter parse(QueryParseContext parseContext) throws IOException, QueryParsingException {
XContentParser parser = parseContext.parser();
boolean cache = false; // default to false, since its using fielddata cache
CacheKeyFilter.Key cacheKey = null;
String fieldName = null;
String from = null;
String to = null;
boolean includeLower = true;
boolean includeUpper = true;
String filterName = 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 == XContentParser.Token.START_OBJECT) {
fieldName = currentFieldName;
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
if (token == XContentParser.Token.FIELD_NAME) {
currentFieldName = parser.currentName();
} else {
if ("from".equals(currentFieldName)) {
from = parser.textOrNull();
} else if ("to".equals(currentFieldName)) {
to = parser.textOrNull();
} else if ("include_lower".equals(currentFieldName) || "includeLower".equals(currentFieldName)) {
includeLower = parser.booleanValue();
} else if ("include_upper".equals(currentFieldName) || "includeUpper".equals(currentFieldName)) {
includeUpper = parser.booleanValue();
} else if ("gt".equals(currentFieldName)) {
from = parser.textOrNull();
includeLower = false;
} else if ("gte".equals(currentFieldName) || "ge".equals(currentFieldName)) {
from = parser.textOrNull();
includeLower = true;
} else if ("lt".equals(currentFieldName)) {
to = parser.textOrNull();
includeUpper = false;
} else if ("lte".equals(currentFieldName) || "le".equals(currentFieldName)) {
to = parser.textOrNull();
includeUpper = true;
} else {
throw new QueryParsingException(parseContext.index(), "[numeric_range] filter does not support [" + currentFieldName + "]");
}
}
}
} else if (token.isValue()) {
if ("_name".equals(currentFieldName)) {
filterName = parser.text();
} else if ("_cache".equals(currentFieldName)) {
cache = parser.booleanValue();
} else if ("_cache_key".equals(currentFieldName) || "_cacheKey".equals(currentFieldName)) {
cacheKey = new CacheKeyFilter.Key(parser.text());
} else {
throw new QueryParsingException(parseContext.index(), "[numeric_range] filter does not support [" + currentFieldName + "]");
}
}
}
MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
if (smartNameFieldMappers == null || !smartNameFieldMappers.hasMapper()) {
throw new QueryParsingException(parseContext.index(), "failed to find mapping for field [" + fieldName + "]");
}
FieldMapper mapper = smartNameFieldMappers.mapper();
if (!(mapper instanceof NumberFieldMapper)) {
throw new QueryParsingException(parseContext.index(), "Field [" + fieldName + "] is not a numeric type");
}
Filter filter = ((NumberFieldMapper) mapper).rangeFilter(parseContext, from, to, includeLower, includeUpper, parseContext);
if (cache) {
filter = parseContext.cacheFilter(filter, cacheKey);
}
filter = wrapSmartNameFilter(filter, smartNameFieldMappers, parseContext);
if (filterName != null) {
parseContext.addNamedFilter(filterName, filter);
}
return filter;
}
}

View File

@ -125,7 +125,6 @@ public class IndicesQueriesModule extends AbstractModule {
fpBinders.addBinding().to(TermFilterParser.class).asEagerSingleton();
fpBinders.addBinding().to(TermsFilterParser.class).asEagerSingleton();
fpBinders.addBinding().to(RangeFilterParser.class).asEagerSingleton();
fpBinders.addBinding().to(NumericRangeFilterParser.class).asEagerSingleton();
fpBinders.addBinding().to(PrefixFilterParser.class).asEagerSingleton();
fpBinders.addBinding().to(RegexpFilterParser.class).asEagerSingleton();
fpBinders.addBinding().to(ScriptFilterParser.class).asEagerSingleton();
@ -149,4 +148,4 @@ public class IndicesQueriesModule extends AbstractModule {
fpBinders.addBinding().to(IndicesFilterParser.class).asEagerSingleton();
fpBinders.addBinding().to(WrapperFilterParser.class).asEagerSingleton();
}
}
}

View File

@ -756,21 +756,6 @@ public class SimpleIndexQueryParserTests extends ElasticsearchSingleNodeTest {
assertThat(rangeFilter.includesMax(), equalTo(false));
}
@Test
public void testNumericRangeFilteredQueryBuilder() throws IOException {
IndexQueryParserService queryParser = queryParser();
Query parsedQuery = queryParser.parse(filteredQuery(termQuery("name.first", "shay"), numericRangeFilter("age").from(23).to(54).includeLower(true).includeUpper(false))).query();
assertThat(parsedQuery, instanceOf(XFilteredQuery.class));
Filter filter = ((XFilteredQuery) parsedQuery).getFilter();
assertThat(filter, instanceOf(NumericRangeFieldDataFilter.class));
NumericRangeFieldDataFilter<Number> rangeFilter = (NumericRangeFieldDataFilter<Number>) filter;
assertThat(rangeFilter.getField(), equalTo("age"));
assertThat(rangeFilter.getLowerVal().intValue(), equalTo(23));
assertThat(rangeFilter.getUpperVal().intValue(), equalTo(54));
assertThat(rangeFilter.isIncludeLower(), equalTo(true));
assertThat(rangeFilter.isIncludeUpper(), equalTo(false));
}
@Test
public void testRangeFilteredQueryBuilder_executionFieldData() throws IOException {
IndexQueryParserService queryParser = queryParser();
@ -786,22 +771,6 @@ public class SimpleIndexQueryParserTests extends ElasticsearchSingleNodeTest {
assertThat(rangeFilter.isIncludeUpper(), equalTo(false));
}
@Test
public void testNumericRangeFilteredQuery() throws IOException {
IndexQueryParserService queryParser = queryParser();
String query = copyToStringFromClasspath("/org/elasticsearch/index/query/numeric_range-filter.json");
Query parsedQuery = queryParser.parse(query).query();
assertThat(parsedQuery, instanceOf(XFilteredQuery.class));
Filter filter = ((XFilteredQuery) parsedQuery).getFilter();
assertThat(filter, instanceOf(NumericRangeFieldDataFilter.class));
NumericRangeFieldDataFilter<Number> rangeFilter = (NumericRangeFieldDataFilter<Number>) filter;
assertThat(rangeFilter.getField(), equalTo("age"));
assertThat(rangeFilter.getLowerVal().intValue(), equalTo(23));
assertThat(rangeFilter.getUpperVal().intValue(), equalTo(54));
assertThat(rangeFilter.isIncludeLower(), equalTo(true));
assertThat(rangeFilter.isIncludeUpper(), equalTo(false));
}
@Test
public void testBoolFilteredQueryBuilder() throws IOException {
IndexQueryParserService queryParser = queryParser();

View File

@ -1,19 +0,0 @@
{
"filtered":{
"query":{
"term":{
"name.first":"shay"
}
},
"filter":{
"numeric_range":{
"age":{
"from":"23",
"to":"54",
"include_lower":true,
"include_upper":false
}
}
}
}
}

View File

@ -2048,13 +2048,9 @@ public class SimpleQueryTests extends ElasticsearchIntegrationTest {
private static FilterBuilder rangeFilter(String field, Object from, Object to) {
if (randomBoolean()) {
if (randomBoolean()) {
return FilterBuilders.rangeFilter(field).from(from).to(to);
} else {
return FilterBuilders.rangeFilter(field).from(from).to(to).setExecution("fielddata");
}
return FilterBuilders.rangeFilter(field).from(from).to(to);
} else {
return FilterBuilders.numericRangeFilter(field).from(from).to(to);
return FilterBuilders.rangeFilter(field).from(from).to(to).setExecution("fielddata");
}
}