Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/main' into gh-windows-builds
Browse files Browse the repository at this point in the history
  • Loading branch information
dweiss committed Dec 10, 2024
2 parents 6a06b0d + 76f5254 commit d4e710f
Show file tree
Hide file tree
Showing 14 changed files with 131 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ final class BlockMaxConjunctionBulkScorer extends BulkScorer {
private final DocIdSetIterator[] iterators;
private final DocIdSetIterator lead1, lead2;
private final Scorable scorer1, scorer2;
private final SimpleScorable scorable = new SimpleScorable();
private final DocAndScore scorable = new DocAndScore();
private final double[] sumOfOtherClauses;
private final int maxDoc;

Expand Down Expand Up @@ -202,4 +202,20 @@ private void scoreWindow(
public long cost() {
return lead1.cost();
}

private static class DocAndScore extends Scorable {

float score;
float minCompetitiveScore;

@Override
public float score() throws IOException {
return score;
}

@Override
public void setMinCompetitiveScore(float minScore) throws IOException {
this.minCompetitiveScore = minScore;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public DisiWrapper get(int i) {
final DisiWrapper[] leads;
final HeadPriorityQueue head;
final TailPriorityQueue tail;
final SimpleScorable score = new SimpleScorable();
final Score score = new Score();
final int minShouldMatch;
final long cost;
final boolean needsScores;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ public int score(final LeafCollector collector, Bits acceptDocs, int min, int ma
throws IOException {
final LeafCollector noScoreCollector =
new LeafCollector() {
SimpleScorable fake = new SimpleScorable();
Score fake = new Score();

@Override
public void setScorer(Scorable scorer) throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public BulkScorer bulkScorer() throws IOException {
public int score(LeafCollector collector, Bits acceptDocs, int min, int max)
throws IOException {
max = Math.min(max, maxDoc);
SimpleScorable scorer = new SimpleScorable();
Score scorer = new Score();
scorer.score = score;
collector.setScorer(scorer);
for (int doc = min; doc < max; ++doc) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@ final class MaxScoreBulkScorer extends BulkScorer {
// The minimum value of minCompetitiveScore that would produce a more favorable partitioning.
float nextMinCompetitiveScore;
private final long cost;
final SimpleScorable scorable = new SimpleScorable();
float minCompetitiveScore;
private final Score scorable = new Score();
final double[] maxScoreSums;
private final DisiWrapper filter;

Expand Down Expand Up @@ -126,7 +127,7 @@ public int score(LeafCollector collector, Bits acceptDocs, int min, int max) thr
while (top.doc < outerWindowMax) {
scoreInnerWindow(collector, acceptDocs, outerWindowMax, filter);
top = essentialQueue.top();
if (scorable.minCompetitiveScore >= nextMinCompetitiveScore) {
if (minCompetitiveScore >= nextMinCompetitiveScore) {
// The minimum competitive score increased substantially, so we can now partition scorers
// in a more favorable way.
break;
Expand Down Expand Up @@ -253,7 +254,7 @@ private void scoreInnerWindowAsConjunction(LeafCollector collector, Bits acceptD
// We specialize handling the second best scorer, which seems to help a bit with performance.
// But this is the exact same logic as in the below for loop.
if ((float) MathUtil.sumUpperBound(score + maxScoreSumAtLead2, allScorers.length)
< scorable.minCompetitiveScore) {
< minCompetitiveScore) {
// a competitive match is not possible according to max scores, skip to the next candidate
lead1.doc = lead1.iterator.nextDoc();
continue;
Expand All @@ -271,7 +272,7 @@ private void scoreInnerWindowAsConjunction(LeafCollector collector, Bits acceptD

for (int i = allScorers.length - 3; i >= firstRequiredScorer; --i) {
if ((float) MathUtil.sumUpperBound(score + maxScoreSums[i], allScorers.length)
< scorable.minCompetitiveScore) {
< minCompetitiveScore) {
// a competitive match is not possible according to max scores, skip to the next candidate
lead1.doc = lead1.iterator.nextDoc();
continue outer;
Expand Down Expand Up @@ -388,7 +389,7 @@ private void scoreNonEssentialClauses(
for (int i = numNonEssentialClauses - 1; i >= 0; --i) {
float maxPossibleScore =
(float) MathUtil.sumUpperBound(score + maxScoreSums[i], allScorers.length);
if (maxPossibleScore < scorable.minCompetitiveScore) {
if (maxPossibleScore < minCompetitiveScore) {
// Hit is not competitive.
return;
}
Expand Down Expand Up @@ -434,7 +435,7 @@ boolean partitionScorers() {
double newMaxScoreSum = maxScoreSum + w.maxWindowScore;
float maxScoreSumFloat =
(float) MathUtil.sumUpperBound(newMaxScoreSum, firstEssentialScorer + 1);
if (maxScoreSumFloat < scorable.minCompetitiveScore) {
if (maxScoreSumFloat < minCompetitiveScore) {
maxScoreSum = newMaxScoreSum;
allScorers[firstEssentialScorer] = w;
maxScoreSums[firstEssentialScorer] = maxScoreSum;
Expand Down Expand Up @@ -472,7 +473,7 @@ boolean partitionScorers() {
if (firstRequiredScorer > 1) {
maxPossibleScoreWithoutPreviousClause += maxScoreSums[firstRequiredScorer - 2];
}
if ((float) maxPossibleScoreWithoutPreviousClause >= scorable.minCompetitiveScore) {
if ((float) maxPossibleScoreWithoutPreviousClause >= minCompetitiveScore) {
break;
}
// The sum of maximum scores ignoring the previous clause is less than the minimum
Expand Down Expand Up @@ -506,4 +507,19 @@ private int nextCandidate(int rangeEnd) {
public long cost() {
return cost;
}

private class Score extends Scorable {

float score;

@Override
public float score() {
return score;
}

@Override
public void setMinCompetitiveScore(float minScore) throws IOException {
MaxScoreBulkScorer.this.minCompetitiveScore = minScore;
}
}
}
30 changes: 30 additions & 0 deletions lucene/core/src/java/org/apache/lucene/search/Score.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.lucene.search;

/**
* Used by {@link BulkScorer}s that need to pass a {@link Scorable} to {@link
* LeafCollector#setScorer}.
*/
final class Score extends Scorable {
float score;

@Override
public float score() {
return score;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public TopDocs rescore(IndexSearcher searcher, TopDocs firstPassTopDocs, int top
int docBase = 0;

LeafCollector leafCollector = null;
SimpleScorable score = new SimpleScorable();
Score score = new Score();

while (hitUpto < hits.length) {
ScoreDoc hit = hits[hitUpto];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import java.util.Optional;
import org.apache.lucene.util.ArrayUtil;
import org.apache.lucene.util.BitUtil;
import org.apache.lucene.util.Constants;
import org.apache.lucene.util.GroupVIntUtil;
import org.apache.lucene.util.IOConsumer;

Expand Down Expand Up @@ -422,12 +423,20 @@ void advise(long offset, long length, IOConsumer<MemorySegment> advice) throws I

@Override
public Optional<Boolean> isLoaded() {
boolean isLoaded = true;
for (MemorySegment seg : segments) {
if (seg.isLoaded() == false) {
return Optional.of(Boolean.FALSE);
isLoaded = false;
break;
}
}
return Optional.of(Boolean.TRUE);

if (Constants.WINDOWS && isLoaded == false) {
// see https://github.com/apache/lucene/issues/14050
return Optional.empty();
}

return Optional.of(isLoaded);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public BulkScorer bulkScorer() throws IOException {
public int score(LeafCollector collector, Bits acceptDocs, int min, int max)
throws IOException {
assert min == 0;
collector.setScorer(new SimpleScorable());
collector.setScorer(new Score());
collector.collect(0);
return DocIdSetIterator.NO_MORE_DOCS;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ public void testWrapped2Times() throws Exception {

// for the combined BQ, the scorer should always be BooleanScorer's BucketScorer, because our
// scorer supports out-of order collection!
final Class<SimpleScorable> bucketScorerClass = SimpleScorable.class;
final Class<Score> bucketScorerClass = Score.class;
checkHits(searcher, csqbq, csqbq.getBoost(), bucketScorerClass);
} finally {
IOUtils.close(reader, directory);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -658,23 +658,23 @@ public void testPartition() throws IOException {
assertEquals(3, scorer.firstRequiredScorer); // no required clauses

// less than the minimum score of every clause
scorer.scorable.minCompetitiveScore = 0.09f;
scorer.minCompetitiveScore = 0.09f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
assertEquals(0, scorer.firstEssentialScorer); // all clauses are still essential
assertEquals(3, scorer.firstRequiredScorer); // no required clauses

// equal to the maximum score of `the`
scorer.scorable.minCompetitiveScore = 0.1f;
scorer.minCompetitiveScore = 0.1f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
assertEquals(0, scorer.firstEssentialScorer); // all clauses are still essential
assertEquals(3, scorer.firstRequiredScorer); // no required clauses

// gt than the minimum score of `the`
scorer.scorable.minCompetitiveScore = 0.11f;
scorer.minCompetitiveScore = 0.11f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
Expand All @@ -683,7 +683,7 @@ public void testPartition() throws IOException {
assertSame(the, scorer.allScorers[0].scorer);

// equal to the sum of the max scores of the and quick
scorer.scorable.minCompetitiveScore = 1.1f;
scorer.minCompetitiveScore = 1.1f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
Expand All @@ -692,7 +692,7 @@ public void testPartition() throws IOException {
assertSame(the, scorer.allScorers[0].scorer);

// greater than the sum of the max scores of the and quick
scorer.scorable.minCompetitiveScore = 1.11f;
scorer.minCompetitiveScore = 1.11f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
Expand All @@ -703,7 +703,7 @@ public void testPartition() throws IOException {
assertSame(fox, scorer.allScorers[2].scorer);

// equal to the sum of the max scores of the and fox
scorer.scorable.minCompetitiveScore = 1.2f;
scorer.minCompetitiveScore = 1.2f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
Expand All @@ -714,7 +714,7 @@ public void testPartition() throws IOException {
assertSame(fox, scorer.allScorers[2].scorer);

// greater than the sum of the max scores of the and fox
scorer.scorable.minCompetitiveScore = 1.21f;
scorer.minCompetitiveScore = 1.21f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
Expand All @@ -725,7 +725,7 @@ public void testPartition() throws IOException {
assertSame(fox, scorer.allScorers[2].scorer);

// equal to the sum of the max scores of quick and fox
scorer.scorable.minCompetitiveScore = 2.1f;
scorer.minCompetitiveScore = 2.1f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
Expand All @@ -736,7 +736,7 @@ public void testPartition() throws IOException {
assertSame(fox, scorer.allScorers[2].scorer);

// greater than the sum of the max scores of quick and fox
scorer.scorable.minCompetitiveScore = 2.11f;
scorer.minCompetitiveScore = 2.11f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
Expand All @@ -747,7 +747,7 @@ public void testPartition() throws IOException {
assertSame(fox, scorer.allScorers[2].scorer);

// greater than the sum of the max scores of quick and fox
scorer.scorable.minCompetitiveScore = 2.11f;
scorer.minCompetitiveScore = 2.11f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
Expand All @@ -758,7 +758,7 @@ public void testPartition() throws IOException {
assertSame(fox, scorer.allScorers[2].scorer);

// equal to the sum of the max scores of all terms
scorer.scorable.minCompetitiveScore = 2.2f;
scorer.minCompetitiveScore = 2.2f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertTrue(scorer.partitionScorers());
Expand All @@ -769,7 +769,7 @@ public void testPartition() throws IOException {
assertSame(fox, scorer.allScorers[2].scorer);

// greater than the sum of the max scores of all terms
scorer.scorable.minCompetitiveScore = 2.21f;
scorer.minCompetitiveScore = 2.21f;
Collections.shuffle(Arrays.asList(scorer.allScorers), random());
scorer.updateMaxWindowScores(4, 100);
assertFalse(scorer.partitionScorers()); // no possible match in this window
Expand Down
Loading

0 comments on commit d4e710f

Please sign in to comment.