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 }