mirror of
https://github.com/apache/lucene.git
synced 2025-02-13 13:35:37 +00:00
LUCENE-10382: Use IndexReaderContext#id
to check reader identity. (#702)
`KnnVectorQuery` currently uses the index reader's hashcode to make sure that the query it builds runs on the right reader. We had added `IndexContextReader#id` a while back for a similar purpose with `TermStates`, let's reuse it?
This commit is contained in:
parent
44d7d962ae
commit
d47ff38d70
@ -253,7 +253,7 @@ public class KnnVectorQuery extends Query {
|
|||||||
scores[i] = topK.scoreDocs[i].score;
|
scores[i] = topK.scoreDocs[i].score;
|
||||||
}
|
}
|
||||||
int[] segmentStarts = findSegmentStarts(reader, docs);
|
int[] segmentStarts = findSegmentStarts(reader, docs);
|
||||||
return new DocAndScoreQuery(k, docs, scores, segmentStarts, reader.hashCode());
|
return new DocAndScoreQuery(k, docs, scores, segmentStarts, reader.getContext().id());
|
||||||
}
|
}
|
||||||
|
|
||||||
private int[] findSegmentStarts(IndexReader reader, int[] docs) {
|
private int[] findSegmentStarts(IndexReader reader, int[] docs) {
|
||||||
@ -306,7 +306,7 @@ public class KnnVectorQuery extends Query {
|
|||||||
private final int[] docs;
|
private final int[] docs;
|
||||||
private final float[] scores;
|
private final float[] scores;
|
||||||
private final int[] segmentStarts;
|
private final int[] segmentStarts;
|
||||||
private final int readerHash;
|
private final Object contextIdentity;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@ -318,20 +318,22 @@ public class KnnVectorQuery extends Query {
|
|||||||
* document in each segment. If a segment has no matching documents, it should be assigned
|
* document in each segment. If a segment has no matching documents, it should be assigned
|
||||||
* the index of the next segment that does. There should be a final entry that is always
|
* the index of the next segment that does. There should be a final entry that is always
|
||||||
* docs.length-1.
|
* docs.length-1.
|
||||||
* @param readerHash a hash code identifying the IndexReader used to create this query
|
* @param contextIdentity an object identifying the reader context that was used to build this
|
||||||
|
* query
|
||||||
*/
|
*/
|
||||||
DocAndScoreQuery(int k, int[] docs, float[] scores, int[] segmentStarts, int readerHash) {
|
DocAndScoreQuery(
|
||||||
|
int k, int[] docs, float[] scores, int[] segmentStarts, Object contextIdentity) {
|
||||||
this.k = k;
|
this.k = k;
|
||||||
this.docs = docs;
|
this.docs = docs;
|
||||||
this.scores = scores;
|
this.scores = scores;
|
||||||
this.segmentStarts = segmentStarts;
|
this.segmentStarts = segmentStarts;
|
||||||
this.readerHash = readerHash;
|
this.contextIdentity = contextIdentity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float boost)
|
public Weight createWeight(IndexSearcher searcher, ScoreMode scoreMode, float boost)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
if (searcher.getIndexReader().hashCode() != readerHash) {
|
if (searcher.getIndexReader().getContext().id() != contextIdentity) {
|
||||||
throw new IllegalStateException("This DocAndScore query was created by a different reader");
|
throw new IllegalStateException("This DocAndScore query was created by a different reader");
|
||||||
}
|
}
|
||||||
return new Weight(this) {
|
return new Weight(this) {
|
||||||
@ -455,13 +457,15 @@ public class KnnVectorQuery extends Query {
|
|||||||
if (sameClassAs(obj) == false) {
|
if (sameClassAs(obj) == false) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return Arrays.equals(docs, ((DocAndScoreQuery) obj).docs)
|
return contextIdentity == ((DocAndScoreQuery) obj).contextIdentity
|
||||||
|
&& Arrays.equals(docs, ((DocAndScoreQuery) obj).docs)
|
||||||
&& Arrays.equals(scores, ((DocAndScoreQuery) obj).scores);
|
&& Arrays.equals(scores, ((DocAndScoreQuery) obj).scores);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return Objects.hash(classHash(), Arrays.hashCode(docs), Arrays.hashCode(scores));
|
return Objects.hash(
|
||||||
|
classHash(), contextIdentity, Arrays.hashCode(docs), Arrays.hashCode(scores));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user