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

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