summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Mollekopf <chrigi_1@fastmail.fm>2017-12-28 11:26:45 +0100
committerChristian Mollekopf <chrigi_1@fastmail.fm>2017-12-28 11:26:45 +0100
commitefbb9a602c380fafc8f969c3e323ce9e85935809 (patch)
tree17c27d17f03a5cb31fb1e1fd20882fa0c2cd918d
parentfb41cc4b30792238eed235aa5c6a8a3ba47b87a6 (diff)
downloadsink-efbb9a602c380fafc8f969c3e323ce9e85935809.tar.gz
sink-efbb9a602c380fafc8f969c3e323ce9e85935809.zip
Fixed incremental updates in folder queries
Incremental additions of children in the tree were filtered due to the parent filter. This broke when we started to maintain state, thus causing the filter in datastorequery containing the parent filter to be carried over. Given that the incremental querying of children currently doesn't really add much value (we don't have trees that are large/deep enough), perhaps we're better off using a different approach.
-rw-r--r--common/queryrunner.cpp13
-rw-r--r--tests/querytest.cpp29
2 files changed, 30 insertions, 12 deletions
diff --git a/common/queryrunner.cpp b/common/queryrunner.cpp
index f196965..f3a9af8 100644
--- a/common/queryrunner.cpp
+++ b/common/queryrunner.cpp
@@ -245,23 +245,12 @@ ReplayResult QueryWorker<DomainType>::executeInitialQuery(
245 QTime time; 245 QTime time;
246 time.start(); 246 time.start();
247 247
248 auto modifiedQuery = query;
249 if (!query.parentProperty().isEmpty()) {
250 if (parent) {
251 SinkTraceCtx(mLogCtx) << "Running initial query for parent:" << parent->identifier();
252 modifiedQuery.filter(query.parentProperty(), Query::Comparator(QVariant::fromValue(Sink::ApplicationDomain::Reference{parent->identifier()})));
253 } else {
254 SinkTraceCtx(mLogCtx) << "Running initial query for toplevel";
255 modifiedQuery.filter(query.parentProperty(), Query::Comparator(QVariant{}));
256 }
257 }
258
259 auto entityStore = EntityStore{mResourceContext, mLogCtx}; 248 auto entityStore = EntityStore{mResourceContext, mLogCtx};
260 auto preparedQuery = [&] { 249 auto preparedQuery = [&] {
261 if (state) { 250 if (state) {
262 return DataStoreQuery{*state, ApplicationDomain::getTypeName<DomainType>(), entityStore, false}; 251 return DataStoreQuery{*state, ApplicationDomain::getTypeName<DomainType>(), entityStore, false};
263 } else { 252 } else {
264 return DataStoreQuery{modifiedQuery, ApplicationDomain::getTypeName<DomainType>(), entityStore}; 253 return DataStoreQuery{query, ApplicationDomain::getTypeName<DomainType>(), entityStore};
265 } 254 }
266 }(); 255 }();
267 auto resultSet = preparedQuery.execute(); 256 auto resultSet = preparedQuery.execute();
diff --git a/tests/querytest.cpp b/tests/querytest.cpp
index 714e549..3b62f56 100644
--- a/tests/querytest.cpp
+++ b/tests/querytest.cpp
@@ -250,6 +250,35 @@ private slots:
250 QCOMPARE(model->rowCount(model->index(0, 0)), 1); 250 QCOMPARE(model->rowCount(model->index(0, 0)), 1);
251 } 251 }
252 252
253 void testIncrementalFolderTree()
254 {
255 // Setup
256 auto folder = ApplicationDomainType::createEntity<Folder>("sink.dummy.instance1");
257 VERIFYEXEC(Sink::Store::create<Folder>(folder));
258 // Ensure all local data is processed
259 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1"));
260
261 // Test
262 Sink::Query query{Sink::Query::LiveQuery};
263 query.resourceFilter("sink.dummy.instance1");
264 query.requestTree<Folder::Parent>();
265
266 // We fetch after the data is available and don't rely on the live query mechanism to deliver the actual data
267 auto model = Sink::Store::loadModel<Folder>(query);
268 QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool());
269 QCOMPARE(model->rowCount(), 1);
270 model->fetchMore(model->index(0, 0));
271
272 auto subfolder = ApplicationDomainType::createEntity<Folder>("sink.dummy.instance1");
273 subfolder.setParent(folder.identifier());
274 VERIFYEXEC(Sink::Store::create<Folder>(subfolder));
275 VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1"));
276
277 model->fetchMore(model->index(0, 0));
278 QTRY_VERIFY(model->data(model->index(0, 0), Sink::Store::ChildrenFetchedRole).toBool());
279 QCOMPARE(model->rowCount(model->index(0, 0)), 1);
280 }
281
253 void testMailByMessageId() 282 void testMailByMessageId()
254 { 283 {
255 // Setup 284 // Setup