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) {