Akonadi Search

collectionquery.cpp
1/*
2 * This file is part of the KDE Akonadi Search Project
3 * SPDX-FileCopyrightText: 2014 Christian Mollekopf <mollekopf@kolabsys.com>
4 *
5 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
6 *
7 */
8
9#include <xapian.h>
10
11#include "akonadi_search_pim_debug.h"
12#include "collectionquery.h"
13#include "resultiterator_p.h"
14#include <QFile>
15#include <QList>
16
17#include <QStandardPaths>
18
19using namespace Akonadi::Search::PIM;
20
21class Akonadi::Search::PIM::CollectionQueryPrivate
22{
23public:
24 QStringList ns;
25 QStringList mimeType;
26 QString nameString;
27 QString identifierString;
28 QString pathString;
29 QString databaseDir;
30 int limit;
31};
32
33CollectionQuery::CollectionQuery()
34 : d(new CollectionQueryPrivate)
35{
36 d->databaseDir = defaultLocation(QStringLiteral("collections"));
37 d->limit = 0;
38}
39
40CollectionQuery::~CollectionQuery() = default;
41
43{
44 d->databaseDir = dir;
45}
46
48{
49 d->nameString = match;
50}
51
52void CollectionQuery::identifierMatches(const QString &match)
53{
54 d->identifierString = match;
55}
56
57void CollectionQuery::pathMatches(const QString &match)
58{
59 d->pathString = match;
60}
61
62void CollectionQuery::setNamespace(const QStringList &ns)
63{
64 d->ns = ns;
65}
66
67void CollectionQuery::setMimetype(const QStringList &mt)
68{
69 d->mimeType = mt;
70}
71
72void CollectionQuery::setLimit(int limit)
73{
74 d->limit = limit;
75}
76
78{
79 Xapian::Database db;
80 try {
81 db = Xapian::Database(QFile::encodeName(d->databaseDir).toStdString());
82 } catch (const Xapian::DatabaseError &e) {
83 qCWarning(AKONADI_SEARCH_PIM_LOG) << "Failed to open Xapian database:" << d->databaseDir << "; error:" << QString::fromStdString(e.get_error_string());
84 return {};
85 }
86
88
89 if (!d->nameString.isEmpty()) {
90 // qDebug() << "searching by name";
91 Xapian::QueryParser parser;
92 parser.set_database(db);
93 parser.add_prefix("", "N");
94 parser.set_default_op(Xapian::Query::OP_AND);
95 queries << parser.parse_query(d->nameString.toStdString(), Xapian::QueryParser::FLAG_PARTIAL);
96 }
97
98 if (!d->identifierString.isEmpty()) {
99 Xapian::QueryParser parser;
100 parser.set_database(db);
101 parser.add_prefix("", "I");
102 parser.set_default_op(Xapian::Query::OP_AND);
103 queries << parser.parse_query(d->identifierString.toStdString(), Xapian::QueryParser::FLAG_PARTIAL);
104 }
105
106 if (!d->pathString.isEmpty()) {
107 Xapian::QueryParser parser;
108 parser.set_database(db);
109 parser.add_prefix("", "P");
110 parser.set_default_op(Xapian::Query::OP_AND);
111 queries << parser.parse_query(d->pathString.toStdString(), Xapian::QueryParser::FLAG_PARTIAL | Xapian::QueryParser::FLAG_PHRASE);
112 }
113
114 if (!d->ns.isEmpty()) {
115 QList<Xapian::Query> queryList;
116 queryList.reserve(d->ns.count());
117 for (const QString &n : std::as_const(d->ns)) {
118 const QByteArray term = "NS" + n.toUtf8();
119 queryList << Xapian::Query(term.constData());
120 }
121 queries << Xapian::Query(Xapian::Query::OP_OR, queryList.begin(), queryList.end());
122 }
123
124 if (!d->mimeType.isEmpty()) {
125 QList<Xapian::Query> queryList;
126 queryList.reserve(d->mimeType.count());
127 for (const QString &n : std::as_const(d->mimeType)) {
128 const QByteArray term = "M" + n.toUtf8();
129 queryList << Xapian::Query(term.constData());
130 }
131 queries << Xapian::Query(Xapian::Query::OP_OR, queryList.begin(), queryList.end());
132 }
133
134 Xapian::Query query = Xapian::Query(Xapian::Query::OP_AND, queries.begin(), queries.end());
135
136 if (d->limit == 0) {
137 d->limit = 1000000;
138 }
139
140 Xapian::Enquire enquire(db);
141 enquire.set_query(query);
142
143 Xapian::MSet mset = enquire.get_mset(0, d->limit);
144
145 ResultIterator iter;
146 iter.d->init(mset);
147 return iter;
148}
void setDatabaseDir(const QString &dir)
For testing.
void nameMatches(const QString &match)
Matches the string match in the name.
ResultIterator exec() override
Execute the query and return an iterator to fetch the results.
PIM specific search API.
const char * constData() const const
QByteArray encodeName(const QString &fileName)
iterator begin()
iterator end()
void reserve(qsizetype size)
QString fromStdString(const std::string &str)
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Apr 25 2025 11:51:42 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.