File indexing completed on 2025-10-12 04:54:41

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::Offset::Offset(int value)
0065     : value(value)
0066 {
0067 }
0068 
0069 Terms::Date::Date(QDate value)
0070     : start(std::move(value))
0071 {
0072 }
0073 
0074 Terms::Date::Date(QDate start, QDate end)
0075     : start(std::move(start))
0076     , end(std::move(end))
0077 {
0078 }
0079 
0080 Terms::Date Terms::Date::today()
0081 {
0082     return Date(QDate::currentDate());
0083 }
0084 
0085 Terms::Date Terms::Date::yesterday()
0086 {
0087     auto date = QDate::currentDate();
0088     return Date(date.addDays(-1));
0089 }
0090 
0091 Terms::Date Terms::Date::currentWeek()
0092 {
0093     auto start = QDate::currentDate();
0094     auto end = start.addDays(-7);
0095     return Date(start, end);
0096 }
0097 
0098 Terms::Date Terms::Date::previousWeek()
0099 {
0100     auto start = QDate::currentDate().addDays(-7);
0101     auto end = start.addDays(-7);
0102     return Date(start, end);
0103 }
0104 
0105 Terms::Date Terms::Date::fromString(QString string)
0106 {
0107     auto splitted = string.split(QStringLiteral(","));
0108     if (splitted.count() == 2) {
0109         // date range case
0110         auto start = QDate::fromString(splitted[0], Qt::ISODate);
0111         auto end = QDate::fromString(splitted[1], Qt::ISODate);
0112         return Date(start, end);
0113     } else {
0114         auto date = QDate::fromString(string, Qt::ISODate);
0115         return Date(date);
0116     }
0117 }
0118 
0119 Terms::Url Terms::Url::startsWith(const QString &prefix)
0120 {
0121     return Url(prefix + QStringLiteral("*"));
0122 }
0123 
0124 Terms::Url Terms::Url::contains(const QString &infix)
0125 {
0126     return Url(QStringLiteral("*") + infix + QStringLiteral("*"));
0127 }
0128 
0129 } // namespace Stats
0130 } // namespace KActivities
0131 
0132 namespace KAStats = KActivities::Stats;
0133 
0134 #define QDEBUG_TERM_OUT(TYPE, OUT)                                                                                                                             \
0135     QDebug operator<<(QDebug dbg, const KAStats::Terms::TYPE &_)                                                                                               \
0136     {                                                                                                                                                          \
0137         using namespace KAStats::Terms;                                                                                                                        \
0138         dbg.nospace() << #TYPE << ": " << (OUT);                                                                                                               \
0139         return dbg;                                                                                                                                            \
0140     }
0141 
0142 QDEBUG_TERM_OUT(Order,
0143                 _ == HighScoredFirst            ? "HighScore"
0144                     : _ == RecentlyUsedFirst    ? "RecentlyUsed"
0145                     : _ == RecentlyCreatedFirst ? "RecentlyCreated"
0146                                                 : "Alphabetical")
0147 
0148 QDEBUG_TERM_OUT(Select, _ == LinkedResources ? "LinkedResources" : _ == UsedResources ? "UsedResources" : "AllResources")
0149 
0150 QDEBUG_TERM_OUT(Type, _.values)
0151 QDEBUG_TERM_OUT(Agent, _.values)
0152 QDEBUG_TERM_OUT(Activity, _.values)
0153 QDEBUG_TERM_OUT(Url, _.values)
0154 
0155 QDEBUG_TERM_OUT(Limit, _.value)
0156 QDEBUG_TERM_OUT(Offset, _.value)
0157 QDEBUG_TERM_OUT(Date, _.end.isNull() ? _.start.toString(Qt::ISODate) : _.start.toString(Qt::ISODate) + QStringLiteral(",") + _.end.toString(Qt::ISODate))
0158 
0159 #undef QDEBUG_TERM_OUT