From 59c41e2a6c685dd9ac943c69d12e9bfe2a7d380e Mon Sep 17 00:00:00 2001 From: Tomas Fernandez Lobbe Date: Tue, 7 Feb 2017 10:38:22 -0800 Subject: [PATCH] SOLR-10011: Add NumberType getNumberType() to FieldType and deprecate LegacyNumericType getNumericType() Modify references to getNumericType() to use the new getNumberType(). NumberType is shared for the different numeric implementations supported in Solr (TrieFields and PointFields). CC SOLR-8396 --- solr/CHANGES.txt | 2 +- .../facet/FieldFacetAccumulator.java | 2 +- .../util/RangeEndpointCalculator.java | 3 +- .../handler/component/RangeFacetRequest.java | 8 +--- .../solr/handler/component/StatsField.java | 26 ++++++------ .../apache/solr/request/IntervalFacets.java | 42 +++++++++---------- .../apache/solr/request/NumericFacets.java | 12 +++--- .../org/apache/solr/request/SimpleFacets.java | 8 ++-- .../org/apache/solr/schema/EnumField.java | 9 ++++ .../org/apache/solr/schema/FieldType.java | 13 +++++- .../org/apache/solr/schema/NumberType.java | 25 +++++++++++ .../apache/solr/schema/NumericFieldType.java | 29 +++++-------- .../schema/SpatialPointVectorFieldType.java | 8 +++- .../apache/solr/search/SolrIndexSearcher.java | 28 ++++++++++--- .../apache/solr/search/facet/FacetField.java | 4 +- .../FacetFieldProcessorByEnumTermsStream.java | 2 +- .../facet/FacetFieldProcessorByHashDV.java | 2 +- .../apache/solr/search/facet/FacetRange.java | 13 ++---- .../org/apache/solr/search/facet/HLLAgg.java | 2 +- .../apache/solr/search/facet/UniqueAgg.java | 2 +- .../solr/search/function/OrdFieldSource.java | 2 +- .../function/ReverseOrdFieldSource.java | 2 +- .../solr/search/grouping/CommandHandler.java | 2 +- .../distributed/command/GroupConverter.java | 4 +- .../command/SearchGroupsFieldCommand.java | 6 +-- .../command/TopGroupsFieldCommand.java | 4 +- .../solr/search/mlt/CloudMLTQParser.java | 2 +- .../solr/search/mlt/SimpleMLTQParser.java | 4 +- .../org/apache/solr/TestRandomDVFaceting.java | 2 +- 29 files changed, 158 insertions(+), 110 deletions(-) create mode 100644 solr/core/src/java/org/apache/solr/schema/NumberType.java diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt index 96b06a6d785..98a5e89da9b 100644 --- a/solr/CHANGES.txt +++ b/solr/CHANGES.txt @@ -87,7 +87,7 @@ Other Changes * SOLR-10011: Refactor PointField & TrieField to now have a common base class, NumericFieldType. The TrieField.TrieTypes and PointField.PointTypes are now consolidated to NumericFieldType.NumberType. This refactoring also fixes a bug whereby PointFields were not using DocValues for range queries for - indexed=false, docValues=true fields. + indexed=false, docValues=true fields. (Ishan Chattopadhyaya, Tomás Fernández Löbbe) ================== 6.5.0 ================== diff --git a/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java b/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java index ab363071d2e..fb0884b3931 100644 --- a/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java +++ b/solr/contrib/analytics/src/java/org/apache/solr/analytics/accumulator/facet/FieldFacetAccumulator.java @@ -58,7 +58,7 @@ public class FieldFacetAccumulator extends ValueAccumulator { this.schemaField = schemaField; this.name = schemaField.getName(); this.multiValued = schemaField.multiValued(); - this.numField = schemaField.getType().getNumericType()!=null; + this.numField = schemaField.getType().getNumberType()!=null; this.dateField = schemaField.getType() instanceof DateValueFieldType; this.parent = parent; this.parser = AnalyticsParsers.getParser(schemaField.getType().getClass()); diff --git a/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/RangeEndpointCalculator.java b/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/RangeEndpointCalculator.java index fa9686d6785..c3c2088de81 100644 --- a/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/RangeEndpointCalculator.java +++ b/solr/contrib/analytics/src/java/org/apache/solr/analytics/util/RangeEndpointCalculator.java @@ -229,8 +229,7 @@ public abstract class RangeEndpointCalculator> { final FieldType ft = sf.getType(); final RangeEndpointCalculator calc; if (ft instanceof TrieField) { - final TrieField trie = (TrieField)ft; - switch (trie.getType()) { + switch (ft.getNumberType()) { case FLOAT: calc = new FloatRangeEndpointCalculator(request); break; diff --git a/solr/core/src/java/org/apache/solr/handler/component/RangeFacetRequest.java b/solr/core/src/java/org/apache/solr/handler/component/RangeFacetRequest.java index f129e739a5d..aa3e3cb1c48 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/RangeFacetRequest.java +++ b/solr/core/src/java/org/apache/solr/handler/component/RangeFacetRequest.java @@ -34,7 +34,6 @@ import org.apache.solr.common.util.SimpleOrderedMap; import org.apache.solr.schema.DateRangeField; import org.apache.solr.schema.FieldType; import org.apache.solr.schema.IndexSchema; -import org.apache.solr.schema.PointField; import org.apache.solr.schema.SchemaField; import org.apache.solr.schema.TrieDateField; import org.apache.solr.schema.TrieField; @@ -144,9 +143,7 @@ public class RangeFacetRequest extends FacetComponent.FacetBase { FieldType ft = schemaField.getType(); if (ft instanceof TrieField) { - final TrieField trie = (TrieField) ft; - - switch (trie.getType()) { + switch (ft.getNumberType()) { case FLOAT: calc = new FloatRangeEndpointCalculator(this); break; @@ -170,8 +167,7 @@ public class RangeFacetRequest extends FacetComponent.FacetBase { } else if (ft instanceof DateRangeField) { calc = new DateRangeEndpointCalculator(this, null); } else if (ft.isPointField()) { - final PointField pointField = (PointField) ft; - switch (pointField.getType()) { + switch (ft.getNumberType()) { case FLOAT: calc = new FloatRangeEndpointCalculator(this); break; diff --git a/solr/core/src/java/org/apache/solr/handler/component/StatsField.java b/solr/core/src/java/org/apache/solr/handler/component/StatsField.java index 5df1b45cc93..03bf814bb31 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/StatsField.java +++ b/solr/core/src/java/org/apache/solr/handler/component/StatsField.java @@ -29,7 +29,6 @@ import java.util.Map; import java.util.Set; import org.apache.commons.lang.StringUtils; -import org.apache.lucene.legacy.LegacyNumericType; import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.queries.function.FunctionQuery; import org.apache.lucene.queries.function.ValueSource; @@ -46,6 +45,7 @@ import org.apache.solr.common.util.StrUtils; import org.apache.solr.request.DocValuesStats; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.schema.IndexSchema; +import org.apache.solr.schema.NumberType; import org.apache.solr.schema.SchemaField; import org.apache.solr.search.DocIterator; import org.apache.solr.search.DocSet; @@ -57,8 +57,8 @@ import org.apache.solr.search.SyntaxError; import org.apache.solr.util.hll.HLL; import org.apache.solr.util.hll.HLLType; -import com.google.common.hash.Hashing; import com.google.common.hash.HashFunction; +import com.google.common.hash.Hashing; /** * Models all of the information associated with a single {@link StatsParams#STATS_FIELD} @@ -636,13 +636,13 @@ public class StatsField { return null; } - final LegacyNumericType hashableNumType = getHashableNumericType(field); + final NumberType hashableNumType = getHashableNumericType(field); // some sane defaults int log2m = 13; // roughly equivilent to "cardinality='0.33'" int regwidth = 6; // with decent hash, this is plenty for all valid long hashes - if (LegacyNumericType.FLOAT.equals(hashableNumType) || LegacyNumericType.INT.equals(hashableNumType)) { + if (NumberType.FLOAT.equals(hashableNumType) || NumberType.INTEGER.equals(hashableNumType)) { // for 32bit values, we can adjust our default regwidth down a bit regwidth--; @@ -706,7 +706,7 @@ public class StatsField { if (null == hasher) { // if this is a function, or a non Long field, pre-hashed is invalid // NOTE: we ignore hashableNumType - it's LONG for non numerics like Strings - if (null == field || !LegacyNumericType.LONG.equals(field.getType().getNumericType())) { + if (null == field || !(NumberType.LONG.equals(field.getType().getNumberType()) || NumberType.DATE.equals(field.getType().getNumberType()))) { throw new SolrException(ErrorCode.BAD_REQUEST, "hllPreHashed is only supported with Long based fields"); } } @@ -739,16 +739,16 @@ public class StatsField { } /** - * Returns the effective {@link LegacyNumericType} for the field for the purposes of hash values. - * ie: If the field has an explict LegacyNumericType that is returned; If the field has no explicit - * LegacyNumericType then {@link LegacyNumericType#LONG} is returned; If field is null, then - * {@link LegacyNumericType#FLOAT} is assumed for ValueSource. + * Returns the effective {@link NumberType} for the field for the purposes of hash values. + * ie: If the field has an explict NumberType that is returned; If the field has no explicit + * NumberType then {@link NumberType#LONG} is returned; If field is null, then + * {@link NumberType#FLOAT} is assumed for ValueSource. */ - private static LegacyNumericType getHashableNumericType(SchemaField field) { + private static NumberType getHashableNumericType(SchemaField field) { if (null == field) { - return LegacyNumericType.FLOAT; + return NumberType.FLOAT; } - final LegacyNumericType result = field.getType().getNumericType(); - return null == result ? LegacyNumericType.LONG : result; + final NumberType result = field.getType().getNumberType(); + return null == result ? NumberType.LONG : result; } } diff --git a/solr/core/src/java/org/apache/solr/request/IntervalFacets.java b/solr/core/src/java/org/apache/solr/request/IntervalFacets.java index 88e39fcf5ac..8b7cd3ccc3c 100644 --- a/solr/core/src/java/org/apache/solr/request/IntervalFacets.java +++ b/solr/core/src/java/org/apache/solr/request/IntervalFacets.java @@ -31,7 +31,6 @@ import org.apache.lucene.index.LeafReaderContext; import org.apache.lucene.index.NumericDocValues; import org.apache.lucene.index.SortedDocValues; import org.apache.lucene.index.SortedSetDocValues; -import org.apache.lucene.legacy.LegacyNumericType; import org.apache.lucene.search.DocIdSet; import org.apache.lucene.search.DocIdSetIterator; import org.apache.lucene.util.Bits; @@ -42,9 +41,9 @@ import org.apache.solr.common.params.CommonParams; import org.apache.solr.common.params.SolrParams; import org.apache.solr.request.IntervalFacets.FacetInterval; import org.apache.solr.schema.FieldType; +import org.apache.solr.schema.NumberType; import org.apache.solr.schema.PointField; import org.apache.solr.schema.SchemaField; -import org.apache.solr.schema.TrieDateField; import org.apache.solr.search.DocIterator; import org.apache.solr.search.DocSet; import org.apache.solr.search.Filter; @@ -175,7 +174,7 @@ public class IntervalFacets implements Iterable { } private void doCount() throws IOException { - if (schemaField.getType().getNumericType() != null && !schemaField.multiValued()) { + if (schemaField.getType().getNumberType() != null && !schemaField.multiValued()) { getCountNumeric(); } else { getCountString(); @@ -185,7 +184,7 @@ public class IntervalFacets implements Iterable { private void getCountNumeric() throws IOException { final FieldType ft = schemaField.getType(); final String fieldName = schemaField.getName(); - final LegacyNumericType numericType = ft.getNumericType(); + final NumberType numericType = ft.getNumberType(); if (numericType == null) { throw new IllegalStateException(); } @@ -203,9 +202,8 @@ public class IntervalFacets implements Iterable { assert doc >= ctx.docBase; switch (numericType) { case LONG: - longs = DocValues.getNumeric(ctx.reader(), fieldName); - break; - case INT: + case DATE: + case INTEGER: longs = DocValues.getNumeric(ctx.reader(), fieldName); break; case FLOAT: @@ -515,7 +513,7 @@ public class IntervalFacets implements Iterable { } // TODO: what about escaping star (*)? // TODO: escaping spaces on ends? - if (schemaField.getType().getNumericType() != null) { + if (schemaField.getType().getNumberType() != null) { setNumericLimits(schemaField); } if (start != null && end != null && start.compareTo(end) > 0) { @@ -537,7 +535,7 @@ public class IntervalFacets implements Iterable { */ public FacetInterval(SchemaField schemaField, String startStr, String endStr, boolean includeLower, boolean includeUpper, String key) { - assert schemaField.getType().getNumericType() != null: "Only numeric fields supported with this constructor"; + assert schemaField.getType().getNumberType() != null: "Only numeric fields supported with this constructor"; this.key = key; this.startOpen = !includeLower; this.endOpen = !includeUpper; @@ -559,15 +557,14 @@ public class IntervalFacets implements Iterable { if (start == null) { startLimit = Long.MIN_VALUE; } else { - switch (schemaField.getType().getNumericType()) { + switch (schemaField.getType().getNumberType()) { case LONG: - if (schemaField.getType() instanceof TrieDateField) { - startLimit = ((Date) schemaField.getType().toObject(schemaField, start)).getTime(); - } else { - startLimit = (long) schemaField.getType().toObject(schemaField, start); - } + startLimit = (long) schemaField.getType().toObject(schemaField, start); break; - case INT: + case DATE: + startLimit = ((Date) schemaField.getType().toObject(schemaField, start)).getTime(); + break; + case INTEGER: startLimit = ((Integer) schemaField.getType().toObject(schemaField, start)).longValue(); break; case FLOAT: @@ -588,15 +585,14 @@ public class IntervalFacets implements Iterable { if (end == null) { endLimit = Long.MAX_VALUE; } else { - switch (schemaField.getType().getNumericType()) { + switch (schemaField.getType().getNumberType()) { case LONG: - if (schemaField.getType() instanceof TrieDateField) { - endLimit = ((Date) schemaField.getType().toObject(schemaField, end)).getTime(); - } else { - endLimit = (long) schemaField.getType().toObject(schemaField, end); - } + endLimit = (long) schemaField.getType().toObject(schemaField, end); break; - case INT: + case DATE: + endLimit = ((Date) schemaField.getType().toObject(schemaField, end)).getTime(); + break; + case INTEGER: endLimit = ((Integer) schemaField.getType().toObject(schemaField, end)).longValue(); break; case FLOAT: diff --git a/solr/core/src/java/org/apache/solr/request/NumericFacets.java b/solr/core/src/java/org/apache/solr/request/NumericFacets.java index d292a88fb13..9452c530caa 100644 --- a/solr/core/src/java/org/apache/solr/request/NumericFacets.java +++ b/solr/core/src/java/org/apache/solr/request/NumericFacets.java @@ -34,7 +34,6 @@ import org.apache.lucene.index.NumericDocValues; import org.apache.lucene.index.ReaderUtil; import org.apache.lucene.index.Terms; import org.apache.lucene.index.TermsEnum; -import org.apache.lucene.legacy.LegacyNumericType; import org.apache.lucene.queries.function.FunctionValues; import org.apache.lucene.queries.function.ValueSource; import org.apache.lucene.util.BytesRef; @@ -44,6 +43,7 @@ import org.apache.lucene.util.StringHelper; import org.apache.solr.common.params.FacetParams; import org.apache.solr.common.util.NamedList; import org.apache.solr.schema.FieldType; +import org.apache.solr.schema.NumberType; import org.apache.solr.schema.SchemaField; import org.apache.solr.schema.TrieField; import org.apache.solr.search.DocIterator; @@ -133,7 +133,7 @@ final class NumericFacets { mincount = Math.max(mincount, 1); final SchemaField sf = searcher.getSchema().getField(fieldName); final FieldType ft = sf.getType(); - final LegacyNumericType numericType = ft.getNumericType(); + final NumberType numericType = ft.getNumberType(); if (numericType == null) { throw new IllegalStateException(); } @@ -154,9 +154,9 @@ final class NumericFacets { assert doc >= ctx.docBase; switch (numericType) { case LONG: - longs = DocValues.getNumeric(ctx.reader(), fieldName); - break; - case INT: + case DATE: + case INTEGER: + // Long, Date and Integer longs = DocValues.getNumeric(ctx.reader(), fieldName); break; case FLOAT: @@ -182,7 +182,7 @@ final class NumericFacets { }; break; default: - throw new AssertionError(); + throw new AssertionError("Unexpected type: " + numericType); } } int valuesDocID = longs.docID(); diff --git a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java index 0d9cb29e533..bc2877c6f05 100644 --- a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java +++ b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java @@ -459,7 +459,7 @@ public class SimpleFacets { break; case FCS: assert !multiToken; - if (ft.getNumericType() != null && !sf.multiValued()) { + if (ft.getNumberType() != null && !sf.multiValued()) { // force numeric faceting if (prefix != null && !prefix.isEmpty()) { throw new SolrException(ErrorCode.BAD_REQUEST, FacetParams.FACET_PREFIX + " is not supported on numeric types"); @@ -593,7 +593,7 @@ public class SimpleFacets { /* Always use filters for booleans if not DocValues only... we know the number of values is very small. */ if (type instanceof BoolField && (field.indexed() == true || field.hasDocValues() == false)) { method = FacetMethod.ENUM; - } else if (type.getNumericType() != null && !field.multiValued()) { + } else if (type.getNumberType() != null && !field.multiValued()) { /* the per-segment approach is optimal for numeric field types since there are no global ords to merge and no need to create an expensive top-level reader */ @@ -606,7 +606,7 @@ public class SimpleFacets { /* FC without docValues does not support single valued numeric facets */ if (method == FacetMethod.FC - && type.getNumericType() != null && !field.multiValued()) { + && type.getNumberType() != null && !field.multiValued()) { method = FacetMethod.FCS; } @@ -692,7 +692,7 @@ public class SimpleFacets { private Collector getInsanityWrapper(final String field, Collector collector) { SchemaField sf = searcher.getSchema().getFieldOrNull(field); - if (sf != null && !sf.hasDocValues() && !sf.multiValued() && sf.getType().getNumericType() != null) { + if (sf != null && !sf.hasDocValues() && !sf.multiValued() && sf.getType().getNumberType() != null) { // it's a single-valued numeric field: we must currently create insanity :( // there isn't a GroupedFacetCollector that works on numerics right now... return new FilterCollector(collector) { diff --git a/solr/core/src/java/org/apache/solr/schema/EnumField.java b/solr/core/src/java/org/apache/solr/schema/EnumField.java index 5723206563e..37cd24b7bfe 100644 --- a/solr/core/src/java/org/apache/solr/schema/EnumField.java +++ b/solr/core/src/java/org/apache/solr/schema/EnumField.java @@ -233,9 +233,18 @@ public class EnumField extends PrimitiveFieldType { * {@inheritDoc} */ @Override + @Deprecated public LegacyNumericType getNumericType() { return LegacyNumericType.INT; } + + /** + * {@inheritDoc} + */ + @Override + public NumberType getNumberType() { + return NumberType.INTEGER; + } /** * {@inheritDoc} diff --git a/solr/core/src/java/org/apache/solr/schema/FieldType.java b/solr/core/src/java/org/apache/solr/schema/FieldType.java index 54f882f178b..7f4400021a3 100644 --- a/solr/core/src/java/org/apache/solr/schema/FieldType.java +++ b/solr/core/src/java/org/apache/solr/schema/FieldType.java @@ -616,10 +616,21 @@ public abstract class FieldType extends FieldProperties { /** Return the numeric type of this field, or null if this field is not a - * numeric field. */ + * numeric field. + * @deprecated Please use {@link FieldType#getNumberType()} instead + */ + @Deprecated public LegacyNumericType getNumericType() { return null; } + + /** + * Return the numeric type of this field, or null if this field is not a + * numeric field. + */ + public NumberType getNumberType() { + return null; + } /** * Sets the Similarity used when scoring fields of this type diff --git a/solr/core/src/java/org/apache/solr/schema/NumberType.java b/solr/core/src/java/org/apache/solr/schema/NumberType.java new file mode 100644 index 00000000000..2253d671bbc --- /dev/null +++ b/solr/core/src/java/org/apache/solr/schema/NumberType.java @@ -0,0 +1,25 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF 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.apache.solr.schema; + +public enum NumberType { + INTEGER, + LONG, + FLOAT, + DOUBLE, + DATE +} diff --git a/solr/core/src/java/org/apache/solr/schema/NumericFieldType.java b/solr/core/src/java/org/apache/solr/schema/NumericFieldType.java index 2d5412f04f2..44066a2c7a7 100644 --- a/solr/core/src/java/org/apache/solr/schema/NumericFieldType.java +++ b/solr/core/src/java/org/apache/solr/schema/NumericFieldType.java @@ -28,20 +28,13 @@ import org.apache.solr.util.DateMathParser; public abstract class NumericFieldType extends PrimitiveFieldType { - public static enum NumberType { - INTEGER, - LONG, - FLOAT, - DOUBLE, - DATE - } - protected NumberType type; /** * @return the type of this field */ - final public NumberType getType() { + @Override + public NumberType getNumberType() { return type; } @@ -58,7 +51,7 @@ public abstract class NumericFieldType extends PrimitiveFieldType { boolean minInclusive, boolean maxInclusive) { assert field.hasDocValues() && !field.multiValued(); - switch (getType()) { + switch (getNumberType()) { case INTEGER: return numericDocValuesRangeQuery(field.getName(), min == null ? null : (long) Integer.parseInt(min), @@ -87,18 +80,18 @@ public abstract class NumericFieldType extends PrimitiveFieldType { Query query; String fieldName = sf.getName(); - Number minVal = min == null ? null : getType() == NumberType.FLOAT ? Float.parseFloat(min): Double.parseDouble(min); - Number maxVal = max == null ? null : getType() == NumberType.FLOAT ? Float.parseFloat(max): Double.parseDouble(max); + Number minVal = min == null ? null : getNumberType() == NumberType.FLOAT ? Float.parseFloat(min): Double.parseDouble(min); + Number maxVal = max == null ? null : getNumberType() == NumberType.FLOAT ? Float.parseFloat(max): Double.parseDouble(max); Long minBits = - min == null ? null : getType() == NumberType.FLOAT ? (long) Float.floatToIntBits(minVal.floatValue()): Double.doubleToLongBits(minVal.doubleValue()); + min == null ? null : getNumberType() == NumberType.FLOAT ? (long) Float.floatToIntBits(minVal.floatValue()): Double.doubleToLongBits(minVal.doubleValue()); Long maxBits = - max == null ? null : getType() == NumberType.FLOAT ? (long) Float.floatToIntBits(maxVal.floatValue()): Double.doubleToLongBits(maxVal.doubleValue()); + max == null ? null : getNumberType() == NumberType.FLOAT ? (long) Float.floatToIntBits(maxVal.floatValue()): Double.doubleToLongBits(maxVal.doubleValue()); - long negativeInfinityBits = getType() == NumberType.FLOAT ? FLOAT_NEGATIVE_INFINITY_BITS : DOUBLE_NEGATIVE_INFINITY_BITS; - long positiveInfinityBits = getType() == NumberType.FLOAT ? FLOAT_POSITIVE_INFINITY_BITS : DOUBLE_POSITIVE_INFINITY_BITS; - long minusZeroBits = getType() == NumberType.FLOAT ? FLOAT_MINUS_ZERO_BITS : DOUBLE_MINUS_ZERO_BITS; - long zeroBits = getType() == NumberType.FLOAT ? FLOAT_ZERO_BITS : DOUBLE_ZERO_BITS; + long negativeInfinityBits = getNumberType() == NumberType.FLOAT ? FLOAT_NEGATIVE_INFINITY_BITS : DOUBLE_NEGATIVE_INFINITY_BITS; + long positiveInfinityBits = getNumberType() == NumberType.FLOAT ? FLOAT_POSITIVE_INFINITY_BITS : DOUBLE_POSITIVE_INFINITY_BITS; + long minusZeroBits = getNumberType() == NumberType.FLOAT ? FLOAT_MINUS_ZERO_BITS : DOUBLE_MINUS_ZERO_BITS; + long zeroBits = getNumberType() == NumberType.FLOAT ? FLOAT_ZERO_BITS : DOUBLE_ZERO_BITS; // If min is negative (or -0d) and max is positive (or +0d), then issue a FunctionRangeQuery if ((minVal == null || minVal.doubleValue() < 0d || minBits == minusZeroBits) && diff --git a/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java b/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java index f6bb782e515..b4b3d2be774 100644 --- a/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java +++ b/solr/core/src/java/org/apache/solr/schema/SpatialPointVectorFieldType.java @@ -80,14 +80,20 @@ public class SpatialPointVectorFieldType extends AbstractSpatialFieldType calcFacets() throws IOException { - if (sf.getType().getNumericType() != null) { + if (sf.getType().getNumberType() != null) { calc = FacetRangeProcessor.getNumericCalc(sf); } else { calc = new TermOrdCalc(); // kind of a hack diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java b/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java index 900bbf7bd3d..276af5fffed 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java +++ b/solr/core/src/java/org/apache/solr/search/facet/FacetRange.java @@ -119,9 +119,7 @@ class FacetRangeProcessor extends FacetProcessor { final FieldType ft = sf.getType(); if (ft instanceof TrieField) { - final TrieField trie = (TrieField)ft; - - switch (trie.getType()) { + switch (ft.getNumberType()) { case FLOAT: calc = new FloatCalc(sf); break; @@ -143,9 +141,8 @@ class FacetRangeProcessor extends FacetProcessor { "Expected numeric field type :" + sf); } } else if (ft instanceof PointField) { - final PointField pfield = (PointField)ft; - - switch (pfield.getType()) { + // TODO, this is the same in Trie and Point now + switch (ft.getNumberType()) { case FLOAT: calc = new FloatCalc(sf); break; @@ -179,9 +176,7 @@ class FacetRangeProcessor extends FacetProcessor { final FieldType ft = sf.getType(); if (ft instanceof TrieField) { - final TrieField trie = (TrieField)ft; - - switch (trie.getType()) { + switch (ft.getNumberType()) { case FLOAT: calc = new FloatCalc(sf); break; diff --git a/solr/core/src/java/org/apache/solr/search/facet/HLLAgg.java b/solr/core/src/java/org/apache/solr/search/facet/HLLAgg.java index 72cdd279122..28c95e86e96 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/HLLAgg.java +++ b/solr/core/src/java/org/apache/solr/search/facet/HLLAgg.java @@ -57,7 +57,7 @@ public class HLLAgg extends StrAggValueSource { return new UniqueMultivaluedSlotAcc(fcontext, getArg(), numSlots, fcontext.isShard() ? factory : null); } } else { - if (sf.getType().getNumericType() != null) { + if (sf.getType().getNumberType() != null) { // always use hll here since we don't know how many values there are? return new NumericAcc(fcontext, getArg(), numSlots); } else { diff --git a/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java b/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java index a18eb0fbeb6..5e1e97c900b 100644 --- a/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java +++ b/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java @@ -48,7 +48,7 @@ public class UniqueAgg extends StrAggValueSource { return new UniqueMultivaluedSlotAcc(fcontext, getArg(), numSlots, null); } } else { - if (sf.getType().getNumericType() != null) { + if (sf.getType().getNumberType() != null) { return new NumericAcc(fcontext, getArg(), numSlots); } else { return new UniqueSinglevaluedSlotAcc(fcontext, getArg(), numSlots, null); diff --git a/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java b/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java index 756a1a69058..4637df64517 100644 --- a/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java +++ b/solr/core/src/java/org/apache/solr/search/function/OrdFieldSource.java @@ -77,7 +77,7 @@ public class OrdFieldSource extends ValueSource { if (o instanceof SolrIndexSearcher) { SolrIndexSearcher is = (SolrIndexSearcher) o; SchemaField sf = is.getSchema().getFieldOrNull(field); - if (sf != null && sf.hasDocValues() == false && sf.multiValued() == false && sf.getType().getNumericType() != null) { + if (sf != null && sf.hasDocValues() == false && sf.multiValued() == false && sf.getType().getNumberType() != null) { // it's a single-valued numeric field: we must currently create insanity :( List leaves = is.getIndexReader().leaves(); LeafReader insaneLeaves[] = new LeafReader[leaves.size()]; diff --git a/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java b/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java index 3ed13f032f5..f379913184b 100644 --- a/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java +++ b/solr/core/src/java/org/apache/solr/search/function/ReverseOrdFieldSource.java @@ -77,7 +77,7 @@ public class ReverseOrdFieldSource extends ValueSource { if (o instanceof SolrIndexSearcher) { SolrIndexSearcher is = (SolrIndexSearcher) o; SchemaField sf = is.getSchema().getFieldOrNull(field); - if (sf != null && sf.hasDocValues() == false && sf.multiValued() == false && sf.getType().getNumericType() != null) { + if (sf != null && sf.hasDocValues() == false && sf.multiValued() == false && sf.getType().getNumberType() != null) { // it's a single-valued numeric field: we must currently create insanity :( List leaves = is.getIndexReader().leaves(); LeafReader insaneLeaves[] = new LeafReader[leaves.size()]; diff --git a/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java b/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java index 9b0b60c72b0..2dd2291def8 100644 --- a/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java +++ b/solr/core/src/java/org/apache/solr/search/grouping/CommandHandler.java @@ -172,7 +172,7 @@ public class CommandHandler { FieldType fieldType = sf.getType(); final AllGroupHeadsCollector allGroupHeadsCollector; - if (fieldType.getNumericType() != null) { + if (fieldType.getNumberType() != null) { ValueSource vs = fieldType.getValueSource(sf, null); allGroupHeadsCollector = new FunctionAllGroupHeadsCollector(vs, new HashMap(), firstCommand.getSortWithinGroup()); } else { diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/GroupConverter.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/GroupConverter.java index a9849d58067..0a21a624118 100644 --- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/GroupConverter.java +++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/GroupConverter.java @@ -33,8 +33,8 @@ import org.apache.lucene.util.mutable.MutableValueFloat; import org.apache.lucene.util.mutable.MutableValueInt; import org.apache.lucene.util.mutable.MutableValueLong; import org.apache.solr.schema.FieldType; +import org.apache.solr.schema.NumberType; import org.apache.solr.schema.SchemaField; -import org.apache.solr.schema.TrieField; /** * this is a transition class: for numeric types we use function-based distributed grouping, @@ -70,7 +70,7 @@ class GroupConverter { for (SearchGroup original : values) { SearchGroup converted = new SearchGroup(); converted.sortValues = original.sortValues; // ? - TrieField.NumberType type = ((TrieField)fieldType).getType(); + NumberType type = fieldType.getNumberType(); final MutableValue v; switch (type) { case INTEGER: diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java index 46f8009d297..d5f9f9da3c6 100644 --- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java +++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/SearchGroupsFieldCommand.java @@ -96,7 +96,7 @@ public class SearchGroupsFieldCommand implements Command collectors = new ArrayList<>(2); final FieldType fieldType = field.getType(); if (topNGroups > 0) { - if (fieldType.getNumericType() != null) { + if (fieldType.getNumberType() != null) { ValueSource vs = fieldType.getValueSource(field, null); firstPassGroupingCollector = new FunctionFirstPassGroupingCollector(vs, new HashMap(), groupSort, topNGroups); } else { @@ -105,7 +105,7 @@ public class SearchGroupsFieldCommand implements Command()); } else { @@ -120,7 +120,7 @@ public class SearchGroupsFieldCommand implements Command> topGroups; if (firstPassGroupingCollector != null) { - if (field.getType().getNumericType() != null) { + if (field.getType().getNumberType() != null) { topGroups = GroupConverter.fromMutable(field, firstPassGroupingCollector.getTopGroups(0, true)); } else { topGroups = firstPassGroupingCollector.getTopGroups(0, true); diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/TopGroupsFieldCommand.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/TopGroupsFieldCommand.java index 0bdb0ed5526..2c6c40148af 100644 --- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/TopGroupsFieldCommand.java +++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/command/TopGroupsFieldCommand.java @@ -132,7 +132,7 @@ public class TopGroupsFieldCommand implements Command> { final List collectors = new ArrayList<>(1); final FieldType fieldType = field.getType(); - if (fieldType.getNumericType() != null) { + if (fieldType.getNumberType() != null) { ValueSource vs = fieldType.getValueSource(field, null); Collection> v = GroupConverter.toMutable(field, firstPhaseGroups); secondPassCollector = new FunctionSecondPassGroupingCollector( @@ -155,7 +155,7 @@ public class TopGroupsFieldCommand implements Command> { } FieldType fieldType = field.getType(); - if (fieldType.getNumericType() != null) { + if (fieldType.getNumberType() != null) { return GroupConverter.fromMutable(field, secondPassCollector.getTopGroups(0)); } else { return secondPassCollector.getTopGroups(0); diff --git a/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java b/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java index 945047b097a..5975f8fb541 100644 --- a/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java +++ b/solr/core/src/java/org/apache/solr/search/mlt/CloudMLTQParser.java @@ -190,7 +190,7 @@ public class CloudMLTQParser extends QParser { } private Query createIdQuery(String defaultField, String uniqueValue) { - return new TermQuery(req.getSchema().getField(defaultField).getType().getNumericType() != null + return new TermQuery(req.getSchema().getField(defaultField).getType().getNumberType() != null ? createNumericTerm(defaultField, uniqueValue) : new Term(defaultField, uniqueValue)); } diff --git a/solr/core/src/java/org/apache/solr/search/mlt/SimpleMLTQParser.java b/solr/core/src/java/org/apache/solr/search/mlt/SimpleMLTQParser.java index de6eb58286b..dea161dbb00 100644 --- a/solr/core/src/java/org/apache/solr/search/mlt/SimpleMLTQParser.java +++ b/solr/core/src/java/org/apache/solr/search/mlt/SimpleMLTQParser.java @@ -101,7 +101,7 @@ public class SimpleMLTQParser extends QParser { ArrayList fields = new ArrayList(); for (String fieldName : fieldDefinitions.keySet()) { if (fieldDefinitions.get(fieldName).indexed() && fieldDefinitions.get(fieldName).stored()) - if (fieldDefinitions.get(fieldName).getType().getNumericType() == null) + if (fieldDefinitions.get(fieldName).getType().getNumberType() == null) fields.add(fieldName); } fieldNames = fields.toArray(new String[0]); @@ -150,7 +150,7 @@ public class SimpleMLTQParser extends QParser { } private Query createIdQuery(String defaultField, String uniqueValue) { - return new TermQuery(req.getSchema().getField(defaultField).getType().getNumericType() != null + return new TermQuery(req.getSchema().getField(defaultField).getType().getNumberType() != null ? createNumericTerm(defaultField, uniqueValue) : new Term(defaultField, uniqueValue)); } diff --git a/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java b/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java index d08892481f0..dc0f5c25186 100644 --- a/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java +++ b/solr/core/src/test/org/apache/solr/TestRandomDVFaceting.java @@ -163,7 +163,7 @@ public class TestRandomDVFaceting extends SolrTestCaseJ4 { SchemaField sf = req.getSchema().getField(ftype.fname); boolean multiValued = sf.getType().multiValuedFieldCache(); boolean indexed = sf.indexed(); - boolean numeric = sf.getType().getNumericType() != null; + boolean numeric = sf.getType().getNumberType() != null; int offset = 0; if (rand.nextInt(100) < 20) {