Implemented visitWithSortedDim for pointCount in PointRangeQuery.

This commit is contained in:
zhouhui 2024-05-11 15:25:24 +08:00
parent 915ad37985
commit 5c7e73d7ae
3 changed files with 109 additions and 0 deletions

View File

@ -519,6 +519,18 @@ public abstract class PointRangeQuery extends Query {
} }
} }
@Override
public boolean visitWithSortedDim(int docID, byte[] packedValue, int sortedDim)
throws IOException {
int matchState = matchesWithState(packedValue, sortedDim);
if (matchState == PointValues.MatchState.MATCH) {
matchingNodeCount[0]++;
} else if (matchState == PointValues.MatchState.HIGH_IN_SORTED_DIM) {
return false;
}
return true;
}
@Override @Override
public Relation compare(byte[] minPackedValue, byte[] maxPackedValue) { public Relation compare(byte[] minPackedValue, byte[] maxPackedValue) {
return nodeComparator.apply(minPackedValue, maxPackedValue); return nodeComparator.apply(minPackedValue, maxPackedValue);

View File

@ -170,6 +170,14 @@ public class TestPointQueries extends LuceneTestCase {
doc.add(new LongPoint("point", 3)); doc.add(new LongPoint("point", 3));
w.addDocument(doc); w.addDocument(doc);
doc = new Document();
doc.add(new LongPoint("point", 4));
w.addDocument(doc);
doc = new Document();
doc.add(new LongPoint("point", 5));
w.addDocument(doc);
DirectoryReader r = DirectoryReader.open(w); DirectoryReader r = DirectoryReader.open(w);
IndexSearcher s = new IndexSearcher(r); IndexSearcher s = new IndexSearcher(r);
assertEquals(2, s.count(LongPoint.newRangeQuery("point", -8L, 1L))); assertEquals(2, s.count(LongPoint.newRangeQuery("point", -8L, 1L)));
@ -181,6 +189,41 @@ public class TestPointQueries extends LuceneTestCase {
dir.close(); dir.close();
} }
public void testVisitWithSoredDim() throws Exception {
Directory dir = newDirectory();
IndexWriter w = new IndexWriter(dir, new IndexWriterConfig(new MockAnalyzer(random())));
Document doc = new Document();
doc.add(new LongPoint("point", -7));
w.addDocument(doc);
doc = new Document();
doc.add(new LongPoint("point", 0));
w.addDocument(doc);
doc = new Document();
doc.add(new LongPoint("point", 3));
w.addDocument(doc);
doc = new Document();
doc.add(new LongPoint("point", 4));
w.addDocument(doc);
doc = new Document();
doc.add(new LongPoint("point", 5));
w.addDocument(doc);
DirectoryReader r = DirectoryReader.open(w);
IndexSearcher s = new IndexSearcher(r);
assertEquals(2, s.search(LongPoint.newRangeQuery("point", -8L, 1L), 10).scoreDocs.length);
assertEquals(3, s.search(LongPoint.newRangeQuery("point", -7L, 3L), 10).scoreDocs.length);
assertEquals(1, s.search(LongPoint.newExactQuery("point", -7L), 10).scoreDocs.length);
assertEquals(0, s.search(LongPoint.newExactQuery("point", -6L), 10).scoreDocs.length);
w.close();
r.close();
dir.close();
}
public void testBasicDoubles() throws Exception { public void testBasicDoubles() throws Exception {
Directory dir = newDirectory(); Directory dir = newDirectory();
IndexWriter w = new IndexWriter(dir, new IndexWriterConfig(new MockAnalyzer(random()))); IndexWriter w = new IndexWriter(dir, new IndexWriterConfig(new MockAnalyzer(random())));

View File

@ -1382,6 +1382,60 @@ public class AssertingLeafReader extends FilterLeafReader {
in.visit(docID, packedValue); in.visit(docID, packedValue);
} }
@Override
public boolean visitWithSortedDim(int docID, byte[] packedValue, int sortedDim)
throws IOException {
assert --docBudget >= 0 : "called add() more times than the last call to grow() reserved";
// This method, to filter each doc's value, should only be invoked when the cell crosses the
// query shape:
assert lastCompareResult == null
|| lastCompareResult == PointValues.Relation.CELL_CROSSES_QUERY;
if (lastCompareResult != null) {
// This doc's packed value should be contained in the last cell passed to compare:
for (int dim = 0; dim < numIndexDims; dim++) {
assert Arrays.compareUnsigned(
lastMinPackedValue,
dim * bytesPerDim,
dim * bytesPerDim + bytesPerDim,
packedValue,
dim * bytesPerDim,
dim * bytesPerDim + bytesPerDim)
<= 0
: "dim=" + dim + " of " + numDataDims + " value=" + new BytesRef(packedValue);
assert Arrays.compareUnsigned(
lastMaxPackedValue,
dim * bytesPerDim,
dim * bytesPerDim + bytesPerDim,
packedValue,
dim * bytesPerDim,
dim * bytesPerDim + bytesPerDim)
>= 0
: "dim=" + dim + " of " + numDataDims + " value=" + new BytesRef(packedValue);
}
lastCompareResult = null;
}
// TODO: we should assert that this "matches" whatever relation the last call to compare had
// returned
assert packedValue.length == numDataDims * bytesPerDim;
if (numDataDims == 1) {
int cmp = Arrays.compareUnsigned(lastDocValue, 0, bytesPerDim, packedValue, 0, bytesPerDim);
if (cmp < 0) {
// ok
} else if (cmp == 0) {
assert lastDocID <= docID : "doc ids are out of order when point values are the same!";
} else {
// out of order!
assert false : "point values are out of order";
}
System.arraycopy(packedValue, 0, lastDocValue, 0, bytesPerDim);
lastDocID = docID;
}
return in.visitWithSortedDim(docID, packedValue, sortedDim);
}
@Override @Override
public void grow(int count) { public void grow(int count) {
in.grow(count); in.grow(count);