You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by cp...@apache.org on 2024/02/21 17:33:29 UTC

(solr) branch jira/solr-13350 updated: factor out SolrMultiCollectorManager.scoreMode method

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

cpoerschke pushed a commit to branch jira/solr-13350
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/jira/solr-13350 by this push:
     new ab895b101a0 factor out SolrMultiCollectorManager.scoreMode method
ab895b101a0 is described below

commit ab895b101a0626f0d393d2564e289d31ddb6cc63
Author: Christine Poerschke <cp...@apache.org>
AuthorDate: Wed Feb 21 17:32:57 2024 +0000

    factor out SolrMultiCollectorManager.scoreMode method
---
 .../org/apache/solr/search/SolrIndexSearcher.java  | 40 ++++++++++++++--------
 .../solr/search/SolrMultiCollectorManager.java     | 23 ++++++++-----
 2 files changed, 39 insertions(+), 24 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
index ac73ff34a4b..ae9833d3bfd 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
@@ -1972,7 +1972,25 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
       throws IOException {
     Collection<CollectorManager<Collector, Object>> collectors = new ArrayList<>();
 
-    Collector[] firstCollectors = new Collector[3];
+    int firstCollectorsSize = 0;
+
+    final int firstTopDocsCollectorIndex;
+    if (needTopDocs) {
+      firstTopDocsCollectorIndex = firstCollectorsSize;
+      firstCollectorsSize++;
+    } else {
+      firstTopDocsCollectorIndex = -1;
+    }
+
+    final int firstMaxScoreCollectorIndex;
+    if (needMaxScore) {
+      firstMaxScoreCollectorIndex = firstCollectorsSize;
+      firstCollectorsSize++;
+    } else {
+      firstMaxScoreCollectorIndex = -1;
+    }
+
+    Collector[] firstCollectors = new Collector[firstCollectorsSize];
 
     if (needTopDocs) {
 
@@ -1982,8 +2000,8 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
             public Collector newCollector() throws IOException {
               @SuppressWarnings("rawtypes")
               TopDocsCollector collector = buildTopDocsCollector(len, cmd);
-              if (firstCollectors[0] == null) {
-                firstCollectors[0] = collector;
+              if (firstCollectors[firstTopDocsCollectorIndex] == null) {
+                firstCollectors[firstTopDocsCollectorIndex] = collector;
               }
               return collector;
             }
@@ -2029,8 +2047,8 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
             @Override
             public Collector newCollector() throws IOException {
               MaxScoreCollector collector = new MaxScoreCollector();
-              if (firstCollectors[1] == null) {
-                firstCollectors[1] = collector;
+              if (firstCollectors[firstMaxScoreCollectorIndex] == null) {
+                firstCollectors[firstMaxScoreCollectorIndex] = collector;
               }
               return collector;
             }
@@ -2079,6 +2097,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
               }
               log.error("new docset collector for {} max={}", numDocs, maxDoc());
 
+              // TODO: add to firstCollectors here? or if not have comment w.r.t. why not adding
               return new ThreadSafeBitSetCollector(bits, maxDoc);
             }
 
@@ -2110,16 +2129,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
       }
     }
 
-    ScoreMode scoreMode = null;
-    for (Collector collector : firstCollectors) {
-      if (collector != null) {
-        if (scoreMode == null) {
-          scoreMode = collector.scoreMode();
-        } else if (scoreMode != collector.scoreMode()) {
-          scoreMode = ScoreMode.COMPLETE;
-        }
-      }
-    }
+    ScoreMode scoreMode = SolrMultiCollectorManager.scoreMode(firstCollectors);
 
     return new SearchResult(scoreMode, ret);
   }
diff --git a/solr/core/src/java/org/apache/solr/search/SolrMultiCollectorManager.java b/solr/core/src/java/org/apache/solr/search/SolrMultiCollectorManager.java
index deee75db361..e2b7e6fe7af 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrMultiCollectorManager.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrMultiCollectorManager.java
@@ -66,6 +66,19 @@ public class SolrMultiCollectorManager
     return results;
   }
 
+  // TODO: could Lucene's MultiCollector permit reuse of its logic?
+  public static ScoreMode scoreMode(Collector[] collectors) {
+    ScoreMode scoreMode = null;
+    for (Collector collector : collectors) {
+      if (scoreMode == null) {
+        scoreMode = collector.scoreMode();
+      } else if (scoreMode != collector.scoreMode()) {
+        return ScoreMode.COMPLETE;
+      }
+    }
+    return scoreMode;
+  }
+
   /** Wraps multiple collectors for processing */
   class Collectors implements Collector {
 
@@ -85,15 +98,7 @@ public class SolrMultiCollectorManager
 
     @Override
     public final ScoreMode scoreMode() {
-      ScoreMode scoreMode = null;
-      for (Collector collector : collectors) {
-        if (scoreMode == null) {
-          scoreMode = collector.scoreMode();
-        } else if (scoreMode != collector.scoreMode()) {
-          return ScoreMode.COMPLETE;
-        }
-      }
-      return scoreMode;
+      return SolrMultiCollectorManager.scoreMode(collectors);
     }
 
     /**