15 class Akonadi::Search::TermPrivate
18 Term::Operation m_op = Term::None;
19 Term::Comparator m_comp = Term::Auto;
24 bool m_isNegated =
false;
27 QVariantHash m_userData;
35 Term::Term(
const Term &t)
36 : d(new TermPrivate(*t.d))
53 auto valueType = value.metaType().id();
77 Term::Term(Term::Operation op)
83 Term::Term(Term::Operation op,
const Term &t)
90 Term::Term(Term::Operation op,
const QList<Term> &t)
97 Term::Term(
const Term &lhs, Term::Operation op,
const Term &rhs)
101 d->m_subTerms << lhs;
102 d->m_subTerms << rhs;
105 Term::~Term() =
default;
107 bool Term::isValid()
const
109 if (d->m_property.isEmpty()) {
110 if (d->m_op == Term::None) {
114 return d->m_property.isEmpty() && d->m_value.isNull();
122 d->m_isNegated = isNegated;
125 bool Term::isNegated()
const
127 return d->m_isNegated;
130 bool Term::negated()
const
132 return d->m_isNegated;
135 void Term::addSubTerm(
const Term &term)
137 d->m_subTerms << term;
142 d->m_subTerms = terms;
147 if (!d->m_subTerms.isEmpty()) {
148 return d->m_subTerms.first();
156 return d->m_subTerms;
159 void Term::setOperation(Term::Operation op)
164 Term::Operation Term::operation()
const
169 bool Term::empty()
const
174 bool Term::isEmpty()
const
176 return d->m_property.isEmpty() && d->m_value.isNull() && d->m_subTerms.isEmpty();
181 return d->m_property;
184 void Term::setProperty(
const QString &property)
189 void Term::setValue(
const QVariant &value)
199 Term::Comparator Term::comparator()
const
204 void Term::setComparator(Term::Comparator c)
211 d->m_userData.insert(name, value);
216 return d->m_userData.value(name);
219 QVariantMap Term::toVariantMap()
const
222 if (d->m_op != None) {
223 QVariantList variantList;
224 variantList.reserve(d->m_subTerms.count());
225 for (
const Term &term : std::as_const(d->m_subTerms)) {
226 variantList <<
QVariant(term.toVariantMap());
229 if (d->m_op == And) {
230 map[QStringLiteral(
"$and")] = variantList;
232 map[QStringLiteral(
"$or")] = variantList;
241 map[d->m_property] = d->m_value;
245 op = QStringLiteral(
"$ct");
249 op = QStringLiteral(
"$gt");
253 op = QStringLiteral(
"$gte");
257 op = QStringLiteral(
"$lt");
261 op = QStringLiteral(
"$lte");
296 Term Term::fromVariantMap(
const QVariantMap &map)
298 if (
map.size() != 1) {
305 if (
map.contains(QStringLiteral(
"$and"))) {
306 andOrString = QStringLiteral(
"$and");
307 term.setOperation(And);
308 }
else if (
map.contains(QStringLiteral(
"$or"))) {
309 andOrString = QStringLiteral(
"$or");
310 term.setOperation(Or);
313 if (andOrString.
size()) {
316 const QVariantList
list =
map[andOrString].toList();
319 subTerms << Term::fromVariantMap(var.
toMap());
322 term.setSubTerms(subTerms);
327 term.setProperty(prop);
332 if (
map.size() != 1) {
337 Term::Comparator com;
352 term.setComparator(com);
353 term.setValue(tryConvert(
map.value(op)));
358 term.setComparator(Equal);
359 term.setValue(tryConvert(value));
364 bool Term::operator==(
const Term &rhs)
const
366 if (d->m_op != rhs.d->m_op || d->m_comp != rhs.d->m_comp || d->m_isNegated != rhs.d->m_isNegated || d->m_property != rhs.d->m_property
367 || d->m_value != rhs.d->m_value) {
371 if (d->m_subTerms.size() != rhs.d->m_subTerms.size()) {
375 if (d->m_subTerms.isEmpty()) {
379 for (
const Term &t : std::as_const(d->m_subTerms)) {
380 if (!rhs.d->m_subTerms.contains(t)) {
388 Term &Term::operator=(
const Term &rhs)
396 QString comparatorToString(Term::Comparator c)
400 return QStringLiteral(
"Auto");
402 return QStringLiteral(
"=");
404 return QStringLiteral(
":");
406 return QStringLiteral(
"<");
407 case Term::LessEqual:
408 return QStringLiteral(
"<=");
410 return QStringLiteral(
">");
411 case Term::GreaterEqual:
412 return QStringLiteral(
">=");
418 QString operationToString(Term::Operation op)
422 return QStringLiteral(
"NONE");
424 return QStringLiteral(
"AND");
426 return QStringLiteral(
"OR");
435 if (t.subTerms().isEmpty()) {
436 d << QStringLiteral(
"(%1 %2 %3 (%4))")
441 d <<
"(" << operationToString(t.operation()).toUtf8().constData();
443 for (
const Term &term : std::as_const(subterms)) {