diff --git a/autotests/unit/engine/phraseanditeratortest.cpp b/autotests/unit/engine/phraseanditeratortest.cpp --- a/autotests/unit/engine/phraseanditeratortest.cpp +++ b/autotests/unit/engine/phraseanditeratortest.cpp @@ -67,7 +67,7 @@ VectorPositionInfoIterator* it1 = new VectorPositionInfoIterator(vec1); VectorPositionInfoIterator* it2 = new VectorPositionInfoIterator(vec2); - QVector vec = {it1, it2}; + QVector vec = {it1, it2}; PhraseAndIterator it(vec); QCOMPARE(it.docId(), static_cast(0)); @@ -102,7 +102,7 @@ VectorPositionInfoIterator* it1 = new VectorPositionInfoIterator(vec1); VectorPositionInfoIterator* it2 = new VectorPositionInfoIterator(vec2); - QVector vec = {it1, nullptr, it2}; + QVector vec = {it1, nullptr, it2}; PhraseAndIterator it(vec); QCOMPARE(it.docId(), static_cast(0)); QCOMPARE(it.next(), static_cast(0)); diff --git a/autotests/unit/engine/positiondbtest.cpp b/autotests/unit/engine/positiondbtest.cpp --- a/autotests/unit/engine/positiondbtest.cpp +++ b/autotests/unit/engine/positiondbtest.cpp @@ -20,7 +20,7 @@ #include "positiondb.h" #include "positioninfo.h" -#include "postingiterator.h" +#include "vectorpositioninfoiterator.h" #include "singledbtest.h" using namespace Baloo; @@ -64,7 +64,7 @@ db.put(word, list); - QScopedPointer it{db.iter(word)}; + QScopedPointer it{db.iter(word)}; QCOMPARE(it->docId(), static_cast(0)); QVERIFY(it->positions().isEmpty()); diff --git a/src/engine/phraseanditerator.h b/src/engine/phraseanditerator.h --- a/src/engine/phraseanditerator.h +++ b/src/engine/phraseanditerator.h @@ -22,22 +22,23 @@ #define BALOO_PHRASEANDITERATOR_H #include "postingiterator.h" +#include "vectorpositioninfoiterator.h" #include namespace Baloo { class BALOO_ENGINE_EXPORT PhraseAndIterator : public PostingIterator { public: - explicit PhraseAndIterator(const QVector& iterators); + explicit PhraseAndIterator(const QVector& iterators); ~PhraseAndIterator(); quint64 next() override; quint64 docId() const override; private: - QVector m_iterators; + QVector m_iterators; quint64 m_docId; bool checkIfPositionsMatch(); diff --git a/src/engine/phraseanditerator.cpp b/src/engine/phraseanditerator.cpp --- a/src/engine/phraseanditerator.cpp +++ b/src/engine/phraseanditerator.cpp @@ -19,10 +19,11 @@ */ #include "phraseanditerator.h" +#include "positioninfo.h" using namespace Baloo; -PhraseAndIterator::PhraseAndIterator(const QVector& iterators) +PhraseAndIterator::PhraseAndIterator(const QVector& iterators) : m_iterators(iterators) , m_docId(0) { @@ -48,7 +49,7 @@ positionList.reserve(m_iterators.size()); // All the iterators should have the same value for (int i = 0; i < m_iterators.size(); i++) { - PostingIterator* iter = m_iterators[i]; + auto* iter = m_iterators[i]; Q_ASSERT(iter->docId() == m_docId); QVector pi = iter->positions(); diff --git a/src/engine/positiondb.h b/src/engine/positiondb.h --- a/src/engine/positiondb.h +++ b/src/engine/positiondb.h @@ -31,7 +31,7 @@ namespace Baloo { class PositionInfo; -class PostingIterator; +class VectorPositionInfoIterator; class BALOO_ENGINE_EXPORT PositionDB { @@ -46,7 +46,7 @@ QVector get(const QByteArray& term); void del(const QByteArray& term); - PostingIterator* iter(const QByteArray& term); + VectorPositionInfoIterator* iter(const QByteArray& term); QMap> toTestMap() const; private: diff --git a/src/engine/positiondb.cpp b/src/engine/positiondb.cpp --- a/src/engine/positiondb.cpp +++ b/src/engine/positiondb.cpp @@ -23,6 +23,7 @@ #include "positioncodec.h" #include "positioninfo.h" #include "postingiterator.h" +#include "vectorpositioninfoiterator.h" using namespace Baloo; @@ -125,44 +126,7 @@ // Query // -class DBPositionIterator : public PostingIterator { -public: - DBPositionIterator(char* data, uint size) - : m_pos(-1) - { - PositionCodec codec; - m_vec = codec.decode(QByteArray(static_cast(data), size)); - } - - quint64 next() override { - m_pos++; - if (m_pos >= m_vec.size()) { - return 0; - } - - return m_vec[m_pos].docId; - } - - quint64 docId() const override { - if (m_pos < 0 || m_pos >= m_vec.size()) { - return 0; - } - return m_vec[m_pos].docId; - } - - QVector positions() override { - if (m_pos < 0 || m_pos >= m_vec.size()) { - return QVector(); - } - return m_vec[m_pos].positions; - } - -private: - QVector m_vec; - int m_pos; -}; - -PostingIterator* PositionDB::iter(const QByteArray& term) +VectorPositionInfoIterator* PositionDB::iter(const QByteArray& term) { Q_ASSERT(!term.isEmpty()); @@ -177,7 +141,9 @@ return nullptr; } - return new DBPositionIterator(static_cast(val.mv_data), val.mv_size); + PositionCodec codec; + QByteArray ba(static_cast(val.mv_data), val.mv_size); + return new VectorPositionInfoIterator(codec.decode(ba)); } QMap> PositionDB::toTestMap() const diff --git a/src/engine/postingiterator.h b/src/engine/postingiterator.h --- a/src/engine/postingiterator.h +++ b/src/engine/postingiterator.h @@ -40,8 +40,6 @@ virtual quint64 next() = 0; virtual quint64 docId() const = 0; virtual quint64 skipTo(quint64 docId); - - virtual QVector positions(); }; } diff --git a/src/engine/postingiterator.cpp b/src/engine/postingiterator.cpp --- a/src/engine/postingiterator.cpp +++ b/src/engine/postingiterator.cpp @@ -33,8 +33,3 @@ } return docId(); } - -QVector PostingIterator::positions() -{ - return QVector(); -} diff --git a/src/engine/transaction.cpp b/src/engine/transaction.cpp --- a/src/engine/transaction.cpp +++ b/src/engine/transaction.cpp @@ -348,10 +348,9 @@ return nullptr; } - QVector vec; - vec.reserve(subQueries.size()); - if (query.op() == EngineQuery::Phrase) { + QVector vec; + vec.reserve(subQueries.size()); for (const EngineQuery& q : subQueries) { if (!q.leaf()) { qCDebug(ENGINE) << "Transaction::toPostingIterator" << "Phrase queries must contain leaf queries"; @@ -363,6 +362,8 @@ return new PhraseAndIterator(vec); } + QVector vec; + vec.reserve(subQueries.size()); for (const EngineQuery& q : subQueries) { auto iterator = postingIterator(q); if (iterator) { diff --git a/src/engine/vectorpositioninfoiterator.h b/src/engine/vectorpositioninfoiterator.h --- a/src/engine/vectorpositioninfoiterator.h +++ b/src/engine/vectorpositioninfoiterator.h @@ -33,7 +33,7 @@ quint64 docId() const override; quint64 next() override; - QVector positions() override; + QVector positions(); private: QVector m_vector; diff --git a/src/engine/vectorpositioninfoiterator.cpp b/src/engine/vectorpositioninfoiterator.cpp --- a/src/engine/vectorpositioninfoiterator.cpp +++ b/src/engine/vectorpositioninfoiterator.cpp @@ -31,13 +31,13 @@ quint64 VectorPositionInfoIterator::next() { - if (m_pos >= m_vector.size() - 1) { + m_pos++; + if (m_pos >= m_vector.size()) { m_pos = m_vector.size(); m_vector.clear(); return 0; } - m_pos++; return m_vector[m_pos].docId; }