You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2014/02/06 19:36:48 UTC
svn commit: r1565387 [2/2] - in /lucene/dev/trunk/lucene: ./
core/src/java/org/apache/lucene/search/
core/src/test/org/apache/lucene/search/
demo/src/java/org/apache/lucene/demo/facet/
facet/src/java/org/apache/lucene/facet/ facet/src/java/org/apache/l...
Modified: lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeFacetCounts.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeFacetCounts.java?rev=1565387&r1=1565386&r2=1565387&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeFacetCounts.java (original)
+++ lucene/dev/trunk/lucene/facet/src/test/org/apache/lucene/facet/range/TestRangeFacetCounts.java Thu Feb 6 18:36:48 2014
@@ -20,6 +20,7 @@ package org.apache.lucene.facet.range;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.DoubleDocValuesField;
@@ -30,6 +31,7 @@ import org.apache.lucene.document.FloatF
import org.apache.lucene.document.LongField;
import org.apache.lucene.document.NumericDocValuesField;
import org.apache.lucene.facet.DrillDownQuery;
+import org.apache.lucene.facet.DrillSideways.DrillSidewaysResult;
import org.apache.lucene.facet.DrillSideways;
import org.apache.lucene.facet.FacetField;
import org.apache.lucene.facet.FacetResult;
@@ -39,10 +41,10 @@ import org.apache.lucene.facet.FacetsCol
import org.apache.lucene.facet.FacetsConfig;
import org.apache.lucene.facet.LabelAndValue;
import org.apache.lucene.facet.MultiFacets;
-import org.apache.lucene.facet.DrillSideways.DrillSidewaysResult;
import org.apache.lucene.facet.taxonomy.TaxonomyReader;
import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyReader;
import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyWriter;
+import org.apache.lucene.index.AtomicReader;
import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriterConfig;
@@ -50,12 +52,20 @@ import org.apache.lucene.index.RandomInd
import org.apache.lucene.queries.function.FunctionValues;
import org.apache.lucene.queries.function.ValueSource;
import org.apache.lucene.queries.function.docvalues.DoubleDocValues;
+import org.apache.lucene.queries.function.valuesource.DoubleFieldSource;
import org.apache.lucene.queries.function.valuesource.FloatFieldSource;
-import org.apache.lucene.search.ConstantScoreQuery;
+import org.apache.lucene.queries.function.valuesource.LongFieldSource;
+import org.apache.lucene.search.CachingWrapperFilter;
+import org.apache.lucene.search.DocIdSet;
+import org.apache.lucene.search.DocIdSetIterator;
+import org.apache.lucene.search.Filter;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.MatchAllDocsQuery;
+import org.apache.lucene.search.NumericRangeFilter;
import org.apache.lucene.search.NumericRangeQuery;
+import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.store.Directory;
+import org.apache.lucene.util.FixedBitSet;
import org.apache.lucene.util.IOUtils;
import org.apache.lucene.util._TestUtil;
@@ -229,6 +239,10 @@ public class TestRangeFacetCounts extend
IndexSearcher s = newSearcher(r);
+ if (VERBOSE) {
+ System.out.println("TEST: searcher=" + s);
+ }
+
DrillSideways ds = new DrillSideways(s, config, tr) {
@Override
@@ -365,6 +379,8 @@ public class TestRangeFacetCounts extend
System.out.println("TEST: numDocs=" + numDocs);
}
long[] values = new long[numDocs];
+ long minValue = Long.MAX_VALUE;
+ long maxValue = Long.MIN_VALUE;
for(int i=0;i<numDocs;i++) {
Document doc = new Document();
long v = random().nextLong();
@@ -372,6 +388,8 @@ public class TestRangeFacetCounts extend
doc.add(new NumericDocValuesField("field", v));
doc.add(new LongField("field", v, Field.Store.NO));
w.addDocument(doc);
+ minValue = Math.min(minValue, v);
+ maxValue = Math.max(maxValue, v);
}
IndexReader r = w.getReader();
@@ -386,6 +404,8 @@ public class TestRangeFacetCounts extend
int numRange = _TestUtil.nextInt(random(), 1, 100);
LongRange[] ranges = new LongRange[numRange];
int[] expectedCounts = new int[numRange];
+ long minAcceptedValue = Long.MAX_VALUE;
+ long maxAcceptedValue = Long.MIN_VALUE;
for(int rangeID=0;rangeID<numRange;rangeID++) {
long min;
if (rangeID > 0 && random().nextInt(10) == 7) {
@@ -447,13 +467,26 @@ public class TestRangeFacetCounts extend
}
if (accept) {
expectedCounts[rangeID]++;
+ minAcceptedValue = Math.min(minAcceptedValue, values[i]);
+ maxAcceptedValue = Math.max(maxAcceptedValue, values[i]);
}
}
}
FacetsCollector sfc = new FacetsCollector();
s.search(new MatchAllDocsQuery(), sfc);
- Facets facets = new LongRangeFacetCounts("field", sfc, ranges);
+ Filter fastMatchFilter;
+ if (random().nextBoolean()) {
+ if (random().nextBoolean()) {
+ fastMatchFilter = NumericRangeFilter.newLongRange("field", minValue, maxValue, true, true);
+ } else {
+ fastMatchFilter = NumericRangeFilter.newLongRange("field", minAcceptedValue, maxAcceptedValue, true, true);
+ }
+ } else {
+ fastMatchFilter = null;
+ }
+ ValueSource vs = new LongFieldSource("field");
+ Facets facets = new LongRangeFacetCounts("field", vs, sfc, fastMatchFilter, ranges);
FacetResult result = facets.getTopChildren(10, "field");
assertEquals(numRange, result.labelValues.length);
for(int rangeID=0;rangeID<numRange;rangeID++) {
@@ -468,7 +501,15 @@ public class TestRangeFacetCounts extend
// Test drill-down:
DrillDownQuery ddq = new DrillDownQuery(config);
- ddq.add("field", NumericRangeQuery.newLongRange("field", range.min, range.max, range.minInclusive, range.maxInclusive));
+ if (random().nextBoolean()) {
+ if (random().nextBoolean()) {
+ ddq.add("field", NumericRangeFilter.newLongRange("field", range.min, range.max, range.minInclusive, range.maxInclusive));
+ } else {
+ ddq.add("field", NumericRangeQuery.newLongRange("field", range.min, range.max, range.minInclusive, range.maxInclusive));
+ }
+ } else {
+ ddq.add("field", range.getFilter(fastMatchFilter, vs));
+ }
assertEquals(expectedCounts[rangeID], s.search(ddq, 10).totalHits);
}
}
@@ -482,6 +523,8 @@ public class TestRangeFacetCounts extend
int numDocs = atLeast(1000);
float[] values = new float[numDocs];
+ float minValue = Float.POSITIVE_INFINITY;
+ float maxValue = Float.NEGATIVE_INFINITY;
for(int i=0;i<numDocs;i++) {
Document doc = new Document();
float v = random().nextFloat();
@@ -489,6 +532,8 @@ public class TestRangeFacetCounts extend
doc.add(new FloatDocValuesField("field", v));
doc.add(new FloatField("field", v, Field.Store.NO));
w.addDocument(doc);
+ minValue = Math.min(minValue, v);
+ maxValue = Math.max(maxValue, v);
}
IndexReader r = w.getReader();
@@ -503,6 +548,8 @@ public class TestRangeFacetCounts extend
int numRange = _TestUtil.nextInt(random(), 1, 5);
DoubleRange[] ranges = new DoubleRange[numRange];
int[] expectedCounts = new int[numRange];
+ float minAcceptedValue = Float.POSITIVE_INFINITY;
+ float maxAcceptedValue = Float.NEGATIVE_INFINITY;
if (VERBOSE) {
System.out.println("TEST: " + numRange + " ranges");
}
@@ -578,13 +625,26 @@ public class TestRangeFacetCounts extend
}
if (accept) {
expectedCounts[rangeID]++;
+ minAcceptedValue = Math.min(minAcceptedValue, values[i]);
+ maxAcceptedValue = Math.max(maxAcceptedValue, values[i]);
}
}
}
FacetsCollector sfc = new FacetsCollector();
s.search(new MatchAllDocsQuery(), sfc);
- Facets facets = new DoubleRangeFacetCounts("field", new FloatFieldSource("field"), sfc, ranges);
+ Filter fastMatchFilter;
+ if (random().nextBoolean()) {
+ if (random().nextBoolean()) {
+ fastMatchFilter = NumericRangeFilter.newFloatRange("field", minValue, maxValue, true, true);
+ } else {
+ fastMatchFilter = NumericRangeFilter.newFloatRange("field", minAcceptedValue, maxAcceptedValue, true, true);
+ }
+ } else {
+ fastMatchFilter = null;
+ }
+ ValueSource vs = new FloatFieldSource("field");
+ Facets facets = new DoubleRangeFacetCounts("field", vs, sfc, fastMatchFilter, ranges);
FacetResult result = facets.getTopChildren(10, "field");
assertEquals(numRange, result.labelValues.length);
for(int rangeID=0;rangeID<numRange;rangeID++) {
@@ -599,7 +659,15 @@ public class TestRangeFacetCounts extend
// Test drill-down:
DrillDownQuery ddq = new DrillDownQuery(config);
- ddq.add("field", NumericRangeQuery.newFloatRange("field", (float) range.min, (float) range.max, range.minInclusive, range.maxInclusive));
+ if (random().nextBoolean()) {
+ if (random().nextBoolean()) {
+ ddq.add("field", NumericRangeFilter.newFloatRange("field", (float) range.min, (float) range.max, range.minInclusive, range.maxInclusive));
+ } else {
+ ddq.add("field", NumericRangeQuery.newFloatRange("field", (float) range.min, (float) range.max, range.minInclusive, range.maxInclusive));
+ }
+ } else {
+ ddq.add("field", range.getFilter(fastMatchFilter, vs));
+ }
assertEquals(expectedCounts[rangeID], s.search(ddq, 10).totalHits);
}
}
@@ -613,6 +681,8 @@ public class TestRangeFacetCounts extend
int numDocs = atLeast(1000);
double[] values = new double[numDocs];
+ double minValue = Double.POSITIVE_INFINITY;
+ double maxValue = Double.NEGATIVE_INFINITY;
for(int i=0;i<numDocs;i++) {
Document doc = new Document();
double v = random().nextDouble();
@@ -620,6 +690,8 @@ public class TestRangeFacetCounts extend
doc.add(new DoubleDocValuesField("field", v));
doc.add(new DoubleField("field", v, Field.Store.NO));
w.addDocument(doc);
+ minValue = Math.min(minValue, v);
+ maxValue = Math.max(maxValue, v);
}
IndexReader r = w.getReader();
@@ -634,6 +706,8 @@ public class TestRangeFacetCounts extend
int numRange = _TestUtil.nextInt(random(), 1, 5);
DoubleRange[] ranges = new DoubleRange[numRange];
int[] expectedCounts = new int[numRange];
+ double minAcceptedValue = Double.POSITIVE_INFINITY;
+ double maxAcceptedValue = Double.NEGATIVE_INFINITY;
for(int rangeID=0;rangeID<numRange;rangeID++) {
double min;
if (rangeID > 0 && random().nextInt(10) == 7) {
@@ -693,13 +767,26 @@ public class TestRangeFacetCounts extend
}
if (accept) {
expectedCounts[rangeID]++;
+ minAcceptedValue = Math.min(minAcceptedValue, values[i]);
+ maxAcceptedValue = Math.max(maxAcceptedValue, values[i]);
}
}
}
FacetsCollector sfc = new FacetsCollector();
s.search(new MatchAllDocsQuery(), sfc);
- Facets facets = new DoubleRangeFacetCounts("field", sfc, ranges);
+ Filter fastMatchFilter;
+ if (random().nextBoolean()) {
+ if (random().nextBoolean()) {
+ fastMatchFilter = NumericRangeFilter.newDoubleRange("field", minValue, maxValue, true, true);
+ } else {
+ fastMatchFilter = NumericRangeFilter.newDoubleRange("field", minAcceptedValue, maxAcceptedValue, true, true);
+ }
+ } else {
+ fastMatchFilter = null;
+ }
+ ValueSource vs = new DoubleFieldSource("field");
+ Facets facets = new DoubleRangeFacetCounts("field", vs, sfc, fastMatchFilter, ranges);
FacetResult result = facets.getTopChildren(10, "field");
assertEquals(numRange, result.labelValues.length);
for(int rangeID=0;rangeID<numRange;rangeID++) {
@@ -714,7 +801,16 @@ public class TestRangeFacetCounts extend
// Test drill-down:
DrillDownQuery ddq = new DrillDownQuery(config);
- ddq.add("field", NumericRangeQuery.newDoubleRange("field", range.min, range.max, range.minInclusive, range.maxInclusive));
+ if (random().nextBoolean()) {
+ if (random().nextBoolean()) {
+ ddq.add("field", NumericRangeFilter.newDoubleRange("field", range.min, range.max, range.minInclusive, range.maxInclusive));
+ } else {
+ ddq.add("field", NumericRangeQuery.newDoubleRange("field", range.min, range.max, range.minInclusive, range.maxInclusive));
+ }
+ } else {
+ ddq.add("field", range.getFilter(fastMatchFilter, vs));
+ }
+
assertEquals(expectedCounts[rangeID], s.search(ddq, 10).totalHits);
}
}
@@ -765,16 +861,13 @@ public class TestRangeFacetCounts extend
Document doc = new Document();
writer.addDocument(doc);
-
- doc = new Document();
writer.addDocument(doc);
-
- doc = new Document();
writer.addDocument(doc);
+ // Test wants 3 docs in one segment:
writer.forceMerge(1);
- ValueSource vs = new ValueSource() {
+ final ValueSource vs = new ValueSource() {
@SuppressWarnings("rawtypes")
@Override
public FunctionValues getValues(Map ignored, AtomicReaderContext ignored2) {
@@ -801,6 +894,8 @@ public class TestRangeFacetCounts extend
throw new UnsupportedOperationException();
}
};
+
+ FacetsConfig config = new FacetsConfig();
FacetsCollector fc = new FacetsCollector();
@@ -808,18 +903,67 @@ public class TestRangeFacetCounts extend
IndexSearcher s = newSearcher(r);
s.search(new MatchAllDocsQuery(), fc);
- Facets facets = new DoubleRangeFacetCounts("field", vs, fc,
+ final DoubleRange[] ranges = new DoubleRange[] {
new DoubleRange("< 1", 0.0, true, 1.0, false),
new DoubleRange("< 2", 0.0, true, 2.0, false),
new DoubleRange("< 5", 0.0, true, 5.0, false),
new DoubleRange("< 10", 0.0, true, 10.0, false),
new DoubleRange("< 20", 0.0, true, 20.0, false),
- new DoubleRange("< 50", 0.0, true, 50.0, false));
+ new DoubleRange("< 50", 0.0, true, 50.0, false)};
+
+ final Filter fastMatchFilter;
+ final AtomicBoolean filterWasUsed = new AtomicBoolean();
+ if (random().nextBoolean()) {
+ // Sort of silly:
+ fastMatchFilter = new CachingWrapperFilter(new QueryWrapperFilter(new MatchAllDocsQuery())) {
+ @Override
+ protected DocIdSet cacheImpl(DocIdSetIterator iterator, AtomicReader reader)
+ throws IOException {
+ final FixedBitSet cached = new FixedBitSet(reader.maxDoc());
+ filterWasUsed.set(true);
+ cached.or(iterator);
+ return cached;
+ }
+ };
+ } else {
+ fastMatchFilter = null;
+ }
+
+ if (VERBOSE) {
+ System.out.println("TEST: fastMatchFilter=" + fastMatchFilter);
+ }
+
+ Facets facets = new DoubleRangeFacetCounts("field", vs, fc, fastMatchFilter, ranges);
assertEquals("dim=field path=[] value=3 childCount=6\n < 1 (0)\n < 2 (1)\n < 5 (3)\n < 10 (3)\n < 20 (3)\n < 50 (3)\n", facets.getTopChildren(10, "field").toString());
+ assertTrue(fastMatchFilter == null || filterWasUsed.get());
+
+ DrillDownQuery ddq = new DrillDownQuery(config);
+ ddq.add("field", ranges[1].getFilter(fastMatchFilter, vs));
- // Test drill-down:
- assertEquals(1, s.search(new ConstantScoreQuery(new DoubleRange("< 2", 0.0, true, 2.0, false).getFilter(vs)), 10).totalHits);
+ // Test simple drill-down:
+ assertEquals(1, s.search(ddq, 10).totalHits);
+
+ // Test drill-sideways after drill-down
+ DrillSideways ds = new DrillSideways(s, config, (TaxonomyReader) null) {
+
+ @Override
+ protected Facets buildFacetsResult(FacetsCollector drillDowns, FacetsCollector[] drillSideways, String[] drillSidewaysDims) throws IOException {
+ assert drillSideways.length == 1;
+ return new DoubleRangeFacetCounts("field", vs, drillSideways[0], fastMatchFilter, ranges);
+ }
+
+ @Override
+ protected boolean scoreSubDocsAtOnce() {
+ return random().nextBoolean();
+ }
+ };
+
+
+ DrillSidewaysResult dsr = ds.search(ddq, 10);
+ assertEquals(1, dsr.hits.totalHits);
+ assertEquals("dim=field path=[] value=3 childCount=6\n < 1 (0)\n < 2 (1)\n < 5 (3)\n < 10 (3)\n < 20 (3)\n < 50 (3)\n",
+ dsr.facets.getTopChildren(10, "field").toString());
IOUtils.close(r, writer, dir);
}