File indexing completed on 2023-12-03 07:39:34
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 int offset() const; 0076 int limit() const; 0077 QDate dateStart() const; 0078 QDate dateEnd() const; 0079 0080 void setSelection(Terms::Select selection); 0081 0082 void addTypes(const QStringList &types); 0083 void addAgents(const QStringList &agents); 0084 void addActivities(const QStringList &activities); 0085 void addUrlFilters(const QStringList &urlFilters); 0086 /** 0087 * @since 5.62 0088 */ 0089 void setTypes(const Terms::Type &types); 0090 /** 0091 * @since 5.62 0092 */ 0093 void setAgents(const Terms::Agent &agents); 0094 /** 0095 * @since 5.62 0096 */ 0097 void setActivities(const Terms::Activity &activities); 0098 /** 0099 * @since 5.62 0100 */ 0101 void setUrlFilters(const Terms::Url &urlFilters); 0102 void setOrdering(Terms::Order ordering); 0103 void setOffset(int offset); 0104 void setLimit(int limit); 0105 /** 0106 * @since 5.62 0107 */ 0108 void setDate(const Terms::Date &date); 0109 void setDateStart(QDate date); 0110 void setDateEnd(QDate date); 0111 0112 void clearTypes(); 0113 void clearAgents(); 0114 void clearActivities(); 0115 void clearUrlFilters(); 0116 0117 void removeTypes(const QStringList &types); 0118 void removeAgents(const QStringList &agents); 0119 void removeActivities(const QStringList &activities); 0120 void removeUrlFilters(const QStringList &urlFilters); 0121 0122 private: 0123 inline void addTerm(const Terms::Type &term) 0124 { 0125 addTypes(term.values); 0126 } 0127 0128 inline void addTerm(const Terms::Agent &term) 0129 { 0130 addAgents(term.values); 0131 } 0132 0133 inline void addTerm(const Terms::Activity &term) 0134 { 0135 addActivities(term.values); 0136 } 0137 0138 inline void addTerm(const Terms::Url &term) 0139 { 0140 addUrlFilters(term.values); 0141 } 0142 0143 inline void addTerm(Terms::Order ordering) 0144 { 0145 setOrdering(ordering); 0146 } 0147 0148 inline void addTerm(Terms::Select selection) 0149 { 0150 setSelection(selection); 0151 } 0152 0153 inline void addTerm(Terms::Limit limit) 0154 { 0155 setLimit(limit.value); 0156 } 0157 0158 inline void addTerm(Terms::Offset offset) 0159 { 0160 setOffset(offset.value); 0161 } 0162 0163 inline void addTerm(Terms::Date date) 0164 { 0165 setDateStart(date.start); 0166 setDateEnd(date.end); 0167 } 0168 0169 public: 0170 template<typename Term> 0171 friend inline Query operator|(const Query &query, Term &&term) 0172 { 0173 Query result(query); 0174 result.addTerm(term); 0175 return result; 0176 } 0177 0178 template<typename Term> 0179 friend inline Query operator|(Query &&query, Term &&term) 0180 { 0181 query.addTerm(term); 0182 return std::move(query); 0183 } 0184 0185 private: 0186 QueryPrivate *d; 0187 }; 0188 0189 template<typename Term> 0190 inline Query operator|(Terms::Select selection, Term &&term) 0191 { 0192 return Query(selection) | term; 0193 } 0194 0195 } // namespace Stats 0196 } // namespace KActivities 0197 0198 KACTIVITIESSTATS_EXPORT 0199 QDebug operator<<(QDebug dbg, const KActivities::Stats::Query &query); 0200 0201 #endif // KACTIVITIES_STATS_QUERY_H