pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / contrib / queryparser / src / java / org / apache / lucene / queryParser / standard / builders / NumericRangeQueryNodeBuilder.java
1 package org.apache.lucene.queryParser.standard.builders;
2
3 /**
4  * Licensed to the Apache Software Foundation (ASF) under one or more
5  * contributor license agreements.  See the NOTICE file distributed with
6  * this work for additional information regarding copyright ownership.
7  * The ASF licenses this file to You under the Apache License, Version 2.0
8  * (the "License"); you may not use this file except in compliance with
9  * the License.  You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 import org.apache.lucene.document.NumericField;
21 import org.apache.lucene.messages.MessageImpl;
22 import org.apache.lucene.queryParser.core.QueryNodeException;
23 import org.apache.lucene.queryParser.core.messages.QueryParserMessages;
24 import org.apache.lucene.queryParser.core.nodes.QueryNode;
25 import org.apache.lucene.queryParser.core.util.StringUtils;
26 import org.apache.lucene.queryParser.standard.config.NumericConfig;
27 import org.apache.lucene.queryParser.standard.nodes.NumericQueryNode;
28 import org.apache.lucene.queryParser.standard.nodes.NumericRangeQueryNode;
29 import org.apache.lucene.search.NumericRangeQuery;
30
31 /**
32  * Builds {@link NumericRangeQuery}s out of {@link NumericRangeQueryNode}s.
33  *
34  * @see NumericRangeQuery
35  * @see NumericRangeQueryNode
36  */
37 public class NumericRangeQueryNodeBuilder implements StandardQueryBuilder {
38   
39   /**
40    * Constructs a {@link NumericRangeQueryNodeBuilder} object.
41    */
42   public NumericRangeQueryNodeBuilder() {
43   // empty constructor
44   }
45   
46   public NumericRangeQuery<? extends Number> build(QueryNode queryNode)
47       throws QueryNodeException {
48     NumericRangeQueryNode numericRangeNode = (NumericRangeQueryNode) queryNode;
49     
50     NumericQueryNode lowerNumericNode = numericRangeNode.getLowerBound();
51     NumericQueryNode upperNumericNode = numericRangeNode.getUpperBound();
52     
53     Number lowerNumber, upperNumber;
54     
55     if (lowerNumericNode != null) {
56       lowerNumber = lowerNumericNode.getValue();
57     } else {
58       lowerNumber = null;
59     }
60     
61     if (upperNumericNode != null) {
62       upperNumber = upperNumericNode.getValue();
63     } else {
64       upperNumber = null;
65     }
66     
67     NumericConfig numericConfig = numericRangeNode.getNumericConfig();
68     NumericField.DataType numberType = numericConfig.getType();
69     String field = StringUtils.toString(numericRangeNode.getField());
70     boolean minInclusive = numericRangeNode.isLowerInclusive();
71     boolean maxInclusive = numericRangeNode.isUpperInclusive();
72     int precisionStep = numericConfig.getPrecisionStep();
73     
74     switch (numberType) {
75       
76       case LONG:
77         return NumericRangeQuery.newLongRange(field, precisionStep,
78             (Long) lowerNumber, (Long) upperNumber, minInclusive, maxInclusive);
79       
80       case INT:
81         return NumericRangeQuery.newIntRange(field, precisionStep,
82             (Integer) lowerNumber, (Integer) upperNumber, minInclusive,
83             maxInclusive);
84       
85       case FLOAT:
86         return NumericRangeQuery.newFloatRange(field, precisionStep,
87             (Float) lowerNumber, (Float) upperNumber, minInclusive,
88             maxInclusive);
89       
90       case DOUBLE:
91         return NumericRangeQuery.newDoubleRange(field, precisionStep,
92             (Double) lowerNumber, (Double) upperNumber, minInclusive,
93             maxInclusive);
94         
95         default :
96           throw new QueryNodeException(new MessageImpl(
97             QueryParserMessages.UNSUPPORTED_NUMERIC_DATA_TYPE, numberType));
98         
99     }
100   }
101   
102 }