1 package org.apache.lucene.xmlparser.builders;
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 import java.io.ByteArrayInputStream;
21 import java.io.IOException;
22 import java.io.InputStream;
24 import javax.xml.parsers.DocumentBuilder;
25 import javax.xml.parsers.DocumentBuilderFactory;
26 import javax.xml.parsers.ParserConfigurationException;
28 import org.apache.lucene.util.LuceneTestCase;
30 import org.apache.lucene.search.NumericRangeQuery;
31 import org.apache.lucene.search.Query;
32 import org.apache.lucene.xmlparser.ParserException;
33 import org.w3c.dom.Document;
34 import org.xml.sax.SAXException;
36 public class TestNumericRangeQueryBuilder extends LuceneTestCase {
38 public void testGetFilterHandleNumericParseErrorStrict() throws Exception {
39 NumericRangeQueryBuilder filterBuilder = new NumericRangeQueryBuilder();
41 String xml = "<NumericRangeQuery fieldName='AGE' type='int' lowerTerm='-1' upperTerm='NaN'/>";
42 Document doc = getDocumentFromString(xml);
44 filterBuilder.getQuery(doc.getDocumentElement());
45 } catch (ParserException e) {
48 fail("Expected to throw " + ParserException.class);
51 public void testGetFilterInt() throws Exception {
52 NumericRangeQueryBuilder filterBuilder = new NumericRangeQueryBuilder();
54 String xml = "<NumericRangeQuery fieldName='AGE' type='int' lowerTerm='-1' upperTerm='10'/>";
55 Document doc = getDocumentFromString(xml);
56 Query filter = filterBuilder.getQuery(doc.getDocumentElement());
57 assertTrue(filter instanceof NumericRangeQuery<?>);
58 @SuppressWarnings("unchecked")
59 NumericRangeQuery<Integer> numRangeFilter = (NumericRangeQuery<Integer>) filter;
60 assertEquals(Integer.valueOf(-1), numRangeFilter.getMin());
61 assertEquals(Integer.valueOf(10), numRangeFilter.getMax());
62 assertEquals("AGE", numRangeFilter.getField());
63 assertTrue(numRangeFilter.includesMin());
64 assertTrue(numRangeFilter.includesMax());
66 String xml2 = "<NumericRangeQuery fieldName='AGE' type='int' lowerTerm='-1' upperTerm='10' includeUpper='false'/>";
67 Document doc2 = getDocumentFromString(xml2);
68 Query filter2 = filterBuilder.getQuery(doc2.getDocumentElement());
69 assertTrue(filter2 instanceof NumericRangeQuery<?>);
70 @SuppressWarnings("unchecked")
71 NumericRangeQuery<Integer> numRangeFilter2 = (NumericRangeQuery) filter2;
72 assertEquals(Integer.valueOf(-1), numRangeFilter2.getMin());
73 assertEquals(Integer.valueOf(10), numRangeFilter2.getMax());
74 assertEquals("AGE", numRangeFilter2.getField());
75 assertTrue(numRangeFilter2.includesMin());
76 assertFalse(numRangeFilter2.includesMax());
79 public void testGetFilterLong() throws Exception {
80 NumericRangeQueryBuilder filterBuilder = new NumericRangeQueryBuilder();
82 String xml = "<NumericRangeQuery fieldName='AGE' type='LoNg' lowerTerm='-2321' upperTerm='60000000'/>";
83 Document doc = getDocumentFromString(xml);
84 Query filter = filterBuilder.getQuery(doc.getDocumentElement());
85 assertTrue(filter instanceof NumericRangeQuery<?>);
86 @SuppressWarnings("unchecked")
87 NumericRangeQuery<Long> numRangeFilter = (NumericRangeQuery) filter;
88 assertEquals(Long.valueOf(-2321L), numRangeFilter.getMin());
89 assertEquals(Long.valueOf(60000000L), numRangeFilter.getMax());
90 assertEquals("AGE", numRangeFilter.getField());
91 assertTrue(numRangeFilter.includesMin());
92 assertTrue(numRangeFilter.includesMax());
94 String xml2 = "<NumericRangeQuery fieldName='AGE' type='LoNg' lowerTerm='-2321' upperTerm='60000000' includeUpper='false'/>";
95 Document doc2 = getDocumentFromString(xml2);
96 Query filter2 = filterBuilder.getQuery(doc2.getDocumentElement());
97 assertTrue(filter2 instanceof NumericRangeQuery<?>);
98 @SuppressWarnings("unchecked")
99 NumericRangeQuery<Long> numRangeFilter2 = (NumericRangeQuery) filter2;
100 assertEquals(Long.valueOf(-2321L), numRangeFilter2.getMin());
101 assertEquals(Long.valueOf(60000000L), numRangeFilter2.getMax());
102 assertEquals("AGE", numRangeFilter2.getField());
103 assertTrue(numRangeFilter2.includesMin());
104 assertFalse(numRangeFilter2.includesMax());
107 public void testGetFilterDouble() throws Exception {
108 NumericRangeQueryBuilder filterBuilder = new NumericRangeQueryBuilder();
110 String xml = "<NumericRangeQuery fieldName='AGE' type='doubLe' lowerTerm='-23.21' upperTerm='60000.00023'/>";
111 Document doc = getDocumentFromString(xml);
113 Query filter = filterBuilder.getQuery(doc.getDocumentElement());
114 assertTrue(filter instanceof NumericRangeQuery<?>);
115 @SuppressWarnings("unchecked")
116 NumericRangeQuery<Double> numRangeFilter = (NumericRangeQuery) filter;
117 assertEquals(Double.valueOf(-23.21d), numRangeFilter.getMin());
118 assertEquals(Double.valueOf(60000.00023d), numRangeFilter.getMax());
119 assertEquals("AGE", numRangeFilter.getField());
120 assertTrue(numRangeFilter.includesMin());
121 assertTrue(numRangeFilter.includesMax());
123 String xml2 = "<NumericRangeQuery fieldName='AGE' type='doubLe' lowerTerm='-23.21' upperTerm='60000.00023' includeUpper='false'/>";
124 Document doc2 = getDocumentFromString(xml2);
125 Query filter2 = filterBuilder.getQuery(doc2.getDocumentElement());
126 assertTrue(filter2 instanceof NumericRangeQuery<?>);
127 @SuppressWarnings("unchecked")
128 NumericRangeQuery<Double> numRangeFilter2 = (NumericRangeQuery) filter2;
129 assertEquals(Double.valueOf(-23.21d), numRangeFilter2.getMin());
130 assertEquals(Double.valueOf(60000.00023d), numRangeFilter2.getMax());
131 assertEquals("AGE", numRangeFilter2.getField());
132 assertTrue(numRangeFilter2.includesMin());
133 assertFalse(numRangeFilter2.includesMax());
136 public void testGetFilterFloat() throws Exception {
137 NumericRangeQueryBuilder filterBuilder = new NumericRangeQueryBuilder();
139 String xml = "<NumericRangeQuery fieldName='AGE' type='FLOAT' lowerTerm='-2.321432' upperTerm='32432.23'/>";
140 Document doc = getDocumentFromString(xml);
142 Query filter = filterBuilder.getQuery(doc.getDocumentElement());
143 assertTrue(filter instanceof NumericRangeQuery<?>);
144 @SuppressWarnings("unchecked")
145 NumericRangeQuery<Float> numRangeFilter = (NumericRangeQuery) filter;
146 assertEquals(Float.valueOf(-2.321432f), numRangeFilter.getMin());
147 assertEquals(Float.valueOf(32432.23f), numRangeFilter.getMax());
148 assertEquals("AGE", numRangeFilter.getField());
149 assertTrue(numRangeFilter.includesMin());
150 assertTrue(numRangeFilter.includesMax());
152 String xml2 = "<NumericRangeQuery fieldName='AGE' type='FLOAT' lowerTerm='-2.321432' upperTerm='32432.23' includeUpper='false' precisionStep='2' />";
153 Document doc2 = getDocumentFromString(xml2);
155 Query filter2 = filterBuilder.getQuery(doc2.getDocumentElement());
156 assertTrue(filter2 instanceof NumericRangeQuery<?>);
157 @SuppressWarnings("unchecked")
158 NumericRangeQuery<Float> numRangeFilter2 = (NumericRangeQuery) filter2;
159 assertEquals(Float.valueOf(-2.321432f), numRangeFilter2.getMin());
160 assertEquals(Float.valueOf(32432.23f), numRangeFilter2.getMax());
161 assertEquals("AGE", numRangeFilter2.getField());
162 assertTrue(numRangeFilter2.includesMin());
163 assertFalse(numRangeFilter2.includesMax());
166 private static Document getDocumentFromString(String str)
167 throws SAXException, IOException, ParserConfigurationException {
168 InputStream is = new ByteArrayInputStream(str.getBytes());
169 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
170 factory.setNamespaceAware(true);
171 DocumentBuilder builder = factory.newDocumentBuilder();
172 Document doc = builder.parse(is);