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