Skip to content

Commit d930e4c

Browse files
BugFIx: FIxed Advance() API implementation in Optimized Composite Searchers
1 parent 0ca3253 commit d930e4c

File tree

3 files changed

+33
-7
lines changed

3 files changed

+33
-7
lines changed

index/scorch/optimize.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,5 +393,7 @@ func (i *IndexSnapshot) unadornedTermFieldReader(
393393
includeNorm: false,
394394
includeTermVectors: false,
395395
recycle: false,
396+
// signal downstream that this is a special unadorned termFieldReader
397+
unadorned: true,
396398
}
397399
}

index/scorch/snapshot_index_tfr.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ type IndexSnapshotTermFieldReader struct {
5050
recycle bool
5151
bytesRead uint64
5252
ctx context.Context
53+
unadorned bool
5354
}
5455

5556
func (i *IndexSnapshotTermFieldReader) incrementBytesRead(val uint64) {
@@ -146,14 +147,31 @@ func (i *IndexSnapshotTermFieldReader) Advance(ID index.IndexInternalID, preAllo
146147
// FIXME do something better
147148
// for now, if we need to seek backwards, then restart from the beginning
148149
if i.currPosting != nil && bytes.Compare(i.currID, ID) >= 0 {
149-
i2, err := i.snapshot.TermFieldReader(nil, i.term, i.field,
150-
i.includeFreq, i.includeNorm, i.includeTermVectors)
151-
if err != nil {
152-
return nil, err
150+
// Check if the TFR is a special unadorned composite optimization.
151+
// Such a TFR will NOT have a valid `term` or `field` set, making it
152+
// impossible for the TFR to replace itself with a new one.
153+
if !i.unadorned {
154+
i2, err := i.snapshot.TermFieldReader(nil, i.term, i.field,
155+
i.includeFreq, i.includeNorm, i.includeTermVectors)
156+
if err != nil {
157+
return nil, err
158+
}
159+
// close the current term field reader before replacing it with a new one
160+
_ = i.Close()
161+
*i = *(i2.(*IndexSnapshotTermFieldReader))
162+
} else {
163+
// unadorned composite optimization
164+
// we need to reset all the iterators
165+
// back to the beginning, which effectively
166+
// achives the same thing as the above
167+
for _, iter := range i.iterators {
168+
optimizedIterator, ok := iter.(*unadornedPostingsIteratorBitmap)
169+
if !ok {
170+
return nil, fmt.Errorf("unexpected iterator type %T", iter)
171+
}
172+
optimizedIterator.ResetIterator()
173+
}
153174
}
154-
// close the current term field reader before replacing it with a new one
155-
_ = i.Close()
156-
*i = *(i2.(*IndexSnapshotTermFieldReader))
157175
}
158176
num, err := docInternalToNumber(ID)
159177
if err != nil {

index/scorch/unadorned.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,12 @@ func (i *unadornedPostingsIteratorBitmap) ReplaceActual(actual *roaring.Bitmap)
9696
i.actual = actual.Iterator()
9797
}
9898

99+
// Resets the iterator to the beginning of the postings list.
100+
// by resetting the actual iterator.
101+
func (i *unadornedPostingsIteratorBitmap) ResetIterator() {
102+
i.actual = i.actualBM.Iterator()
103+
}
104+
99105
func newUnadornedPostingsIteratorFromBitmap(bm *roaring.Bitmap) segment.PostingsIterator {
100106
return &unadornedPostingsIteratorBitmap{
101107
actualBM: bm,

0 commit comments

Comments
 (0)