blob: 4e150860a7ec85327579bdce510e462d714b2f52 [file] [log] [blame]
/*
* 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.search;
import java.io.IOException;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.DoubleRangeDocValuesField;
import org.apache.lucene.document.FloatRangeDocValuesField;
import org.apache.lucene.document.IntRangeDocValuesField;
import org.apache.lucene.document.LongRangeDocValuesField;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.RandomIndexWriter;
import org.apache.lucene.store.Directory;
import org.apache.lucene.util.LuceneTestCase;
public class TestRangeFieldsDocValuesQuery extends LuceneTestCase {
public void testDoubleRangeDocValuesIntersectsQuery() throws IOException {
Directory dir = newDirectory();
RandomIndexWriter iw = new RandomIndexWriter(random(), dir);
final int iters = atLeast(10);
double[] min = {112.7, 296.0, 512.4};
double[] max = {119.3, 314.8, 524.3};
for (int i = 0; i < iters; ++i) {
Document doc = new Document();
doc.add(new DoubleRangeDocValuesField("dv", min, max));
iw.addDocument(doc);
}
iw.commit();
double[] nonMatchingMin = {256.7, 296.0, 532.4};
double[] nonMatchingMax = {259.3, 364.8, 534.3};
Document doc = new Document();
doc.add(new DoubleRangeDocValuesField("dv", nonMatchingMin, nonMatchingMax));
iw.addDocument(doc);
iw.commit();
IndexReader reader = iw.getReader();
final IndexSearcher searcher = newSearcher(reader);
iw.close();
final double[] lowRange = {111.3, 294.4, 517.4};
final double[] highRange = {116.7, 319.4, 533.0};
Query query = DoubleRangeDocValuesField.newSlowIntersectsQuery("dv", lowRange, highRange);
assertEquals(searcher.count(query), iters);
double[] lowRange2 = {116.3, 299.3, 517.0};
double[] highRange2 = {121.0, 317.1, 531.2};
query = DoubleRangeDocValuesField.newSlowIntersectsQuery( "dv", lowRange2, highRange2);
assertEquals(searcher.count(query), iters);
reader.close();
dir.close();
}
public void testIntRangeDocValuesIntersectsQuery() throws IOException {
Directory dir = newDirectory();
RandomIndexWriter iw = new RandomIndexWriter(random(), dir);
final int iters = atLeast(10);
int[] min = {3, 11, 17};
int[] max = {27, 35, 49};
for (int i = 0; i < iters; ++i) {
Document doc = new Document();
doc.add(new IntRangeDocValuesField("dv", min, max));
iw.addDocument(doc);
}
int[] min2 = {11, 19, 27};
int[] max2 = {29, 38, 56};
Document doc = new Document();
doc.add(new IntRangeDocValuesField("dv", min2, max2));
iw.commit();
final IndexReader reader = iw.getReader();
final IndexSearcher searcher = newSearcher(reader);
iw.close();
final int[] lowRange = {6, 16, 19};
final int[] highRange = {29, 41, 42};
Query query = IntRangeDocValuesField.newSlowIntersectsQuery("dv", lowRange, highRange);
assertEquals(searcher.count(query), iters);
int[] lowRange2 = {2, 9, 18};
int[] highRange2 = {25, 34, 41};
query = IntRangeDocValuesField.newSlowIntersectsQuery("dv", lowRange2, highRange2);
assertEquals(searcher.count(query), iters);
int[] lowRange3 = {101, 121, 153};
int[] highRange3 = {156, 127, 176};
query = IntRangeDocValuesField.newSlowIntersectsQuery("dv", lowRange3, highRange3);
assertEquals(searcher.count(query), 0);
reader.close();
dir.close();
}
public void testLongRangeDocValuesIntersectQuery() throws IOException {
Directory dir = newDirectory();
RandomIndexWriter iw = new RandomIndexWriter(random(), dir);
final int iters = atLeast(10);
long[] min = {31, 15, 2};
long[] max = {95, 27, 4};
for (int i = 0; i < iters; ++i) {
Document doc = new Document();
doc.add(new LongRangeDocValuesField("dv", min, max));
iw.addDocument(doc);
}
long[] min2 = {101, 124, 137};
long[] max2 = {138, 145, 156};
Document doc = new Document();
doc.add(new LongRangeDocValuesField("dv", min2, max2));
iw.commit();
final IndexReader reader = iw.getReader();
final IndexSearcher searcher = newSearcher(reader);
iw.close();
final long[] lowRange = {6, 12, 1};
final long[] highRange = {34, 24, 3};
Query query = LongRangeDocValuesField.newSlowIntersectsQuery("dv", lowRange, highRange);
assertEquals(searcher.count(query), iters);
final long[] lowRange2 = {32, 18, 3};
final long[] highRange2 = {96, 29, 5};
query = LongRangeDocValuesField.newSlowIntersectsQuery("dv", lowRange2, highRange2);
assertEquals(searcher.count(query), iters);
reader.close();
dir.close();
}
public void testFloatRangeDocValuesIntersectQuery() throws IOException {
Directory dir = newDirectory();
RandomIndexWriter iw = new RandomIndexWriter(random(), dir);
final int iters = atLeast(10);
float[] min = {3.7f, 11.0f, 33.4f};
float[] max = {8.3f, 21.6f, 59.8f};
for (int i = 0; i < iters; ++i) {
Document doc = new Document();
doc.add(new FloatRangeDocValuesField("dv", min, max));
iw.addDocument(doc);
}
float[] nonMatchingMin = {11.4f, 29.7f, 102.4f};
float[] nonMatchingMax = {17.6f, 37.2f, 160.2f};
Document doc = new Document();
doc.add(new FloatRangeDocValuesField("dv", nonMatchingMin, nonMatchingMax));
iw.addDocument(doc);
iw.commit();
final IndexReader reader = iw.getReader();
final IndexSearcher searcher = newSearcher(reader);
iw.close();
final float[] lowRange = {1.2f, 8.3f, 21.4f};
final float[] highRange = {6.0f, 17.6f, 47.1f};
Query query = FloatRangeDocValuesField.newSlowIntersectsQuery("dv", lowRange, highRange);
assertEquals(searcher.count(query), iters);
final float[] lowRange2 = {6.1f, 17.0f, 31.3f};
final float[] highRange2 = {14.2f, 23.4f, 61.1f};
query = FloatRangeDocValuesField.newSlowIntersectsQuery("dv", lowRange2, highRange2);
assertEquals(searcher.count(query), iters);
reader.close();
dir.close();
}
public void testToString() {
double[] doubleMin = {112.7, 296.0, 512.4f};
double[] doubleMax = {119.3, 314.8, 524.3f};
Query q1 = DoubleRangeDocValuesField.newSlowIntersectsQuery("foo", doubleMin, doubleMax);
assertEquals("foo:[[112.7, 296.0, 512.4000244140625] TO [119.3, 314.8, 524.2999877929688]]", q1.toString());
int[] intMin = {3, 11, 17};
int[] intMax = {27, 35, 49};
Query q2 = IntRangeDocValuesField.newSlowIntersectsQuery("foo", intMin, intMax);
assertEquals("foo:[[3, 11, 17] TO [27, 35, 49]]", q2.toString());
float[] floatMin = {3.7f, 11.0f, 33.4f};
float[] floatMax = {8.3f, 21.6f, 59.8f};
Query q3 = FloatRangeDocValuesField.newSlowIntersectsQuery("foo", floatMin, floatMax);
assertEquals("foo:[[3.7, 11.0, 33.4] TO [8.3, 21.6, 59.8]]", q3.toString());
long[] longMin = {101, 124, 137};
long[] longMax = {138, 145, 156};
Query q4 = LongRangeDocValuesField.newSlowIntersectsQuery("foo", longMin, longMax);
assertEquals("foo:[[101, 124, 137] TO [138, 145, 156]]", q4.toString());
}
}