From 1259b236704e790fa1284a63ec537525bce23841 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sat, 11 Feb 2017 12:02:58 +0100 Subject: Fixed reduction updates with stateful query. Some filters need to maintain state between runs in order to be able to emit only what has changed. This now also make reduction work for live queries. --- tests/querytest.cpp | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/querytest.cpp b/tests/querytest.cpp index 0641c0d..328448f 100644 --- a/tests/querytest.cpp +++ b/tests/querytest.cpp @@ -731,7 +731,7 @@ private slots: Query query; query.setId("testLivequeryUnmatch"); query.filter(folder1); - query.reduce(Query::Reduce::Selector::max()).count("count").collect("senders"); + query.reduce(Query::Reduce::Selector::max()).count("count").collect("folders"); query.sort(); query.setFlags(Query::LiveQuery); query.request(); @@ -747,7 +747,61 @@ private slots: VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); QTRY_COMPARE(model->rowCount(), 1); auto mail = model->data(model->index(0, 0, QModelIndex{}), Sink::Store::DomainObjectRole).value(); - QCOMPARE(mail->getUnread(), true); + QTRY_COMPARE(mail->getUnread(), true); + QCOMPARE(mail->getProperty("count").toInt(), 1); + QCOMPARE(mail->getProperty("folders").toList().size(), 1); + } + + void testReductionUpdate() + { + // Setup + auto folder1 = Folder::createEntity("sink.dummy.instance1"); + VERIFYEXEC(Sink::Store::create(folder1)); + + auto folder2 = Folder::createEntity("sink.dummy.instance1"); + VERIFYEXEC(Sink::Store::create(folder2)); + + QDateTime now{QDate{2017, 2, 3}, QTime{10, 0, 0}}; + QDateTime later{QDate{2017, 2, 3}, QTime{11, 0, 0}}; + + auto mail1 = Mail::createEntity("sink.dummy.instance1"); + mail1.setExtractedMessageId("mail1"); + mail1.setFolder(folder1); + mail1.setUnread(false); + mail1.setExtractedDate(now); + VERIFYEXEC(Sink::Store::create(mail1)); + + // Ensure all local data is processed + VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); + + Query query; + query.setId("testLivequeryUnmatch"); + query.setFlags(Query::LiveQuery); + query.filter(folder1); + query.reduce(Query::Reduce::Selector::max()).count("count").collect("folders"); + query.sort(); + query.request(); + query.request(); + + auto model = Sink::Store::loadModel(query); + QTRY_COMPARE(model->rowCount(), 1); + + //The leader should change to mail2 after the modification + { + auto mail2 = Mail::createEntity("sink.dummy.instance1"); + mail2.setExtractedMessageId("mail2"); + mail2.setFolder(folder1); + mail2.setUnread(false); + mail2.setExtractedDate(later); + VERIFYEXEC(Sink::Store::create(mail2)); + } + + VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); + QTRY_COMPARE(model->rowCount(), 1); + auto mail = model->data(model->index(0, 0, QModelIndex{}), Sink::Store::DomainObjectRole).value(); + QTRY_COMPARE(mail->getMessageId(), QByteArray{"mail2"}); + QCOMPARE(mail->getProperty("count").toInt(), 2); + QCOMPARE(mail->getProperty("folders").toList().size(), 2); } void testBloom() -- cgit v1.2.3