You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by yo...@apache.org on 2010/06/18 23:20:27 UTC

svn commit: r956132 - /lucene/dev/trunk/solr/src/java/org/apache/solr/request/SimpleFacets.java

Author: yonik
Date: Fri Jun 18 21:20:25 2010
New Revision: 956132

URL: http://svn.apache.org/viewvc?rev=956132&view=rev
Log:
SOLR-1965: collect docs per-segment for enum faceting when not using filterCache

Modified:
    lucene/dev/trunk/solr/src/java/org/apache/solr/request/SimpleFacets.java

Modified: lucene/dev/trunk/solr/src/java/org/apache/solr/request/SimpleFacets.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/src/java/org/apache/solr/request/SimpleFacets.java?rev=956132&r1=956131&r2=956132&view=diff
==============================================================================
--- lucene/dev/trunk/solr/src/java/org/apache/solr/request/SimpleFacets.java (original)
+++ lucene/dev/trunk/solr/src/java/org/apache/solr/request/SimpleFacets.java Fri Jun 18 21:20:25 2010
@@ -582,20 +582,43 @@ public class SimpleFacets {
             // TODO: do this per-segment for better efficiency (MultiDocsEnum just uses base class impl)
             // TODO: would passing deleted docs lead to better efficiency over checking the fastForRandomSet?
             docsEnum = termsEnum.docs(null, docsEnum);
+            c=0;
+
+            if (docsEnum instanceof MultiDocsEnum) {
+              MultiDocsEnum.EnumWithSlice[] subs = ((MultiDocsEnum)docsEnum).getSubs();
+              int numSubs = ((MultiDocsEnum)docsEnum).getNumSubs();
+              for (int subindex = 0; subindex<numSubs; subindex++) {
+                MultiDocsEnum.EnumWithSlice sub = subs[subindex];
+                if (sub.docsEnum == null) continue;
+                DocsEnum.BulkReadResult bulk = sub.docsEnum.getBulkResult();
+                int base = sub.slice.start;
+                for (;;) {
+                  int nDocs = sub.docsEnum.read();
+                  if (nDocs == 0) break;
+                  int[] docArr = bulk.docs.ints;  // this might be movable outside the loop, but perhaps not worth the risk.
+                  int end = bulk.docs.offset + nDocs;
+                  for (int i=bulk.docs.offset; i<end; i++) {
+                    if (fastForRandomSet.exists(docArr[i]+base)) c++;
+                  }
+                }
+              }
+            } else {
 
-            // this should be the same bulk result object if sharing of the docsEnum succeeded
-            DocsEnum.BulkReadResult bulk = docsEnum.getBulkResult();
+              // this should be the same bulk result object if sharing of the docsEnum succeeded
+              DocsEnum.BulkReadResult bulk = docsEnum.getBulkResult();
 
-            c=0;
-            for (;;) {
-              int nDocs = docsEnum.read();
-              if (nDocs == 0) break;
-              int[] docArr = bulk.docs.ints;  // this might be movable outside the loop, but perhaps not worth the risk.
-              int end = bulk.docs.offset + nDocs;
-              for (int i=bulk.docs.offset; i<end; i++) {
-                if (fastForRandomSet.exists(docArr[i])) c++;
+              for (;;) {
+                int nDocs = docsEnum.read();
+                if (nDocs == 0) break;
+                int[] docArr = bulk.docs.ints;  // this might be movable outside the loop, but perhaps not worth the risk.
+                int end = bulk.docs.offset + nDocs;
+                for (int i=bulk.docs.offset; i<end; i++) {
+                  if (fastForRandomSet.exists(docArr[i])) c++;
+                }
               }
             }
+            
+
           }
 
           if (sortByCount) {