From 61f8517000b3af74c0b079e4a5fa81eb870b1c35 Mon Sep 17 00:00:00 2001 From: Grigoriy Troitskiy Date: Mon, 26 Jul 2021 23:04:51 +0300 Subject: [PATCH] LUCENE-10030: Lazily evaluate score in DrillSidewaysScorer.doQueryFirstScoring (#217) --- .../lucene/facet/DrillSidewaysScorer.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) 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 5a063890869..8d43462e042 100644 --- a/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java +++ b/lucene/facet/src/java/org/apache/lucene/facet/DrillSidewaysScorer.java @@ -26,6 +26,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; @@ -86,17 +87,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 @@ -155,6 +152,8 @@ class DrillSidewaysScorer extends BulkScorer { // if (DEBUG) { // System.out.println(" doQueryFirstScoring"); // } + setScorer(collector, new ScoreCachingWrappingScorer(baseScorer)); + int docID = baseScorer.docID(); nextDoc: @@ -195,10 +194,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); @@ -214,6 +209,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; @@ -424,6 +421,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; @@ -598,6 +596,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