From a4a26aadb18a2b07db77413d01f1a92dfbf2c237 Mon Sep 17 00:00:00 2001 From: Christine Poerschke Date: Fri, 29 Aug 2025 17:31:56 +0100 Subject: [PATCH 1/3] abstract QueryComponent.mergeIds' ShardDoc processing --- .../handler/component/QueryComponent.java | 63 +++++++++++++++++-- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java index 42909359883..81015bcf9f7 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java @@ -37,6 +37,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.BiFunction; import java.util.stream.Collectors; import org.apache.lucene.index.ExitableDirectoryReader; import org.apache.lucene.index.IndexReaderContext; @@ -905,7 +906,58 @@ protected boolean addFL(StringBuilder fl, String field, boolean additionalAdded) return true; } + protected abstract static class ShardDocQueue { + public abstract void push(ShardDoc shardDoc); + + public abstract ShardDoc pop(); + + public abstract int size(); + } + ; + + private static class DefaultShardDocQueue extends ShardDocQueue { + private final ShardFieldSortedHitQueue queue; + + public DefaultShardDocQueue(SortField[] sortFields, int size, SolrIndexSearcher searcher) { + queue = new ShardFieldSortedHitQueue(sortFields, size, searcher); + } + + public void push(ShardDoc shardDoc) { + queue.insertWithOverflow(shardDoc); + } + + public ShardDoc pop() { + return queue.pop(); + } + + public int size() { + return queue.size(); + } + } + ; + + protected static class ShardDocQueueFactory + implements BiFunction { + + private final SolrIndexSearcher searcher; + + public ShardDocQueueFactory(SolrIndexSearcher searcher) { + this.searcher = searcher; + } + + @Override + public ShardDocQueue apply(SortField[] sortFields, Integer size) { + return new DefaultShardDocQueue(sortFields, size, searcher); + } + } + ; + protected void mergeIds(ResponseBuilder rb, ShardRequest sreq) { + implementMergeIds(rb, sreq, new ShardDocQueueFactory(rb.req.getSearcher())); + } + + private void implementMergeIds( + ResponseBuilder rb, ShardRequest sreq, ShardDocQueueFactory shardDocQueueFactory) { List mergeStrategies = rb.getMergeStrategies(); if (mergeStrategies != null) { mergeStrategies.sort(MergeStrategy.MERGE_COMP); @@ -952,9 +1004,8 @@ protected void mergeIds(ResponseBuilder rb, ShardRequest sreq) { // Merge the docs via a priority queue so we don't have to sort *all* of the // documents... we only need to order the top (rows+start) - final ShardFieldSortedHitQueue queue = - new ShardFieldSortedHitQueue( - sortFields, ss.getOffset() + ss.getCount(), rb.req.getSearcher()); + final ShardDocQueue shardDocQueue = + shardDocQueueFactory.apply(sortFields, ss.getOffset() + ss.getCount()); NamedList shardInfo = null; if (rb.req.getParams().getBool(ShardParams.SHARDS_INFO, false)) { @@ -1160,19 +1211,19 @@ protected void mergeIds(ResponseBuilder rb, ShardRequest sreq) { shardDoc.sortFieldValues = unmarshalledSortFieldValues; - queue.insertWithOverflow(shardDoc); + shardDocQueue.push(shardDoc); } // end for-each-doc-in-response } // end for-each-response // The queue now has 0 -> queuesize docs, where queuesize <= start + rows // So we want to pop the last documents off the queue to get // the docs offset -> queuesize - int resultSize = queue.size() - ss.getOffset(); + int resultSize = shardDocQueue.size() - ss.getOffset(); resultSize = Math.max(0, resultSize); // there may not be any docs in range Map resultIds = new HashMap<>(); for (int i = resultSize - 1; i >= 0; i--) { - ShardDoc shardDoc = queue.pop(); + ShardDoc shardDoc = shardDocQueue.pop(); shardDoc.positionInResponse = i; // Need the toString() for correlation with other lists that must // be strings (like keys in highlighting, explain, etc) From 7fe997c8d47f7acb03bb5a01df991f832945b264 Mon Sep 17 00:00:00 2001 From: Christine Poerschke Date: Fri, 29 Aug 2025 18:00:30 +0100 Subject: [PATCH 2/3] add missing @Override annotations --- .../java/org/apache/solr/handler/component/QueryComponent.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java index 81015bcf9f7..ff7a76bc7ad 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java @@ -922,14 +922,17 @@ public DefaultShardDocQueue(SortField[] sortFields, int size, SolrIndexSearcher queue = new ShardFieldSortedHitQueue(sortFields, size, searcher); } + @Override public void push(ShardDoc shardDoc) { queue.insertWithOverflow(shardDoc); } + @Override public ShardDoc pop() { return queue.pop(); } + @Override public int size() { return queue.size(); } From bcd1c3b48c2c217c65b74c38863fe0786bda2e61 Mon Sep 17 00:00:00 2001 From: Christine Poerschke Date: Mon, 1 Sep 2025 12:30:44 +0000 Subject: [PATCH 3/3] make DefaultShardDocQueue an anonymous class --- .../handler/component/QueryComponent.java | 44 ++++++++----------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java index ff7a76bc7ad..b470040ab72 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/QueryComponent.java @@ -915,30 +915,6 @@ protected abstract static class ShardDocQueue { } ; - private static class DefaultShardDocQueue extends ShardDocQueue { - private final ShardFieldSortedHitQueue queue; - - public DefaultShardDocQueue(SortField[] sortFields, int size, SolrIndexSearcher searcher) { - queue = new ShardFieldSortedHitQueue(sortFields, size, searcher); - } - - @Override - public void push(ShardDoc shardDoc) { - queue.insertWithOverflow(shardDoc); - } - - @Override - public ShardDoc pop() { - return queue.pop(); - } - - @Override - public int size() { - return queue.size(); - } - } - ; - protected static class ShardDocQueueFactory implements BiFunction { @@ -950,7 +926,25 @@ public ShardDocQueueFactory(SolrIndexSearcher searcher) { @Override public ShardDocQueue apply(SortField[] sortFields, Integer size) { - return new DefaultShardDocQueue(sortFields, size, searcher); + return new ShardDocQueue() { + private final ShardFieldSortedHitQueue queue = + new ShardFieldSortedHitQueue(sortFields, size, searcher); + + @Override + public void push(ShardDoc shardDoc) { + queue.insertWithOverflow(shardDoc); + } + + @Override + public ShardDoc pop() { + return queue.pop(); + } + + @Override + public int size() { + return queue.size(); + } + }; } } ;