From e382924f1a90b5a27eba2e8c5981f6a4fe7892c9 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sat, 10 Jun 2017 09:37:08 +0200 Subject: Fixed incremental queries The incremental querying broke as soon as a revision update came in since it would nuke the base-set. This fixes it, but it's definitely not pretty. --- common/datastorequery.cpp | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) (limited to 'common/datastorequery.cpp') diff --git a/common/datastorequery.cpp b/common/datastorequery.cpp index 2e0c348..4c95606 100644 --- a/common/datastorequery.cpp +++ b/common/datastorequery.cpp @@ -43,6 +43,8 @@ class Source : public FilterBase { QVector mIds; QVector::ConstIterator mIt; + QVector mIncrementalIds; + QVector::ConstIterator mIncrementalIt; Source (const QVector &ids, DataStoreQuery *store) : FilterBase(store), @@ -63,21 +65,36 @@ class Source : public FilterBase { void add(const QVector &ids) { - mIds = ids; - mIt = mIds.constBegin(); + mIncrementalIds = ids; + mIncrementalIt = mIncrementalIds.constBegin(); } bool next(const std::function &callback) Q_DECL_OVERRIDE { - if (mIt == mIds.constEnd()) { - return false; + if (!mIncrementalIds.isEmpty()) { + if (mIncrementalIt == mIncrementalIds.constEnd()) { + return false; + } + readEntity(*mIncrementalIt, [this, callback](const Sink::ApplicationDomain::ApplicationDomainType &entity, Sink::Operation operation) { + SinkTraceCtx(mDatastore->mLogCtx) << "Source: Read entity: " << entity.identifier() << operationName(operation); + callback({entity, operation}); + }); + mIncrementalIt++; + if (mIncrementalIt == mIncrementalIds.constEnd()) { + return false; + } + return true; + } else { + if (mIt == mIds.constEnd()) { + return false; + } + readEntity(*mIt, [this, callback](const Sink::ApplicationDomain::ApplicationDomainType &entity, Sink::Operation operation) { + SinkTraceCtx(mDatastore->mLogCtx) << "Source: Read entity: " << entity.identifier() << operationName(operation); + callback({entity, operation}); + }); + mIt++; + return mIt != mIds.constEnd(); } - readEntity(*mIt, [this, callback](const Sink::ApplicationDomain::ApplicationDomainType &entity, Sink::Operation operation) { - SinkTraceCtx(mDatastore->mLogCtx) << "Source: Read entity: " << entity.identifier() << operationName(operation); - callback({entity, operation}); - }); - mIt++; - return mIt != mIds.constEnd(); } }; @@ -599,6 +616,10 @@ ResultSet DataStoreQuery::update(qint64 baseRevision) return ResultSet(generator, [this]() { mCollector->skip(); }); } +void DataStoreQuery::updateComplete() +{ + mSource->mIncrementalIds.clear(); +} ResultSet DataStoreQuery::execute() { -- cgit v1.2.3