diff --git a/.idea/misc.xml b/.idea/misc.xml
index 07d9c300e74..54c142cfd6e 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -3,6 +3,9 @@
+
+
+
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/BoostFieldMapper.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/BoostFieldMapper.java
index 038a9e45f48..102ad359c3c 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/BoostFieldMapper.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/BoostFieldMapper.java
@@ -31,8 +31,10 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericFloatAnalyzer;
+import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MergeMappingException;
+import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
@@ -127,6 +129,13 @@ public class BoostFieldMapper extends NumberFieldMapper implements org.el
includeLower, includeUpper);
}
+ @Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
+ return NumericRangeFieldDataFilter.newFloatRange(fieldDataCache, names.indexName(),
+ lowerTerm == null ? null : Float.parseFloat(lowerTerm),
+ upperTerm == null ? null : Float.parseFloat(upperTerm),
+ includeLower, includeUpper);
+ }
+
@Override public void parse(ParseContext context) throws IOException {
// we override parse since we want to handle cases where it is not indexed and not stored (the default)
float value = parseFloatValue(context);
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/DateFieldMapper.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/DateFieldMapper.java
index 0b078b6a787..4871d54dda6 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/DateFieldMapper.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/DateFieldMapper.java
@@ -34,9 +34,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericDateAnalyzer;
+import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
+import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@@ -167,6 +169,13 @@ public class DateFieldMapper extends NumberFieldMapper {
includeLower, includeUpper);
}
+ @Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
+ return NumericRangeFieldDataFilter.newLongRange(fieldDataCache, names.indexName(),
+ lowerTerm == null ? null : parseStringValue(lowerTerm),
+ upperTerm == null ? null : parseStringValue(upperTerm),
+ includeLower, includeUpper);
+ }
+
@Override protected Field parseCreateField(ParseContext context) throws IOException {
String dateAsString;
if (context.externalValueSet()) {
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/DoubleFieldMapper.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/DoubleFieldMapper.java
index c7f9fa4c85e..997f4bf35cc 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/DoubleFieldMapper.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/DoubleFieldMapper.java
@@ -31,9 +31,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericDoubleAnalyzer;
+import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
+import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@@ -140,6 +142,13 @@ public class DoubleFieldMapper extends NumberFieldMapper {
includeLower, includeUpper);
}
+ @Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
+ return NumericRangeFieldDataFilter.newDoubleRange(fieldDataCache, names.indexName(),
+ lowerTerm == null ? null : Double.parseDouble(lowerTerm),
+ upperTerm == null ? null : Double.parseDouble(upperTerm),
+ includeLower, includeUpper);
+ }
+
@Override protected Field parseCreateField(ParseContext context) throws IOException {
double value;
if (context.externalValueSet()) {
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/FloatFieldMapper.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/FloatFieldMapper.java
index 88049146c9f..ea55318b14e 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/FloatFieldMapper.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/FloatFieldMapper.java
@@ -32,9 +32,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericFloatAnalyzer;
+import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
+import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@@ -139,6 +141,13 @@ public class FloatFieldMapper extends NumberFieldMapper {
includeLower, includeUpper);
}
+ @Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
+ return NumericRangeFieldDataFilter.newFloatRange(fieldDataCache, names.indexName(),
+ lowerTerm == null ? null : Float.parseFloat(lowerTerm),
+ upperTerm == null ? null : Float.parseFloat(upperTerm),
+ includeLower, includeUpper);
+ }
+
@Override protected Field parseCreateField(ParseContext context) throws IOException {
float value;
if (context.externalValueSet()) {
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/IntegerFieldMapper.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/IntegerFieldMapper.java
index eb3c199938f..f4100247c1a 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/IntegerFieldMapper.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/IntegerFieldMapper.java
@@ -32,9 +32,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericIntegerAnalyzer;
+import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
+import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@@ -139,6 +141,13 @@ public class IntegerFieldMapper extends NumberFieldMapper {
includeLower, includeUpper);
}
+ @Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
+ return NumericRangeFieldDataFilter.newIntRange(fieldDataCache, names.indexName(),
+ lowerTerm == null ? null : Integer.parseInt(lowerTerm),
+ upperTerm == null ? null : Integer.parseInt(upperTerm),
+ includeLower, includeUpper);
+ }
+
@Override protected Field parseCreateField(ParseContext context) throws IOException {
int value;
if (context.externalValueSet()) {
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/LongFieldMapper.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/LongFieldMapper.java
index d9c7dea16ff..a626037aed6 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/LongFieldMapper.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/LongFieldMapper.java
@@ -32,9 +32,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericLongAnalyzer;
+import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
+import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@@ -139,6 +141,13 @@ public class LongFieldMapper extends NumberFieldMapper {
includeLower, includeUpper);
}
+ @Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
+ return NumericRangeFieldDataFilter.newLongRange(fieldDataCache, names.indexName(),
+ lowerTerm == null ? null : Long.parseLong(lowerTerm),
+ upperTerm == null ? null : Long.parseLong(upperTerm),
+ includeLower, includeUpper);
+ }
+
@Override protected Field parseCreateField(ParseContext context) throws IOException {
long value;
if (context.externalValueSet()) {
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/NumberFieldMapper.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/NumberFieldMapper.java
index 3b1eacf25ee..8ed1a9a0300 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/NumberFieldMapper.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/NumberFieldMapper.java
@@ -29,6 +29,7 @@ import org.apache.lucene.util.NumericUtils;
import org.elasticsearch.common.thread.ThreadLocals;
import org.elasticsearch.common.trove.TIntObjectHashMap;
import org.elasticsearch.index.analysis.NamedAnalyzer;
+import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MergeMappingException;
@@ -142,6 +143,11 @@ public abstract class NumberFieldMapper extends AbstractFieldM
@Override public abstract Filter rangeFilter(String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper);
+ /**
+ * A range filter based on the field data cache.
+ */
+ public abstract Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper);
+
/**
* Override the default behavior (to return the string, and return the actual Number instance).
*/
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/ShortFieldMapper.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/ShortFieldMapper.java
index b04678f5ca5..28caa0d779c 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/ShortFieldMapper.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/ShortFieldMapper.java
@@ -32,9 +32,11 @@ import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericIntegerAnalyzer;
+import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
+import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.util.Map;
@@ -139,6 +141,13 @@ public class ShortFieldMapper extends NumberFieldMapper {
includeLower, includeUpper);
}
+ @Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
+ return NumericRangeFieldDataFilter.newShortRange(fieldDataCache, names.indexName(),
+ lowerTerm == null ? null : Short.parseShort(lowerTerm),
+ upperTerm == null ? null : Short.parseShort(upperTerm),
+ includeLower, includeUpper);
+ }
+
@Override protected Field parseCreateField(ParseContext context) throws IOException {
short value;
if (context.externalValueSet()) {
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/ip/IpFieldMapper.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/ip/IpFieldMapper.java
index 0b27a3607c3..5fc918fd89d 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/ip/IpFieldMapper.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/mapper/xcontent/ip/IpFieldMapper.java
@@ -35,6 +35,7 @@ import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.analysis.NamedAnalyzer;
import org.elasticsearch.index.analysis.NumericAnalyzer;
import org.elasticsearch.index.analysis.NumericTokenizer;
+import org.elasticsearch.index.cache.field.data.FieldDataCache;
import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.MapperParsingException;
import org.elasticsearch.index.mapper.MergeMappingException;
@@ -42,6 +43,7 @@ import org.elasticsearch.index.mapper.xcontent.MergeContext;
import org.elasticsearch.index.mapper.xcontent.NumberFieldMapper;
import org.elasticsearch.index.mapper.xcontent.ParseContext;
import org.elasticsearch.index.mapper.xcontent.XContentMapper;
+import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import java.io.IOException;
import java.io.Reader;
@@ -186,6 +188,13 @@ public class IpFieldMapper extends NumberFieldMapper {
includeLower, includeUpper);
}
+ @Override public Filter rangeFilter(FieldDataCache fieldDataCache, String lowerTerm, String upperTerm, boolean includeLower, boolean includeUpper) {
+ return NumericRangeFieldDataFilter.newLongRange(fieldDataCache, names.indexName(),
+ lowerTerm == null ? null : ipToLong(lowerTerm),
+ upperTerm == null ? null : ipToLong(upperTerm),
+ includeLower, includeUpper);
+ }
+
@Override protected Field parseCreateField(ParseContext context) throws IOException {
String ipAsString;
if (context.externalValueSet()) {
diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/xcontent/NumericRangeFilterParser.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/xcontent/NumericRangeFilterParser.java
index 0c68b963923..1cd3ce2b527 100644
--- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/xcontent/NumericRangeFilterParser.java
+++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/query/xcontent/NumericRangeFilterParser.java
@@ -25,11 +25,10 @@ import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.AbstractIndexComponent;
import org.elasticsearch.index.Index;
-import org.elasticsearch.index.field.data.FieldDataType;
import org.elasticsearch.index.mapper.FieldMapper;
import org.elasticsearch.index.mapper.MapperService;
+import org.elasticsearch.index.mapper.xcontent.NumberFieldMapper;
import org.elasticsearch.index.query.QueryParsingException;
-import org.elasticsearch.index.search.NumericRangeFieldDataFilter;
import org.elasticsearch.index.settings.IndexSettings;
import java.io.IOException;
@@ -105,7 +104,6 @@ public class NumericRangeFilterParser extends AbstractIndexComponent implements
}
}
- Filter filter;
MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
if (smartNameFieldMappers == null || !smartNameFieldMappers.hasMapper()) {
@@ -113,29 +111,10 @@ public class NumericRangeFilterParser extends AbstractIndexComponent implements
}
FieldMapper mapper = smartNameFieldMappers.mapper();
- if (mapper.fieldDataType() == FieldDataType.DefaultTypes.INT) {
- filter = NumericRangeFieldDataFilter.newIntRange(parseContext.indexCache().fieldData(), mapper.names().indexName(),
- from == null ? null : Integer.parseInt(from),
- to == null ? null : Integer.parseInt(to),
- includeLower, includeUpper);
- } else if (mapper.fieldDataType() == FieldDataType.DefaultTypes.LONG) {
- filter = NumericRangeFieldDataFilter.newLongRange(parseContext.indexCache().fieldData(), mapper.names().indexName(),
- from == null ? null : Long.parseLong(from),
- to == null ? null : Long.parseLong(to),
- includeLower, includeUpper);
- } else if (mapper.fieldDataType() == FieldDataType.DefaultTypes.FLOAT) {
- filter = NumericRangeFieldDataFilter.newFloatRange(parseContext.indexCache().fieldData(), mapper.names().indexName(),
- from == null ? null : Float.parseFloat(from),
- to == null ? null : Float.parseFloat(to),
- includeLower, includeUpper);
- } else if (mapper.fieldDataType() == FieldDataType.DefaultTypes.DOUBLE) {
- filter = NumericRangeFieldDataFilter.newDoubleRange(parseContext.indexCache().fieldData(), mapper.names().indexName(),
- from == null ? null : Double.parseDouble(from),
- to == null ? null : Double.parseDouble(to),
- includeLower, includeUpper);
- } else {
- throw new QueryParsingException(index, "field [" + fieldName + "] is not numeric");
+ if (!(mapper instanceof NumberFieldMapper)) {
+ throw new QueryParsingException(index, "Field [" + fieldName + "] is not a numeric type");
}
+ Filter filter = ((NumberFieldMapper) mapper).rangeFilter(parseContext.indexCache().fieldData(), from, to, includeLower, includeUpper);
if (cache) {
filter = parseContext.cacheFilter(filter);