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 2016/10/18 13:24:22 UTC

lucene-solr:branch_6x: LUCENE-7493: FacetCollector.search now accepts limit=0, for getting facets but not search hits

Repository: lucene-solr
Updated Branches:
  refs/heads/branch_6x e6d225603 -> 2b32f5d0d


LUCENE-7493: FacetCollector.search now accepts limit=0, for getting facets but not search hits


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/2b32f5d0
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/2b32f5d0
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/2b32f5d0

Branch: refs/heads/branch_6x
Commit: 2b32f5d0db532eeee723f707f0d704d7e6f6ac33
Parents: e6d2256
Author: Mike McCandless <mi...@apache.org>
Authored: Tue Oct 18 09:23:24 2016 -0400
Committer: Mike McCandless <mi...@apache.org>
Committed: Tue Oct 18 09:23:51 2016 -0400

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |  3 ++
 .../apache/lucene/facet/FacetsCollector.java    | 42 ++++++++++++--------
 .../apache/lucene/facet/TestDrillDownQuery.java | 11 +++++
 3 files changed, 40 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2b32f5d0/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 33adbb7..d09afab 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -46,6 +46,9 @@ Bug Fixes
 * LUCENE-6914: Fixed DecimalDigitFilter in case of supplementary code points.
   (Hossman)
 
+* LUCENE-7493: FacetCollector.search threw an unexpected exception if
+  you asked for zero hits but wanted facets (Mahesh via Mike McCandless)
+
 Improvements
 
 * LUCENE-7439: FuzzyQuery now matches all terms within the specified

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2b32f5d0/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java b/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
index d3f2eb8..b942f7e 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
@@ -36,6 +36,7 @@ import org.apache.lucene.search.TopDocsCollector;
 import org.apache.lucene.search.TopFieldCollector;
 import org.apache.lucene.search.TopFieldDocs;
 import org.apache.lucene.search.TopScoreDocCollector;
+import org.apache.lucene.search.TotalHitCountCollector;
 import org.apache.lucene.util.ArrayUtil;
 import org.apache.lucene.util.BitDocIdSet;
 import org.apache.lucene.util.FixedBitSet;
@@ -251,23 +252,32 @@ public class FacetsCollector extends SimpleCollector implements Collector {
                                          + after.doc + " limit=" + limit);
     }
 
-    TopDocsCollector<?> hitsCollector;
-    if (sort != null) {
-      if (after != null && !(after instanceof FieldDoc)) {
-        // TODO: if we fix type safety of TopFieldDocs we can
-        // remove this
-        throw new IllegalArgumentException("after must be a FieldDoc; got " + after);
-      }
-      boolean fillFields = true;
-      hitsCollector = TopFieldCollector.create(sort, n,
-                                               (FieldDoc) after,
-                                               fillFields,
-                                               doDocScores,
-                                               doMaxScore);
+    TopDocs topDocs = null;
+    if (n==0) {
+      TotalHitCountCollector totalHitCountCollector = new TotalHitCountCollector();
+      searcher.search(q, MultiCollector.wrap(totalHitCountCollector, fc));
+      topDocs = new TopDocs(totalHitCountCollector.getTotalHits(), new ScoreDoc[0], Float.NaN);
     } else {
-      hitsCollector = TopScoreDocCollector.create(n, after);
+      TopDocsCollector<?> hitsCollector;
+      if (sort != null) {
+        if (after != null && !(after instanceof FieldDoc)) {
+          // TODO: if we fix type safety of TopFieldDocs we can
+          // remove this
+          throw new IllegalArgumentException("after must be a FieldDoc; got " + after);
+        }
+        boolean fillFields = true;
+        hitsCollector = TopFieldCollector.create(sort, n,
+                                                 (FieldDoc) after,
+                                                 fillFields,
+                                                 doDocScores,
+                                                 doMaxScore);
+      } else {
+        hitsCollector = TopScoreDocCollector.create(n, after);
+      }
+      searcher.search(q, MultiCollector.wrap(hitsCollector, fc));
+    
+      topDocs = hitsCollector.topDocs();
     }
-    searcher.search(q, MultiCollector.wrap(hitsCollector, fc));
-    return hitsCollector.topDocs();
+    return topDocs;
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/2b32f5d0/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java b/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
index f76e839..bf8d0f4 100644
--- a/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
+++ b/lucene/facet/src/test/org/apache/lucene/facet/TestDrillDownQuery.java
@@ -182,6 +182,17 @@ public class TestDrillDownQuery extends FacetTestCase {
     assertEquals(10, docs.totalHits);
   }
   
+  public void testZeroLimit() throws IOException {
+    IndexSearcher searcher = newSearcher(reader);
+    DrillDownQuery q = new DrillDownQuery(config);
+    q.add("b", "1");
+    int limit = 0;
+    FacetsCollector facetCollector = new FacetsCollector();
+    FacetsCollector.search(searcher, q, limit, facetCollector);
+    Facets facets = getTaxonomyFacetCounts(taxo, config, facetCollector, config.getDimConfig("b").indexFieldName);
+    assertNotNull(facets.getTopChildren(10, "b"));
+  }
+  
   public void testScoring() throws IOException {
     // verify that drill-down queries do not modify scores
     IndexSearcher searcher = newSearcher(reader);