11 #include "akonadi_search_pim_debug.h"
12 #include "collectionquery.h"
13 #include "resultiterator_p.h"
17 #include <QStandardPaths>
21 class Akonadi::Search::PIM::CollectionQueryPrivate
33 CollectionQuery::CollectionQuery()
35 , d(new CollectionQueryPrivate)
37 d->databaseDir = defaultLocation(QStringLiteral(
"collections"));
41 CollectionQuery::~CollectionQuery() =
default;
43 void CollectionQuery::setDatabaseDir(
const QString &dir)
48 void CollectionQuery::nameMatches(
const QString &match)
50 d->nameString = match;
53 void CollectionQuery::identifierMatches(
const QString &match)
55 d->identifierString = match;
58 void CollectionQuery::pathMatches(
const QString &match)
60 d->pathString = match;
63 void CollectionQuery::setNamespace(
const QStringList &ns)
68 void CollectionQuery::setMimetype(
const QStringList &mt)
73 void CollectionQuery::setLimit(
int limit)
83 }
catch (
const Xapian::DatabaseError &e) {
84 qCWarning(AKONADI_SEARCH_PIM_LOG) <<
"Failed to open Xapian database:" << d->databaseDir <<
"; error:" <<
QString::fromStdString(e.get_error_string());
90 if (!d->nameString.isEmpty()) {
92 Xapian::QueryParser parser;
93 parser.set_database(db);
94 parser.add_prefix(
"",
"N");
95 parser.set_default_op(Xapian::Query::OP_AND);
96 queries << parser.parse_query(d->nameString.toStdString(), Xapian::QueryParser::FLAG_PARTIAL);
99 if (!d->identifierString.isEmpty()) {
100 Xapian::QueryParser parser;
101 parser.set_database(db);
102 parser.add_prefix(
"",
"I");
103 parser.set_default_op(Xapian::Query::OP_AND);
104 queries << parser.parse_query(d->identifierString.toStdString(), Xapian::QueryParser::FLAG_PARTIAL);
107 if (!d->pathString.isEmpty()) {
108 Xapian::QueryParser parser;
109 parser.set_database(db);
110 parser.add_prefix(
"",
"P");
111 parser.set_default_op(Xapian::Query::OP_AND);
112 queries << parser.parse_query(d->pathString.toStdString(), Xapian::QueryParser::FLAG_PARTIAL | Xapian::QueryParser::FLAG_PHRASE);
115 if (!d->ns.isEmpty()) {
117 queryList.
reserve(d->ns.count());
118 for (
const QString &n : std::as_const(d->ns)) {
120 queryList << Xapian::Query(term.
constData());
122 queries << Xapian::Query(Xapian::Query::OP_OR, queryList.
begin(), queryList.
end());
125 if (!d->mimeType.isEmpty()) {
127 queryList.
reserve(d->mimeType.count());
128 for (
const QString &n : std::as_const(d->mimeType)) {
130 queryList << Xapian::Query(term.
constData());
132 queries << Xapian::Query(Xapian::Query::OP_OR, queryList.
begin(), queryList.
end());
135 Xapian::Query query = Xapian::Query(Xapian::Query::OP_AND, queries.
begin(), queries.
end());
141 Xapian::Enquire enquire(db);
142 enquire.set_query(query);
144 Xapian::MSet mset = enquire.get_mset(0, d->limit);