1818 */
1919package org .apache .pinot .core .operator .dociditerators ;
2020
21+ import java .util .OptionalInt ;
2122import javax .annotation .Nullable ;
23+ import org .apache .pinot .core .common .BlockDocIdIterator ;
2224import org .apache .pinot .core .operator .filter .predicate .PredicateEvaluator ;
2325import org .apache .pinot .segment .spi .Constants ;
2426import org .apache .pinot .segment .spi .datasource .DataSource ;
@@ -44,7 +46,7 @@ public final class SVScanDocIdIterator implements ScanBasedDocIdIterator {
4446 private final ForwardIndexReaderContext _readerContext ;
4547 private final int _numDocs ;
4648 private final ValueMatcher _valueMatcher ;
47- private final int [] _batch = new int [ OPTIMAL_ITERATOR_BATCH_SIZE ] ;
49+ private final int [] _batch ;
4850 private int _firstMismatch ;
4951 private int _cursor ;
5052 private final int _cardinality ;
@@ -53,7 +55,8 @@ public final class SVScanDocIdIterator implements ScanBasedDocIdIterator {
5355 private long _numEntriesScanned = 0L ;
5456
5557 public SVScanDocIdIterator (PredicateEvaluator predicateEvaluator , DataSource dataSource , int numDocs ,
56- @ Nullable NullValueVectorReader nullValueReader ) {
58+ @ Nullable NullValueVectorReader nullValueReader , int batchSize ) {
59+ _batch = new int [batchSize ];
5760 _predicateEvaluator = predicateEvaluator ;
5861 _reader = dataSource .getForwardIndex ();
5962 _readerContext = _reader .createContext ();
@@ -69,6 +72,7 @@ public SVScanDocIdIterator(PredicateEvaluator predicateEvaluator, DataSource dat
6972 // for testing
7073 public SVScanDocIdIterator (PredicateEvaluator predicateEvaluator , ForwardIndexReader reader , int numDocs ,
7174 @ Nullable NullValueVectorReader nullValueReader ) {
75+ _batch = new int [BlockDocIdIterator .OPTIMAL_ITERATOR_BATCH_SIZE ];
7276 _predicateEvaluator = predicateEvaluator ;
7377 _reader = reader ;
7478 _readerContext = reader .createContext ();
@@ -87,7 +91,7 @@ public int next() {
8791 int limit ;
8892 int batchSize = 0 ;
8993 do {
90- limit = Math .min (_numDocs - _nextDocId , OPTIMAL_ITERATOR_BATCH_SIZE );
94+ limit = Math .min (_numDocs - _nextDocId , _batch . length );
9195 if (limit > 0 ) {
9296 for (int i = 0 ; i < limit ; i ++) {
9397 _batch [i ] = _nextDocId + i ;
@@ -121,14 +125,22 @@ public int advance(int targetDocId) {
121125 }
122126
123127 @ Override
124- public MutableRoaringBitmap applyAnd (ImmutableRoaringBitmap docIds ) {
125- if (docIds . isEmpty ()) {
128+ public MutableRoaringBitmap applyAnd (BatchIterator docIdIterator , OptionalInt firstDoc , OptionalInt lastDoc ) {
129+ if (! docIdIterator . hasNext ()) {
126130 return new MutableRoaringBitmap ();
127131 }
128- RoaringBitmapWriter <MutableRoaringBitmap > result = RoaringBitmapWriter .bufferWriter ()
129- .expectedRange (docIds .first (), docIds .last ()).runCompress (false ).get ();
130- BatchIterator docIdIterator = docIds .getBatchIterator ();
131- int [] buffer = new int [OPTIMAL_ITERATOR_BATCH_SIZE ];
132+ RoaringBitmapWriter <MutableRoaringBitmap > result ;
133+ if (firstDoc .isPresent () && lastDoc .isPresent ()) {
134+ result = RoaringBitmapWriter .bufferWriter ()
135+ .expectedRange (firstDoc .getAsInt (), lastDoc .getAsInt ())
136+ .runCompress (false )
137+ .get ();
138+ } else {
139+ result = RoaringBitmapWriter .bufferWriter ()
140+ .runCompress (false )
141+ .get ();
142+ }
143+ int [] buffer = new int [_batch .length ];
132144 while (docIdIterator .hasNext ()) {
133145 int limit = docIdIterator .nextBatch (buffer );
134146 if (limit > 0 ) {
@@ -264,7 +276,7 @@ public static int removeNullDocs(int[] docIds, double[] values, int limit, Immut
264276
265277 private class DictIdMatcher implements ValueMatcher {
266278
267- private final int [] _buffer = new int [OPTIMAL_ITERATOR_BATCH_SIZE ];
279+ private final int [] _buffer = new int [_batch . length ];
268280
269281 @ Override
270282 public boolean doesValueMatch (int docId ) {
@@ -280,7 +292,7 @@ public int matchValues(int limit, int[] docIds) {
280292
281293 private class DictIdMatcherAndNullHandler implements ValueMatcher {
282294
283- private final int [] _buffer = new int [OPTIMAL_ITERATOR_BATCH_SIZE ];
295+ private final int [] _buffer = new int [_batch . length ];
284296 private final ImmutableRoaringBitmap _nullBitmap ;
285297
286298 public DictIdMatcherAndNullHandler (ImmutableRoaringBitmap nullBitmap ) {
@@ -308,7 +320,7 @@ public int matchValues(int limit, int[] docIds) {
308320
309321 private class IntMatcher implements ValueMatcher {
310322
311- private final int [] _buffer = new int [OPTIMAL_ITERATOR_BATCH_SIZE ];
323+ private final int [] _buffer = new int [_batch . length ];
312324
313325 @ Override
314326 public boolean doesValueMatch (int docId ) {
@@ -325,7 +337,7 @@ public int matchValues(int limit, int[] docIds) {
325337 private class IntMatcherAndNullHandler implements ValueMatcher {
326338
327339 private final ImmutableRoaringBitmap _nullBitmap ;
328- private final int [] _buffer = new int [OPTIMAL_ITERATOR_BATCH_SIZE ];
340+ private final int [] _buffer = new int [_batch . length ];
329341
330342 public IntMatcherAndNullHandler (ImmutableRoaringBitmap nullBitmap ) {
331343 _nullBitmap = nullBitmap ;
@@ -349,7 +361,7 @@ public int matchValues(int limit, int[] docIds) {
349361
350362 private class LongMatcher implements ValueMatcher {
351363
352- private final long [] _buffer = new long [OPTIMAL_ITERATOR_BATCH_SIZE ];
364+ private final long [] _buffer = new long [_batch . length ];
353365
354366 @ Override
355367 public boolean doesValueMatch (int docId ) {
@@ -366,7 +378,7 @@ public int matchValues(int limit, int[] docIds) {
366378 private class LongMatcherAndNullHandler implements ValueMatcher {
367379
368380 private final ImmutableRoaringBitmap _nullBitmap ;
369- private final long [] _buffer = new long [OPTIMAL_ITERATOR_BATCH_SIZE ];
381+ private final long [] _buffer = new long [_batch . length ];
370382
371383 public LongMatcherAndNullHandler (ImmutableRoaringBitmap nullBitmap ) {
372384 _nullBitmap = nullBitmap ;
@@ -390,7 +402,7 @@ public int matchValues(int limit, int[] docIds) {
390402
391403 private class FloatMatcher implements ValueMatcher {
392404
393- private final float [] _buffer = new float [OPTIMAL_ITERATOR_BATCH_SIZE ];
405+ private final float [] _buffer = new float [_batch . length ];
394406
395407 @ Override
396408 public boolean doesValueMatch (int docId ) {
@@ -407,7 +419,7 @@ public int matchValues(int limit, int[] docIds) {
407419 private class FloatMatcherAndNullHandler implements ValueMatcher {
408420
409421 private final ImmutableRoaringBitmap _nullBitmap ;
410- private final float [] _buffer = new float [OPTIMAL_ITERATOR_BATCH_SIZE ];
422+ private final float [] _buffer = new float [_batch . length ];
411423
412424 public FloatMatcherAndNullHandler (ImmutableRoaringBitmap nullBitmap ) {
413425 _nullBitmap = nullBitmap ;
@@ -431,7 +443,7 @@ public int matchValues(int limit, int[] docIds) {
431443
432444 private class DoubleMatcher implements ValueMatcher {
433445
434- private final double [] _buffer = new double [OPTIMAL_ITERATOR_BATCH_SIZE ];
446+ private final double [] _buffer = new double [_batch . length ];
435447
436448 @ Override
437449 public boolean doesValueMatch (int docId ) {
@@ -448,7 +460,7 @@ public int matchValues(int limit, int[] docIds) {
448460 private class DoubleMatcherAndNullHandler implements ValueMatcher {
449461
450462 private final ImmutableRoaringBitmap _nullBitmap ;
451- private final double [] _buffer = new double [OPTIMAL_ITERATOR_BATCH_SIZE ];
463+ private final double [] _buffer = new double [_batch . length ];
452464
453465 public DoubleMatcherAndNullHandler (ImmutableRoaringBitmap nullBitmap ) {
454466 _nullBitmap = nullBitmap ;
0 commit comments