minor tweaks and spotless

This commit is contained in:
Greg Miller 2024-08-27 08:15:30 -07:00 committed by Greg Miller
parent 0fb0a63ebc
commit 8418be1160
3 changed files with 50 additions and 29 deletions

View File

@ -16,11 +16,15 @@
*/
package org.apache.lucene.document;
import java.io.IOException;
import java.util.Objects;
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.DocValuesSkipper;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.SortedSetDocValues;
import org.apache.lucene.search.ConstantScoreScorer;
import org.apache.lucene.search.ConstantScoreWeight;
import org.apache.lucene.search.DocIdSetIterator;
import org.apache.lucene.search.FieldExistsQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
@ -32,9 +36,6 @@ import org.apache.lucene.search.SortedSetDocValuesRangeScorer;
import org.apache.lucene.search.Weight;
import org.apache.lucene.util.BytesRef;
import java.io.IOException;
import java.util.Objects;
final class SortedSetDocValuesRangeQuery extends Query {
private final String field;
@ -148,7 +149,15 @@ final class SortedSetDocValuesRangeQuery extends Query {
}
}
return new SortedSetDocValuesRangeScorer(field, values, minOrd, maxOrd, scoreMode, score(), skipper, context);
// no terms matched in this segment
if (minOrd > maxOrd
|| (skipper != null
&& (minOrd > skipper.maxValue() || maxOrd < skipper.minValue()))) {
return new ConstantScoreScorer(score(), scoreMode, DocIdSetIterator.empty());
}
return new SortedSetDocValuesRangeScorer(
field, values, minOrd, maxOrd, scoreMode, score(), skipper, context.reader());
}
@Override

View File

@ -178,24 +178,35 @@ public final class DocValuesRewriteMethod extends MultiTermQuery.RewriteMethod {
assert minOrd >= 0;
long maxOrd = -1;
long prev = minOrd - 1;
boolean hasGaps = false;
boolean contiguous = true;
do {
long ord = termsEnum.ord();
assert ord >= 0 && ord > maxOrd;
if (ord - prev > 1) {
hasGaps = true;
contiguous = false;
}
prev = ord;
maxOrd = ord;
termSet.set(ord);
} while (termsEnum.next() != null);
// no terms matched in this segment
if (skipper != null && (minOrd > skipper.maxValue() || maxOrd < skipper.minValue())) {
return new ConstantScoreScorer(score(), scoreMode, DocIdSetIterator.empty());
}
if (hasGaps == false) {
return new SortedSetDocValuesRangeScorer(query.field, values, minOrd, maxOrd, scoreMode, score(), skipper, context);
// if the term set happens to create a contiguous range we can optimize with a range
// scorer
if (contiguous) {
return new SortedSetDocValuesRangeScorer(
query.field,
values,
minOrd,
maxOrd,
scoreMode,
score(),
skipper,
context.reader());
}
final SortedDocValues singleton = DocValues.unwrapSingleton(values);

View File

@ -16,17 +16,24 @@
*/
package org.apache.lucene.search;
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.DocValuesSkipper;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.index.SortedSetDocValues;
import java.io.IOException;
import java.util.Collection;
import java.util.function.LongPredicate;
import org.apache.lucene.index.DocValues;
import org.apache.lucene.index.DocValuesSkipper;
import org.apache.lucene.index.LeafReader;
import org.apache.lucene.index.SortedDocValues;
import org.apache.lucene.index.SortedSetDocValues;
/**
* Implements a "slow" {@link Scorer} for a term range defined by min/max ordinals. This is really
* just a common implementation detail of a couple different queries and not intended to be directly
* used (but must be public due to our package structure). You're probably better off looking at
* {@link org.apache.lucene.document.SortedSetDocValuesField#newSlowRangeQuery} or {@link
* org.apache.lucene.document.SortedSetDocValuesField#newSlowSetQuery}.
*
* @lucene.experimental
*/
public class SortedSetDocValuesRangeScorer extends Scorer {
final Scorer delegate;
@ -38,8 +45,9 @@ public class SortedSetDocValuesRangeScorer extends Scorer {
ScoreMode scoreMode,
float score,
DocValuesSkipper skipper,
LeafReaderContext context) throws IOException {
delegate = setupScorer(field, values, minOrd, maxOrd, scoreMode, score, skipper, context);
LeafReader reader)
throws IOException {
delegate = setupScorer(field, values, minOrd, maxOrd, scoreMode, score, skipper, reader);
}
static Scorer setupScorer(
@ -50,21 +58,14 @@ public class SortedSetDocValuesRangeScorer extends Scorer {
ScoreMode scoreMode,
float score,
DocValuesSkipper skipper,
LeafReaderContext context) throws IOException {
// no terms matched in this segment
if (minOrd > maxOrd
|| (skipper != null
&& (minOrd > skipper.maxValue() || maxOrd < skipper.minValue()))) {
return new ConstantScoreScorer(score, scoreMode, DocIdSetIterator.empty());
}
LeafReader reader)
throws IOException {
// all terms matched in this segment
if (skipper != null
&& skipper.docCount() == context.reader().maxDoc()
&& skipper.docCount() == reader.maxDoc()
&& skipper.minValue() >= minOrd
&& skipper.maxValue() <= maxOrd) {
return new ConstantScoreScorer(
score, scoreMode, DocIdSetIterator.all(skipper.docCount()));
return new ConstantScoreScorer(score, scoreMode, DocIdSetIterator.all(skipper.docCount()));
}
final SortedDocValues singleton = DocValues.unwrapSingleton(values);
@ -73,7 +74,7 @@ public class SortedSetDocValuesRangeScorer extends Scorer {
if (skipper != null) {
final DocIdSetIterator psIterator =
getDocIdSetIteratorOrNullForPrimarySort(
context.reader(), field, singleton, skipper, minOrd, maxOrd);
reader, field, singleton, skipper, minOrd, maxOrd);
if (psIterator != null) {
return new ConstantScoreScorer(score, scoreMode, psIterator);
}