You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2015/05/21 16:51:50 UTC

svn commit: r1680893 - /lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java

Author: jpountz
Date: Thu May 21 14:51:49 2015
New Revision: 1680893

URL: http://svn.apache.org/r1680893
Log:
LUCENE-6458: Propagate the bulk scorer too.

Modified:
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java?rev=1680893&r1=1680892&r2=1680893&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java Thu May 21 14:51:49 2015
@@ -20,6 +20,7 @@ package org.apache.lucene.search;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.PostingsEnum;
@@ -60,6 +61,21 @@ final class MultiTermQueryConstantScoreW
     }
   }
 
+  private static class WeightOrBitSet {
+    final Weight weight;
+    final BitDocIdSet bitset;
+
+    WeightOrBitSet(Weight weight) {
+      this.weight = Objects.requireNonNull(weight);
+      this.bitset = null;
+    }
+
+    WeightOrBitSet(BitDocIdSet bitset) {
+      this.bitset = bitset;
+      this.weight = null;
+    }
+  }
+
   protected final Q query;
 
   /**
@@ -116,18 +132,20 @@ final class MultiTermQueryConstantScoreW
         return termsEnum.next() == null;
       }
 
-      @Override
-      public Scorer scorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
+      /**
+       * On the given leaf context, try to either rewrite to a disjunction if
+       * there are few terms, or build a bitset containing matching docs.
+       */
+      private WeightOrBitSet rewrite(LeafReaderContext context, Bits acceptDocs) throws IOException {
         final Terms terms = context.reader().terms(query.field);
         if (terms == null) {
           // field does not exist
-          return null;
+          return new WeightOrBitSet((BitDocIdSet) null);
         }
 
         final TermsEnum termsEnum = query.getTermsEnum(terms);
         assert termsEnum != null;
 
-        BitDocIdSet.Builder builder = new BitDocIdSet.Builder(context.reader().maxDoc());
         PostingsEnum docs = null;
 
         final List<TermAndState> collectedTerms = new ArrayList<>();
@@ -141,10 +159,11 @@ final class MultiTermQueryConstantScoreW
           }
           Query q = new ConstantScoreQuery(bq);
           q.setBoost(score());
-          return searcher.rewrite(q).createWeight(searcher, needsScores).scorer(context, acceptDocs);
+          return new WeightOrBitSet(searcher.rewrite(q).createWeight(searcher, needsScores));
         }
 
         // Too many terms: go back to the terms we already collected and start building the bit set
+        BitDocIdSet.Builder builder = new BitDocIdSet.Builder(context.reader().maxDoc());
         if (collectedTerms.isEmpty() == false) {
           TermsEnum termsEnum2 = terms.iterator();
           for (TermAndState t : collectedTerms) {
@@ -160,7 +179,10 @@ final class MultiTermQueryConstantScoreW
           builder.or(docs);
         } while (termsEnum.next() != null);
 
-        final BitDocIdSet set = builder.build();
+        return new WeightOrBitSet(builder.build());
+      }
+
+      private Scorer scorer(BitDocIdSet set) {
         if (set == null) {
           return null;
         }
@@ -170,6 +192,30 @@ final class MultiTermQueryConstantScoreW
         }
         return new ConstantScoreScorer(this, score(), disi);
       }
+
+      @Override
+      public BulkScorer bulkScorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
+        final WeightOrBitSet weightOrBitSet = rewrite(context, acceptDocs);
+        if (weightOrBitSet.weight != null) {
+          return weightOrBitSet.weight.bulkScorer(context, acceptDocs);
+        } else {
+          final Scorer scorer = scorer(weightOrBitSet.bitset);
+          if (scorer == null) {
+            return null;
+          }
+          return new DefaultBulkScorer(scorer);
+        }
+      }
+
+      @Override
+      public Scorer scorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
+        final WeightOrBitSet weightOrBitSet = rewrite(context, acceptDocs);
+        if (weightOrBitSet.weight != null) {
+          return weightOrBitSet.weight.scorer(context, acceptDocs);
+        } else {
+          return scorer(weightOrBitSet.bitset);
+        }
+      }
     };
   }
 }