11#include "akonadi_search_pim_debug.h"
12#include "contactquery.h"
13#include "resultiterator_p.h"
17#include <QStandardPaths>
21class Akonadi::Search::PIM::ContactQueryPrivate
31 ContactQuery::MatchCriteria criteria;
34ContactQuery::ContactQuery()
35 : d(new ContactQueryPrivate)
37 d->criteria = StartsWithMatch;
40ContactQuery::~ContactQuery() =
default;
42void ContactQuery::matchName(
const QString &name)
47void ContactQuery::matchNickname(
const QString &nick)
52void ContactQuery::matchEmail(
const QString &email)
57void ContactQuery::matchUID(
const QString &uid)
62void ContactQuery::match(
const QString &str)
67int ContactQuery::limit()
const
72void ContactQuery::setLimit(
int limit)
77ContactQuery::MatchCriteria ContactQuery::matchCriteria()
const
82void ContactQuery::setMatchCriteria(ContactQuery::MatchCriteria m)
89 const QString
dir = defaultLocation(QStringLiteral(
"contacts"));
94 }
catch (
const Xapian::DatabaseOpeningError &) {
95 qCWarning(AKONADI_SEARCH_PIM_LOG) <<
"Xapian Database does not exist at " <<
dir;
97 }
catch (
const Xapian::DatabaseCorruptError &) {
98 qCWarning(AKONADI_SEARCH_PIM_LOG) <<
"Xapian Database corrupted";
100 }
catch (
const Xapian::DatabaseError &e) {
101 qCWarning(AKONADI_SEARCH_PIM_LOG) <<
"Failed to open Xapian database:" <<
QString::fromStdString(e.get_error_string());
104 qCWarning(AKONADI_SEARCH_PIM_LOG) <<
"Random exception, but we do not want to crash";
108 QList<Xapian::Query> m_queries;
110 if (d->criteria == ExactMatch) {
111 if (!d->any.isEmpty()) {
112 const QByteArray ba = d->any.toUtf8();
113 m_queries << Xapian::Query(ba.
constData());
116 if (!d->name.isEmpty()) {
117 const QByteArray ba =
"NA" + d->name.toUtf8();
118 m_queries << Xapian::Query(ba.
constData());
121 if (!d->nick.isEmpty()) {
122 const QByteArray ba =
"NI" + d->nick.toUtf8();
123 m_queries << Xapian::Query(ba.
constData());
126 if (!d->email.isEmpty()) {
127 const QByteArray ba = d->email.toUtf8();
128 m_queries << Xapian::Query(ba.
constData());
131 if (!d->uid.isEmpty()) {
132 const QByteArray ba =
"UID" + d->uid.toUtf8();
133 m_queries << Xapian::Query(ba.
constData());
135 }
else if (d->criteria == StartsWithMatch) {
136 if (!d->any.isEmpty()) {
137 Xapian::QueryParser parser;
138 parser.set_database(db);
139 const QByteArray ba = d->any.toUtf8();
140 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
143 if (!d->name.isEmpty()) {
144 Xapian::QueryParser parser;
145 parser.set_database(db);
146 parser.add_prefix(
"",
"NA");
147 const QByteArray ba = d->name.toUtf8();
148 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
151 if (!d->nick.isEmpty()) {
152 Xapian::QueryParser parser;
153 parser.set_database(db);
154 parser.add_prefix(
"",
"NI");
155 const QByteArray ba = d->nick.toUtf8();
156 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
160 if (!d->email.isEmpty()) {
161 Xapian::QueryParser parser;
162 parser.set_database(db);
163 const QByteArray ba = d->email.toUtf8();
164 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
167 if (!d->uid.isEmpty()) {
168 Xapian::QueryParser parser;
169 parser.set_database(db);
170 parser.add_prefix(
"",
"UID");
171 const QByteArray ba = d->uid.toUtf8();
172 m_queries << parser.parse_query(ba.
constData(), Xapian::QueryParser::FLAG_PARTIAL);
176 Xapian::Query
query(Xapian::Query::OP_OR, m_queries.
begin(), m_queries.
end());
177 qCDebug(AKONADI_SEARCH_PIM_LOG) <<
query.get_description().c_str();
179 Xapian::Enquire enquire(db);
180 enquire.set_query(query);
186 Xapian::MSet matches = enquire.get_mset(0, d->limit);
189 iter.d->init(matches);
191 }
catch (
const Xapian::Error &e) {
KSERVICE_EXPORT KService::List query(FilterFunc filterFunc)
KIOCORE_EXPORT QString dir(const QString &fileClass)
QString name(StandardAction id)
const char * constData() const const
QByteArray encodeName(const QString &fileName)
QString fromStdString(const std::string &str)