Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement IntersectVisitor#visit(IntsRef) whenever it makes sense #14138

Merged
merged 15 commits into from
Jan 16, 2025
4 changes: 4 additions & 0 deletions lucene/CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ Improvements

* GITHUB#14113: Remove unnecessary ByteArrayDataInput allocations from `Lucene90DocValuesProducer$TermsDict.decompressBlock`. (Ankit Jain)

* GITHUB#14138: Implement IntersectVisitor#visit(IntsRef) in many of the current implementations and add
BulkAdder#add(IntsRef) method. They should provide better performance due to less virtual method calls and
more efficient bulk processing. (Ignacio Vera)

Optimizations
---------------------

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import org.apache.lucene.util.BitSetIterator;
import org.apache.lucene.util.DocIdSetBuilder;
import org.apache.lucene.util.FixedBitSet;
import org.apache.lucene.util.IntsRef;
import org.apache.lucene.util.NumericUtils;

/** Distance query for {@link LatLonPoint}. */
Expand Down Expand Up @@ -233,6 +234,11 @@ public void visit(int docID) {
adder.add(docID);
}

@Override
public void visit(IntsRef ref) {
adder.add(ref);
}

@Override
public void visit(DocIdSetIterator iterator) throws IOException {
adder.add(iterator);
Expand Down Expand Up @@ -269,6 +275,14 @@ public void visit(int docID) {
cost[0]--;
}

@Override
public void visit(IntsRef ref) {
for (int i = 0; i < ref.length; i++) {
result.clear(ref.ints[ref.offset + i]);
}
cost[0] = -ref.length;
}

@Override
public void visit(DocIdSetIterator iterator) throws IOException {
result.andNot(iterator);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import org.apache.lucene.search.ScorerSupplier;
import org.apache.lucene.search.Weight;
import org.apache.lucene.util.DocIdSetBuilder;
import org.apache.lucene.util.IntsRef;
import org.apache.lucene.util.NumericUtils;

final class LongDistanceFeatureQuery extends Query {
Expand Down Expand Up @@ -405,6 +406,21 @@ public void visit(int docID, byte[] packedValue) {
adder.add(docID);
}

@Override
public void visit(DocIdSetIterator iterator) throws IOException {
int docID;
while ((docID = iterator.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
visit(docID);
}
}

@Override
public void visit(IntsRef ref) {
for (int i = 0; i < ref.length; ++i) {
visit(ref.ints[ref.offset + i]);
}
}

@Override
public Relation compare(byte[] minPackedValue, byte[] maxPackedValue) {
long minDocValue = NumericUtils.sortableBytesToLong(minPackedValue, 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import org.apache.lucene.util.ArrayUtil;
import org.apache.lucene.util.ArrayUtil.ByteArrayComparator;
import org.apache.lucene.util.DocIdSetBuilder;
import org.apache.lucene.util.IntsRef;

/**
* Query class for searching {@code RangeField} types by a defined {@link Relation}.
Expand Down Expand Up @@ -401,7 +402,12 @@ public void grow(int count) {
}

@Override
public void visit(int docID) throws IOException {
public void visit(IntsRef ref) {
adder.add(ref);
}

@Override
public void visit(int docID) {
adder.add(docID);
}

Expand All @@ -411,7 +417,7 @@ public void visit(DocIdSetIterator iterator) throws IOException {
}

@Override
public void visit(int docID, byte[] leaf) throws IOException {
public void visit(int docID, byte[] leaf) {
if (queryType.matches(ranges, leaf, numDims, bytesPerDim, comparator)) {
visit(docID);
}
Expand Down
44 changes: 44 additions & 0 deletions lucene/core/src/java/org/apache/lucene/document/SpatialQuery.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import org.apache.lucene.util.BitSetIterator;
import org.apache.lucene.util.DocIdSetBuilder;
import org.apache.lucene.util.FixedBitSet;
import org.apache.lucene.util.IntsRef;

/**
* Base query class for all spatial geometries: {@link LatLonShape}, {@link LatLonPoint} and {@link
Expand Down Expand Up @@ -445,6 +446,11 @@ public void visit(DocIdSetIterator iterator) throws IOException {
adder.add(iterator);
}

@Override
public void visit(IntsRef ref) {
adder.add(ref);
}

@Override
public void visit(int docID, byte[] t) {
if (leafPredicate.test(t)) {
Expand Down Expand Up @@ -489,6 +495,14 @@ public void visit(DocIdSetIterator iterator) throws IOException {
cost[0] += iterator.cost();
}

@Override
public void visit(IntsRef ref) {
for (int i = 0; i < ref.length; i++) {
result.set(ref.ints[ref.offset + i]);
}
cost[0] += ref.length;
}

@Override
public void visit(int docID, byte[] t) {
if (result.get(docID) == false) {
Expand Down Expand Up @@ -532,6 +546,14 @@ public void visit(int docID) {
cost[0]++;
}

@Override
public void visit(IntsRef ref) {
for (int i = 0; i < ref.length; i++) {
result.set(ref.ints[ref.offset + i]);
}
cost[0] += ref.length;
}

@Override
public void visit(DocIdSetIterator iterator) throws IOException {
result.or(iterator);
Expand Down Expand Up @@ -589,6 +611,13 @@ public void visit(DocIdSetIterator iterator) throws IOException {
excluded.or(iterator);
}

@Override
public void visit(IntsRef ref) {
for (int i = 0; i < ref.length; i++) {
visit(ref.ints[ref.offset + i]);
}
}

@Override
public void visit(int docID, byte[] t) {
if (excluded.get(docID) == false) {
Expand Down Expand Up @@ -643,6 +672,14 @@ public void visit(int docID) {
cost[0]--;
}

@Override
public void visit(IntsRef ref) {
for (int i = 0; i < ref.length; i++) {
result.clear(ref.ints[ref.offset + i]);
}
cost[0] -= ref.length;
}

@Override
public void visit(DocIdSetIterator iterator) throws IOException {
result.andNot(iterator);
Expand Down Expand Up @@ -693,6 +730,13 @@ public void visit(DocIdSetIterator iterator) throws IOException {
result.andNot(iterator);
}

@Override
public void visit(IntsRef ref) {
for (int i = 0; i < ref.length; i++) {
visit(ref.ints[ref.offset + i]);
}
}

@Override
public void visit(int docID, byte[] packedTriangle) {
// NO-OP
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
import org.apache.lucene.search.ScorerSupplier;
import org.apache.lucene.search.Weight;
import org.apache.lucene.util.DocIdSetBuilder;
import org.apache.lucene.util.IntsRef;

/**
* Finds all previously indexed points that fall within the specified XY geometries.
Expand Down Expand Up @@ -90,6 +91,11 @@ public void visit(DocIdSetIterator iterator) throws IOException {
adder.add(iterator);
}

@Override
public void visit(IntsRef ref) {
adder.add(ref);
}

@Override
public void visit(int docID, byte[] packedValue) {
double x = XYEncodingUtils.decode(packedValue, 0);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,9 +188,7 @@ public void visit(DocIdSetIterator iterator) throws IOException {

@Override
public void visit(IntsRef ref) {
for (int i = ref.offset; i < ref.offset + ref.length; i++) {
adder.add(ref.ints[i]);
}
adder.add(ref);
}

@Override
Expand Down
48 changes: 28 additions & 20 deletions lucene/core/src/java/org/apache/lucene/util/DocIdSetBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,29 +41,28 @@ public final class DocIdSetBuilder {
*
* @see DocIdSetBuilder#grow
*/
public abstract static class BulkAdder {
public abstract void add(int doc);
public sealed interface BulkAdder permits FixedBitSetAdder, BufferAdder {
void add(int doc);

public void add(DocIdSetIterator iterator) throws IOException {
int docID;
while ((docID = iterator.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
add(docID);
}
}
}
void add(IntsRef docs);

private static class FixedBitSetAdder extends BulkAdder {
final FixedBitSet bitSet;
void add(DocIdSetIterator iterator) throws IOException;
}

FixedBitSetAdder(FixedBitSet bitSet) {
this.bitSet = bitSet;
}
private record FixedBitSetAdder(FixedBitSet bitSet) implements BulkAdder {

@Override
public void add(int doc) {
bitSet.set(doc);
}

@Override
public void add(IntsRef docs) {
for (int i = 0; i < docs.length; i++) {
bitSet.set(docs.ints[docs.offset + i]);
}
}

@Override
public void add(DocIdSetIterator iterator) throws IOException {
bitSet.or(iterator);
Expand All @@ -85,17 +84,26 @@ private static class Buffer {
}
}

private static class BufferAdder extends BulkAdder {
final Buffer buffer;

BufferAdder(Buffer buffer) {
this.buffer = buffer;
}
private record BufferAdder(Buffer buffer) implements BulkAdder {

@Override
public void add(int doc) {
buffer.array[buffer.length++] = doc;
}

@Override
public void add(IntsRef docs) {
System.arraycopy(docs.ints, docs.offset, buffer.array, buffer.length, docs.length);
buffer.length += docs.length;
}

@Override
public void add(DocIdSetIterator iterator) throws IOException {
int docID;
while ((docID = iterator.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
add(docID);
}
}
}

private final int maxDoc;
Expand Down
14 changes: 14 additions & 0 deletions lucene/core/src/java/org/apache/lucene/util/bkd/BKDReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import org.apache.lucene.store.IndexInput;
import org.apache.lucene.util.ArrayUtil;
import org.apache.lucene.util.BytesRef;
import org.apache.lucene.util.IntsRef;
import org.apache.lucene.util.MathUtil;

/**
Expand Down Expand Up @@ -146,6 +147,19 @@ public void visit(int docID) {
count[0]++;
}

@Override
public void visit(DocIdSetIterator iterator) throws IOException {
int docID;
while ((docID = iterator.nextDoc()) != DocIdSetIterator.NO_MORE_DOCS) {
visit(docID);
}
}

@Override
public void visit(IntsRef ref) {
count[0] += ref.length;
}

@Override
public void visit(int docID, byte[] packedValue) {
throw new AssertionError();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,13 +130,20 @@ public void testRandom() throws IOException {
for (j = 0; j < array.length; ) {
final int l = TestUtil.nextInt(random(), 1, array.length - j);
DocIdSetBuilder.BulkAdder adder = null;
for (int k = 0, budget = 0; k < l; ++k) {
if (budget == 0 || rarely()) {
budget = TestUtil.nextInt(random(), 1, l - k + 5);
adder = builder.grow(budget);
if (usually()) {
for (int k = 0, budget = 0; k < l; ++k) {
if (budget == 0 || rarely()) {
budget = TestUtil.nextInt(random(), 1, l - k + 5);
adder = builder.grow(budget);
}
adder.add(array[j++]);
budget--;
}
adder.add(array[j++]);
budget--;
} else {
IntsRef intsRef = new IntsRef(array, j, l);
adder = builder.grow(l);
adder.add(intsRef);
j += l;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.apache.lucene.spatial3d.geom.PlanetModel.DocValueEncoder;
import org.apache.lucene.spatial3d.geom.XYZBounds;
import org.apache.lucene.util.DocIdSetBuilder;
import org.apache.lucene.util.IntsRef;
import org.apache.lucene.util.NumericUtils;

class PointInShapeIntersectVisitor implements IntersectVisitor {
Expand Down Expand Up @@ -67,6 +68,11 @@ public void visit(DocIdSetIterator iterator) throws IOException {
adder.add(iterator);
}

@Override
public void visit(IntsRef ref) throws IOException {
adder.add(ref);
}

@Override
public void visit(int docID, byte[] packedValue) {
assert packedValue.length == 12;
Expand Down
Loading