172 const QString dir = defaultLocation(QStringLiteral(
"email"));
176 }
catch (
const Xapian::DatabaseOpeningError &) {
177 qCWarning(AKONADI_SEARCH_PIM_LOG) <<
"Xapian Database does not exist at " << dir;
179 }
catch (
const Xapian::DatabaseCorruptError &) {
180 qCWarning(AKONADI_SEARCH_PIM_LOG) <<
"Xapian Database corrupted";
182 }
catch (
const Xapian::DatabaseError &e) {
183 qCWarning(AKONADI_SEARCH_PIM_LOG) <<
"Failed to open Xapian database:" <<
QString::fromStdString(e.get_description());
186 qCWarning(AKONADI_SEARCH_PIM_LOG) <<
"Random exception, but we do not want to crash";
192 if (!d->involves.isEmpty()) {
193 Xapian::QueryParser parser;
194 parser.set_database(db);
195 parser.add_prefix(
"",
"F");
196 parser.add_prefix(
"",
"T");
197 parser.add_prefix(
"",
"CC");
198 parser.add_prefix(
"",
"BCC");
201 for (
const QString &str : std::as_const(d->involves)) {
203 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
207 if (!d->from.isEmpty()) {
208 Xapian::QueryParser parser;
209 parser.set_database(db);
210 parser.add_prefix(
"",
"F");
212 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
215 if (!d->to.isEmpty()) {
216 Xapian::QueryParser parser;
217 parser.set_database(db);
218 parser.add_prefix(
"",
"T");
220 for (
const QString &str : std::as_const(d->to)) {
222 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
226 if (!d->cc.isEmpty()) {
227 Xapian::QueryParser parser;
228 parser.set_database(db);
229 parser.add_prefix(
"",
"CC");
231 for (
const QString &str : std::as_const(d->cc)) {
233 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
237 if (!d->bcc.isEmpty()) {
238 Xapian::QueryParser parser;
239 parser.set_database(db);
240 parser.add_prefix(
"",
"BC");
242 for (
const QString &str : std::as_const(d->bcc)) {
244 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
248 if (!d->subjectMatchString.isEmpty()) {
249 Xapian::QueryParser parser;
250 parser.set_database(db);
251 parser.add_prefix(
"",
"SU");
252 parser.set_default_op(Xapian::Query::OP_AND);
253 const QByteArray ba = d->subjectMatchString.toUtf8();
254 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
257 if (!d->collections.isEmpty()) {
261 const Xapian::Query q = Xapian::Query(
'C' + c.
toStdString());
263 query = Xapian::Query(Xapian::Query::OP_OR, query, q);
269 if (!d->bodyMatchString.isEmpty()) {
270 Xapian::QueryParser parser;
271 parser.set_database(db);
272 parser.add_prefix(
"",
"BO");
273 parser.set_default_op(Xapian::Query::OP_AND);
274 const QByteArray ba = d->bodyMatchString.toUtf8();
275 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
278 if (d->important ==
'T') {
279 m_queries << Xapian::Query(
"BI");
280 }
else if (d->important ==
'F') {
281 m_queries << Xapian::Query(
"BNI");
284 if (d->read ==
'T') {
285 m_queries << Xapian::Query(
"BR");
286 }
else if (d->read ==
'F') {
287 m_queries << Xapian::Query(
"BNR");
290 if (d->attachment ==
'T') {
291 m_queries << Xapian::Query(
"BA");
292 }
else if (d->attachment ==
'F') {
293 m_queries << Xapian::Query(
"BNA");
296 if (!d->matchString.isEmpty()) {
297 Xapian::QueryParser parser;
298 parser.set_database(db);
299 parser.set_default_op(Xapian::Query::OP_AND);
300 if (d->splitSearchMatchString) {
302 for (
const QString &s : list) {
304 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
307 const QByteArray ba = d->matchString.toUtf8();
308 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
314 query = Xapian::Query(Xapian::Query::OP_AND, m_queries.
begin(), m_queries.
end());
317 query = Xapian::Query(Xapian::Query::OP_OR, m_queries.
begin(), m_queries.
end());
321 AgePostingSource ps(0);
322 query = Xapian::Query(Xapian::Query::OP_AND_MAYBE, query, Xapian::Query(&ps));
325 Xapian::Enquire enquire(db);
326 enquire.set_query(query);
333 Xapian::MSet mset = enquire.get_mset(0, d->limit);
338 }
catch (
const Xapian::Error &e) {