From 972f3a4e96876e4c36162a11062e40863d88a2a1 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 15 Nov 2015 12:46:26 +0100 Subject: Cleanup --- common/CMakeLists.txt | 1 - common/entitystorage.cpp | 74 ----------------------- common/entitystorage.h | 126 --------------------------------------- common/facade.h | 3 +- common/resourceaccess.cpp | 2 +- tests/genericfacadebenchmark.cpp | 3 +- tests/genericfacadetest.cpp | 39 ++++++------ tests/testimplementations.h | 26 -------- 8 files changed, 22 insertions(+), 252 deletions(-) delete mode 100644 common/entitystorage.cpp delete mode 100644 common/entitystorage.h diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index f24ec46..bdb9eac 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -15,7 +15,6 @@ set(command_SRCS definitions.cpp log.cpp entitybuffer.cpp - entitystorage.cpp clientapi.cpp facadefactory.cpp commands.cpp diff --git a/common/entitystorage.cpp b/common/entitystorage.cpp deleted file mode 100644 index 5d4df9f..0000000 --- a/common/entitystorage.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2014 Christian Mollekopf - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "entitystorage.h" - -ResultSet EntityStorageBase::filteredSet(const ResultSet &resultSet, const std::function &filter, const Akonadi2::Storage::Transaction &transaction, bool initialQuery) -{ - auto resultSetPtr = QSharedPointer::create(resultSet); - - //Read through the source values and return whatever matches the filter - std::function)> generator = [this, resultSetPtr, &transaction, filter, initialQuery](std::function callback) -> bool { - while (resultSetPtr->next()) { - readEntity(transaction, 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) { - if (initialQuery) { - //We're not interested in removals during the initial query - if (operation != Akonadi2::Operation_Removal) { - callback(domainObject, Akonadi2::Operation_Creation); - } - } else { - callback(domainObject, operation); - } - } - }); - } - return false; - }; - return ResultSet(generator); -} - - -ResultSet EntityStorageBase::getResultSet(const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, qint64 baseRevision) -{ - QSet remainingFilters = query.propertyFilter.keys().toSet(); - ResultSet resultSet; - const bool initialQuery = (baseRevision == 1); - if (initialQuery) { - Trace() << "Initial result set update"; - resultSet = loadInitialResultSet(query, transaction, remainingFilters); - } else { - //TODO fallback in case the old revision is no longer available to clear + redo complete initial scan - Trace() << "Incremental result set update" << baseRevision; - resultSet = loadIncrementalResultSet(baseRevision, query, transaction, remainingFilters); - } - - auto filter = [remainingFilters, query, baseRevision](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject) -> bool { - for (const auto &filterProperty : remainingFilters) { - //TODO implement other comparison operators than equality - if (domainObject->getProperty(filterProperty) != query.propertyFilter.value(filterProperty)) { - return false; - } - } - return true; - }; - - return filteredSet(resultSet, filter, transaction, initialQuery); -} diff --git a/common/entitystorage.h b/common/entitystorage.h deleted file mode 100644 index 8e73083..0000000 --- a/common/entitystorage.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2014 Christian Mollekopf - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the - * Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ -#pragma once - -#include - -#include "query.h" -#include "domainadaptor.h" -#include "entitybuffer.h" -#include "log.h" -#include "storage.h" -#include "resultset.h" -#include "resultprovider.h" -#include "definitions.h" - -/** - * Wraps storage, entity adaptor factory and indexes into one. - * - */ -class EntityStorageBase -{ -public: - typedef std::function &remainingFilters)> InitialResultLoader; - typedef std::function &remainingFilters)> IncrementalResultLoader; - typedef std::function &resultCallback)> EntityReader; - - /** - * Returns the initial result set that still needs to be filtered. - * - * To make this efficient indexes should be chosen that are as selective as possible. - */ - InitialResultLoader loadInitialResultSet; - /** - * Returns the incremental result set that still needs to be filtered. - */ - IncrementalResultLoader loadIncrementalResultSet; - - /** - * Loads a single entity by uid from storage. - */ - EntityReader readEntity; - -protected: - EntityStorageBase(const QByteArray &instanceIdentifier) - : mResourceInstanceIdentifier(instanceIdentifier) - { - - } - - virtual Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr copy(const Akonadi2::ApplicationDomain::ApplicationDomainType &) = 0; - - ResultSet getResultSet(const Akonadi2::Query &query, Akonadi2::Storage::Transaction &transaction, qint64 baseRevision); - - QByteArray mResourceInstanceIdentifier; - -private: - ResultSet filteredSet(const ResultSet &resultSet, const std::function &filter, const Akonadi2::Storage::Transaction &transaction, bool isInitialQuery); -}; - -template -class EntityStorage : public EntityStorageBase -{ - -public: - - EntityStorage(const QByteArray &instanceIdentifier) - : EntityStorageBase(instanceIdentifier) - { - } - -protected: - Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr copy(const Akonadi2::ApplicationDomain::ApplicationDomainType &object) Q_DECL_OVERRIDE - { - return Akonadi2::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation(object); - } - -public: - - virtual qint64 read(const Akonadi2::Query &query, qint64 baseRevision, const QSharedPointer > &resultProvider) - { - Akonadi2::Storage storage(Akonadi2::storageLocation(), mResourceInstanceIdentifier); - storage.setDefaultErrorHandler([](const Akonadi2::Storage::Error &error) { - Warning() << "Error during query: " << error.store << error.message; - }); - - auto transaction = storage.createTransaction(Akonadi2::Storage::ReadOnly); - - Log() << "Querying" << baseRevision << Akonadi2::Storage::maxRevision(transaction); - auto resultSet = getResultSet(query, transaction, baseRevision); - while(resultSet.next([this, resultProvider](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &value, Akonadi2::Operation operation) -> bool { - switch (operation) { - case Akonadi2::Operation_Creation: - Trace() << "Got creation"; - resultProvider->add(copy(*value).template staticCast()); - break; - case Akonadi2::Operation_Modification: - Trace() << "Got modification"; - resultProvider->modify(copy(*value).template staticCast()); - break; - case Akonadi2::Operation_Removal: - Trace() << "Got removal"; - resultProvider->remove(copy(*value).template staticCast()); - break; - } - return true; - })){}; - return Akonadi2::Storage::maxRevision(transaction); - } - -}; diff --git a/common/facade.h b/common/facade.h index 5be1c73..6e45e08 100644 --- a/common/facade.h +++ b/common/facade.h @@ -29,7 +29,8 @@ #include "domainadaptor.h" #include "log.h" #include "resultset.h" -#include "entitystorage.h" +#include "storage.h" +#include "definitions.h" /** * A QueryRunner runs a query and updates the corresponding result set. diff --git a/common/resourceaccess.cpp b/common/resourceaccess.cpp index bd9e2c9..88f785f 100644 --- a/common/resourceaccess.cpp +++ b/common/resourceaccess.cpp @@ -340,7 +340,7 @@ KAsync::Job ResourceAccess::sendRevisionReplayedCommand(qint64 revision) void ResourceAccess::open() { if (d->socket && d->socket->isValid()) { - log("Socket valid, so not opening again"); + Trace() << "Socket valid, so not opening again"; return; } if (d->openingSocket) { diff --git a/tests/genericfacadebenchmark.cpp b/tests/genericfacadebenchmark.cpp index 29c91d7..94d6f41 100644 --- a/tests/genericfacadebenchmark.cpp +++ b/tests/genericfacadebenchmark.cpp @@ -56,8 +56,7 @@ private Q_SLOTS: QBENCHMARK { auto resultSet = QSharedPointer >::create(); auto resourceAccess = QSharedPointer::create(); - auto storage = QSharedPointer >::create("identifier"); - TestResourceFacade facade(identifier, storage, resourceAccess); + TestResourceFacade facade(identifier, resourceAccess); async::SyncListResult result(resultSet->emitter()); diff --git a/tests/genericfacadetest.cpp b/tests/genericfacadetest.cpp index 67320c3..9e7500f 100644 --- a/tests/genericfacadetest.cpp +++ b/tests/genericfacadetest.cpp @@ -17,6 +17,7 @@ * Test for the generic facade implementation. * * This test doesn't use the actual storage and thus only tests the update logic of the facade. + * //FIXME this now uses the actual storage */ class GenericFacadeTest : public QObject { @@ -34,10 +35,9 @@ private Q_SLOTS: query.liveQuery = false; auto resultSet = QSharedPointer >::create(); - auto storage = QSharedPointer::create("identifier"); auto resourceAccess = QSharedPointer::create(); - storage->mResults << Akonadi2::ApplicationDomain::Event::Ptr::create(); - TestResourceFacade facade("identifier", storage, resourceAccess); + // storage->mResults << Akonadi2::ApplicationDomain::Event::Ptr::create(); + TestResourceFacade facade("identifier", resourceAccess); async::SyncListResult result(resultSet->emitter()); @@ -56,10 +56,9 @@ private Q_SLOTS: query.liveQuery = true; auto resultSet = QSharedPointer >::create(); - auto storage = QSharedPointer::create("identifier"); auto resourceAccess = QSharedPointer::create(); - storage->mResults << Akonadi2::ApplicationDomain::Event::Ptr::create(); - TestResourceFacade facade("identifier", storage, resourceAccess); + // storage->mResults << Akonadi2::ApplicationDomain::Event::Ptr::create(); + TestResourceFacade facade("identifier", resourceAccess); async::SyncListResult result(resultSet->emitter()); @@ -70,9 +69,9 @@ private Q_SLOTS: QCOMPARE(result.size(), 1); //Enter a second result - storage->mResults.clear(); - storage->mResults << QSharedPointer::create("resource", "id2", 0, QSharedPointer()); - storage->mLatestRevision = 2; + // storage->mResults.clear(); + // storage->mResults << QSharedPointer::create("resource", "id2", 0, QSharedPointer()); + // storage->mLatestRevision = 2; resourceAccess->emit revisionChanged(2); //Hack to get event loop in synclistresult to abort again @@ -88,12 +87,11 @@ private Q_SLOTS: query.liveQuery = true; auto resultSet = QSharedPointer >::create(); - auto storage = QSharedPointer::create("identifier"); auto resourceAccess = QSharedPointer::create(); auto entity = QSharedPointer::create("resource", "id2", 0, QSharedPointer::create()); entity->setProperty("test", "test1"); - storage->mResults << entity; - TestResourceFacade facade("identifier", storage, resourceAccess); + // storage->mResults << entity; + TestResourceFacade facade("identifier", resourceAccess); async::SyncListResult result(resultSet->emitter()); @@ -104,11 +102,11 @@ private Q_SLOTS: QCOMPARE(result.size(), 1); //Modify the entity again - storage->mResults.clear(); + // storage->mResults.clear(); entity = QSharedPointer::create("resource", "id2", 0, QSharedPointer::create()); entity->setProperty("test", "test2"); - storage->mModifications << entity; - storage->mLatestRevision = 2; + // storage->mModifications << entity; + // storage->mLatestRevision = 2; resourceAccess->emit revisionChanged(2); //Hack to get event loop in synclistresult to abort again @@ -125,11 +123,10 @@ private Q_SLOTS: query.liveQuery = true; auto resultSet = QSharedPointer >::create(); - auto storage = QSharedPointer::create("identifier"); auto resourceAccess = QSharedPointer::create(); auto entity = QSharedPointer::create("resource", "id2", 0, QSharedPointer()); - storage->mResults << entity; - TestResourceFacade facade("identifier", storage, resourceAccess); + // storage->mResults << entity; + TestResourceFacade facade("identifier", resourceAccess); async::SyncListResult result(resultSet->emitter()); @@ -140,9 +137,9 @@ private Q_SLOTS: QCOMPARE(result.size(), 1); //Remove the entity again - storage->mResults.clear(); - storage->mRemovals << entity; - storage->mLatestRevision = 2; + // storage->mResults.clear(); + // storage->mRemovals << entity; + // storage->mLatestRevision = 2; resourceAccess->emit revisionChanged(2); //Hack to get event loop in synclistresult to abort again diff --git a/tests/testimplementations.h b/tests/testimplementations.h index 1436c68..c371456 100644 --- a/tests/testimplementations.h +++ b/tests/testimplementations.h @@ -21,13 +21,11 @@ #include -#include #include #include #include #include #include -#include #include //Replace with something different @@ -44,30 +42,6 @@ public: virtual ~TestEventAdaptorFactory() {}; }; -class TestEntityStorage : public EntityStorage -{ -public: - using EntityStorage::EntityStorage; - virtual qint64 read(const Akonadi2::Query &query, qint64 oldRevision, const QSharedPointer > &resultProvider) Q_DECL_OVERRIDE - { - for (const auto &res : mResults) { - resultProvider->add(res); - } - for (const auto &res : mModifications) { - resultProvider->modify(res); - } - for (const auto &res : mRemovals) { - resultProvider->remove(res); - } - return mLatestRevision; - } - - QList mResults; - QList mModifications; - QList mRemovals; - qint64 mLatestRevision; -}; - class TestResourceAccess : public Akonadi2::ResourceAccessInterface { Q_OBJECT -- cgit v1.2.3