File indexing completed on 2024-05-12 05:22:22

0001 /*
0002  * SPDX-FileCopyrightText: 2014 Daniel Vrátil <dvratil@redhat.com>
0003  * SPDX-FileCopyrightText: 2019 David Barchiesi <david@barchie.si>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006  */
0007 
0008 #include "searchquery.h"
0009 
0010 #include <QDateTime>
0011 #include <QString>
0012 
0013 using namespace KGAPI2;
0014 using namespace KGAPI2::Drive;
0015 
0016 class Q_DECL_HIDDEN SearchQuery::Private : public QSharedData
0017 {
0018 public:
0019     Private() = default;
0020     Private(const Private &other) = default;
0021     ~Private() = default;
0022 
0023     static QString compareOperatorToString(CompareOperator op);
0024     static QString logicOperatorToString(LogicOperator op);
0025 
0026     QList<SearchQuery> subqueries;
0027     QString field;
0028     QString value;
0029     CompareOperator compareOp;
0030     LogicOperator logicOp;
0031 };
0032 
0033 QString SearchQuery::Private::compareOperatorToString(CompareOperator op)
0034 {
0035     switch (op) {
0036     case Contains:
0037         return QStringLiteral(" contains ");
0038     case Equals:
0039         return QStringLiteral(" = ");
0040     case NotEquals:
0041         return QStringLiteral(" != ");
0042     case Less:
0043         return QStringLiteral(" < ");
0044     case LessOrEqual:
0045         return QStringLiteral(" <= ");
0046     case Greater:
0047         return QStringLiteral(" > ");
0048     case GreaterOrEqual:
0049         return QStringLiteral(" >= ");
0050     case In:
0051         return QStringLiteral(" in ");
0052     case Has:
0053         return QStringLiteral(" has ");
0054     }
0055 
0056     Q_ASSERT(false);
0057     return QString();
0058 }
0059 
0060 QString SearchQuery::Private::logicOperatorToString(SearchQuery::LogicOperator op)
0061 {
0062     switch (op) {
0063     case And:
0064         return QStringLiteral(" and ");
0065     case Or:
0066         return QStringLiteral(" or ");
0067     }
0068 
0069     Q_ASSERT(false);
0070     return QString();
0071 }
0072 
0073 SearchQuery::SearchQuery(SearchQuery::LogicOperator op)
0074     : d(new Private)
0075 {
0076     d->logicOp = op;
0077 }
0078 
0079 SearchQuery::SearchQuery(const SearchQuery &other) = default;
0080 
0081 SearchQuery::~SearchQuery() = default;
0082 
0083 SearchQuery &SearchQuery::operator=(const SearchQuery &other) = default;
0084 
0085 void SearchQuery::addQuery(const QString &field, SearchQuery::CompareOperator op, const QString &value)
0086 {
0087     SearchQuery query;
0088     query.d->field = field;
0089     query.d->compareOp = op;
0090     query.d->value = value;
0091     d->subqueries.append(query);
0092 }
0093 
0094 void SearchQuery::addQuery(const SearchQuery &query)
0095 {
0096     d->subqueries.append(query);
0097 }
0098 
0099 bool SearchQuery::isEmpty() const
0100 {
0101     return d->value.isNull() && d->subqueries.isEmpty();
0102 }
0103 
0104 QString SearchQuery::serialize() const
0105 {
0106     if (isEmpty()) {
0107         return QString();
0108     }
0109 
0110     QString r;
0111     r = QLatin1Char('(');
0112     if (d->subqueries.isEmpty()) {
0113         if (d->compareOp == In) {
0114             r += QStringLiteral("%1 in %2").arg(d->value, d->field);
0115         } else {
0116             r += d->field % Private::compareOperatorToString(d->compareOp) % d->value;
0117         }
0118     } else {
0119         QList<SearchQuery>::ConstIterator iter;
0120         QList<SearchQuery>::ConstIterator end;
0121         for (iter = d->subqueries.constBegin(), end = d->subqueries.constEnd(); iter != end; ++iter) {
0122             if (iter != d->subqueries.constBegin()) {
0123                 r += Private::logicOperatorToString(d->logicOp);
0124             }
0125             r += (*iter).serialize();
0126         }
0127     }
0128     r += QLatin1Char(')');
0129 
0130     return r;
0131 }