caio.co/de/cantine

Ensure we don't seek back when reading postings

This works around the debug-only crash when trying to seek
to a doc_id that would have appeared before the current
SegmentPostings cursor.

Since DocSets now come already initialized, `.seek()`ing
without checking if we're already at the desired position
is likely a bug (hence the `debug_assert!` biting me, I
suspect).

On tantivy.git @ 730cceff one can see the subtle bug that
the assertion can catch. Code that once looked like:

    let mut scorer = create_scorer();
    if scorer.seek(doc) != doc {
        ...
    }

Should now look like:

    let mut scorer = create_scorer();
    if scorer.doc() > doc || scorer.seek(doc) != doc {
        ...
    }
Id
550b38d90950b2e3158217565cc70ad0c15380ef
Author
Caio
Commit time
2020-11-01T10:28:46+01:00

Modified tique/src/topterms.rs

@@ -297,6 +297,12
let mut postings =
inverted_index.read_postings_from_terminfo(terminfo, IndexRecordOption::WithFreqs);

+ // XXX SegmentPostings::seek crashes debug builds when the target
+ // is before the current position
+ if postings.doc() > doc_id {
+ continue;
+ }
+
if postings.seek(doc_id) == doc_id {
let term = Term::from_field_text(field, text);
consumer(term, postings.term_freq());