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