From 077e3cb30ace5f6ee20ee15e0d32d2bfb197fde0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Nicole?= Date: Tue, 19 Jun 2018 11:04:17 +0200 Subject: Implement Overlap queries Summary: Notes: - Introduces the concept of queries on multiple properties (which meant changing query's internals a bit) - Dates are stored as well as the "reference" in the index to allow quick filtering without fetching the whole entity - Buckets are weeks starting on Monday (guaranteed by the use of the Julian calendar) - Some size improvements are definitely possible (dates are padded numbers again, not using integer databases, Julian calendar starts at a very old date, etc.) Test Plan: Tested in querytest Reviewers: cmollekopf Reviewed By: cmollekopf Tags: #sink Differential Revision: https://phabricator.kde.org/D13477 --- tests/querytest.cpp | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/querytest.cpp b/tests/querytest.cpp index 36b6e90..b52ba96 100644 --- a/tests/querytest.cpp +++ b/tests/querytest.cpp @@ -59,7 +59,7 @@ private slots: Sink::QueryBase::Filter filter; filter.ids << "id"; - filter.propertyFilter.insert("foo", QVariant::fromValue(QByteArray("bar"))); + filter.propertyFilter.insert({"foo"}, QVariant::fromValue(QByteArray("bar"))); Sink::Query query; query.setFilter(filter); @@ -1617,6 +1617,163 @@ private slots: QCOMPARE(model->rowCount(), 4); } } + + void eventsWithDates() + { + { + Event event("sink.dummy.instance1"); + event.setExtractedStartTime(QDateTime::fromString("2018-05-23T12:00:00Z", Qt::ISODate)); + event.setExtractedEndTime(QDateTime::fromString("2018-05-23T13:00:00Z", Qt::ISODate)); + VERIFYEXEC(Sink::Store::create(event)); + } + { + Event event("sink.dummy.instance1"); + event.setExtractedStartTime(QDateTime::fromString("2018-05-23T13:00:00Z", Qt::ISODate)); + event.setExtractedEndTime(QDateTime::fromString("2018-05-23T14:00:00Z", Qt::ISODate)); + VERIFYEXEC(Sink::Store::create(event)); + } + { + Event event("sink.dummy.instance1"); + event.setExtractedStartTime(QDateTime::fromString("2018-05-23T14:00:00Z", Qt::ISODate)); + event.setExtractedEndTime(QDateTime::fromString("2018-05-23T15:00:00Z", Qt::ISODate)); + VERIFYEXEC(Sink::Store::create(event)); + } + { + Event event("sink.dummy.instance1"); + event.setExtractedStartTime(QDateTime::fromString("2018-05-23T12:00:00Z", Qt::ISODate)); + event.setExtractedEndTime(QDateTime::fromString("2018-05-23T14:00:00Z", Qt::ISODate)); + VERIFYEXEC(Sink::Store::create(event)); + } + { + Event event("sink.dummy.instance1"); + event.setExtractedStartTime(QDateTime::fromString("2018-05-24T12:00:00Z", Qt::ISODate)); + event.setExtractedEndTime(QDateTime::fromString("2018-05-24T14:00:00Z", Qt::ISODate)); + VERIFYEXEC(Sink::Store::create(event)); + } + { + Event event("sink.dummy.instance1"); + VERIFYEXEC(Sink::Store::create(event)); + } + + VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); + } + + void testOverlap() + { + eventsWithDates(); + + { + Sink::Query query; + query.resourceFilter("sink.dummy.instance1"); + query.filter(QueryBase::Comparator( + QVariantList{ QDateTime::fromString("2018-05-22T12:00:00Z", Qt::ISODate), + QDateTime::fromString("2018-05-30T13:00:00Z", Qt::ISODate) }, + QueryBase::Comparator::Overlap)); + auto model = Sink::Store::loadModel(query); + QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(), 5); + } + + { + Sink::Query query; + query.resourceFilter("sink.dummy.instance1"); + query.filter(QueryBase::Comparator( + QVariantList{ QDateTime::fromString("2018-05-22T12:30:00Z", Qt::ISODate), + QDateTime::fromString("2018-05-22T12:31:00Z", Qt::ISODate) }, + QueryBase::Comparator::Overlap)); + auto model = Sink::Store::loadModel(query); + QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(), 0); + } + + { + Sink::Query query; + query.resourceFilter("sink.dummy.instance1"); + query.filter(QueryBase::Comparator( + QVariantList{ QDateTime::fromString("2018-05-24T10:00:00Z", Qt::ISODate), + QDateTime::fromString("2018-05-24T11:00:00Z", Qt::ISODate) }, + QueryBase::Comparator::Overlap)); + auto model = Sink::Store::loadModel(query); + QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(), 0); + } + + { + Sink::Query query; + query.resourceFilter("sink.dummy.instance1"); + query.filter(QueryBase::Comparator( + QVariantList{ QDateTime::fromString("2018-05-23T12:30:00Z", Qt::ISODate), + QDateTime::fromString("2018-05-23T12:31:00Z", Qt::ISODate) }, + QueryBase::Comparator::Overlap)); + auto model = Sink::Store::loadModel(query); + QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(), 2); + } + + { + Sink::Query query; + query.resourceFilter("sink.dummy.instance1"); + query.filter(QueryBase::Comparator( + QVariantList{ QDateTime::fromString("2018-05-22T12:30:00Z", Qt::ISODate), + QDateTime::fromString("2018-05-23T12:00:00Z", Qt::ISODate) }, + QueryBase::Comparator::Overlap)); + auto model = Sink::Store::loadModel(query); + QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(), 2); + } + + { + Sink::Query query; + query.resourceFilter("sink.dummy.instance1"); + query.filter(QueryBase::Comparator( + QVariantList{ QDateTime::fromString("2018-05-23T14:30:00Z", Qt::ISODate), + QDateTime::fromString("2018-05-23T16:00:00Z", Qt::ISODate) }, + QueryBase::Comparator::Overlap)); + auto model = Sink::Store::loadModel(query); + QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(), 1); + } + + } + + void testOverlapLive() + { + eventsWithDates(); + + { + Sink::Query query; + query.resourceFilter("sink.dummy.instance1"); + query.setFlags(Query::LiveQuery); + query.filter(QueryBase::Comparator( + QVariantList{ QDateTime::fromString("2018-05-22T12:00:00Z", Qt::ISODate), + QDateTime::fromString("2018-05-30T13:00:00Z", Qt::ISODate) }, + QueryBase::Comparator::Overlap)); + auto model = Sink::Store::loadModel(query); + QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); + QCOMPARE(model->rowCount(), 5); + + Event event = Event::createEntity("sink.dummy.instance1"); + event.setExtractedStartTime(QDateTime::fromString("2018-05-23T12:00:00Z", Qt::ISODate)); + event.setExtractedEndTime(QDateTime::fromString("2018-05-23T13:00:00Z", Qt::ISODate)); + VERIFYEXEC(Sink::Store::create(event)); + + Event event2 = Event::createEntity("sink.dummy.instance1"); + event2.setExtractedStartTime(QDateTime::fromString("2018-05-33T12:00:00Z", Qt::ISODate)); + event2.setExtractedEndTime(QDateTime::fromString("2018-05-33T13:00:00Z", Qt::ISODate)); + VERIFYEXEC(Sink::Store::create(event2)); + + QTest::qWait(500); + QCOMPARE(model->rowCount(), 6); + + VERIFYEXEC(Sink::Store::remove(event)); + VERIFYEXEC(Sink::Store::remove(event2)); + + QTest::qWait(500); + QCOMPARE(model->rowCount(), 5); + } + + } + }; QTEST_MAIN(QueryTest) -- cgit v1.2.3