From 4926e7f613ea3e03a2865eec66c6a8c1ec0b6516 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sat, 28 Nov 2015 16:07:15 +0100 Subject: Cleanup --- common/clientapi.cpp | 12 +----------- common/clientapi.h | 12 ------------ common/modelresult.cpp | 2 +- common/queryrunner.cpp | 24 ++++++++++++++++++++---- common/queryrunner.h | 1 + common/resultprovider.h | 2 +- examples/client/main.cpp | 4 +--- examples/dummyresource/dummystore.cpp | 2 +- 8 files changed, 26 insertions(+), 33 deletions(-) diff --git a/common/clientapi.cpp b/common/clientapi.cpp index b24dfa8..29b7e68 100644 --- a/common/clientapi.cpp +++ b/common/clientapi.cpp @@ -41,7 +41,7 @@ namespace async { - void run(const std::function &runner) { + static void run(const std::function &runner) { auto timer = new QTimer(); timer->setSingleShot(true); QObject::connect(timer, &QTimer::timeout, [runner, timer]() { @@ -97,15 +97,6 @@ QList Store::getResources(const QList &resourceFilter, c return resources; } -template -QSharedPointer > Store::load(Query query) -{ - auto resultSet = QSharedPointer >::create(); - qWarning() << "Main thread " << QThread::currentThreadId(); - //FIXME remove - return resultSet->emitter(); -} - template QSharedPointer Store::loadModel(Query query) { @@ -213,7 +204,6 @@ KAsync::Job Store::synchronize(const Akonadi2::Query &query) #define REGISTER_TYPE(T) template KAsync::Job Store::remove(const T &domainObject); \ template KAsync::Job Store::create(const T &domainObject); \ template KAsync::Job Store::modify(const T &domainObject); \ - template QSharedPointer > Store::load(Query query); \ template QSharedPointer Store::loadModel(Query query); \ REGISTER_TYPE(ApplicationDomain::Event); diff --git a/common/clientapi.h b/common/clientapi.h index c48c6e9..7fee6ae 100644 --- a/common/clientapi.h +++ b/common/clientapi.h @@ -33,12 +33,6 @@ Q_DECLARE_METATYPE(std::shared_ptr); class QAbstractItemModel; -namespace async { - //This should abstract if we execute from eventloop or in thread. - //It supposed to allow the caller to finish the current method before executing the runner. - void run(const std::function &runner); -} - namespace Akonadi2 { using namespace async; @@ -54,12 +48,6 @@ public: static QString storageLocation(); static QByteArray resourceName(const QByteArray &instanceIdentifier); - /** - * Asynchronusly load a dataset - */ - template - static QSharedPointer > load(Query query); - enum Roles { DomainObjectRole = Qt::UserRole + 1 //Must be the same as in ModelResult }; diff --git a/common/modelresult.cpp b/common/modelresult.cpp index 65eaba9..930048f 100644 --- a/common/modelresult.cpp +++ b/common/modelresult.cpp @@ -141,7 +141,7 @@ void ModelResult::add(const Ptr &value) return; } // qDebug() << "Inserting rows " << index << parent; - beginInsertRows(QModelIndex(), index, index); + beginInsertRows(parent, index, index); mEntities.insert(childId, value); mTree[id].insert(index, childId); mParents.insert(childId, id); diff --git a/common/queryrunner.cpp b/common/queryrunner.cpp index 4159112..3f62f6a 100644 --- a/common/queryrunner.cpp +++ b/common/queryrunner.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include "commands.h" #include "log.h" #include "storage.h" @@ -45,7 +46,7 @@ static inline ResultSet fullScan(const Akonadi2::Storage::Transaction &transacti qWarning() << "Error during query: " << error.message; }); - Trace() << "Full scan found " << keys.size() << " results"; + Trace() << "Full scan on " << bufferType << " found " << keys.size() << " results"; return ResultSet(keys); } @@ -96,6 +97,12 @@ QueryRunner::QueryRunner(const Akonadi2::Query &query, const Akonadi } } +template +QueryRunner::~QueryRunner() +{ + Trace() << "Stopped query"; +} + template typename Akonadi2::ResultEmitter::Ptr QueryRunner::emitter() { @@ -202,7 +209,6 @@ ResultSet QueryRunner::filterSet(const ResultSet &resultSet, const s readEntity(db, resultSetPtr->id(), [this, filter, callback, initialQuery](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject, Akonadi2::Operation operation) { //Always remove removals, they probably don't match due to non-available properties if (filter(domainObject) || operation == Akonadi2::Operation_Removal) { - Trace() << "entity is not filtered" << initialQuery; if (initialQuery) { //We're not interested in removals during the initial query if (operation != Akonadi2::Operation_Removal) { @@ -262,16 +268,24 @@ qint64 QueryRunner::load(const Akonadi2::Query &query, const std::fu template qint64 QueryRunner::executeIncrementalQuery(const Akonadi2::Query &query, Akonadi2::ResultProviderInterface &resultProvider) { + QTime time; + time.start(); + const qint64 baseRevision = resultProvider.revision() + 1; Trace() << "Running incremental query " << baseRevision; - return load(query, [&](Akonadi2::Storage::Transaction &transaction, QSet &remainingFilters) -> ResultSet { + auto revision = load(query, [&](Akonadi2::Storage::Transaction &transaction, QSet &remainingFilters) -> ResultSet { return loadIncrementalResultSet(baseRevision, query, transaction, remainingFilters); }, resultProvider, false); + Trace() << "Incremental query took: " << time.elapsed() << " ms"; + return revision; } template qint64 QueryRunner::executeInitialQuery(const Akonadi2::Query &query, const typename DomainType::Ptr &parent, Akonadi2::ResultProviderInterface &resultProvider) { + QTime time; + time.start(); + auto modifiedQuery = query; if (!query.parentProperty.isEmpty()) { if (parent) { @@ -282,9 +296,11 @@ qint64 QueryRunner::executeInitialQuery(const Akonadi2::Query &query modifiedQuery.propertyFilter.insert(query.parentProperty, QVariant()); } } - return load(modifiedQuery, [&](Akonadi2::Storage::Transaction &transaction, QSet &remainingFilters) -> ResultSet { + auto revision = load(modifiedQuery, [&](Akonadi2::Storage::Transaction &transaction, QSet &remainingFilters) -> ResultSet { return loadInitialResultSet(modifiedQuery, transaction, remainingFilters); }, resultProvider, true); + Trace() << "Initial query took: " << time.elapsed() << " ms"; + return revision; } template class QueryRunner; diff --git a/common/queryrunner.h b/common/queryrunner.h index e2af9de..c918dcb 100644 --- a/common/queryrunner.h +++ b/common/queryrunner.h @@ -79,6 +79,7 @@ class QueryRunner : public QueryRunnerBase { public: QueryRunner(const Akonadi2::Query &query, const Akonadi2::ResourceAccessInterface::Ptr &, const QByteArray &instanceIdentifier, const DomainTypeAdaptorFactoryInterface::Ptr &, const QByteArray &bufferType); + virtual ~QueryRunner(); typename Akonadi2::ResultEmitter::Ptr emitter(); diff --git a/common/resultprovider.h b/common/resultprovider.h index 86382ef..6d7867a 100644 --- a/common/resultprovider.h +++ b/common/resultprovider.h @@ -106,7 +106,7 @@ private: public: typedef QSharedPointer > Ptr; - ~ResultProvider() + virtual ~ResultProvider() { } diff --git a/examples/client/main.cpp b/examples/client/main.cpp index c75b3ce..3fa5a4e 100644 --- a/examples/client/main.cpp +++ b/examples/client/main.cpp @@ -77,7 +77,6 @@ public: topLayout->addWidget(titleLabel); topLayout->addWidget(syncButton); topLayout->addWidget(modelView, 10); - model->fetchMore(QModelIndex()); show(); } @@ -127,6 +126,7 @@ int main(int argc, char *argv[]) query.syncOnDemand = false; query.processAll = false; query.requestedProperties << "name"; + query.liveQuery = true; auto model = Akonadi2::Store::loadModel(query); if (cliOptions.isSet("list")) { @@ -137,11 +137,9 @@ int main(int argc, char *argv[]) qDebug() << model->data(model->index(i, 0, index)).toString(); } }); - model->fetchMore(QModelIndex()); return app.exec(); } else if (cliOptions.isSet("count")) { query.liveQuery = false; - model->fetchMore(QModelIndex()); qDebug() << "Counted results " << model->rowCount(QModelIndex()); } else { query.liveQuery = true; diff --git a/examples/dummyresource/dummystore.cpp b/examples/dummyresource/dummystore.cpp index 39ecfe4..458695f 100644 --- a/examples/dummyresource/dummystore.cpp +++ b/examples/dummyresource/dummystore.cpp @@ -64,7 +64,7 @@ QMap > populateMails() QMap > populateFolders() { QMap> content; - for (int i = 0; i < 5000; i++) { + for (int i = 0; i < 5; i++) { content.insert(QString("key%1").arg(i), createFolder(i)); } return content; -- cgit v1.2.3