From d3cb4e649177443e8ecfd7f86d136fc0a319e2f3 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Fri, 12 May 2017 14:00:54 +0200 Subject: Don't add resources that don't match the query during a livequery --- common/resourcefacade.cpp | 43 +++++++++++++++++++++++++++++++------------ common/resourcefacade.h | 18 +++++++++--------- 2 files changed, 40 insertions(+), 21 deletions(-) (limited to 'common') diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp index e6f98a9..dab6aed 100644 --- a/common/resourcefacade.cpp +++ b/common/resourcefacade.cpp @@ -96,17 +96,24 @@ template LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, const QByteArray &identifier, const QByteArray &typeName, ConfigNotifier &configNotifier, const Sink::Log::Context &ctx) : mResultProvider(new ResultProvider), mConfigStore(identifier, typeName), mGuard(new QObject), mLogCtx(ctx.subContext("config")) { + + auto matchesTypeAndIds = [query, this] (const QByteArray &type, const QByteArray &id) { + if (query.hasFilter(ApplicationDomain::SinkResource::ResourceType::name) && query.getFilter(ApplicationDomain::SinkResource::ResourceType::name).value.toByteArray() != type) { + SinkTraceCtx(mLogCtx) << "Skipping due to type."; + return false; + } + if (!query.ids().isEmpty() && !query.ids().contains(id)) { + return false; + } + return true; + }; + QObject *guard = new QObject; - mResultProvider->setFetcher([this, query, guard, &configNotifier](const QSharedPointer &) { + mResultProvider->setFetcher([this, query, guard, &configNotifier, matchesTypeAndIds](const QSharedPointer &) { const auto entries = mConfigStore.getEntries(); for (const auto &res : entries.keys()) { const auto type = entries.value(res); - - if (query.hasFilter(ApplicationDomain::SinkResource::ResourceType::name) && query.getFilter(ApplicationDomain::SinkResource::ResourceType::name).value.toByteArray() != type) { - SinkTraceCtx(mLogCtx) << "Skipping due to type."; - continue; - } - if (!query.ids().isEmpty() && !query.ids().contains(res)) { + if (!matchesTypeAndIds(type, res)){ continue; } auto entity = readFromConfig(mConfigStore, res, type, query.requestedProperties); @@ -124,8 +131,14 @@ LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, }); if (query.liveQuery()) { { - auto ret = QObject::connect(&configNotifier, &ConfigNotifier::added, guard, [this](const ApplicationDomain::ApplicationDomainType::Ptr &entry) { + auto ret = QObject::connect(&configNotifier, &ConfigNotifier::added, guard, [this, query, matchesTypeAndIds](const ApplicationDomain::ApplicationDomainType::Ptr &entry, const QByteArray &type) { auto entity = entry.staticCast(); + if (!matchesTypeAndIds(type, entity->identifier())){ + return; + } + if (!matchesFilter(query.getBaseFilters(), *entity)){ + return; + } SinkTraceCtx(mLogCtx) << "A new resource has been added: " << entity->identifier(); updateStatus(*entity); mResultProvider->add(entity); @@ -133,8 +146,14 @@ LocalStorageQueryRunner::LocalStorageQueryRunner(const Query &query, Q_ASSERT(ret); } { - auto ret = QObject::connect(&configNotifier, &ConfigNotifier::modified, guard, [this](const ApplicationDomain::ApplicationDomainType::Ptr &entry) { + auto ret = QObject::connect(&configNotifier, &ConfigNotifier::modified, guard, [this, query, matchesTypeAndIds](const ApplicationDomain::ApplicationDomainType::Ptr &entry, const QByteArray &type) { auto entity = entry.staticCast(); + if (!matchesTypeAndIds(type, entity->identifier())){ + return; + } + if (!matchesFilter(query.getBaseFilters(), *entity)){ + return; + } updateStatus(*entity); mResultProvider->modify(entity); }); @@ -218,7 +237,7 @@ KAsync::Job LocalStorageFacade::create(const DomainType &domai } configStore.modify(identifier, configurationValues); } - sConfigNotifier.add(::readFromConfig(configStore, identifier, type, QByteArrayList{})); + sConfigNotifier.add(::readFromConfig(configStore, identifier, type, QByteArrayList{}), type); }); } @@ -247,7 +266,7 @@ KAsync::Job LocalStorageFacade::modify(const DomainType &domai } const auto type = configStore.getEntries().value(identifier); - sConfigNotifier.modify(::readFromConfig(configStore, identifier, type, QByteArrayList{})); + sConfigNotifier.modify(::readFromConfig(configStore, identifier, type, QByteArrayList{}), type); }); } @@ -277,7 +296,7 @@ KAsync::Job LocalStorageFacade::remove(const DomainType &domai SinkTrace() << "Removing: " << identifier; auto configStore = ConfigStore(configStoreIdentifier, typeName); configStore.remove(identifier); - sConfigNotifier.remove(QSharedPointer::create(domainObject)); + sConfigNotifier.remove(QSharedPointer::create(domainObject), typeName); }); } diff --git a/common/resourcefacade.h b/common/resourcefacade.h index 1cc075c..76fadce 100644 --- a/common/resourcefacade.h +++ b/common/resourcefacade.h @@ -36,24 +36,24 @@ class ConfigNotifier : public QObject { Q_OBJECT public: - void add(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account) + void add(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type) { - emit added(account); + emit added(account, type); } - void remove(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account) + void remove(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type) { - emit removed(account); + emit removed(account, type); } - void modify(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account) + void modify(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type) { - emit modified(account); + emit modified(account, type); } signals: - void added(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account); - void removed(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account); - void modified(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account); + void added(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type); + void removed(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type); + void modified(const Sink::ApplicationDomain::ApplicationDomainType::Ptr &account, const QByteArray &type); }; template -- cgit v1.2.3