File indexing completed on 2023-12-03 10:54:09
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 #ifndef KACTIVITIES_STATS_QUERY_H 0008 #define KACTIVITIES_STATS_QUERY_H 0009 0010 #include <initializer_list> 0011 0012 #include <QString> 0013 #include <QStringList> 0014 0015 #include "kactivitiesstats_export.h" 0016 0017 #include "terms.h" 0018 0019 namespace KActivities 0020 { 0021 namespace Stats 0022 { 0023 class QueryPrivate; 0024 0025 /** 0026 * @class KActivities::Stats::Query query.h <KActivities/Stats/Query> 0027 * 0028 * The activities system tracks resources (documents, contacts, etc.) 0029 * that the user has used. It also allows linking resources to 0030 * specific activities (like bookmarks, favorites, etc.). 0031 * 0032 * The Query class specifies which resources to return - 0033 * the previously used ones, the linked ones, or to 0034 * combine these two. 0035 * 0036 * It allows filtering the results depending on the resource type, 0037 * the agent (application that reported the usage event, 0038 * see KActivities::ResourceInstance) and the activity the resource 0039 * has been used in, or linked to. It also allows filtering 0040 * on the URL of the resource. 0041 * 0042 * While it can be explicitly instantiated, a preferred approach 0043 * is to use the pipe syntax like this: 0044 * 0045 * @code 0046 * auto query = UsedResources 0047 * | RecentlyUsedFirst 0048 * | Agent::any() 0049 * | Type::any() 0050 * | Activity::current(); 0051 * @endcode 0052 */ 0053 class KACTIVITIESSTATS_EXPORT Query 0054 { 0055 public: 0056 Query(Terms::Select selection = Terms::AllResources); 0057 0058 // The damned rule of five minus one :) 0059 Query(Query &&source); 0060 Query(const Query &source); 0061 Query &operator=(Query source); 0062 ~Query(); 0063 0064 // Not all are born equal 0065 bool operator==(const Query &right) const; 0066 bool operator!=(const Query &right) const; 0067 0068 Terms::Select selection() const; 0069 QStringList types() const; 0070 QStringList agents() const; 0071 QStringList activities() const; 0072 0073 QStringList urlFilters() const; 0074 Terms::Order ordering() const; 0075 QStringList titleFilters() const; 0076 int offset() const; 0077 int limit() const; 0078 QDate dateStart() const; 0079 QDate dateEnd() const; 0080 0081 void setSelection(Terms::Select selection); 0082 0083 void addTypes(const QStringList &types); 0084 void addAgents(const QStringList &agents); 0085 void addActivities(const QStringList &activities); 0086 void addUrlFilters(const QStringList &urlFilters); 0087 void addTitleFilters(const QStringList &urlFilters); 0088 /** 0089 * @since 5.62 0090 */ 0091 void setTypes(const Terms::Type &types); 0092 /** 0093 * @since 5.62 0094 */ 0095 void setAgents(const Terms::Agent &agents); 0096 /** 0097 * @since 5.62 0098 */ 0099 void setActivities(const Terms::Activity &activities); 0100 /** 0101 * @since 5.62 0102 */ 0103 void setUrlFilters(const Terms::Url &urlFilters); 0104 void setOrdering(Terms::Order ordering); 0105 void setOffset(int offset); 0106 void setLimit(int limit); 0107 void setTitleFilters(const Terms::Title &title); 0108 /** 0109 * @since 5.62 0110 */ 0111 void setDate(const Terms::Date &date); 0112 void setDateStart(QDate date); 0113 void setDateEnd(QDate date); 0114 0115 void clearTypes(); 0116 void clearAgents(); 0117 void clearActivities(); 0118 void clearUrlFilters(); 0119 void clearTitleFilters(); 0120 0121 void removeTypes(const QStringList &types); 0122 void removeAgents(const QStringList &agents); 0123 void removeActivities(const QStringList &activities); 0124 void removeUrlFilters(const QStringList &urlFilters); 0125 0126 private: 0127 inline void addTerm(const Terms::Type &term) 0128 { 0129 addTypes(term.values); 0130 } 0131 0132 inline void addTerm(const Terms::Agent &term) 0133 { 0134 addAgents(term.values); 0135 } 0136 0137 inline void addTerm(const Terms::Activity &term) 0138 { 0139 addActivities(term.values); 0140 } 0141 0142 inline void addTerm(const Terms::Url &term) 0143 { 0144 addUrlFilters(term.values); 0145 } 0146 0147 inline void addTerm(Terms::Order ordering) 0148 { 0149 setOrdering(ordering); 0150 } 0151 0152 inline void addTerm(Terms::Select selection) 0153 { 0154 setSelection(selection); 0155 } 0156 0157 inline void addTerm(Terms::Limit limit) 0158 { 0159 setLimit(limit.value); 0160 } 0161 0162 inline void addTerm(Terms::Offset offset) 0163 { 0164 setOffset(offset.value); 0165 } 0166 0167 inline void addTerm(Terms::Date date) 0168 { 0169 setDateStart(date.start); 0170 setDateEnd(date.end); 0171 } 0172 inline void addTerm(Terms::Title title) 0173 { 0174 setTitleFilters(title); 0175 } 0176 0177 public: 0178 template<typename Term> 0179 friend inline Query operator|(const Query &query, Term &&term) 0180 { 0181 Query result(query); 0182 result.addTerm(term); 0183 return result; 0184 } 0185 0186 template<typename Term> 0187 friend inline Query operator|(Query &&query, Term &&term) 0188 { 0189 query.addTerm(term); 0190 return std::move(query); 0191 } 0192 0193 private: 0194 QueryPrivate *d; 0195 }; 0196 0197 template<typename Term> 0198 inline Query operator|(Terms::Select selection, Term &&term) 0199 { 0200 return Query(selection) | term; 0201 } 0202 0203 } // namespace Stats 0204 } // namespace KActivities 0205 0206 KACTIVITIESSTATS_EXPORT 0207 QDebug operator<<(QDebug dbg, const KActivities::Stats::Query &query); 0208 0209 #endif // KACTIVITIES_STATS_QUERY_H