Browse Source

Support date and ip types for `numeric_range` filter, closes #530.

kimchy 15 years ago
parent
commit
db1f7e09f3

+ 3 - 0
.idea/misc.xml

@@ -3,6 +3,9 @@
   <component name="DependencyValidationManager">
     <option name="SKIP_IMPORT_STATEMENTS" value="false" />
   </component>
+  <component name="EntryPointsManager">
+    <entry_points version="2.0" />
+  </component>
   <component name="IdProvider" IDEtalkID="4A8F53B851E388D477AEE98A9276B454" />
   <component name="JavadocGenerationManager">
     <option name="OUTPUT_DIRECTORY" value="$USER_HOME$/tmp/tmp1" />

+ 9 - 0
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<Float> 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);

+ 9 - 0
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<Long> {
                 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()) {

+ 9 - 0
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<Double> {
                 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()) {

+ 9 - 0
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<Float> {
                 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()) {

+ 9 - 0
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<Integer> {
                 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()) {

+ 9 - 0
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<Long> {
                 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()) {

+ 6 - 0
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<T extends Number> 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).
      */

+ 9 - 0
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<Short> {
                 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()) {

+ 9 - 0
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<Long> {
                 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()) {

+ 4 - 25
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);