Skip to content

Commit ee4ea87

Browse files
authored
Use the same DocIdSetIterator impl for #all, #range and #empty. (#14451)
This helps reduce pollymorphism of call sites to `DocIdSetIterator` methods. Relates #14450
1 parent 7cf51a7 commit ee4ea87

File tree

2 files changed

+70
-111
lines changed

2 files changed

+70
-111
lines changed

lucene/core/src/java/org/apache/lucene/search/DocIdSetIterator.java

Lines changed: 53 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -29,80 +29,15 @@ public abstract class DocIdSetIterator {
2929

3030
/** An empty {@code DocIdSetIterator} instance */
3131
public static DocIdSetIterator empty() {
32-
return new DocIdSetIterator() {
33-
boolean exhausted = false;
34-
35-
@Override
36-
public int advance(int target) {
37-
assert !exhausted;
38-
assert target >= 0;
39-
exhausted = true;
40-
return NO_MORE_DOCS;
41-
}
42-
43-
@Override
44-
public int docID() {
45-
return exhausted ? NO_MORE_DOCS : -1;
46-
}
47-
48-
@Override
49-
public int nextDoc() {
50-
assert !exhausted;
51-
exhausted = true;
52-
return NO_MORE_DOCS;
53-
}
54-
55-
@Override
56-
public long cost() {
57-
return 0;
58-
}
59-
};
32+
return new RangeDocIdSetIterator(0, 0);
6033
}
6134

6235
/** A {@link DocIdSetIterator} that matches all documents up to {@code maxDoc - 1}. */
6336
public static DocIdSetIterator all(int maxDoc) {
64-
return new DocIdSetIterator() {
65-
int doc = -1;
66-
67-
@Override
68-
public int docID() {
69-
return doc;
70-
}
71-
72-
@Override
73-
public int nextDoc() {
74-
return advance(doc + 1);
75-
}
76-
77-
@Override
78-
public int advance(int target) {
79-
doc = target;
80-
if (doc >= maxDoc) {
81-
doc = NO_MORE_DOCS;
82-
}
83-
return doc;
84-
}
85-
86-
@Override
87-
public long cost() {
88-
return maxDoc;
89-
}
90-
91-
@Override
92-
public void intoBitSet(int upTo, FixedBitSet bitSet, int offset) {
93-
assert offset <= doc;
94-
upTo = Math.min(upTo, maxDoc);
95-
if (upTo > doc) {
96-
bitSet.set(doc - offset, upTo - offset);
97-
advance(upTo);
98-
}
99-
}
100-
101-
@Override
102-
public int docIDRunEnd() throws IOException {
103-
return maxDoc;
104-
}
105-
};
37+
if (maxDoc < 0) {
38+
throw new IllegalArgumentException("maxDoc must be >= 0, but got maxDoc=" + maxDoc);
39+
}
40+
return new RangeDocIdSetIterator(0, maxDoc);
10641
}
10742

10843
/**
@@ -117,51 +52,62 @@ public static DocIdSetIterator range(int minDoc, int maxDoc) {
11752
if (minDoc < 0) {
11853
throw new IllegalArgumentException("minDoc must be >= 0 but got minDoc=" + minDoc);
11954
}
120-
return new DocIdSetIterator() {
121-
private int doc = -1;
55+
return new RangeDocIdSetIterator(minDoc, maxDoc);
56+
}
12257

123-
@Override
124-
public int docID() {
125-
return doc;
126-
}
58+
private static class RangeDocIdSetIterator extends DocIdSetIterator {
12759

128-
@Override
129-
public int nextDoc() {
130-
return advance(doc + 1);
131-
}
60+
private final int minDoc, maxDoc;
61+
private int doc = -1;
13262

133-
@Override
134-
public int advance(int target) {
135-
if (target < minDoc) {
136-
doc = minDoc;
137-
} else if (target >= maxDoc) {
138-
doc = NO_MORE_DOCS;
139-
} else {
140-
doc = target;
141-
}
142-
return doc;
143-
}
63+
RangeDocIdSetIterator(int minDoc, int maxDoc) {
64+
// advance relies on minDoc <= maxDoc for correctness
65+
assert minDoc <= maxDoc;
66+
this.minDoc = minDoc;
67+
this.maxDoc = maxDoc;
68+
}
14469

145-
@Override
146-
public long cost() {
147-
return maxDoc - minDoc;
148-
}
70+
@Override
71+
public int docID() {
72+
return doc;
73+
}
14974

150-
@Override
151-
public void intoBitSet(int upTo, FixedBitSet bitSet, int offset) {
152-
assert offset <= doc;
153-
upTo = Math.min(upTo, maxDoc);
154-
if (upTo > doc) {
155-
bitSet.set(doc - offset, upTo - offset);
156-
advance(upTo);
157-
}
75+
@Override
76+
public int nextDoc() {
77+
return advance(doc + 1);
78+
}
79+
80+
@Override
81+
public int advance(int target) {
82+
if (target >= maxDoc) {
83+
doc = NO_MORE_DOCS;
84+
} else if (target < minDoc) {
85+
doc = minDoc;
86+
} else {
87+
doc = target;
15888
}
89+
return doc;
90+
}
15991

160-
@Override
161-
public int docIDRunEnd() throws IOException {
162-
return maxDoc;
92+
@Override
93+
public long cost() {
94+
return maxDoc - minDoc;
95+
}
96+
97+
@Override
98+
public void intoBitSet(int upTo, FixedBitSet bitSet, int offset) {
99+
assert offset <= doc;
100+
upTo = Math.min(upTo, maxDoc);
101+
if (upTo > doc) {
102+
bitSet.set(doc - offset, upTo - offset);
103+
advance(upTo);
163104
}
164-
};
105+
}
106+
107+
@Override
108+
public int docIDRunEnd() throws IOException {
109+
return maxDoc;
110+
}
165111
}
166112

167113
/**

lucene/core/src/test/org/apache/lucene/search/TestDocIdSetIterator.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,19 @@
2424
import org.apache.lucene.util.FixedBitSet;
2525

2626
public class TestDocIdSetIterator extends LuceneTestCase {
27+
28+
public void testEmpty() throws IOException {
29+
DocIdSetIterator disi = DocIdSetIterator.empty();
30+
assertEquals(-1, disi.docID());
31+
assertEquals(NO_MORE_DOCS, disi.nextDoc());
32+
assertEquals(NO_MORE_DOCS, disi.docID());
33+
34+
disi = DocIdSetIterator.empty();
35+
assertEquals(-1, disi.docID());
36+
assertEquals(NO_MORE_DOCS, disi.advance(42));
37+
assertEquals(NO_MORE_DOCS, disi.docID());
38+
}
39+
2740
public void testRangeBasic() throws Exception {
2841
DocIdSetIterator disi = DocIdSetIterator.range(5, 8);
2942
assertEquals(-1, disi.docID());
@@ -41,23 +54,23 @@ public void testInvalidRange() throws Exception {
4154
});
4255
}
4356

44-
public void testInvalidMin() throws Exception {
57+
public void testInvalidRangeMin() throws Exception {
4558
expectThrows(
4659
IllegalArgumentException.class,
4760
() -> {
4861
DocIdSetIterator.range(-1, 4);
4962
});
5063
}
5164

52-
public void testEmpty() throws Exception {
65+
public void testEmptyRange() throws Exception {
5366
expectThrows(
5467
IllegalArgumentException.class,
5568
() -> {
5669
DocIdSetIterator.range(7, 7);
5770
});
5871
}
5972

60-
public void testAdvance() throws Exception {
73+
public void testRangeAdvance() throws Exception {
6174
DocIdSetIterator disi = DocIdSetIterator.range(5, 20);
6275
assertEquals(-1, disi.docID());
6376
assertEquals(5, disi.nextDoc());
@@ -117,7 +130,7 @@ public void testIntoBitset() throws Exception {
117130
}
118131
}
119132

120-
public void testDocIDRunEnd() throws IOException {
133+
public void testDocIDRunEndAll() throws IOException {
121134
DocIdSetIterator it = DocIdSetIterator.all(13);
122135
assertEquals(0, it.nextDoc());
123136
assertEquals(13, it.docIDRunEnd());

0 commit comments

Comments
 (0)