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);