diff --git a/autotests/unit/engine/mtimedbtest.cpp b/autotests/unit/engine/mtimedbtest.cpp --- a/autotests/unit/engine/mtimedbtest.cpp +++ b/autotests/unit/engine/mtimedbtest.cpp @@ -96,6 +96,13 @@ QCOMPARE(it->next(), static_cast(val)); QCOMPARE(it->docId(), static_cast(val)); } + + // Empty range + it = db.iterRange(4, 4); + QVERIFY(!it); + + it = db.iterRange(10, 20); + QVERIFY(!it); } void testSortedAndUnique() diff --git a/src/engine/mtimedb.h b/src/engine/mtimedb.h --- a/src/engine/mtimedb.h +++ b/src/engine/mtimedb.h @@ -54,6 +54,10 @@ GreaterEqual }; PostingIterator* iter(quint32 mtime, Comparator com); + /** + * Get documents with an mtime between \p beginTime and + * \p endTime (inclusive) + */ PostingIterator* iterRange(quint32 beginTime, quint32 endTime); QMap toTestMap() const; diff --git a/src/engine/mtimedb.cpp b/src/engine/mtimedb.cpp --- a/src/engine/mtimedb.cpp +++ b/src/engine/mtimedb.cpp @@ -227,25 +227,28 @@ } QVector results; - results << *static_cast(val.mv_data); while (1) { + quint32 time = *static_cast(key.mv_data); + if (time > endTime) { + break; + } + results << *static_cast(val.mv_data); + rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); if (rc) { if (rc != MDB_NOTFOUND) { qCWarning(ENGINE) << "MTimeDB::iterRange (loop)" << beginTime << endTime << mdb_strerror(rc); } break; } - - quint32 time = *static_cast(key.mv_data); - if (time > endTime) { - break; - } - results << *static_cast(val.mv_data); } mdb_cursor_close(cursor); + + if (results.isEmpty()) { + return nullptr; + } std::sort(results.begin(), results.end()); results.erase(std::unique(results.begin(), results.end()), results.end()); return new VectorPostingIterator(results);