diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/package-info.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/package-info.java
index c9d55eab12c..23c72a1ada9 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/package-info.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/core/nodes/package-info.java
@@ -52,14 +52,14 @@
*
FuzzyQueryNode - fuzzy node
* TermRangeQueryNode - used for parametric field:[low_value TO high_value]
* ProximityQueryNode - used for proximity search
- * NumericRangeQueryNode - used for numeric range search
+ * LegacyNumericRangeQueryNode - used for numeric range search
* TokenizedPhraseQueryNode - used by tokenizers/lemmatizers/analyzers for phrases/autophrases
*
*
* Leaf Nodes:
*
* - FieldQueryNode - field/value node
- * - NumericQueryNode - used for numeric search
+ * - LegacyNumericQueryNode - used for numeric search
* - PathQueryNode - {@link org.apache.lucene.queryparser.flexible.core.nodes.QueryNode} object used with path-like queries
* - OpaqueQueryNode - Used as for part of the query that can be parsed by other parsers. schema/value
* - PrefixWildcardQueryNode - non-phrase wildcard query
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java
index ada65a4ca7a..2774cf091ff 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/StandardQueryParser.java
@@ -29,7 +29,8 @@ import org.apache.lucene.queryparser.flexible.core.QueryParserHelper;
import org.apache.lucene.queryparser.flexible.core.config.QueryConfigHandler;
import org.apache.lucene.queryparser.flexible.standard.builders.StandardQueryTreeBuilder;
import org.apache.lucene.queryparser.flexible.standard.config.FuzzyConfig;
-import org.apache.lucene.queryparser.flexible.standard.config.NumericConfig;
+import org.apache.lucene.queryparser.flexible.standard.config.LegacyNumericConfig;
+import org.apache.lucene.queryparser.flexible.standard.config.PointsConfig;
import org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfigHandler;
import org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfigHandler.ConfigurationKeys;
import org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfigHandler.Operator;
@@ -322,12 +323,30 @@ public class StandardQueryParser extends QueryParserHelper implements CommonQuer
}
- public void setNumericConfigMap(Map numericConfigMap) {
- getQueryConfigHandler().set(ConfigurationKeys.NUMERIC_CONFIG_MAP, numericConfigMap);
+ /**
+ * Sets field configuration for legacy numeric fields
+ * @deprecated Index with points instead and use {@link #setPointsConfigMap(Map)}
+ */
+ @Deprecated
+ public void setLegacyNumericConfigMap(Map legacyNumericConfigMap) {
+ getQueryConfigHandler().set(ConfigurationKeys.LEGACY_NUMERIC_CONFIG_MAP, legacyNumericConfigMap);
}
- public Map getNumericConfigMap() {
- return getQueryConfigHandler().get(ConfigurationKeys.NUMERIC_CONFIG_MAP);
+ /**
+ * Gets field configuration for legacy numeric fields
+ * @deprecated Index with points instead and use {@link #getPointsConfigMap()}
+ */
+ @Deprecated
+ public Map getLegacyNumericConfigMap() {
+ return getQueryConfigHandler().get(ConfigurationKeys.LEGACY_NUMERIC_CONFIG_MAP);
+ }
+
+ public void setPointsConfigMap(Map pointsConfigMap) {
+ getQueryConfigHandler().set(ConfigurationKeys.POINTS_CONFIG_MAP, pointsConfigMap);
+ }
+
+ public Map getPointsConfigMap() {
+ return getQueryConfigHandler().get(ConfigurationKeys.POINTS_CONFIG_MAP);
}
/**
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/NumericRangeQueryNodeBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/LegacyNumericRangeQueryNodeBuilder.java
similarity index 75%
rename from lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/NumericRangeQueryNodeBuilder.java
rename to lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/LegacyNumericRangeQueryNodeBuilder.java
index 6c8790ff8f0..8ae7d5e2e43 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/NumericRangeQueryNodeBuilder.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/LegacyNumericRangeQueryNodeBuilder.java
@@ -22,38 +22,40 @@ import org.apache.lucene.queryparser.flexible.core.messages.QueryParserMessages;
import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode;
import org.apache.lucene.queryparser.flexible.core.util.StringUtils;
import org.apache.lucene.queryparser.flexible.messages.MessageImpl;
-import org.apache.lucene.queryparser.flexible.standard.config.NumericConfig;
-import org.apache.lucene.queryparser.flexible.standard.nodes.NumericQueryNode;
-import org.apache.lucene.queryparser.flexible.standard.nodes.NumericRangeQueryNode;
+import org.apache.lucene.queryparser.flexible.standard.config.LegacyNumericConfig;
+import org.apache.lucene.queryparser.flexible.standard.nodes.LegacyNumericQueryNode;
+import org.apache.lucene.queryparser.flexible.standard.nodes.LegacyNumericRangeQueryNode;
import org.apache.lucene.search.LegacyNumericRangeQuery;
/**
- * Builds {@link org.apache.lucene.search.LegacyNumericRangeQuery}s out of {@link NumericRangeQueryNode}s.
+ * Builds {@link org.apache.lucene.search.LegacyNumericRangeQuery}s out of {@link LegacyNumericRangeQueryNode}s.
*
* @see org.apache.lucene.search.LegacyNumericRangeQuery
- * @see NumericRangeQueryNode
+ * @see LegacyNumericRangeQueryNode
+ * @deprecated Index with points and use {@link PointRangeQueryNodeBuilder} instead.
*/
-public class NumericRangeQueryNodeBuilder implements StandardQueryBuilder {
+@Deprecated
+public class LegacyNumericRangeQueryNodeBuilder implements StandardQueryBuilder {
/**
- * Constructs a {@link NumericRangeQueryNodeBuilder} object.
+ * Constructs a {@link LegacyNumericRangeQueryNodeBuilder} object.
*/
- public NumericRangeQueryNodeBuilder() {
+ public LegacyNumericRangeQueryNodeBuilder() {
// empty constructor
}
@Override
public LegacyNumericRangeQuery extends Number> build(QueryNode queryNode)
throws QueryNodeException {
- NumericRangeQueryNode numericRangeNode = (NumericRangeQueryNode) queryNode;
+ LegacyNumericRangeQueryNode numericRangeNode = (LegacyNumericRangeQueryNode) queryNode;
- NumericQueryNode lowerNumericNode = numericRangeNode.getLowerBound();
- NumericQueryNode upperNumericNode = numericRangeNode.getUpperBound();
+ LegacyNumericQueryNode lowerNumericNode = numericRangeNode.getLowerBound();
+ LegacyNumericQueryNode upperNumericNode = numericRangeNode.getUpperBound();
Number lowerNumber = lowerNumericNode.getValue();
Number upperNumber = upperNumericNode.getValue();
- NumericConfig numericConfig = numericRangeNode.getNumericConfig();
+ LegacyNumericConfig numericConfig = numericRangeNode.getNumericConfig();
FieldType.LegacyNumericType numberType = numericConfig.getType();
String field = StringUtils.toString(numericRangeNode.getField());
boolean minInclusive = numericRangeNode.isLowerInclusive();
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/PointRangeQueryNodeBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/PointRangeQueryNodeBuilder.java
new file mode 100644
index 00000000000..0cce4bf94f2
--- /dev/null
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/PointRangeQueryNodeBuilder.java
@@ -0,0 +1,137 @@
+/*
+ * 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.lucene.queryparser.flexible.standard.builders;
+
+import org.apache.lucene.document.DoublePoint;
+import org.apache.lucene.document.FloatPoint;
+import org.apache.lucene.document.IntPoint;
+import org.apache.lucene.document.LongPoint;
+import org.apache.lucene.index.PointValues;
+import org.apache.lucene.queryparser.flexible.core.QueryNodeException;
+import org.apache.lucene.queryparser.flexible.core.messages.QueryParserMessages;
+import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode;
+import org.apache.lucene.queryparser.flexible.core.util.StringUtils;
+import org.apache.lucene.queryparser.flexible.messages.MessageImpl;
+import org.apache.lucene.queryparser.flexible.standard.config.PointsConfig;
+import org.apache.lucene.queryparser.flexible.standard.nodes.PointQueryNode;
+import org.apache.lucene.queryparser.flexible.standard.nodes.PointRangeQueryNode;
+import org.apache.lucene.search.Query;
+
+/**
+ * Builds {@link PointValues} range queries out of {@link PointRangeQueryNode}s.
+ *
+ * @see PointRangeQueryNode
+ */
+public class PointRangeQueryNodeBuilder implements StandardQueryBuilder {
+
+ /**
+ * Constructs a {@link PointRangeQueryNodeBuilder} object.
+ */
+ public PointRangeQueryNodeBuilder() {
+ // empty constructor
+ }
+
+ @Override
+ public Query build(QueryNode queryNode) throws QueryNodeException {
+ PointRangeQueryNode numericRangeNode = (PointRangeQueryNode) queryNode;
+
+ PointQueryNode lowerNumericNode = numericRangeNode.getLowerBound();
+ PointQueryNode upperNumericNode = numericRangeNode.getUpperBound();
+
+ Number lowerNumber = lowerNumericNode.getValue();
+ Number upperNumber = upperNumericNode.getValue();
+
+ PointsConfig pointsConfig = numericRangeNode.getPointsConfig();
+ Class extends Number> numberType = pointsConfig.getType();
+ String field = StringUtils.toString(numericRangeNode.getField());
+ boolean minInclusive = numericRangeNode.isLowerInclusive();
+ boolean maxInclusive = numericRangeNode.isUpperInclusive();
+
+ // TODO: push down cleaning up of crazy nulls and inclusive/exclusive elsewhere
+ if (Integer.class.equals(numberType)) {
+ Integer lower = (Integer) lowerNumber;
+ if (lower == null) {
+ lower = Integer.MIN_VALUE;
+ }
+ if (minInclusive == false) {
+ lower = lower + 1;
+ }
+
+ Integer upper = (Integer) upperNumber;
+ if (upper == null) {
+ upper = Integer.MAX_VALUE;
+ }
+ if (maxInclusive == false) {
+ upper = upper - 1;
+ }
+ return IntPoint.newRangeQuery(field, lower, upper);
+ } else if (Long.class.equals(numberType)) {
+ Long lower = (Long) lowerNumber;
+ if (lower == null) {
+ lower = Long.MIN_VALUE;
+ }
+ if (minInclusive == false) {
+ lower = lower + 1;
+ }
+
+ Long upper = (Long) upperNumber;
+ if (upper == null) {
+ upper = Long.MAX_VALUE;
+ }
+ if (maxInclusive == false) {
+ upper = upper - 1;
+ }
+ return LongPoint.newRangeQuery(field, lower, upper);
+ } else if (Float.class.equals(numberType)) {
+ Float lower = (Float) lowerNumber;
+ if (lower == null) {
+ lower = Float.NEGATIVE_INFINITY;
+ }
+ if (minInclusive == false) {
+ lower = Math.nextUp(lower);
+ }
+
+ Float upper = (Float) upperNumber;
+ if (upper == null) {
+ upper = Float.POSITIVE_INFINITY;
+ }
+ if (maxInclusive == false) {
+ upper = Math.nextDown(upper);
+ }
+ return FloatPoint.newRangeQuery(field, lower, upper);
+ } else if (Double.class.equals(numberType)) {
+ Double lower = (Double) lowerNumber;
+ if (lower == null) {
+ lower = Double.NEGATIVE_INFINITY;
+ }
+ if (minInclusive == false) {
+ lower = Math.nextUp(lower);
+ }
+
+ Double upper = (Double) upperNumber;
+ if (upper == null) {
+ upper = Double.POSITIVE_INFINITY;
+ }
+ if (maxInclusive == false) {
+ upper = Math.nextDown(upper);
+ }
+ return DoublePoint.newRangeQuery(field, lower, upper);
+ } else {
+ throw new QueryNodeException(new MessageImpl(QueryParserMessages.UNSUPPORTED_NUMERIC_DATA_TYPE, numberType));
+ }
+ }
+}
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/StandardQueryTreeBuilder.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/StandardQueryTreeBuilder.java
index 2d7c6434be8..360f6a7ff83 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/StandardQueryTreeBuilder.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/builders/StandardQueryTreeBuilder.java
@@ -30,8 +30,10 @@ import org.apache.lucene.queryparser.flexible.core.nodes.QueryNode;
import org.apache.lucene.queryparser.flexible.core.nodes.SlopQueryNode;
import org.apache.lucene.queryparser.flexible.core.nodes.TokenizedPhraseQueryNode;
import org.apache.lucene.queryparser.flexible.standard.nodes.MultiPhraseQueryNode;
-import org.apache.lucene.queryparser.flexible.standard.nodes.NumericQueryNode;
-import org.apache.lucene.queryparser.flexible.standard.nodes.NumericRangeQueryNode;
+import org.apache.lucene.queryparser.flexible.standard.nodes.PointQueryNode;
+import org.apache.lucene.queryparser.flexible.standard.nodes.PointRangeQueryNode;
+import org.apache.lucene.queryparser.flexible.standard.nodes.LegacyNumericQueryNode;
+import org.apache.lucene.queryparser.flexible.standard.nodes.LegacyNumericRangeQueryNode;
import org.apache.lucene.queryparser.flexible.standard.nodes.PrefixWildcardQueryNode;
import org.apache.lucene.queryparser.flexible.standard.nodes.TermRangeQueryNode;
import org.apache.lucene.queryparser.flexible.standard.nodes.RegexpQueryNode;
@@ -57,8 +59,10 @@ public class StandardQueryTreeBuilder extends QueryTreeBuilder implements
setBuilder(FieldQueryNode.class, new FieldQueryNodeBuilder());
setBuilder(BooleanQueryNode.class, new BooleanQueryNodeBuilder());
setBuilder(FuzzyQueryNode.class, new FuzzyQueryNodeBuilder());
- setBuilder(NumericQueryNode.class, new DummyQueryNodeBuilder());
- setBuilder(NumericRangeQueryNode.class, new NumericRangeQueryNodeBuilder());
+ setBuilder(LegacyNumericQueryNode.class, new DummyQueryNodeBuilder());
+ setBuilder(LegacyNumericRangeQueryNode.class, new LegacyNumericRangeQueryNodeBuilder());
+ setBuilder(PointQueryNode.class, new DummyQueryNodeBuilder());
+ setBuilder(PointRangeQueryNode.class, new PointRangeQueryNodeBuilder());
setBuilder(BoostQueryNode.class, new BoostQueryNodeBuilder());
setBuilder(ModifierQueryNode.class, new ModifierQueryNodeBuilder());
setBuilder(WildcardQueryNode.class, new WildcardQueryNodeBuilder());
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/NumericConfig.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/LegacyNumericConfig.java
similarity index 90%
rename from lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/NumericConfig.java
rename to lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/LegacyNumericConfig.java
index c457a4ebc46..985f55a616f 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/NumericConfig.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/LegacyNumericConfig.java
@@ -28,8 +28,10 @@ import org.apache.lucene.document.FieldType.LegacyNumericType;
*
* @see org.apache.lucene.search.LegacyNumericRangeQuery
* @see NumberFormat
+ * @deprecated Index with Points instead and use {@link PointsConfig}
*/
-public class NumericConfig {
+@Deprecated
+public class LegacyNumericConfig {
private int precisionStep;
@@ -38,7 +40,7 @@ public class NumericConfig {
private FieldType.LegacyNumericType type;
/**
- * Constructs a {@link NumericConfig} object.
+ * Constructs a {@link LegacyNumericConfig} object.
*
* @param precisionStep
* the precision used to index the numeric values
@@ -48,11 +50,11 @@ public class NumericConfig {
* @param type
* the numeric type used to index the numeric values
*
- * @see NumericConfig#setPrecisionStep(int)
- * @see NumericConfig#setNumberFormat(NumberFormat)
+ * @see LegacyNumericConfig#setPrecisionStep(int)
+ * @see LegacyNumericConfig#setNumberFormat(NumberFormat)
* @see #setType(org.apache.lucene.document.FieldType.LegacyNumericType)
*/
- public NumericConfig(int precisionStep, NumberFormat format,
+ public LegacyNumericConfig(int precisionStep, NumberFormat format,
LegacyNumericType type) {
setPrecisionStep(precisionStep);
setNumberFormat(format);
@@ -141,8 +143,8 @@ public class NumericConfig {
if (obj == this) return true;
- if (obj instanceof NumericConfig) {
- NumericConfig other = (NumericConfig) obj;
+ if (obj instanceof LegacyNumericConfig) {
+ LegacyNumericConfig other = (LegacyNumericConfig) obj;
if (this.precisionStep == other.precisionStep
&& this.type == other.type
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/NumericFieldConfigListener.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/LegacyNumericFieldConfigListener.java
similarity index 67%
rename from lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/NumericFieldConfigListener.java
rename to lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/LegacyNumericFieldConfigListener.java
index c28cf2c92df..f2d312489f6 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/NumericFieldConfigListener.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/LegacyNumericFieldConfigListener.java
@@ -25,25 +25,27 @@ import org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfi
/**
* This listener is used to listen to {@link FieldConfig} requests in
- * {@link QueryConfigHandler} and add {@link ConfigurationKeys#NUMERIC_CONFIG}
- * based on the {@link ConfigurationKeys#NUMERIC_CONFIG_MAP} set in the
+ * {@link QueryConfigHandler} and add {@link ConfigurationKeys#LEGACY_NUMERIC_CONFIG}
+ * based on the {@link ConfigurationKeys#LEGACY_NUMERIC_CONFIG_MAP} set in the
* {@link QueryConfigHandler}.
*
- * @see NumericConfig
+ * @see LegacyNumericConfig
* @see QueryConfigHandler
- * @see ConfigurationKeys#NUMERIC_CONFIG
- * @see ConfigurationKeys#NUMERIC_CONFIG_MAP
+ * @see ConfigurationKeys#LEGACY_NUMERIC_CONFIG
+ * @see ConfigurationKeys#LEGACY_NUMERIC_CONFIG_MAP
+ * @deprecated Index with Points instead and use {@link PointsConfigListener}
*/
-public class NumericFieldConfigListener implements FieldConfigListener {
+@Deprecated
+public class LegacyNumericFieldConfigListener implements FieldConfigListener {
final private QueryConfigHandler config;
/**
- * Construcs a {@link NumericFieldConfigListener} object using the given {@link QueryConfigHandler}.
+ * Constructs a {@link LegacyNumericFieldConfigListener} object using the given {@link QueryConfigHandler}.
*
* @param config the {@link QueryConfigHandler} it will listen too
*/
- public NumericFieldConfigListener(QueryConfigHandler config) {
+ public LegacyNumericFieldConfigListener(QueryConfigHandler config) {
if (config == null) {
throw new IllegalArgumentException("config cannot be null!");
@@ -55,15 +57,15 @@ public class NumericFieldConfigListener implements FieldConfigListener {
@Override
public void buildFieldConfig(FieldConfig fieldConfig) {
- Map numericConfigMap = config
- .get(ConfigurationKeys.NUMERIC_CONFIG_MAP);
+ Map numericConfigMap = config
+ .get(ConfigurationKeys.LEGACY_NUMERIC_CONFIG_MAP);
if (numericConfigMap != null) {
- NumericConfig numericConfig = numericConfigMap
+ LegacyNumericConfig numericConfig = numericConfigMap
.get(fieldConfig.getField());
if (numericConfig != null) {
- fieldConfig.set(ConfigurationKeys.NUMERIC_CONFIG, numericConfig);
+ fieldConfig.set(ConfigurationKeys.LEGACY_NUMERIC_CONFIG, numericConfig);
}
}
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/PointsConfig.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/PointsConfig.java
new file mode 100644
index 00000000000..db59b48123a
--- /dev/null
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/PointsConfig.java
@@ -0,0 +1,124 @@
+/*
+ * 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.lucene.queryparser.flexible.standard.config;
+
+import java.text.NumberFormat;
+
+import org.apache.lucene.index.PointValues;
+
+/**
+ * This class holds the configuration used to parse numeric queries and create
+ * {@link PointValues} queries.
+ *
+ * @see PointValues
+ * @see NumberFormat
+ */
+public class PointsConfig {
+
+ private NumberFormat format;
+
+ private Class extends Number> type;
+
+ /**
+ * Constructs a {@link PointsConfig} object.
+ *
+ * @param format
+ * the {@link NumberFormat} used to parse a {@link String} to
+ * {@link Number}
+ * @param type
+ * the numeric type used to index the numeric values
+ *
+ * @see PointsConfig#setNumberFormat(NumberFormat)
+ */
+ public PointsConfig(NumberFormat format, Class extends Number> type) {
+ setNumberFormat(format);
+ setType(type);
+ }
+
+ /**
+ * Returns the {@link NumberFormat} used to parse a {@link String} to
+ * {@link Number}
+ *
+ * @return the {@link NumberFormat} used to parse a {@link String} to
+ * {@link Number}
+ */
+ public NumberFormat getNumberFormat() {
+ return format;
+ }
+
+ /**
+ * Returns the numeric type used to index the numeric values
+ *
+ * @return the numeric type used to index the numeric values
+ */
+ public Class extends Number> getType() {
+ return type;
+ }
+
+ /**
+ * Sets the numeric type used to index the numeric values
+ *
+ * @param type the numeric type used to index the numeric values
+ */
+ public void setType(Class extends Number> type) {
+ if (type == null) {
+ throw new IllegalArgumentException("type cannot be null!");
+ }
+ if (Integer.class.equals(type) == false &&
+ Long.class.equals(type) == false &&
+ Float.class.equals(type) == false &&
+ Double.class.equals(type) == false) {
+ throw new IllegalArgumentException("unsupported numeric type: " + type);
+ }
+ this.type = type;
+ }
+
+ /**
+ * Sets the {@link NumberFormat} used to parse a {@link String} to
+ * {@link Number}
+ *
+ * @param format
+ * the {@link NumberFormat} used to parse a {@link String} to
+ * {@link Number}, cannot be null
+ */
+ public void setNumberFormat(NumberFormat format) {
+ if (format == null) {
+ throw new IllegalArgumentException("format cannot be null!");
+ }
+ this.format = format;
+ }
+
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + format.hashCode();
+ result = prime * result + type.hashCode();
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) return true;
+ if (obj == null) return false;
+ if (getClass() != obj.getClass()) return false;
+ PointsConfig other = (PointsConfig) obj;
+ if (!format.equals(other.format)) return false;
+ if (!type.equals(other.type)) return false;
+ return true;
+ }
+}
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/PointsConfigListener.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/PointsConfigListener.java
new file mode 100644
index 00000000000..9efbbb7e5a0
--- /dev/null
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/PointsConfigListener.java
@@ -0,0 +1,65 @@
+/*
+ * 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.lucene.queryparser.flexible.standard.config;
+
+import java.util.Map;
+
+import org.apache.lucene.queryparser.flexible.core.config.FieldConfig;
+import org.apache.lucene.queryparser.flexible.core.config.FieldConfigListener;
+import org.apache.lucene.queryparser.flexible.core.config.QueryConfigHandler;
+import org.apache.lucene.queryparser.flexible.standard.config.StandardQueryConfigHandler.ConfigurationKeys;
+
+/**
+ * This listener is used to listen to {@link FieldConfig} requests in
+ * {@link QueryConfigHandler} and add {@link ConfigurationKeys#POINTS_CONFIG}
+ * based on the {@link ConfigurationKeys#POINTS_CONFIG_MAP} set in the
+ * {@link QueryConfigHandler}.
+ *
+ * @see PointsConfig
+ * @see QueryConfigHandler
+ * @see ConfigurationKeys#POINTS_CONFIG
+ * @see ConfigurationKeys#POINTS_CONFIG_MAP
+ */
+public class PointsConfigListener implements FieldConfigListener {
+
+ final private QueryConfigHandler config;
+
+ /**
+ * Constructs a {@link PointsConfigListener} object using the given {@link QueryConfigHandler}.
+ *
+ * @param config the {@link QueryConfigHandler} it will listen too
+ */
+ public PointsConfigListener(QueryConfigHandler config) {
+ if (config == null) {
+ throw new IllegalArgumentException("config cannot be null!");
+ }
+ this.config = config;
+ }
+
+ @Override
+ public void buildFieldConfig(FieldConfig fieldConfig) {
+ Map pointsConfigMap = config.get(ConfigurationKeys.POINTS_CONFIG_MAP);
+
+ if (pointsConfigMap != null) {
+ PointsConfig pointsConfig = pointsConfigMap.get(fieldConfig.getField());
+
+ if (pointsConfig != null) {
+ fieldConfig.set(ConfigurationKeys.POINTS_CONFIG, pointsConfig);
+ }
+ }
+ }
+}
diff --git a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/StandardQueryConfigHandler.java b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/StandardQueryConfigHandler.java
index 77bd7bb639c..bba95eed91f 100644
--- a/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/StandardQueryConfigHandler.java
+++ b/lucene/queryparser/src/java/org/apache/lucene/queryparser/flexible/standard/config/StandardQueryConfigHandler.java
@@ -167,21 +167,41 @@ public class StandardQueryConfigHandler extends QueryConfigHandler {
final public static ConfigurationKey BOOST = ConfigurationKey.newInstance();
/**
- * Key used to set a field to its {@link NumericConfig}.
+ * Key used to set a field to its {@link LegacyNumericConfig}.
*
- * @see StandardQueryParser#setNumericConfigMap(Map)
- * @see StandardQueryParser#getNumericConfigMap()
+ * @see StandardQueryParser#setLegacyNumericConfigMap(Map)
+ * @see StandardQueryParser#getLegacyNumericConfigMap()
+ * @deprecated Index with Points instead and use {@link #POINTS_CONFIG}
*/
- final public static ConfigurationKey NUMERIC_CONFIG = ConfigurationKey.newInstance();
+ @Deprecated
+ final public static ConfigurationKey LEGACY_NUMERIC_CONFIG = ConfigurationKey.newInstance();
/**
- * Key used to set the {@link NumericConfig} in {@link FieldConfig} for numeric fields.
+ * Key used to set the {@link LegacyNumericConfig} in {@link FieldConfig} for numeric fields.
*
- * @see StandardQueryParser#setNumericConfigMap(Map)
- * @see StandardQueryParser#getNumericConfigMap()
+ * @see StandardQueryParser#setLegacyNumericConfigMap(Map)
+ * @see StandardQueryParser#getLegacyNumericConfigMap()
+ * @deprecated Index with Points instead and use {@link #POINTS_CONFIG_MAP}
*/
- final public static ConfigurationKey