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.index.IndexReader;
31 import org.apache.lucene.index.IndexWriter;
32 import org.apache.lucene.search.Filter;
33 import org.apache.lucene.search.NumericRangeFilter;
34 import org.apache.lucene.store.Directory;
35 import org.apache.lucene.xmlparser.ParserException;
36 import org.w3c.dom.Document;
37 import org.xml.sax.SAXException;
39 public class TestNumericRangeFilterBuilder extends LuceneTestCase {
41 public void testGetFilterHandleNumericParseErrorStrict() throws Exception {
42 NumericRangeFilterBuilder filterBuilder = new NumericRangeFilterBuilder();
43 filterBuilder.setStrictMode(true);
45 String xml = "<NumericRangeFilter fieldName='AGE' type='int' lowerTerm='-1' upperTerm='NaN'/>";
46 Document doc = getDocumentFromString(xml);
48 filterBuilder.getFilter(doc.getDocumentElement());
49 } catch (ParserException e) {
52 fail("Expected to throw " + ParserException.class);
55 public void testGetFilterHandleNumericParseError() throws Exception {
56 NumericRangeFilterBuilder filterBuilder = new NumericRangeFilterBuilder();
57 filterBuilder.setStrictMode(false);
59 String xml = "<NumericRangeFilter fieldName='AGE' type='int' lowerTerm='-1' upperTerm='NaN'/>";
60 Document doc = getDocumentFromString(xml);
61 Filter filter = filterBuilder.getFilter(doc.getDocumentElement());
62 Directory ramDir = newDirectory();
63 IndexWriter writer = new IndexWriter(ramDir, newIndexWriterConfig(TEST_VERSION_CURRENT, null));
67 IndexReader reader = IndexReader.open(ramDir, true);
70 assertNull(filter.getDocIdSet(reader));
85 public void testGetFilterInt() throws Exception {
86 NumericRangeFilterBuilder filterBuilder = new NumericRangeFilterBuilder();
87 filterBuilder.setStrictMode(true);
89 String xml = "<NumericRangeFilter fieldName='AGE' type='int' lowerTerm='-1' upperTerm='10'/>";
90 Document doc = getDocumentFromString(xml);
91 Filter filter = filterBuilder.getFilter(doc.getDocumentElement());
92 assertTrue(filter instanceof NumericRangeFilter<?>);
93 @SuppressWarnings("unchecked")
94 NumericRangeFilter<Integer> numRangeFilter = (NumericRangeFilter<Integer>) filter;
95 assertEquals(Integer.valueOf(-1), numRangeFilter.getMin());
96 assertEquals(Integer.valueOf(10), numRangeFilter.getMax());
97 assertEquals("AGE", numRangeFilter.getField());
98 assertTrue(numRangeFilter.includesMin());
99 assertTrue(numRangeFilter.includesMax());
101 String xml2 = "<NumericRangeFilter fieldName='AGE' type='int' lowerTerm='-1' upperTerm='10' includeUpper='false'/>";
102 Document doc2 = getDocumentFromString(xml2);
103 Filter filter2 = filterBuilder.getFilter(doc2.getDocumentElement());
104 assertTrue(filter2 instanceof NumericRangeFilter<?>);
105 @SuppressWarnings("unchecked")
106 NumericRangeFilter<Integer> numRangeFilter2 = (NumericRangeFilter) filter2;
107 assertEquals(Integer.valueOf(-1), numRangeFilter2.getMin());
108 assertEquals(Integer.valueOf(10), numRangeFilter2.getMax());
109 assertEquals("AGE", numRangeFilter2.getField());
110 assertTrue(numRangeFilter2.includesMin());
111 assertFalse(numRangeFilter2.includesMax());
114 public void testGetFilterLong() throws Exception {
115 NumericRangeFilterBuilder filterBuilder = new NumericRangeFilterBuilder();
116 filterBuilder.setStrictMode(true);
118 String xml = "<NumericRangeFilter fieldName='AGE' type='LoNg' lowerTerm='-2321' upperTerm='60000000'/>";
119 Document doc = getDocumentFromString(xml);
120 Filter filter = filterBuilder.getFilter(doc.getDocumentElement());
121 assertTrue(filter instanceof NumericRangeFilter<?>);
122 @SuppressWarnings("unchecked")
123 NumericRangeFilter<Long> numRangeFilter = (NumericRangeFilter) filter;
124 assertEquals(Long.valueOf(-2321L), numRangeFilter.getMin());
125 assertEquals(Long.valueOf(60000000L), numRangeFilter.getMax());
126 assertEquals("AGE", numRangeFilter.getField());
127 assertTrue(numRangeFilter.includesMin());
128 assertTrue(numRangeFilter.includesMax());
130 String xml2 = "<NumericRangeFilter fieldName='AGE' type='LoNg' lowerTerm='-2321' upperTerm='60000000' includeUpper='false'/>";
131 Document doc2 = getDocumentFromString(xml2);
132 Filter filter2 = filterBuilder.getFilter(doc2.getDocumentElement());
133 assertTrue(filter2 instanceof NumericRangeFilter<?>);
134 @SuppressWarnings("unchecked")
135 NumericRangeFilter<Long> numRangeFilter2 = (NumericRangeFilter) filter2;
136 assertEquals(Long.valueOf(-2321L), numRangeFilter2.getMin());
137 assertEquals(Long.valueOf(60000000L), numRangeFilter2.getMax());
138 assertEquals("AGE", numRangeFilter2.getField());
139 assertTrue(numRangeFilter2.includesMin());
140 assertFalse(numRangeFilter2.includesMax());
143 public void testGetFilterDouble() throws Exception {
144 NumericRangeFilterBuilder filterBuilder = new NumericRangeFilterBuilder();
145 filterBuilder.setStrictMode(true);
147 String xml = "<NumericRangeFilter fieldName='AGE' type='doubLe' lowerTerm='-23.21' upperTerm='60000.00023'/>";
148 Document doc = getDocumentFromString(xml);
150 Filter filter = filterBuilder.getFilter(doc.getDocumentElement());
151 assertTrue(filter instanceof NumericRangeFilter<?>);
152 @SuppressWarnings("unchecked")
153 NumericRangeFilter<Double> numRangeFilter = (NumericRangeFilter) filter;
154 assertEquals(Double.valueOf(-23.21d), numRangeFilter.getMin());
155 assertEquals(Double.valueOf(60000.00023d), numRangeFilter.getMax());
156 assertEquals("AGE", numRangeFilter.getField());
157 assertTrue(numRangeFilter.includesMin());
158 assertTrue(numRangeFilter.includesMax());
160 String xml2 = "<NumericRangeFilter fieldName='AGE' type='doubLe' lowerTerm='-23.21' upperTerm='60000.00023' includeUpper='false'/>";
161 Document doc2 = getDocumentFromString(xml2);
162 Filter filter2 = filterBuilder.getFilter(doc2.getDocumentElement());
163 assertTrue(filter2 instanceof NumericRangeFilter<?>);
164 @SuppressWarnings("unchecked")
165 NumericRangeFilter<Double> numRangeFilter2 = (NumericRangeFilter) filter2;
166 assertEquals(Double.valueOf(-23.21d), numRangeFilter2.getMin());
167 assertEquals(Double.valueOf(60000.00023d), numRangeFilter2.getMax());
168 assertEquals("AGE", numRangeFilter2.getField());
169 assertTrue(numRangeFilter2.includesMin());
170 assertFalse(numRangeFilter2.includesMax());
173 public void testGetFilterFloat() throws Exception {
174 NumericRangeFilterBuilder filterBuilder = new NumericRangeFilterBuilder();
175 filterBuilder.setStrictMode(true);
177 String xml = "<NumericRangeFilter fieldName='AGE' type='FLOAT' lowerTerm='-2.321432' upperTerm='32432.23'/>";
178 Document doc = getDocumentFromString(xml);
180 Filter filter = filterBuilder.getFilter(doc.getDocumentElement());
181 assertTrue(filter instanceof NumericRangeFilter<?>);
182 @SuppressWarnings("unchecked")
183 NumericRangeFilter<Float> numRangeFilter = (NumericRangeFilter) filter;
184 assertEquals(Float.valueOf(-2.321432f), numRangeFilter.getMin());
185 assertEquals(Float.valueOf(32432.23f), numRangeFilter.getMax());
186 assertEquals("AGE", numRangeFilter.getField());
187 assertTrue(numRangeFilter.includesMin());
188 assertTrue(numRangeFilter.includesMax());
190 String xml2 = "<NumericRangeFilter fieldName='AGE' type='FLOAT' lowerTerm='-2.321432' upperTerm='32432.23' includeUpper='false' precisionStep='2' />";
191 Document doc2 = getDocumentFromString(xml2);
193 Filter filter2 = filterBuilder.getFilter(doc2.getDocumentElement());
194 assertTrue(filter2 instanceof NumericRangeFilter<?>);
195 @SuppressWarnings("unchecked")
196 NumericRangeFilter<Float> numRangeFilter2 = (NumericRangeFilter) filter2;
197 assertEquals(Float.valueOf(-2.321432f), numRangeFilter2.getMin());
198 assertEquals(Float.valueOf(32432.23f), numRangeFilter2.getMax());
199 assertEquals("AGE", numRangeFilter2.getField());
200 assertTrue(numRangeFilter2.includesMin());
201 assertFalse(numRangeFilter2.includesMax());
204 private static Document getDocumentFromString(String str)
205 throws SAXException, IOException, ParserConfigurationException {
206 InputStream is = new ByteArrayInputStream(str.getBytes());
207 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
208 factory.setNamespaceAware(true);
209 DocumentBuilder builder = factory.newDocumentBuilder();
210 Document doc = builder.parse(is);