diff --git a/autotests/QueryTest.h b/autotests/QueryTest.h --- a/autotests/QueryTest.h +++ b/autotests/QueryTest.h @@ -50,6 +50,7 @@ void testFancySyntaxTypeDefinition(); void testFancySyntaxActivityDefinition(); void testFancySyntaxOrderingDefinition(); + void tesDateSyntaxOrderingDefinition(); void cleanupTestCase(); diff --git a/autotests/QueryTest.cpp b/autotests/QueryTest.cpp --- a/autotests/QueryTest.cpp +++ b/autotests/QueryTest.cpp @@ -297,6 +297,24 @@ } } +void QueryTest::tesDateSyntaxOrderingDefinition() +{ + TEST_CHUNK(QStringLiteral("Testing the Date definition")) + { + auto query = Date::today(); + QCOMPARE(query.value, QDate::currentDate()); + } + { + auto query = Date::yesterday(); + QDate date = QDate::currentDate(); + QCOMPARE(query.value, date.addDays(-1)); + } + { + auto query = Date(QDate::fromString(QStringLiteral("2019-07-25"))); + QCOMPARE(query.value, QDate::fromString(QStringLiteral("2019-07-25"))); + } +} + void QueryTest::initTestCase() { // CHECK_CONDITION(isActivityManagerRunning, FailIfTrue); diff --git a/src/query.h b/src/query.h --- a/src/query.h +++ b/src/query.h @@ -89,6 +89,7 @@ Terms::Order ordering() const; int offset() const; int limit() const; + QDate date() const; void setSelection(Terms::Select selection); @@ -99,6 +100,7 @@ void setOrdering(Terms::Order ordering); void setOffset(int offset); void setLimit(int limit); + void setDate(QDate date); void clearTypes(); void clearAgents(); @@ -151,6 +153,11 @@ setOffset(offset.value); } + inline void addTerm(Terms::Date date) + { + setDate(date.value); + } + public: template diff --git a/src/query.cpp b/src/query.cpp --- a/src/query.cpp +++ b/src/query.cpp @@ -20,6 +20,7 @@ */ #include "query.h" +#include #include namespace KActivities { @@ -71,6 +72,7 @@ QStringList activities; QStringList urlFilters; Terms::Order ordering; + QDate date; int limit; int offset; }; @@ -111,7 +113,8 @@ agents() == right.agents() && activities() == right.activities() && selection() == right.selection() && - urlFilters() == right.urlFilters(); + urlFilters() == right.urlFilters() && + date() == right.date(); } bool Query::operator!= (const Query &right) const @@ -163,6 +166,11 @@ d->offset = offset; } +void Query::setDate(QDate date) +{ + d->date = date; +} + Terms::Order Query::ordering() const { return d->ordering; @@ -184,6 +192,11 @@ return d->offset; } +QDate Query::date() const +{ + return d->date; +} + } // namespace Stats } // namespace KActivities @@ -200,6 +213,7 @@ << ", " << Agent(query.agents()) << ", " << Activity(query.activities()) << ", " << Url(query.urlFilters()) + << ", " << Date(query.date()) << ", " << query.ordering() << ", Limit: " << query.limit() << " }"; diff --git a/src/resultset.cpp b/src/resultset.cpp --- a/src/resultset.cpp +++ b/src/resultset.cpp @@ -179,6 +179,12 @@ return QStringLiteral("mimetype LIKE '") + Common::starPatternToLike(mimetype) + QStringLiteral("' ESCAPE '\\'"); } + QString dateClause(const QDate &date) const { + return date.isNull() ? QStringLiteral("1") : + QStringLiteral("DATE(start, 'unixepoch') = '") + + date.toString(Qt::ISODate) + QStringLiteral("' "); + } + /** * Transforms the input list's elements with the f member method, * and returns the resulting list @@ -226,7 +232,6 @@ : QString() ); - // WHERE clause for filtering on agents QStringList agentsFilter = transformedList( queryDefinition.agents(), &ResultSetPrivate::agentClause); @@ -243,6 +248,9 @@ QStringList mimetypeFilter = transformedList( queryDefinition.types(), &ResultSetPrivate::mimetypeClause); + // WHERE clause for access date filtering + QString dateColumn = dateClause(queryDefinition.date()); + auto queryString = _query; queryString.replace(QStringLiteral("ORDER_BY_CLAUSE"), QStringLiteral("ORDER BY $orderingColumn resource ASC")) @@ -255,6 +263,7 @@ .replace(QLatin1String("$activitiesFilter"), activitiesFilter.join(QStringLiteral(" OR "))) .replace(QLatin1String("$urlFilter"), urlFilter.join(QStringLiteral(" OR "))) .replace(QLatin1String("$mimetypeFilter"), mimetypeFilter.join(QStringLiteral(" OR "))) + .replace(QLatin1String("$dateFilter"), dateColumn) ); } @@ -286,12 +295,18 @@ LEFT JOIN ResourceInfo ri ON rl.targettedResource = ri.targettedResource + LEFT JOIN + ResourceEvent re + ON rl.targettedResource = re.targettedResource + AND rl.usedActivity = re.usedActivity + AND rl.initiatingAgent = re.initiatingAgent WHERE ($agentsFilter) AND ($activitiesFilter) AND ($urlFilter) AND ($mimetypeFilter) + AND ($dateFilter) GROUP BY resource, title @@ -325,12 +340,18 @@ LEFT JOIN ResourceInfo ri ON rsc.targettedResource = ri.targettedResource + LEFT JOIN + ResourceEvent re + ON rsc.targettedResource = re.targettedResource + AND rsc.usedActivity = re.usedActivity + AND rsc.initiatingAgent = re.initiatingAgent WHERE ($agentsFilter) AND ($activitiesFilter) AND ($urlFilter) AND ($mimetypeFilter) + AND ($dateFilter) GROUP BY resource, title @@ -367,12 +388,18 @@ ON rl.targettedResource = rsc.targettedResource AND rl.usedActivity = rsc.usedActivity AND rl.initiatingAgent = rsc.initiatingAgent + LEFT JOIN + ResourceEvent re + ON rl.targettedResource = re.targettedResource + AND rl.usedActivity = re.usedActivity + AND rl.initiatingAgent = re.initiatingAgent WHERE ($agentsFilter) AND ($activitiesFilter) AND ($urlFilter) AND ($mimetypeFilter) + AND ($dateFilter) ), UsedResourcesResults AS ( @@ -386,12 +413,18 @@ FROM ResourceScoreCache rsc + LEFT JOIN + ResourceEvent re + ON re.targettedResource = rsc.targettedResource + AND re.usedActivity = rsc.usedActivity + AND re.initiatingAgent = rsc.initiatingAgent WHERE ($agentsFilter) AND ($activitiesFilter) AND ($urlFilter) AND ($mimetypeFilter) + AND ($dateFilter) ), CollectedResults AS ( diff --git a/src/terms.h b/src/terms.h --- a/src/terms.h +++ b/src/terms.h @@ -31,6 +31,7 @@ #include #include +#include #include "kactivitiesstats_export.h" @@ -202,6 +203,17 @@ const QStringList values; }; + + /** + * On which start access date do you want to filter ? + */ + struct KACTIVITIESSTATS_EXPORT Date { + Date(QDate value); + static Date today(); + static Date yesterday(); + QDate value; + }; + } // namespace Terms } // namespace Stats @@ -231,5 +243,8 @@ KACTIVITIESSTATS_EXPORT QDebug operator<<(QDebug dbg, const KActivities::Stats::Terms::Offset &offset); +KACTIVITIESSTATS_EXPORT +QDebug operator<<(QDebug dbg, const KActivities::Stats::Terms::Date &date); + #endif // KACTIVITIES_STATS_TERMS_H diff --git a/src/terms.cpp b/src/terms.cpp --- a/src/terms.cpp +++ b/src/terms.cpp @@ -76,6 +76,22 @@ { } +Terms::Date::Date(QDate value) + : value(value) +{ +} + +Terms::Date Terms::Date::today() +{ + return Date(QDate::currentDate()); +} + +Terms::Date Terms::Date::yesterday() +{ + auto date = QDate::currentDate(); + return Date(date.addDays(-1)); +} + Terms::Url Terms::Url::startsWith(const QString &prefix) { return Url(prefix + QStringLiteral("*")); @@ -115,6 +131,7 @@ QDEBUG_TERM_OUT(Limit, _.value) QDEBUG_TERM_OUT(Offset, _.value) +QDEBUG_TERM_OUT(Date, _.value) #undef QDEBUG_TERM_OUT diff --git a/tests/model/window.cpp b/tests/model/window.cpp --- a/tests/model/window.cpp +++ b/tests/model/window.cpp @@ -323,6 +323,8 @@ { qDebug() << "Updating the results"; + QString textDate = ui->textDate->text(); + setQuery( // What should we get ( @@ -352,6 +354,13 @@ // And URL filters Url(ui->textUrl->text().split(QLatin1Char(','), QString::SkipEmptyParts)) | + // And date filter + ( + textDate == QStringLiteral("today") ? Date::today() : + textDate == QStringLiteral("yesterday") ? Date::yesterday() : + Date(QDate::fromString(textDate, Qt::ISODate)) + ) | + // And how many items Limit(ui->spinLimitCount->value()) ); diff --git a/tests/model/window.ui b/tests/model/window.ui --- a/tests/model/window.ui +++ b/tests/model/window.ui @@ -259,30 +259,40 @@ + + + + Url + + + + + + + + + Date + + + + + + + Count - + 10 - - - - Url - - - - - -