14 class Baloo::Term::Private {
16 Operation m_op =
None;
17 Comparator m_comp = Auto;
22 bool m_isNegated =
false;
25 QVariantHash m_userData;
33 Term::Term(
const Term& t)
34 : d(new Private(*t.d))
38 Term::Term(
const QString& property)
44 Term::Term(
const QString& property,
const QVariant& value, Term::Comparator c)
75 Term::Term(Term::Operation op)
81 Term::Term(Term::Operation op,
const Term& t)
88 Term::Term(Term::Operation op,
const QList<Term>& t)
95 Term::Term(
const Term& lhs, Term::Operation op,
const Term& rhs)
108 if (lhs.operation() == op) {
109 d->m_subTerms << lhs.subTerms();
111 d->m_subTerms << lhs;
114 if (rhs.operation() == op) {
115 d->m_subTerms << rhs.subTerms();
117 d->m_subTerms << rhs;
126 bool Term::isValid()
const
129 if (d->m_op != Term::None) {
133 if (d->m_comp == Term::Auto) {
140 void Term::setNegation(
bool isNegated)
142 d->m_isNegated = isNegated;
145 bool Term::isNegated()
const
147 return d->m_isNegated;
150 bool Term::negated()
const
152 return d->m_isNegated;
155 void Term::addSubTerm(
const Term& term)
157 d->m_subTerms << term;
162 d->m_subTerms = terms;
165 Term Term::subTerm()
const
167 if (!d->m_subTerms.isEmpty()) {
168 return d->m_subTerms.
first();
176 return d->m_subTerms;
179 void Term::setOperation(Term::Operation op)
184 Term::Operation Term::operation()
const
189 bool Term::empty()
const
194 bool Term::isEmpty()
const
196 return d->m_property.isEmpty() && d->m_value.isNull() && d->m_subTerms.isEmpty();
201 return d->m_property;
204 void Term::setProperty(
const QString& property)
206 d->m_property = property;
209 void Term::setValue(
const QVariant& value)
219 Term::Comparator Term::comparator()
const
224 void Term::setComparator(Term::Comparator c)
231 d->m_userData.insert(name, value);
236 return d->m_userData.
value(name);
239 QVariantMap Term::toVariantMap()
const
242 if (d->m_op != None) {
243 QVariantList variantList;
244 for (
const Term& term : std::as_const(d->m_subTerms)) {
245 variantList <<
QVariant(term.toVariantMap());
248 if (d->m_op == And) {
249 map[QStringLiteral(
"$and")] = variantList;
251 map[QStringLiteral(
"$or")] = variantList;
260 map[d->m_property] = d->m_value;
264 op = QStringLiteral(
"$ct");
268 op = QStringLiteral(
"$gt");
272 op = QStringLiteral(
"$gte");
276 op = QStringLiteral(
"$lt");
280 op = QStringLiteral(
"$lte");
313 Term Term::fromVariantMap(
const QVariantMap& map)
315 if (
map.size() != 1) {
323 andOrString = QStringLiteral(
"$and");
324 term.setOperation(And);
327 andOrString = QStringLiteral(
"$or");
328 term.setOperation(Or);
334 const QVariantList
list =
map[andOrString].toList();
336 subTerms << Term::fromVariantMap(var.
toMap());
339 term.setSubTerms(subTerms);
344 term.setProperty(prop);
348 QVariantMap mapVal = value.
toMap();
349 if (mapVal.size() != 1) {
354 Term::Comparator com;
369 term.setComparator(com);
370 term.setValue(tryConvert(mapVal.value(op)));
375 term.setComparator(Equal);
376 term.setValue(tryConvert(value));
381 bool Term::operator==(
const Term& rhs)
const
383 if (d->m_op != rhs.d->m_op || d->m_comp != rhs.d->m_comp ||
384 d->m_isNegated != rhs.d->m_isNegated || d->m_property != rhs.d->m_property ||
385 d->m_value != rhs.d->m_value)
390 if (d->m_subTerms.size() != rhs.d->m_subTerms.size()) {
394 if (d->m_subTerms.isEmpty()) {
398 for (
const Term& t : std::as_const(d->m_subTerms)) {
399 if (!rhs.d->m_subTerms.contains(t)) {
407 Term& Term::operator=(
const Term& rhs)
424 QString comparatorToString(Baloo::Term::Comparator c) {
426 case Baloo::Term::Auto:
427 return QStringLiteral(
"Auto");
428 case Baloo::Term::Equal:
429 return QStringLiteral(
"=");
430 case Baloo::Term::Contains:
431 return QStringLiteral(
":");
432 case Baloo::Term::Less:
433 return QStringLiteral(
"<");
434 case Baloo::Term::LessEqual:
435 return QStringLiteral(
"<=");
436 case Baloo::Term::Greater:
437 return QStringLiteral(
">");
438 case Baloo::Term::GreaterEqual:
439 return QStringLiteral(
">=");
445 QString operationToString(Baloo::Term::Operation op) {
447 case Baloo::Term::None:
448 return QStringLiteral(
"NONE");
449 case Baloo::Term::And:
450 return QStringLiteral(
"AND");
451 case Baloo::Term::Or:
452 return QStringLiteral(
"OR");
463 if (t.subTerms().isEmpty()) {
464 if (!t.property().isEmpty()) {
467 d << comparatorToString(t.comparator());
476 d <<
"[" << operationToString(t.operation());
477 const auto subTerms = t.subTerms();
478 for (
const Baloo::Term& term : subTerms) {