You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by gs...@apache.org on 2021/08/01 19:05:52 UTC

[lucene-solr] branch branch_8x updated: LUCENE-10030: Lazily evaluate score in DrillSidewaysScorer.doQueryFirstScoring (#2542)

This is an automated email from the ASF dual-hosted git repository.

gsmiller pushed a commit to branch branch_8x
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/branch_8x by this push:
     new c7210e4  LUCENE-10030: Lazily evaluate score in DrillSidewaysScorer.doQueryFirstScoring (#2542)
c7210e4 is described below

commit c7210e494e165b66673000df6ae43a32702800cf
Author: Greg Miller <gs...@gmail.com>
AuthorDate: Sun Aug 1 12:05:35 2021 -0700

    LUCENE-10030: Lazily evaluate score in DrillSidewaysScorer.doQueryFirstScoring (#2542)
---
 lucene/CHANGES.txt                                 |  3 +++
 .../apache/lucene/facet/DrillSidewaysScorer.java   | 24 ++++++++++++++--------
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 71b6532..0dd0ffd 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -55,6 +55,9 @@ Improvements
   characters as boundaries for incremental processing, vastly improving worst-case
   performance. (Michael Gibney)
 
+* LUCENE-10030: Lazily evaluate score in DrillSidewaysScorer.doQueryFirstScoring
+  (Grigoriy Troitskiy)
+
 Optimizations
 ---------------------
 
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java b/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java
index ddace0d..365431c 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java
@@ -27,6 +27,7 @@ import org.apache.lucene.search.Collector;
 import org.apache.lucene.search.DocIdSetIterator;
 import org.apache.lucene.search.LeafCollector;
 import org.apache.lucene.search.Scorable;
+import org.apache.lucene.search.ScoreCachingWrappingScorer;
 import org.apache.lucene.search.Scorer;
 import org.apache.lucene.search.TwoPhaseIterator;
 import org.apache.lucene.util.Bits;
@@ -82,17 +83,13 @@ class DrillSidewaysScorer extends BulkScorer {
     //  System.out.println("\nscore: reader=" + context.reader());
     //}
     //System.out.println("score r=" + context.reader());
-    ScoreAndDoc scorer = new ScoreAndDoc();
-    collector.setScorer(scorer);
     if (drillDownCollector != null) {
       drillDownLeafCollector = drillDownCollector.getLeafCollector(context);
-      drillDownLeafCollector.setScorer(scorer);
     } else {
       drillDownLeafCollector = null;
     }
     for (DocsAndCost dim : dims) {
       dim.sidewaysLeafCollector = dim.sidewaysCollector.getLeafCollector(context);
-      dim.sidewaysLeafCollector.setScorer(scorer);
     }
 
     // some scorers, eg ReqExlScorer, can hit NPE if cost is called after nextDoc
@@ -149,6 +146,8 @@ class DrillSidewaysScorer extends BulkScorer {
     //if (DEBUG) {
     //  System.out.println("  doQueryFirstScoring");
     //}
+    setScorer(collector, ScoreCachingWrappingScorer.wrap(baseScorer));
+
     int docID = baseScorer.docID();
 
     nextDoc: while (docID != PostingsEnum.NO_MORE_DOCS) {
@@ -188,10 +187,6 @@ class DrillSidewaysScorer extends BulkScorer {
 
       collectDocID = docID;
 
-      // TODO: we could score on demand instead since we are
-      // daat here:
-      collectScore = baseScorer.score();
-
       if (failedCollector == null) {
         // Hit passed all filters, so it's "real":
         collectHit(collector, dims);
@@ -207,6 +202,8 @@ class DrillSidewaysScorer extends BulkScorer {
   /** Used when drill downs are highly constraining vs
    *  baseQuery. */
   private void doDrillDownAdvanceScoring(Bits acceptDocs, LeafCollector collector, DocsAndCost[] dims) throws IOException {
+    setScorer(collector, new ScoreAndDoc());
+
     final int maxDoc = context.reader().maxDoc();
     final int numDims = dims.length;
 
@@ -409,6 +406,7 @@ class DrillSidewaysScorer extends BulkScorer {
     //if (DEBUG) {
     //  System.out.println("  doUnionScoring");
     //}
+    setScorer(collector, new ScoreAndDoc());
 
     final int maxDoc = context.reader().maxDoc();
     final int numDims = dims.length;
@@ -580,6 +578,16 @@ class DrillSidewaysScorer extends BulkScorer {
     sidewaysCollector.collect(collectDocID);
   }
 
+  private void setScorer(LeafCollector mainCollector, Scorable scorer) throws IOException {
+    mainCollector.setScorer(scorer);
+    if (drillDownLeafCollector != null) {
+      drillDownLeafCollector.setScorer(scorer);
+    }
+    for (DocsAndCost dim : dims) {
+      dim.sidewaysLeafCollector.setScorer(scorer);
+    }
+  }
+
   private final class ScoreAndDoc extends Scorable {
 
     @Override