Skip to content
Merged
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