diff --git a/autotests/QueryTest.cpp b/autotests/QueryTest.cpp --- a/autotests/QueryTest.cpp +++ b/autotests/QueryTest.cpp @@ -302,16 +302,21 @@ TEST_CHUNK(QStringLiteral("Testing the Date definition")) { auto query = Date::today(); - QCOMPARE(query.value, QDate::currentDate()); + QCOMPARE(query.start, QDate::currentDate()); } { auto query = Date::yesterday(); QDate date = QDate::currentDate(); - QCOMPARE(query.value, date.addDays(-1)); + QCOMPARE(query.start, date.addDays(-1)); } { auto query = Date(QDate::fromString(QStringLiteral("2019-07-25"))); - QCOMPARE(query.value, QDate::fromString(QStringLiteral("2019-07-25"))); + QCOMPARE(query.start, QDate::fromString(QStringLiteral("2019-07-25"))); + } + { + auto query = Date(QDate::fromString(QStringLiteral("2019-07-24,2019-07-25"))); + QCOMPARE(query.start, QDate::fromString(QStringLiteral("2019-07-24"))); + QCOMPARE(query.end, QDate::fromString(QStringLiteral("2019-07-25"))); } } diff --git a/autotests/ResultSetTest.cpp b/autotests/ResultSetTest.cpp --- a/autotests/ResultSetTest.cpp +++ b/autotests/ResultSetTest.cpp @@ -158,6 +158,19 @@ QCOMPARE(result.at(0).resource(), QStringLiteral("/path/high1_act1_gvim")); } + + TEST_CHUNK(QStringLiteral("Getting the used resources filter by Date range")) + { + ResultSet result(UsedResources + | HighScoredFirst + | Agent::any() + | Activity::any() + | Date::fromString(QStringLiteral("2015-01-14,2015-01-15")) + ); + + QCOMPARE(result.at(0).resource(), QStringLiteral("/path/high1_act1_gvim")); + QCOMPARE(result.at(1).resource(), QStringLiteral("/path/high2_act2_kate")); + } } void ResultSetTest::initTestCase() @@ -208,12 +221,17 @@ database->execQuery( QStringLiteral("INSERT INTO ResourceEvent (usedActivity, initiatingAgent, targettedResource, start, end ) VALUES" - "('activity1' , 'gvim' , '/path/high1_act1_gvim' , '1421345799', '1421345799')") + // 15 january 2015 + " ('activity1' , 'gvim' , '/path/high1_act1_gvim' , '1421345799', '1421345799')" + // 14 january 2015 + " , ('activity2' , 'kate' , '/path/high2_act2_kate' , '1421259377', '1421259377')" + ) ); database->execQuery( QStringLiteral("INSERT INTO ResourceInfo (targettedResource, title, mimetype, autoTitle, autoMimetype) VALUES" - "('/path/high1_act1_gvim', 'high1_act1_gvim', 'text/plain', 1, 1 )") + "('/path/high1_act1_gvim', 'high1_act1_gvim', 'text/plain', 1, 1 ) ," + "('/path/high2_act2_kate', 'high2_act2_kate', 'text/plain', 1, 1 )") ); // Renaming the activity1 to the current acitivty diff --git a/src/query.h b/src/query.h --- a/src/query.h +++ b/src/query.h @@ -89,7 +89,8 @@ Terms::Order ordering() const; int offset() const; int limit() const; - QDate date() const; + QDate dateStart() const; + QDate dateEnd() const; void setSelection(Terms::Select selection); @@ -100,7 +101,8 @@ void setOrdering(Terms::Order ordering); void setOffset(int offset); void setLimit(int limit); - void setDate(QDate date); + void setDateStart(QDate date); + void setDateEnd(QDate date); void clearTypes(); void clearAgents(); @@ -155,7 +157,8 @@ inline void addTerm(Terms::Date date) { - setDate(date.value); + setDateStart(date.start); + setDateEnd(date.end); } public: @@ -174,7 +177,7 @@ inline Query operator| (Query &&query, Term &&term) { query.addTerm(term); - return query; + return std::move(query); } private: diff --git a/src/query.cpp b/src/query.cpp --- a/src/query.cpp +++ b/src/query.cpp @@ -72,7 +72,7 @@ QStringList activities; QStringList urlFilters; Terms::Order ordering; - QDate date; + QDate start, end; int limit; int offset; }; @@ -114,7 +114,8 @@ activities() == right.activities() && selection() == right.selection() && urlFilters() == right.urlFilters() && - date() == right.date(); + dateStart() == right.dateStart() && + dateEnd() == right.dateEnd(); } bool Query::operator!= (const Query &right) const @@ -166,9 +167,14 @@ d->offset = offset; } -void Query::setDate(QDate date) +void Query::setDateStart(QDate start) { - d->date = date; + d->start = start; +} + +void Query::setDateEnd(QDate end) +{ + d->end = end; } Terms::Order Query::ordering() const @@ -192,9 +198,14 @@ return d->offset; } -QDate Query::date() const +QDate Query::dateStart() const +{ + return d->start; +} + +QDate Query::dateEnd() const { - return d->date; + return d->end; } } // namespace Stats @@ -213,7 +224,7 @@ << ", " << Agent(query.agents()) << ", " << Activity(query.activities()) << ", " << Url(query.urlFilters()) - << ", " << Date(query.date()) + << ", " << Date(query.dateStart(), query.dateEnd()) << ", " << query.ordering() << ", Limit: " << query.limit() << " }"; diff --git a/src/resultset.cpp b/src/resultset.cpp --- a/src/resultset.cpp +++ b/src/resultset.cpp @@ -179,9 +179,17 @@ return QStringLiteral("mimetype LIKE '") + Common::starPatternToLike(mimetype) + QStringLiteral("' ESCAPE '\\'"); } - QString dateClause(QDate date) const { - return QStringLiteral("DATE(re.start, 'unixepoch') = '") + - date.toString(Qt::ISODate) + QStringLiteral("' "); + QString dateClause(QDate start, QDate end) const { + if (end.isNull()) { + // only date filtering + return QStringLiteral("DATE(re.start, 'unixepoch') = '") + + start.toString(Qt::ISODate) + QStringLiteral("' "); + } else { + // date range filtering + return QStringLiteral("DATE(re.start, 'unixepoch') >= '") + + start.toString(Qt::ISODate) + QStringLiteral("' AND DATE(re.start, 'unixepoch') <= '") + + end.toString(Qt::ISODate) + QStringLiteral("' "); + } } QString resourceEventJoinClause() const { @@ -259,8 +267,8 @@ QString dateColumn = QStringLiteral("1"), resourceEventJoin; // WHERE clause for access date filtering and ResourceEvent table Join - if (!queryDefinition.date().isNull()) { - dateColumn = dateClause(queryDefinition.date()); + if (!queryDefinition.dateStart().isNull()) { + dateColumn = dateClause(queryDefinition.dateStart(), queryDefinition.dateEnd()); resourceEventJoin = resourceEventJoinClause(); } diff --git a/src/terms.h b/src/terms.h --- a/src/terms.h +++ b/src/terms.h @@ -209,10 +209,15 @@ */ struct KACTIVITIESSTATS_EXPORT Date { Date(QDate value); + Date(QDate start, QDate end); + static Date today(); static Date yesterday(); + static Date currentWeek(); + static Date previousWeek(); static Date fromString(QString); - QDate value; + + QDate start, end; }; } // namespace Terms diff --git a/src/terms.cpp b/src/terms.cpp --- a/src/terms.cpp +++ b/src/terms.cpp @@ -77,7 +77,12 @@ } Terms::Date::Date(QDate value) - : value(value) + : start(value) +{ +} + +Terms::Date::Date(QDate start, QDate end) + : start(start), end(end) { } @@ -92,10 +97,32 @@ return Date(date.addDays(-1)); } +Terms::Date Terms::Date::currentWeek() +{ + auto start = QDate::currentDate(); + auto end = start.addDays(-7); + return Date(start, end); +} + +Terms::Date Terms::Date::previousWeek() +{ + auto start = QDate::currentDate().addDays(-7); + auto end = start.addDays(-7); + return Date(start, end); +} + Terms::Date Terms::Date::fromString(QString string) { - auto date = QDate::fromString(string, Qt::ISODate); - return Date(date); + auto splitted = string.split(QStringLiteral(",")); + if (splitted.count() == 2) { + // date range case + auto start = QDate::fromString(splitted[0], Qt::ISODate); + auto end = QDate::fromString(splitted[1], Qt::ISODate); + return Date(start, end); + } else { + auto date = QDate::fromString(string, Qt::ISODate); + return Date(date); + } } Terms::Url Terms::Url::startsWith(const QString &prefix) @@ -137,7 +164,8 @@ QDEBUG_TERM_OUT(Limit, _.value) QDEBUG_TERM_OUT(Offset, _.value) -QDEBUG_TERM_OUT(Date, _.value) +QDEBUG_TERM_OUT(Date, _.end.isNull() ? _.start.toString(Qt::ISODate) : + _.start.toString(Qt::ISODate) + QStringLiteral(",") + _.end.toString(Qt::ISODate)) #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 @@ -358,7 +358,7 @@ ( textDate == QStringLiteral("today") ? Date::today() : textDate == QStringLiteral("yesterday") ? Date::yesterday() : - Date(QDate::fromString(textDate, Qt::ISODate)) + Date::fromString(textDate) ) | // And how many items