File indexing completed on 2024-05-19 16:38:21

0001 /*
0002     SPDX-FileCopyrightText: 2015, 2016 Ivan Cukic <ivan.cukic(at)kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "terms.h"
0008 #include "common/specialvalues.h"
0009 
0010 #include <QDebug>
0011 
0012 namespace KActivities
0013 {
0014 namespace Stats
0015 {
0016 // Term classes
0017 #define IMPLEMENT_TERM_CONSTRUCTORS(TYPE)                                                                                                                      \
0018     Terms::TYPE::TYPE(QStringList values)                                                                                                                      \
0019         : values(std::move(values))                                                                                                                            \
0020     {                                                                                                                                                          \
0021     }                                                                                                                                                          \
0022                                                                                                                                                                \
0023     Terms::TYPE::TYPE(QString value)                                                                                                                           \
0024         : values(QStringList() << std::move(value))                                                                                                            \
0025     {                                                                                                                                                          \
0026     }
0027 
0028 #define IMPLEMENT_SPECIAL_TERM_VALUE(TYPE, VALUE_NAME, VALUE)                                                                                                  \
0029     Terms::TYPE Terms::TYPE::VALUE_NAME()                                                                                                                      \
0030     {                                                                                                                                                          \
0031         return Terms::TYPE(VALUE);                                                                                                                             \
0032     }
0033 
0034 IMPLEMENT_TERM_CONSTRUCTORS(Type)
0035 IMPLEMENT_SPECIAL_TERM_VALUE(Type, any, ANY_TYPE_TAG)
0036 IMPLEMENT_SPECIAL_TERM_VALUE(Type, files, FILES_TYPE_TAG)
0037 IMPLEMENT_SPECIAL_TERM_VALUE(Type, directories, DIRECTORIES_TYPE_TAG)
0038 
0039 IMPLEMENT_TERM_CONSTRUCTORS(Agent)
0040 IMPLEMENT_SPECIAL_TERM_VALUE(Agent, any, ANY_AGENT_TAG)
0041 IMPLEMENT_SPECIAL_TERM_VALUE(Agent, global, GLOBAL_AGENT_TAG)
0042 IMPLEMENT_SPECIAL_TERM_VALUE(Agent, current, CURRENT_AGENT_TAG)
0043 
0044 IMPLEMENT_TERM_CONSTRUCTORS(Activity)
0045 IMPLEMENT_SPECIAL_TERM_VALUE(Activity, any, ANY_ACTIVITY_TAG)
0046 IMPLEMENT_SPECIAL_TERM_VALUE(Activity, global, GLOBAL_ACTIVITY_TAG)
0047 IMPLEMENT_SPECIAL_TERM_VALUE(Activity, current, CURRENT_ACTIVITY_TAG)
0048 
0049 IMPLEMENT_TERM_CONSTRUCTORS(Url)
0050 IMPLEMENT_SPECIAL_TERM_VALUE(Url, localFile, QStringLiteral("/*"))
0051 IMPLEMENT_SPECIAL_TERM_VALUE(Url,
0052                              file,
0053                              QStringList() << QStringLiteral("/*") << QStringLiteral("smb:*") << QStringLiteral("fish:*") << QStringLiteral("sftp:*")
0054                                            << QStringLiteral("ftp:*"))
0055 
0056 #undef IMPLEMENT_TERM_CONSTRUCTORS
0057 #undef IMPLEMENT_SPECIAL_TERM_VALUE
0058 
0059 Terms::Limit::Limit(int value)
0060     : value(value)
0061 {
0062 }
0063 
0064 Terms::Limit Terms::Limit::all()
0065 {
0066     return Limit(0);
0067 }
0068 
0069 Terms::Offset::Offset(int value)
0070     : value(value)
0071 {
0072 }
0073 
0074 Terms::Date::Date(QDate value)
0075     : start(std::move(value))
0076 {
0077 }
0078 
0079 Terms::Date::Date(QDate start, QDate end)
0080     : start(std::move(start))
0081     , end(std::move(end))
0082 {
0083 }
0084 
0085 Terms::Date Terms::Date::today()
0086 {
0087     return Date(QDate::currentDate());
0088 }
0089 
0090 Terms::Date Terms::Date::yesterday()
0091 {
0092     auto date = QDate::currentDate();
0093     return Date(date.addDays(-1));
0094 }
0095 
0096 Terms::Date Terms::Date::currentWeek()
0097 {
0098     auto start = QDate::currentDate();
0099     auto end = start.addDays(-7);
0100     return Date(start, end);
0101 }
0102 
0103 Terms::Date Terms::Date::previousWeek()
0104 {
0105     auto start = QDate::currentDate().addDays(-7);
0106     auto end = start.addDays(-7);
0107     return Date(start, end);
0108 }
0109 
0110 Terms::Date Terms::Date::fromString(QString string)
0111 {
0112     auto splitted = string.split(QStringLiteral(","));
0113     if (splitted.count() == 2) {
0114         // date range case
0115         auto start = QDate::fromString(splitted[0], Qt::ISODate);
0116         auto end = QDate::fromString(splitted[1], Qt::ISODate);
0117         return Date(start, end);
0118     } else {
0119         auto date = QDate::fromString(string, Qt::ISODate);
0120         return Date(date);
0121     }
0122 }
0123 
0124 Terms::Url Terms::Url::startsWith(const QString &prefix)
0125 {
0126     return Url(prefix + QStringLiteral("*"));
0127 }
0128 
0129 Terms::Url Terms::Url::contains(const QString &infix)
0130 {
0131     return Url(QStringLiteral("*") + infix + QStringLiteral("*"));
0132 }
0133 
0134 } // namespace Stats
0135 } // namespace KActivities
0136 
0137 namespace KAStats = KActivities::Stats;
0138 
0139 #define QDEBUG_TERM_OUT(TYPE, OUT)                                                                                                                             \
0140     QDebug operator<<(QDebug dbg, const KAStats::Terms::TYPE &_)                                                                                               \
0141     {                                                                                                                                                          \
0142         using namespace KAStats::Terms;                                                                                                                        \
0143         dbg.nospace() << #TYPE << ": " << (OUT);                                                                                                               \
0144         return dbg;                                                                                                                                            \
0145     }
0146 
0147 QDEBUG_TERM_OUT(Order,
0148                 _ == HighScoredFirst            ? "HighScore"
0149                     : _ == RecentlyUsedFirst    ? "RecentlyUsed"
0150                     : _ == RecentlyCreatedFirst ? "RecentlyCreated"
0151                                                 : "Alphabetical")
0152 
0153 QDEBUG_TERM_OUT(Select, _ == LinkedResources ? "LinkedResources" : _ == UsedResources ? "UsedResources" : "AllResources")
0154 
0155 QDEBUG_TERM_OUT(Type, _.values)
0156 QDEBUG_TERM_OUT(Agent, _.values)
0157 QDEBUG_TERM_OUT(Activity, _.values)
0158 QDEBUG_TERM_OUT(Url, _.values)
0159 
0160 QDEBUG_TERM_OUT(Limit, _.value)
0161 QDEBUG_TERM_OUT(Offset, _.value)
0162 QDEBUG_TERM_OUT(Date, _.end.isNull() ? _.start.toString(Qt::ISODate) : _.start.toString(Qt::ISODate) + QStringLiteral(",") + _.end.toString(Qt::ISODate))
0163 
0164 #undef QDEBUG_TERM_OUT