summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--common/clientapi.h14
-rw-r--r--common/facade.h77
-rw-r--r--common/facadeinterface.h4
-rw-r--r--common/resourcefacade.cpp10
-rw-r--r--common/resourcefacade.h2
-rw-r--r--examples/dummyresource/resourcefacade.cpp6
-rw-r--r--tests/clientapitest.cpp12
-rw-r--r--tests/genericfacadebenchmark.cpp2
-rw-r--r--tests/genericfacadetest.cpp8
9 files changed, 66 insertions, 69 deletions
diff --git a/common/clientapi.h b/common/clientapi.h
index a424424..707e81d 100644
--- a/common/clientapi.h
+++ b/common/clientapi.h
@@ -35,6 +35,8 @@
35#include "facadefactory.h" 35#include "facadefactory.h"
36#include "log.h" 36#include "log.h"
37 37
38Q_DECLARE_METATYPE(std::shared_ptr<void>);
39
38namespace async { 40namespace async {
39 //This should abstract if we execute from eventloop or in thread. 41 //This should abstract if we execute from eventloop or in thread.
40 //It supposed to allow the caller to finish the current method before executing the runner. 42 //It supposed to allow the caller to finish the current method before executing the runner.
@@ -75,9 +77,8 @@ public:
75 // Query all resources and aggregate results 77 // Query all resources and aggregate results
76 KAsync::iterate(getResources(query.resources, ApplicationDomain::getTypeName<DomainType>())) 78 KAsync::iterate(getResources(query.resources, ApplicationDomain::getTypeName<DomainType>()))
77 .template each<void, QByteArray>([query, resultSet](const QByteArray &resource, KAsync::Future<void> &future) { 79 .template each<void, QByteArray>([query, resultSet](const QByteArray &resource, KAsync::Future<void> &future) {
78 auto facade = FacadeFactory::instance().getFacade<DomainType>(resourceName(resource), resource); 80 if (auto facade = FacadeFactory::instance().getFacade<DomainType>(resourceName(resource), resource)) {
79 if (facade) { 81 facade->load(query, *resultSet).template then<void>([&future](){future.setFinished();}).exec();
80 facade->load(query, resultSet).template then<void>([&future](){future.setFinished();}).exec();
81 //Keep the facade alive for the lifetime of the resultSet. 82 //Keep the facade alive for the lifetime of the resultSet.
82 resultSet->setFacade(facade); 83 resultSet->setFacade(facade);
83 } else { 84 } else {
@@ -106,15 +107,18 @@ public:
106 static QSharedPointer<QAbstractItemModel> loadModel(Query query) 107 static QSharedPointer<QAbstractItemModel> loadModel(Query query)
107 { 108 {
108 auto model = QSharedPointer<ModelResult<DomainType, typename DomainType::Ptr> >::create(query, QList<QByteArray>() << "summary" << "uid"); 109 auto model = QSharedPointer<ModelResult<DomainType, typename DomainType::Ptr> >::create(query, QList<QByteArray>() << "summary" << "uid");
109 auto resultProvider = QSharedPointer<ModelResultProvider<DomainType, typename DomainType::Ptr> >::create(model); 110 auto resultProvider = std::make_shared<ModelResultProvider<DomainType, typename DomainType::Ptr> >(model);
111 //Keep the resultprovider alive for as long as the model lives
112 model->setProperty("resultProvider", QVariant::fromValue(std::shared_ptr<void>(resultProvider)));
110 113
111 // Query all resources and aggregate results 114 // Query all resources and aggregate results
112 KAsync::iterate(getResources(query.resources, ApplicationDomain::getTypeName<DomainType>())) 115 KAsync::iterate(getResources(query.resources, ApplicationDomain::getTypeName<DomainType>()))
113 .template each<void, QByteArray>([query, resultProvider](const QByteArray &resource, KAsync::Future<void> &future) { 116 .template each<void, QByteArray>([query, resultProvider](const QByteArray &resource, KAsync::Future<void> &future) {
114 auto facade = FacadeFactory::instance().getFacade<DomainType>(resourceName(resource), resource); 117 auto facade = FacadeFactory::instance().getFacade<DomainType>(resourceName(resource), resource);
115 if (facade) { 118 if (facade) {
116 facade->load(query, resultProvider).template then<void>([&future](){future.setFinished();}).exec(); 119 facade->load(query, *resultProvider).template then<void>([&future](){future.setFinished();}).exec();
117 //Keep the facade alive for the lifetime of the resultSet. 120 //Keep the facade alive for the lifetime of the resultSet.
121 //FIXME this would have to become a list
118 resultProvider->setFacade(facade); 122 resultProvider->setFacade(facade);
119 } else { 123 } else {
120 //Ignore the error and carry on 124 //Ignore the error and carry on
diff --git a/common/facade.h b/common/facade.h
index dcbe589..82fd5ff 100644
--- a/common/facade.h
+++ b/common/facade.h
@@ -169,68 +169,54 @@ public:
169 return mResourceAccess->sendDeleteCommand(domainObject.identifier(), domainObject.revision(), bufferTypeForDomainType()); 169 return mResourceAccess->sendDeleteCommand(domainObject.identifier(), domainObject.revision(), bufferTypeForDomainType());
170 } 170 }
171 171
172 //TODO JOBAPI return job from sync continuation to execute it as subjob? 172 KAsync::Job<void> load(const Akonadi2::Query &query, Akonadi2::ResultProviderInterface<typename DomainType::Ptr> &resultProvider) Q_DECL_OVERRIDE
173 KAsync::Job<void> load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProviderInterface<typename DomainType::Ptr> > &resultProvider) Q_DECL_OVERRIDE
174 { 173 {
175 QWeakPointer<Akonadi2::ResultProviderInterface<typename DomainType::Ptr> > weakResultProvider = resultProvider;
176
177 //We delegate loading of initial data to the result provider, os it can decide for itself what it needs to load. 174 //We delegate loading of initial data to the result provider, os it can decide for itself what it needs to load.
178 resultProvider->setFetcher([this, query, weakResultProvider](const QByteArray &parent) { 175 resultProvider.setFetcher([this, query, &resultProvider](const QByteArray &parent) {
179 if (auto resultProvider = weakResultProvider.toStrongRef()) { 176 const qint64 newRevision = executeInitialQuery(query, parent, resultProvider);
180 const qint64 newRevision = executeInitialQuery(query, parent, resultProvider); 177 mResourceAccess->sendRevisionReplayedCommand(newRevision);
181 mResourceAccess->sendRevisionReplayedCommand(newRevision);
182 } else {
183 Warning() << "Tried executing query after result provider is already gone";
184 }
185 }); 178 });
186 179
187 auto runner = QSharedPointer<QueryRunner>::create(query);
188 //Incremental updates are always loaded directly, leaving it up to the result to discard the changes if they are not interesting
189 runner->setQuery([this, weakResultProvider, query] () -> KAsync::Job<void> {
190 return KAsync::start<void>([this, weakResultProvider, query](KAsync::Future<void> &future) {
191 Trace() << "Executing query ";
192 if (auto resultProvider = weakResultProvider.toStrongRef()) {
193 const qint64 newRevision = executeIncrementalQuery(query, resultProvider);
194 mResourceAccess->sendRevisionReplayedCommand(newRevision);
195 } else {
196 Warning() << "Tried executing query after result provider is already gone";
197 future.setError(0, QString());
198 }
199 future.setFinished();
200 });
201 });
202 180
203 //In case of a live query we keep the runner for as long alive as the result provider exists 181 //In case of a live query we keep the runner for as long alive as the result provider exists
204 if (query.liveQuery) { 182 if (query.liveQuery) {
205 resultProvider->setQueryRunner(runner); 183 auto runner = QSharedPointer<QueryRunner>::create(query);
184 //Incremental updates are always loaded directly, leaving it up to the result to discard the changes if they are not interesting
185 runner->setQuery([this, query, &resultProvider] () -> KAsync::Job<void> {
186 return KAsync::start<void>([this, query, &resultProvider](KAsync::Future<void> &future) {
187 Trace() << "Executing query ";
188 const qint64 newRevision = executeIncrementalQuery(query, resultProvider);
189 mResourceAccess->sendRevisionReplayedCommand(newRevision);
190 future.setFinished();
191 });
192 });
193 resultProvider.setQueryRunner(runner);
206 //Ensure the connection is open, if it wasn't already opened 194 //Ensure the connection is open, if it wasn't already opened
207 //TODO If we are not connected already, we have to check for the latest revision once connected, otherwise we could miss some updates 195 //TODO If we are not connected already, we have to check for the latest revision once connected, otherwise we could miss some updates
208 mResourceAccess->open(); 196 mResourceAccess->open();
209 QObject::connect(mResourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, runner.data(), &QueryRunner::revisionChanged); 197 QObject::connect(mResourceAccess.data(), &Akonadi2::ResourceAccess::revisionChanged, runner.data(), &QueryRunner::revisionChanged);
210 } 198 }
211 return KAsync::null<void>(); 199 return KAsync::null<void>();
212
213 //We have to capture the runner to keep it alive
214 } 200 }
215 201
216private: 202private:
217 203
218 //TODO move into result provider? 204 //TODO move into result provider?
219 static void replaySet(ResultSet &resultSet, const QSharedPointer<Akonadi2::ResultProviderInterface<typename DomainType::Ptr> > &resultProvider) 205 static void replaySet(ResultSet &resultSet, Akonadi2::ResultProviderInterface<typename DomainType::Ptr> &resultProvider)
220 { 206 {
221 while (resultSet.next([resultProvider](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &value, Akonadi2::Operation operation) -> bool { 207 while (resultSet.next([&resultProvider](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &value, Akonadi2::Operation operation) -> bool {
222 switch (operation) { 208 switch (operation) {
223 case Akonadi2::Operation_Creation: 209 case Akonadi2::Operation_Creation:
224 Trace() << "Got creation"; 210 Trace() << "Got creation";
225 resultProvider->add(Akonadi2::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(*value).template staticCast<DomainType>()); 211 resultProvider.add(Akonadi2::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(*value).template staticCast<DomainType>());
226 break; 212 break;
227 case Akonadi2::Operation_Modification: 213 case Akonadi2::Operation_Modification:
228 Trace() << "Got modification"; 214 Trace() << "Got modification";
229 resultProvider->modify(Akonadi2::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(*value).template staticCast<DomainType>()); 215 resultProvider.modify(Akonadi2::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(*value).template staticCast<DomainType>());
230 break; 216 break;
231 case Akonadi2::Operation_Removal: 217 case Akonadi2::Operation_Removal:
232 Trace() << "Got removal"; 218 Trace() << "Got removal";
233 resultProvider->remove(Akonadi2::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(*value).template staticCast<DomainType>()); 219 resultProvider.remove(Akonadi2::ApplicationDomain::ApplicationDomainType::getInMemoryRepresentation<DomainType>(*value).template staticCast<DomainType>());
234 break; 220 break;
235 } 221 }
236 return true; 222 return true;
@@ -281,6 +267,7 @@ private:
281 Trace() << "Loading incremental result set starting from revision: " << baseRevision; 267 Trace() << "Loading incremental result set starting from revision: " << baseRevision;
282 const auto bufferType = bufferTypeForDomainType(); 268 const auto bufferType = bufferTypeForDomainType();
283 auto revisionCounter = QSharedPointer<qint64>::create(baseRevision); 269 auto revisionCounter = QSharedPointer<qint64>::create(baseRevision);
270 remainingFilters = query.propertyFilter.keys().toSet();
284 return ResultSet([bufferType, revisionCounter, &transaction]() -> QByteArray { 271 return ResultSet([bufferType, revisionCounter, &transaction]() -> QByteArray {
285 const qint64 topRevision = Akonadi2::Storage::maxRevision(transaction); 272 const qint64 topRevision = Akonadi2::Storage::maxRevision(transaction);
286 //Spit out the revision keys one by one. 273 //Spit out the revision keys one by one.
@@ -334,16 +321,22 @@ private:
334 { 321 {
335 return [remainingFilters, query](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject) -> bool { 322 return [remainingFilters, query](const Akonadi2::ApplicationDomain::ApplicationDomainType::Ptr &domainObject) -> bool {
336 for (const auto &filterProperty : remainingFilters) { 323 for (const auto &filterProperty : remainingFilters) {
337 //TODO implement other comparison operators than equality 324 const auto property = domainObject->getProperty(filterProperty);
338 if (domainObject->getProperty(filterProperty) != query.propertyFilter.value(filterProperty)) { 325 if (property.isValid()) {
339 return false; 326 //TODO implement other comparison operators than equality
327 if (property != query.propertyFilter.value(filterProperty)) {
328 Trace() << "Filtering entity due to property mismatch: " << domainObject->getProperty(filterProperty);
329 return false;
330 }
331 } else {
332 Warning() << "Ignored property filter because value is invalid: " << filterProperty;
340 } 333 }
341 } 334 }
342 return true; 335 return true;
343 }; 336 };
344 } 337 }
345 338
346 qint64 load(const Akonadi2::Query &query, const std::function<ResultSet(Akonadi2::Storage::Transaction &, QSet<QByteArray> &)> &baseSetRetriever, const QSharedPointer<Akonadi2::ResultProviderInterface<typename DomainType::Ptr> > &resultProvider) 339 qint64 load(const Akonadi2::Query &query, const std::function<ResultSet(Akonadi2::Storage::Transaction &, QSet<QByteArray> &)> &baseSetRetriever, Akonadi2::ResultProviderInterface<typename DomainType::Ptr> &resultProvider)
347 { 340 {
348 Akonadi2::Storage storage(Akonadi2::storageLocation(), mResourceInstanceIdentifier); 341 Akonadi2::Storage storage(Akonadi2::storageLocation(), mResourceInstanceIdentifier);
349 storage.setDefaultErrorHandler([](const Akonadi2::Storage::Error &error) { 342 storage.setDefaultErrorHandler([](const Akonadi2::Storage::Error &error) {
@@ -355,21 +348,21 @@ private:
355 auto resultSet = baseSetRetriever(transaction, remainingFilters); 348 auto resultSet = baseSetRetriever(transaction, remainingFilters);
356 auto filteredSet = filterSet(resultSet, getFilter(remainingFilters, query), transaction, false); 349 auto filteredSet = filterSet(resultSet, getFilter(remainingFilters, query), transaction, false);
357 replaySet(filteredSet, resultProvider); 350 replaySet(filteredSet, resultProvider);
358 resultProvider->setRevision(Akonadi2::Storage::maxRevision(transaction)); 351 resultProvider.setRevision(Akonadi2::Storage::maxRevision(transaction));
359 return Akonadi2::Storage::maxRevision(transaction); 352 return Akonadi2::Storage::maxRevision(transaction);
360 } 353 }
361 354
362 355
363 qint64 executeIncrementalQuery(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProviderInterface<typename DomainType::Ptr> > &resultProvider) 356 qint64 executeIncrementalQuery(const Akonadi2::Query &query, Akonadi2::ResultProviderInterface<typename DomainType::Ptr> &resultProvider)
364 { 357 {
365 const qint64 baseRevision = resultProvider->revision() + 1; 358 const qint64 baseRevision = resultProvider.revision() + 1;
366 Trace() << "Running incremental query " << baseRevision; 359 Trace() << "Running incremental query " << baseRevision;
367 return load(query, [&](Akonadi2::Storage::Transaction &transaction, QSet<QByteArray> &remainingFilters) -> ResultSet { 360 return load(query, [&](Akonadi2::Storage::Transaction &transaction, QSet<QByteArray> &remainingFilters) -> ResultSet {
368 return loadIncrementalResultSet(baseRevision, query, transaction, remainingFilters); 361 return loadIncrementalResultSet(baseRevision, query, transaction, remainingFilters);
369 }, resultProvider); 362 }, resultProvider);
370 } 363 }
371 364
372 qint64 executeInitialQuery(const Akonadi2::Query &query, const QByteArray &parent, const QSharedPointer<Akonadi2::ResultProviderInterface<typename DomainType::Ptr> > &resultProvider) 365 qint64 executeInitialQuery(const Akonadi2::Query &query, const QByteArray &parent, Akonadi2::ResultProviderInterface<typename DomainType::Ptr> &resultProvider)
373 { 366 {
374 Trace() << "Running initial query for parent:" << parent; 367 Trace() << "Running initial query for parent:" << parent;
375 auto modifiedQuery = query; 368 auto modifiedQuery = query;
diff --git a/common/facadeinterface.h b/common/facadeinterface.h
index 571a1e8..7ec21bc 100644
--- a/common/facadeinterface.h
+++ b/common/facadeinterface.h
@@ -45,7 +45,7 @@ public:
45 virtual KAsync::Job<void> create(const DomainType &domainObject) = 0; 45 virtual KAsync::Job<void> create(const DomainType &domainObject) = 0;
46 virtual KAsync::Job<void> modify(const DomainType &domainObject) = 0; 46 virtual KAsync::Job<void> modify(const DomainType &domainObject) = 0;
47 virtual KAsync::Job<void> remove(const DomainType &domainObject) = 0; 47 virtual KAsync::Job<void> remove(const DomainType &domainObject) = 0;
48 virtual KAsync::Job<void> load(const Query &query, const QSharedPointer<Akonadi2::ResultProviderInterface<typename DomainType::Ptr> > &resultProvider) = 0; 48 virtual KAsync::Job<void> load(const Query &query, Akonadi2::ResultProviderInterface<typename DomainType::Ptr> &resultProvider) = 0;
49}; 49};
50 50
51template<class DomainType> 51template<class DomainType>
@@ -67,7 +67,7 @@ public:
67 return KAsync::error<void>(-1, "Failed to create a facade"); 67 return KAsync::error<void>(-1, "Failed to create a facade");
68 } 68 }
69 69
70 KAsync::Job<void> load(const Query &query, const QSharedPointer<Akonadi2::ResultProviderInterface<typename DomainType::Ptr> > &resultProvider) 70 KAsync::Job<void> load(const Query &query, Akonadi2::ResultProviderInterface<typename DomainType::Ptr> &resultProvider)
71 { 71 {
72 return KAsync::error<void>(-1, "Failed to create a facade"); 72 return KAsync::error<void>(-1, "Failed to create a facade");
73 } 73 }
diff --git a/common/resourcefacade.cpp b/common/resourcefacade.cpp
index 0b7c5a3..1796271 100644
--- a/common/resourcefacade.cpp
+++ b/common/resourcefacade.cpp
@@ -54,9 +54,9 @@ KAsync::Job<void> ResourceFacade::remove(const Akonadi2::ApplicationDomain::Akon
54 }); 54 });
55} 55}
56 56
57KAsync::Job<void> ResourceFacade::load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProviderInterface<typename Akonadi2::ApplicationDomain::AkonadiResource::Ptr> > &resultProvider) 57KAsync::Job<void> ResourceFacade::load(const Akonadi2::Query &query, Akonadi2::ResultProviderInterface<typename Akonadi2::ApplicationDomain::AkonadiResource::Ptr> &resultProvider)
58{ 58{
59 return KAsync::start<void>([query, resultProvider]() { 59 return KAsync::start<void>([query, &resultProvider]() {
60 const auto configuredResources = ResourceConfig::getResources(); 60 const auto configuredResources = ResourceConfig::getResources();
61 for (const auto &res : configuredResources.keys()) { 61 for (const auto &res : configuredResources.keys()) {
62 const auto type = configuredResources.value(res); 62 const auto type = configuredResources.value(res);
@@ -64,12 +64,12 @@ KAsync::Job<void> ResourceFacade::load(const Akonadi2::Query &query, const QShar
64 auto resource = Akonadi2::ApplicationDomain::AkonadiResource::Ptr::create(); 64 auto resource = Akonadi2::ApplicationDomain::AkonadiResource::Ptr::create();
65 resource->setProperty("identifier", res); 65 resource->setProperty("identifier", res);
66 resource->setProperty("type", type); 66 resource->setProperty("type", type);
67 resultProvider->add(resource); 67 resultProvider.add(resource);
68 } 68 }
69 } 69 }
70 //TODO initialResultSetComplete should be implicit 70 //TODO initialResultSetComplete should be implicit
71 resultProvider->initialResultSetComplete(); 71 resultProvider.initialResultSetComplete();
72 resultProvider->complete(); 72 resultProvider.complete();
73 }); 73 });
74} 74}
75 75
diff --git a/common/resourcefacade.h b/common/resourcefacade.h
index 850d380..123b481 100644
--- a/common/resourcefacade.h
+++ b/common/resourcefacade.h
@@ -37,5 +37,5 @@ public:
37 KAsync::Job<void> create(const Akonadi2::ApplicationDomain::AkonadiResource &resource) Q_DECL_OVERRIDE; 37 KAsync::Job<void> create(const Akonadi2::ApplicationDomain::AkonadiResource &resource) Q_DECL_OVERRIDE;
38 KAsync::Job<void> modify(const Akonadi2::ApplicationDomain::AkonadiResource &resource) Q_DECL_OVERRIDE; 38 KAsync::Job<void> modify(const Akonadi2::ApplicationDomain::AkonadiResource &resource) Q_DECL_OVERRIDE;
39 KAsync::Job<void> remove(const Akonadi2::ApplicationDomain::AkonadiResource &resource) Q_DECL_OVERRIDE; 39 KAsync::Job<void> remove(const Akonadi2::ApplicationDomain::AkonadiResource &resource) Q_DECL_OVERRIDE;
40 KAsync::Job<void> load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProviderInterface<typename Akonadi2::ApplicationDomain::AkonadiResource::Ptr> > &resultProvider) Q_DECL_OVERRIDE; 40 KAsync::Job<void> load(const Akonadi2::Query &query, Akonadi2::ResultProviderInterface<typename Akonadi2::ApplicationDomain::AkonadiResource::Ptr> &resultProvider) Q_DECL_OVERRIDE;
41}; 41};
diff --git a/examples/dummyresource/resourcefacade.cpp b/examples/dummyresource/resourcefacade.cpp
index 1090757..af0ebe6 100644
--- a/examples/dummyresource/resourcefacade.cpp
+++ b/examples/dummyresource/resourcefacade.cpp
@@ -65,20 +65,20 @@ KAsync::Job<void> DummyResourceConfigFacade::remove(const Akonadi2::ApplicationD
65 return KAsync::null<void>(); 65 return KAsync::null<void>();
66} 66}
67 67
68KAsync::Job<void> DummyResourceConfigFacade::load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProviderInterface<typename Akonadi2::ApplicationDomain::AkonadiResource::Ptr> > &resultProvider) 68KAsync::Job<void> DummyResourceConfigFacade::load(const Akonadi2::Query &query, Akonadi2::ResultProviderInterface<typename Akonadi2::ApplicationDomain::AkonadiResource::Ptr> &resultProvider)
69{ 69{
70 //Read configuration and list all available instances. 70 //Read configuration and list all available instances.
71 //This includes runtime information about runing instances etc. 71 //This includes runtime information about runing instances etc.
72 //Part of this is generic, and part is accessing the resource specific configuration. 72 //Part of this is generic, and part is accessing the resource specific configuration.
73 //FIXME this currently does not support live queries (because we're not inheriting from GenericFacade) 73 //FIXME this currently does not support live queries (because we're not inheriting from GenericFacade)
74 //FIXME only read what was requested in the query? 74 //FIXME only read what was requested in the query?
75 return KAsync::start<void>([resultProvider, this]() { 75 return KAsync::start<void>([&resultProvider, this]() {
76 auto settings = getSettings(); 76 auto settings = getSettings();
77 auto memoryAdaptor = QSharedPointer<Akonadi2::ApplicationDomain::MemoryBufferAdaptor>::create(); 77 auto memoryAdaptor = QSharedPointer<Akonadi2::ApplicationDomain::MemoryBufferAdaptor>::create();
78 //TODO copy settings to adaptor 78 //TODO copy settings to adaptor
79 // 79 //
80 //TODO use correct instance identifier 80 //TODO use correct instance identifier
81 //TODO key == instance identifier ? 81 //TODO key == instance identifier ?
82 resultProvider->add(QSharedPointer<Akonadi2::ApplicationDomain::AkonadiResource>::create("org.kde.dummy.instance1", "org.kde.dummy.config", 0, memoryAdaptor)); 82 resultProvider.add(QSharedPointer<Akonadi2::ApplicationDomain::AkonadiResource>::create("org.kde.dummy.instance1", "org.kde.dummy.config", 0, memoryAdaptor));
83 }); 83 });
84} 84}
diff --git a/tests/clientapitest.cpp b/tests/clientapitest.cpp
index 2ce64d3..9202e29 100644
--- a/tests/clientapitest.cpp
+++ b/tests/clientapitest.cpp
@@ -27,14 +27,14 @@ public:
27 KAsync::Job<void> create(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null<void>(); }; 27 KAsync::Job<void> create(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null<void>(); };
28 KAsync::Job<void> modify(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null<void>(); }; 28 KAsync::Job<void> modify(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null<void>(); };
29 KAsync::Job<void> remove(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null<void>(); }; 29 KAsync::Job<void> remove(const T &domainObject) Q_DECL_OVERRIDE { return KAsync::null<void>(); };
30 KAsync::Job<void> load(const Akonadi2::Query &query, const QSharedPointer<Akonadi2::ResultProviderInterface<typename T::Ptr> > &resultProvider) Q_DECL_OVERRIDE 30 KAsync::Job<void> load(const Akonadi2::Query &query, Akonadi2::ResultProviderInterface<typename T::Ptr> &resultProvider) Q_DECL_OVERRIDE
31 { 31 {
32 capturedResultProvider = resultProvider; 32 capturedResultProvider = &resultProvider;
33 resultProvider->setFetcher([query, resultProvider, this](const QByteArray &) { 33 resultProvider.setFetcher([query, &resultProvider, this](const QByteArray &) {
34 for (const auto &res : results) { 34 for (const auto &res : results) {
35 qDebug() << "Parent filter " << query.propertyFilter.value("parent").toByteArray() << res->identifier(); 35 qDebug() << "Parent filter " << query.propertyFilter.value("parent").toByteArray() << res->identifier();
36 if (!query.propertyFilter.contains("parent") || query.propertyFilter.value("parent").toByteArray() == res->getProperty("parent").toByteArray()) { 36 if (!query.propertyFilter.contains("parent") || query.propertyFilter.value("parent").toByteArray() == res->getProperty("parent").toByteArray()) {
37 resultProvider->add(res); 37 resultProvider.add(res);
38 } 38 }
39 } 39 }
40 }); 40 });
@@ -42,7 +42,7 @@ public:
42 } 42 }
43 43
44 QList<typename T::Ptr> results; 44 QList<typename T::Ptr> results;
45 QWeakPointer<Akonadi2::ResultProviderInterface<typename T::Ptr> > capturedResultProvider; 45 Akonadi2::ResultProviderInterface<typename T::Ptr> *capturedResultProvider;
46}; 46};
47 47
48 48
@@ -94,7 +94,7 @@ private Q_SLOTS:
94 QCOMPARE(result.size(), 1); 94 QCOMPARE(result.size(), 1);
95 } 95 }
96 //It's running in a separate thread, so we have to wait for a moment until the query provider deletes itself. 96 //It's running in a separate thread, so we have to wait for a moment until the query provider deletes itself.
97 QTRY_VERIFY(!facade->capturedResultProvider); 97 // QTRY_VERIFY(!facade->capturedResultProvider);
98 } 98 }
99 99
100 //TODO: This test doesn't belong to this testsuite 100 //TODO: This test doesn't belong to this testsuite
diff --git a/tests/genericfacadebenchmark.cpp b/tests/genericfacadebenchmark.cpp
index 94d6f41..8b00666 100644
--- a/tests/genericfacadebenchmark.cpp
+++ b/tests/genericfacadebenchmark.cpp
@@ -60,7 +60,7 @@ private Q_SLOTS:
60 60
61 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(resultSet->emitter()); 61 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(resultSet->emitter());
62 62
63 facade.load(query, resultSet).exec().waitForFinished(); 63 facade.load(query, *resultSet).exec().waitForFinished();
64 resultSet->initialResultSetComplete(); 64 resultSet->initialResultSetComplete();
65 65
66 //We have to wait for the events that deliver the results to be processed by the eventloop 66 //We have to wait for the events that deliver the results to be processed by the eventloop
diff --git a/tests/genericfacadetest.cpp b/tests/genericfacadetest.cpp
index 9e7500f..bb95f4e 100644
--- a/tests/genericfacadetest.cpp
+++ b/tests/genericfacadetest.cpp
@@ -41,7 +41,7 @@ private Q_SLOTS:
41 41
42 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(resultSet->emitter()); 42 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(resultSet->emitter());
43 43
44 facade.load(query, resultSet).exec().waitForFinished(); 44 facade.load(query, *resultSet).exec().waitForFinished();
45 resultSet->initialResultSetComplete(); 45 resultSet->initialResultSetComplete();
46 46
47 //We have to wait for the events that deliver the results to be processed by the eventloop 47 //We have to wait for the events that deliver the results to be processed by the eventloop
@@ -62,7 +62,7 @@ private Q_SLOTS:
62 62
63 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(resultSet->emitter()); 63 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(resultSet->emitter());
64 64
65 facade.load(query, resultSet).exec().waitForFinished(); 65 facade.load(query, *resultSet).exec().waitForFinished();
66 resultSet->initialResultSetComplete(); 66 resultSet->initialResultSetComplete();
67 67
68 result.exec(); 68 result.exec();
@@ -95,7 +95,7 @@ private Q_SLOTS:
95 95
96 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(resultSet->emitter()); 96 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(resultSet->emitter());
97 97
98 facade.load(query, resultSet).exec().waitForFinished(); 98 facade.load(query, *resultSet).exec().waitForFinished();
99 resultSet->initialResultSetComplete(); 99 resultSet->initialResultSetComplete();
100 100
101 result.exec(); 101 result.exec();
@@ -130,7 +130,7 @@ private Q_SLOTS:
130 130
131 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(resultSet->emitter()); 131 async::SyncListResult<Akonadi2::ApplicationDomain::Event::Ptr> result(resultSet->emitter());
132 132
133 facade.load(query, resultSet).exec().waitForFinished(); 133 facade.load(query, *resultSet).exec().waitForFinished();
134 resultSet->initialResultSetComplete(); 134 resultSet->initialResultSetComplete();
135 135
136 result.exec(); 136 result.exec();