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 @@ -62,34 +62,34 @@ db.put(8, 5); db.put(9, 6); - PostingIterator* it = db.iter(6, MTimeDB::GreaterEqual); + PostingIterator* it = db.iterRange(6, std::numeric_limits::max()); QVERIFY(it); QVector result = {2, 3, 4, 5, 6}; for (quint64 val : result) { QCOMPARE(it->next(), static_cast(val)); QCOMPARE(it->docId(), static_cast(val)); } - it = db.iter(10, MTimeDB::LessEqual); + it = db.iterRange(0, 10); QVERIFY(it); result = {1, 2, 3, 4, 5, 6}; for (quint64 val : result) { QCOMPARE(it->next(), static_cast(val)); QCOMPARE(it->docId(), static_cast(val)); } - it = db.iter(7, MTimeDB::LessEqual); + it = db.iterRange(0, 7); QVERIFY(it); result = {1, 2, 3, 4}; for (quint64 val : result) { QCOMPARE(it->next(), static_cast(val)); QCOMPARE(it->docId(), static_cast(val)); } - it = db.iter(6, MTimeDB::LessEqual); + it = db.iterRange(0, 6); QVERIFY(it); result = {1, 2, 3}; @@ -150,7 +150,7 @@ } { - it = db.iter(6, MTimeDB::GreaterEqual); + it = db.iterRange(6, std::numeric_limits::max()); QVERIFY(it); QVector result = {2, 3, 4}; @@ -176,14 +176,14 @@ db.del(0, 2); QCOMPARE(db.get(0), QVector({1, 3})); - PostingIterator* it = db.iter(0, MTimeDB::LessEqual); + PostingIterator* it = db.iterRange(0, 0); QVector result; while (it->next()) { result.append(it->docId()); } QCOMPARE(result, QVector({1, 3})); - it = db.iter(1, MTimeDB::GreaterEqual); + it = db.iterRange(1, std::numeric_limits::max()); QVERIFY(it->next()); QCOMPARE(it->docId(), 4); } diff --git a/src/engine/mtimedb.h b/src/engine/mtimedb.h --- a/src/engine/mtimedb.h +++ b/src/engine/mtimedb.h @@ -48,12 +48,6 @@ void del(quint32 mtime, quint64 docId); - enum Comparator { - Equal, - LessEqual, - GreaterEqual - }; - PostingIterator* iter(quint32 mtime, Comparator com); /** * Get documents with an mtime between \p beginTime and * \p endTime (inclusive) diff --git a/src/engine/mtimedb.cpp b/src/engine/mtimedb.cpp --- a/src/engine/mtimedb.cpp +++ b/src/engine/mtimedb.cpp @@ -141,86 +141,6 @@ // // Posting Iterator // - -PostingIterator* MTimeDB::iter(quint32 mtime, MTimeDB::Comparator com) -{ - if (com == Equal) { - return new VectorPostingIterator(get(mtime)); - } - - MDB_val key; - key.mv_size = sizeof(quint32); - key.mv_data = &mtime; - - MDB_cursor* cursor; - mdb_cursor_open(m_txn, m_dbi, &cursor); - - MDB_val val{0, nullptr}; - // Set cursor at first element greater or equal key - int rc = mdb_cursor_get(cursor, &key, &val, MDB_SET_RANGE); - if (com == LessEqual && rc == MDB_NOTFOUND) { - rc = mdb_cursor_get(cursor, &key, &val, MDB_LAST); - } - if (rc) { - if (rc != MDB_NOTFOUND) { - qCWarning(ENGINE) << "MTimeDB::iter" << mtime << mdb_strerror(rc); - } - mdb_cursor_close(cursor); - return nullptr; - } - - QVector results; - - if (com == GreaterEqual) { - results << *static_cast(val.mv_data); - while (1) { - rc = mdb_cursor_get(cursor, &key, &val, MDB_NEXT); - if (rc) { - if (rc != MDB_NOTFOUND) { - qCWarning(ENGINE) << "MTimeDB::iter GreaterEqual (loop)" << mtime << mdb_strerror(rc); - } - break; - } - - results << *static_cast(val.mv_data); - } - } else { - quint32 time = *static_cast(key.mv_data); - if (time <= mtime) { - // set cursor to last element equal key - rc = mdb_cursor_get(cursor, &key, &val, MDB_LAST_DUP); - } else { - // set cursor to element less than key - rc = mdb_cursor_get(cursor, &key, &val, MDB_PREV); - } - if (rc) { - if (rc != MDB_NOTFOUND) { - qCWarning(ENGINE) << "MTimeDB::iter LessEqual" << mtime << mdb_strerror(rc); - } else { - return nullptr; - } - } - results << *static_cast(val.mv_data); - while (1) { - rc = mdb_cursor_get(cursor, &key, &val, MDB_PREV); - if (rc) { - if (rc != MDB_NOTFOUND) { - qCWarning(ENGINE) << "MTimeDB::iter LessEqual (loop)" << mtime << mdb_strerror(rc); - } - break; - } - - quint64 id = *static_cast(val.mv_data); - results.push_front(id); - } - } - - mdb_cursor_close(cursor); - std::sort(results.begin(), results.end()); - results.erase(std::unique(results.begin(), results.end()), results.end()); - return new VectorPostingIterator(results); -} - PostingIterator* MTimeDB::iterRange(quint32 beginTime, quint32 endTime) { if (endTime < beginTime) { diff --git a/src/engine/transaction.h b/src/engine/transaction.h --- a/src/engine/transaction.h +++ b/src/engine/transaction.h @@ -73,7 +73,6 @@ PostingIterator* postingIterator(const EngineQuery& query) const; PostingIterator* postingCompIterator(const QByteArray& prefix, qlonglong value, PostingDB::Comparator com) const; - PostingIterator* mTimeIter(quint32 mtime, MTimeDB::Comparator com) const; PostingIterator* mTimeRangeIter(quint32 beginTime, quint32 endTime) const; PostingIterator* docUrlIter(quint64 id) const; diff --git a/src/engine/transaction.cpp b/src/engine/transaction.cpp --- a/src/engine/transaction.cpp +++ b/src/engine/transaction.cpp @@ -401,12 +401,6 @@ return postingDb.compIter(prefix, value, com); } -PostingIterator* Transaction::mTimeIter(quint32 mtime, MTimeDB::Comparator com) const -{ - MTimeDB mTimeDb(m_dbis.mtimeDbi, m_txn); - return mTimeDb.iter(mtime, com); -} - PostingIterator* Transaction::mTimeRangeIter(quint32 beginTime, quint32 endTime) const { MTimeDB mTimeDb(m_dbis.mtimeDbi, m_txn); diff --git a/src/lib/searchstore.h b/src/lib/searchstore.h --- a/src/lib/searchstore.h +++ b/src/lib/searchstore.h @@ -57,7 +57,6 @@ EngineQuery constructTypeQuery(const QString& type); PostingIterator* constructRatingQuery(Transaction* tr, int rating); - PostingIterator* constructMTimeQuery(Transaction* tr, const QDateTime& dt, Term::Comparator com); }; } diff --git a/src/lib/searchstore.cpp b/src/lib/searchstore.cpp --- a/src/lib/searchstore.cpp +++ b/src/lib/searchstore.cpp @@ -46,6 +46,34 @@ using namespace Baloo; +namespace { +QPair calculateTimeRange(const QDateTime& dt, Term::Comparator com) +{ + Q_ASSERT(dt.isValid()); + quint32 timet = dt.toSecsSinceEpoch(); + + if (com == Term::LessEqual) { + return {0, timet}; + } + if (com == Term::Less) { + return {0, timet - 1}; + } + if (com == Term::GreaterEqual) { + return {timet, std::numeric_limits::max()}; + } + if (com == Term::Greater) { + return {timet + 1, std::numeric_limits::max()}; + } + if (com == Term::Equal) { + timet = QDateTime(dt.date()).toSecsSinceEpoch(); + return {timet, timet + 24 * 60 * 60 - 1}; + } + + Q_ASSERT_X(0, __FUNC__, "mtime query must contain a valid comparator"); + return {0, 0}; +} +} + SearchStore::SearchStore() : m_db(nullptr) { @@ -153,7 +181,6 @@ int propPrefix = static_cast(pi.property()); return 'X' + QByteArray::number(propPrefix) + '-'; } - } PostingIterator* SearchStore::constructQuery(Transaction* tr, const Term& term) @@ -248,10 +275,15 @@ } else if (value.type() == QVariant::Date || value.type() == QVariant::DateTime) { const QDateTime dt = value.toDateTime(); - return constructMTimeQuery(tr, dt, term.comparator()); + QPair timerange = calculateTimeRange(dt, term.comparator()); + if ((timerange.first == 0) && (timerange.second == 0)) { + return nullptr; + } + return tr->mTimeRangeIter(timerange.first, timerange.second); } else { Q_ASSERT_X(0, "SearchStore::constructQuery", "modified property must contain date/datetime values"); + return nullptr; } } else if (property == "tag") { if (term.comparator() == Term::Equal) { @@ -364,32 +396,3 @@ return EngineQuery('T' + QByteArray::number(num)); } -PostingIterator* SearchStore::constructMTimeQuery(Transaction* tr, const QDateTime& dt, Term::Comparator com) -{ - Q_ASSERT(dt.isValid()); - quint32 timet = dt.toSecsSinceEpoch(); - - MTimeDB::Comparator mtimeCom; - if (com == Term::Equal) { - mtimeCom = MTimeDB::Equal; - quint32 end = QDateTime(dt.date().addDays(1)).toSecsSinceEpoch() - 1; - - return tr->mTimeRangeIter(timet, end); - } - else if (com == Term::GreaterEqual) { - mtimeCom = MTimeDB::GreaterEqual; - } else if (com == Term::Greater) { - timet++; - mtimeCom = MTimeDB::GreaterEqual; - } else if (com == Term::LessEqual) { - mtimeCom = MTimeDB::LessEqual; - } else if (com == Term::Less) { - mtimeCom = MTimeDB::LessEqual; - timet--; - } else { - Q_ASSERT_X(0, "SearchStore::constructQuery", "mtime query must contain a valid comparator"); - return nullptr; - } - - return tr->mTimeIter(timet, mtimeCom); -}