diff options
author | Rémi Nicole <nicole@kolabsystems.com> | 2018-06-19 11:04:17 +0200 |
---|---|---|
committer | Christian Mollekopf <chrigi_1@fastmail.fm> | 2018-06-19 11:10:47 +0200 |
commit | 077e3cb30ace5f6ee20ee15e0d32d2bfb197fde0 (patch) | |
tree | 3cfdaf0912ef22dba71755b4332354d579f6e7cf /tests/querytest.cpp | |
parent | 1ff4456e5dc2b9a9dfa80047f9e5a4a9e1395cdf (diff) | |
download | sink-077e3cb30ace5f6ee20ee15e0d32d2bfb197fde0.tar.gz sink-077e3cb30ace5f6ee20ee15e0d32d2bfb197fde0.zip |
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
Diffstat (limited to 'tests/querytest.cpp')
-rw-r--r-- | tests/querytest.cpp | 159 |
1 files changed, 158 insertions, 1 deletions
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: | |||
59 | 59 | ||
60 | Sink::QueryBase::Filter filter; | 60 | Sink::QueryBase::Filter filter; |
61 | filter.ids << "id"; | 61 | filter.ids << "id"; |
62 | filter.propertyFilter.insert("foo", QVariant::fromValue(QByteArray("bar"))); | 62 | filter.propertyFilter.insert({"foo"}, QVariant::fromValue(QByteArray("bar"))); |
63 | 63 | ||
64 | Sink::Query query; | 64 | Sink::Query query; |
65 | query.setFilter(filter); | 65 | query.setFilter(filter); |
@@ -1617,6 +1617,163 @@ private slots: | |||
1617 | QCOMPARE(model->rowCount(), 4); | 1617 | QCOMPARE(model->rowCount(), 4); |
1618 | } | 1618 | } |
1619 | } | 1619 | } |
1620 | |||
1621 | void eventsWithDates() | ||
1622 | { | ||
1623 | { | ||
1624 | Event event("sink.dummy.instance1"); | ||
1625 | event.setExtractedStartTime(QDateTime::fromString("2018-05-23T12:00:00Z", Qt::ISODate)); | ||
1626 | event.setExtractedEndTime(QDateTime::fromString("2018-05-23T13:00:00Z", Qt::ISODate)); | ||
1627 | VERIFYEXEC(Sink::Store::create<Event>(event)); | ||
1628 | } | ||
1629 | { | ||
1630 | Event event("sink.dummy.instance1"); | ||
1631 | event.setExtractedStartTime(QDateTime::fromString("2018-05-23T13:00:00Z", Qt::ISODate)); | ||
1632 | event.setExtractedEndTime(QDateTime::fromString("2018-05-23T14:00:00Z", Qt::ISODate)); | ||
1633 | VERIFYEXEC(Sink::Store::create<Event>(event)); | ||
1634 | } | ||
1635 | { | ||
1636 | Event event("sink.dummy.instance1"); | ||
1637 | event.setExtractedStartTime(QDateTime::fromString("2018-05-23T14:00:00Z", Qt::ISODate)); | ||
1638 | event.setExtractedEndTime(QDateTime::fromString("2018-05-23T15:00:00Z", Qt::ISODate)); | ||
1639 | VERIFYEXEC(Sink::Store::create<Event>(event)); | ||
1640 | } | ||
1641 | { | ||
1642 | Event event("sink.dummy.instance1"); | ||
1643 | event.setExtractedStartTime(QDateTime::fromString("2018-05-23T12:00:00Z", Qt::ISODate)); | ||
1644 | event.setExtractedEndTime(QDateTime::fromString("2018-05-23T14:00:00Z", Qt::ISODate)); | ||
1645 | VERIFYEXEC(Sink::Store::create<Event>(event)); | ||
1646 | } | ||
1647 | { | ||
1648 | Event event("sink.dummy.instance1"); | ||
1649 | event.setExtractedStartTime(QDateTime::fromString("2018-05-24T12:00:00Z", Qt::ISODate)); | ||
1650 | event.setExtractedEndTime(QDateTime::fromString("2018-05-24T14:00:00Z", Qt::ISODate)); | ||
1651 | VERIFYEXEC(Sink::Store::create<Event>(event)); | ||
1652 | } | ||
1653 | { | ||
1654 | Event event("sink.dummy.instance1"); | ||
1655 | VERIFYEXEC(Sink::Store::create<Event>(event)); | ||
1656 | } | ||
1657 | |||
1658 | VERIFYEXEC(Sink::ResourceControl::flushMessageQueue("sink.dummy.instance1")); | ||
1659 | } | ||
1660 | |||
1661 | void testOverlap() | ||
1662 | { | ||
1663 | eventsWithDates(); | ||
1664 | |||
1665 | { | ||
1666 | Sink::Query query; | ||
1667 | query.resourceFilter("sink.dummy.instance1"); | ||
1668 | query.filter<Event::StartTime, Event::EndTime>(QueryBase::Comparator( | ||
1669 | QVariantList{ QDateTime::fromString("2018-05-22T12:00:00Z", Qt::ISODate), | ||
1670 | QDateTime::fromString("2018-05-30T13:00:00Z", Qt::ISODate) }, | ||
1671 | QueryBase::Comparator::Overlap)); | ||
1672 | auto model = Sink::Store::loadModel<Event>(query); | ||
1673 | QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); | ||
1674 | QCOMPARE(model->rowCount(), 5); | ||
1675 | } | ||
1676 | |||
1677 | { | ||
1678 | Sink::Query query; | ||
1679 | query.resourceFilter("sink.dummy.instance1"); | ||
1680 | query.filter<Event::StartTime, Event::EndTime>(QueryBase::Comparator( | ||
1681 | QVariantList{ QDateTime::fromString("2018-05-22T12:30:00Z", Qt::ISODate), | ||
1682 | QDateTime::fromString("2018-05-22T12:31:00Z", Qt::ISODate) }, | ||
1683 | QueryBase::Comparator::Overlap)); | ||
1684 | auto model = Sink::Store::loadModel<Event>(query); | ||
1685 | QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); | ||
1686 | QCOMPARE(model->rowCount(), 0); | ||
1687 | } | ||
1688 | |||
1689 | { | ||
1690 | Sink::Query query; | ||
1691 | query.resourceFilter("sink.dummy.instance1"); | ||
1692 | query.filter<Event::StartTime, Event::EndTime>(QueryBase::Comparator( | ||
1693 | QVariantList{ QDateTime::fromString("2018-05-24T10:00:00Z", Qt::ISODate), | ||
1694 | QDateTime::fromString("2018-05-24T11:00:00Z", Qt::ISODate) }, | ||
1695 | QueryBase::Comparator::Overlap)); | ||
1696 | auto model = Sink::Store::loadModel<Event>(query); | ||
1697 | QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); | ||
1698 | QCOMPARE(model->rowCount(), 0); | ||
1699 | } | ||
1700 | |||
1701 | { | ||
1702 | Sink::Query query; | ||
1703 | query.resourceFilter("sink.dummy.instance1"); | ||
1704 | query.filter<Event::StartTime, Event::EndTime>(QueryBase::Comparator( | ||
1705 | QVariantList{ QDateTime::fromString("2018-05-23T12:30:00Z", Qt::ISODate), | ||
1706 | QDateTime::fromString("2018-05-23T12:31:00Z", Qt::ISODate) }, | ||
1707 | QueryBase::Comparator::Overlap)); | ||
1708 | auto model = Sink::Store::loadModel<Event>(query); | ||
1709 | QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); | ||
1710 | QCOMPARE(model->rowCount(), 2); | ||
1711 | } | ||
1712 | |||
1713 | { | ||
1714 | Sink::Query query; | ||
1715 | query.resourceFilter("sink.dummy.instance1"); | ||
1716 | query.filter<Event::StartTime, Event::EndTime>(QueryBase::Comparator( | ||
1717 | QVariantList{ QDateTime::fromString("2018-05-22T12:30:00Z", Qt::ISODate), | ||
1718 | QDateTime::fromString("2018-05-23T12:00:00Z", Qt::ISODate) }, | ||
1719 | QueryBase::Comparator::Overlap)); | ||
1720 | auto model = Sink::Store::loadModel<Event>(query); | ||
1721 | QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); | ||
1722 | QCOMPARE(model->rowCount(), 2); | ||
1723 | } | ||
1724 | |||
1725 | { | ||
1726 | Sink::Query query; | ||
1727 | query.resourceFilter("sink.dummy.instance1"); | ||
1728 | query.filter<Event::StartTime, Event::EndTime>(QueryBase::Comparator( | ||
1729 | QVariantList{ QDateTime::fromString("2018-05-23T14:30:00Z", Qt::ISODate), | ||
1730 | QDateTime::fromString("2018-05-23T16:00:00Z", Qt::ISODate) }, | ||
1731 | QueryBase::Comparator::Overlap)); | ||
1732 | auto model = Sink::Store::loadModel<Event>(query); | ||
1733 | QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); | ||
1734 | QCOMPARE(model->rowCount(), 1); | ||
1735 | } | ||
1736 | |||
1737 | } | ||
1738 | |||
1739 | void testOverlapLive() | ||
1740 | { | ||
1741 | eventsWithDates(); | ||
1742 | |||
1743 | { | ||
1744 | Sink::Query query; | ||
1745 | query.resourceFilter("sink.dummy.instance1"); | ||
1746 | query.setFlags(Query::LiveQuery); | ||
1747 | query.filter<Event::StartTime, Event::EndTime>(QueryBase::Comparator( | ||
1748 | QVariantList{ QDateTime::fromString("2018-05-22T12:00:00Z", Qt::ISODate), | ||
1749 | QDateTime::fromString("2018-05-30T13:00:00Z", Qt::ISODate) }, | ||
1750 | QueryBase::Comparator::Overlap)); | ||
1751 | auto model = Sink::Store::loadModel<Event>(query); | ||
1752 | QTRY_VERIFY(model->data(QModelIndex(), Sink::Store::ChildrenFetchedRole).toBool()); | ||
1753 | QCOMPARE(model->rowCount(), 5); | ||
1754 | |||
1755 | Event event = Event::createEntity<Event>("sink.dummy.instance1"); | ||
1756 | event.setExtractedStartTime(QDateTime::fromString("2018-05-23T12:00:00Z", Qt::ISODate)); | ||
1757 | event.setExtractedEndTime(QDateTime::fromString("2018-05-23T13:00:00Z", Qt::ISODate)); | ||
1758 | VERIFYEXEC(Sink::Store::create<Event>(event)); | ||
1759 | |||
1760 | Event event2 = Event::createEntity<Event>("sink.dummy.instance1"); | ||
1761 | event2.setExtractedStartTime(QDateTime::fromString("2018-05-33T12:00:00Z", Qt::ISODate)); | ||
1762 | event2.setExtractedEndTime(QDateTime::fromString("2018-05-33T13:00:00Z", Qt::ISODate)); | ||
1763 | VERIFYEXEC(Sink::Store::create<Event>(event2)); | ||
1764 | |||
1765 | QTest::qWait(500); | ||
1766 | QCOMPARE(model->rowCount(), 6); | ||
1767 | |||
1768 | VERIFYEXEC(Sink::Store::remove<Event>(event)); | ||
1769 | VERIFYEXEC(Sink::Store::remove<Event>(event2)); | ||
1770 | |||
1771 | QTest::qWait(500); | ||
1772 | QCOMPARE(model->rowCount(), 5); | ||
1773 | } | ||
1774 | |||
1775 | } | ||
1776 | |||
1620 | }; | 1777 | }; |
1621 | 1778 | ||
1622 | QTEST_MAIN(QueryTest) | 1779 | QTEST_MAIN(QueryTest) |