Baloo
10 #include "advancedqueryparser.h"
11 #include "searchstore.h"
12 #include "baloodebug.h"
15 #include <QStringList>
18 #include <QJsonDocument>
19 #include <QJsonObject>
21 using namespace Baloo;
23 const int defaultLimit = -1;
25 class BALOO_CORE_NO_EXPORT
Baloo::Query::Private {
31 int m_limit = defaultLimit;
35 int m_monthFilter = 0;
38 SortingOption m_sortingOption = SortAuto;
47 Query::Query(
const Query& rhs)
48 : d(new Private(*rhs.d))
64 for (
const QString& type : typeList) {
69 void Query::setType(
const QString& type)
85 QString Query::searchString()
const
87 return d->m_searchString;
92 d->m_searchString = str;
97 uint Query::limit()
const
107 uint Query::offset()
const
112 void Query::setOffset(uint offset)
114 d->m_offset = offset;
119 d->m_yearFilter = year;
120 d->m_monthFilter = month;
121 d->m_dayFilter = day;
124 int Query::yearFilter()
const
126 return d->m_yearFilter;
129 int Query::monthFilter()
const
131 return d->m_monthFilter;
134 int Query::dayFilter()
const
136 return d->m_dayFilter;
141 d->m_sortingOption = option;
146 return d->m_sortingOption;
149 QString Query::includeFolder()
const
151 return d->m_includeFolder;
156 d->m_includeFolder = folder;
159 ResultIterator Query::exec()
161 if (!d->m_searchString.isEmpty()) {
162 if (d->m_term.isValid()) {
163 qCDebug(BALOO) <<
"Term already set";
165 AdvancedQueryParser parser;
166 d->m_term = parser.parse(d->m_searchString);
169 Term term(d->m_term);
170 if (!d->m_types.isEmpty()) {
171 for (
const QString& type : std::as_const(d->m_types)) {
172 term = term && Term(QStringLiteral(
"type"), type);
176 if (!d->m_includeFolder.isEmpty()) {
177 term = term && Term(QStringLiteral(
"includefolder"), d->m_includeFolder);
180 if (d->m_yearFilter || d->m_monthFilter || d->m_dayFilter) {
182 if (d->m_monthFilter < 10) {
186 if (d->m_dayFilter < 10) {
191 term = term && Term(QStringLiteral(
"modified"), ba, Term::Equal);
194 SearchStore searchStore;
195 auto results = searchStore.exec(term, d->m_offset, d->m_limit, d->m_sortingOption ==
SortAuto);
196 return ResultIterator(std::move(results));
203 if (!d->m_types.isEmpty()) {
204 map[QStringLiteral(
"type")] = d->m_types;
207 if (d->m_limit != defaultLimit) {
208 map[QStringLiteral(
"limit")] = d->m_limit;
212 map[QStringLiteral(
"offset")] = d->m_offset;
215 if (!d->m_searchString.isEmpty()) {
216 map[QStringLiteral(
"searchString")] = d->m_searchString;
219 if (d->m_term.isValid()) {
220 map[QStringLiteral(
"term")] =
QVariant(d->m_term.toVariantMap());
223 if (d->m_yearFilter > 0) {
224 map[QStringLiteral(
"yearFilter")] = d->m_yearFilter;
226 if (d->m_monthFilter > 0) {
227 map[QStringLiteral(
"monthFilter")] = d->m_monthFilter;
229 if (d->m_dayFilter > 0) {
230 map[QStringLiteral(
"dayFilter")] = d->m_dayFilter;
233 if (d->m_sortingOption !=
SortAuto) {
234 map[QStringLiteral(
"sortingOption")] =
static_cast<int>(d->m_sortingOption);
237 if (!d->m_includeFolder.isEmpty()) {
238 map[QStringLiteral(
"includeFolder")] = d->m_includeFolder;
244 return jdoc.
toJson(QJsonDocument::JsonFormat::Compact);
254 query.d->m_types =
map[QStringLiteral(
"type")].toStringList();
256 if (
map.contains(QStringLiteral(
"limit"))) {
257 query.d->m_limit =
map[QStringLiteral(
"limit")].toUInt();
259 query.d->m_limit = defaultLimit;
262 query.d->m_offset =
map[QStringLiteral(
"offset")].toUInt();
263 query.d->m_searchString =
map[QStringLiteral(
"searchString")].toString();
264 query.d->m_term = Term::fromVariantMap(map[QStringLiteral(
"term")].
toMap());
266 if (
map.contains(QStringLiteral(
"yearFilter"))) {
267 query.d->m_yearFilter =
map[QStringLiteral(
"yearFilter")].toInt();
269 if (
map.contains(QStringLiteral(
"monthFilter"))) {
270 query.d->m_monthFilter =
map[QStringLiteral(
"monthFilter")].toInt();
272 if (
map.contains(QStringLiteral(
"dayFilter"))) {
273 query.d->m_dayFilter =
map[QStringLiteral(
"dayFilter")].toInt();
276 if (
map.contains(QStringLiteral(
"sortingOption"))) {
277 int option =
map.value(QStringLiteral(
"sortingOption")).toInt();
281 if (
map.contains(QStringLiteral(
"includeFolder"))) {
282 query.d->m_includeFolder =
map.value(QStringLiteral(
"includeFolder")).
toString();
285 if (!
query.d->m_searchString.isEmpty() &&
query.d->m_term.isValid()) {
286 qCWarning(BALOO) <<
"Only one of 'searchString' and 'term' should be set:" << arr;
294 url.
setScheme(QStringLiteral(
"baloosearch"));
312 return QStringLiteral(
"{\"type\":[\"Document\"]}");
314 return QStringLiteral(
"{\"type\":[\"Image\"]}");
316 return QStringLiteral(
"{\"type\":[\"Audio\"]}");
318 return QStringLiteral(
"{\"type\":[\"Video\"]}");
324 Query Query::fromSearchUrl(
const QUrl& url)
334 return Query::fromJSON(jsonString.
toUtf8());
340 q.setSearchString(queryString);
344 const QString jsonString = jsonQueryFromUrl(url);
346 return Query::fromJSON(jsonString.
toUtf8());
358 bool Query::operator==(
const Query& rhs)
const
360 if (rhs.d->m_limit != d->m_limit || rhs.d->m_offset != d->m_offset ||
361 rhs.d->m_dayFilter != d->m_dayFilter || rhs.d->m_monthFilter != d->m_monthFilter ||
362 rhs.d->m_yearFilter != d->m_yearFilter || rhs.d->m_includeFolder != d->m_includeFolder ||
363 rhs.d->m_searchString != d->m_searchString ||
364 rhs.d->m_sortingOption != d->m_sortingOption)
369 if (rhs.d->m_types.size() != d->m_types.size()) {
373 for (
const QString& type : std::as_const(rhs.d->m_types)) {
374 if (!d->m_types.contains(type)) {
379 return d->m_term == rhs.d->m_term;
382 bool Query::operator!=(
const Query& rhs)
const
384 return !(*
this == rhs);
387 Query& Query::operator=(
const Query& rhs)
bool endsWith(const QString &s, Qt::CaseSensitivity cs) const const
QJsonObject object() const const
std::optional< QSqlQuery > query(const QString &queryStatement)
@ SortAuto
The results are returned in the order Baloo decides should be ideal.
QJsonDocument fromJson(const QByteArray &json, QJsonParseError *error)
QString fromUtf8(const char *str, int size)
QString scheme() const const
void setSearchString(const QString &str)
Set some text which should be used to search for Items.
void addQueryItem(const QString &key, const QString &value)
bool hasQueryItem(const QString &key) const const
QVariantMap toVariantMap() const const
QJsonObject fromVariantMap(const QVariantMap &map)
QByteArray number(int n, int base)
void setScheme(const QString &scheme)
QStringList types(Mode mode=Writing)
void setIncludeFolder(const QString &folder)
Only files in this folder will be returned.
Implements storage for docIds without any associated data Instantiated for:
bool isEmpty() const const
QByteArray toUtf8() const const
void setQuery(const QString &query, QUrl::ParsingMode mode)
QString path(QUrl::ComponentFormattingOptions options) const const
QString path(const QString &relativePath)
QByteArray toJson() const const
void setObject(const QJsonObject &object)
const QVariantMap toMap(const MODEL &model)
QString queryItemValue(const QString &key, QUrl::ComponentFormattingOptions encoding) const const
void setLimit(uint limit)
Only a maximum of limit results will be returned.
void addType(const QString &type)
Add a type to the results of the query.
QFuture< void > map(Sequence &sequence, MapFunctor function)
void setDateFilter(int year, int month=0, int day=0)
Filter the results in the specified date range.
char * toString(const EngineQuery &query)
Helper for QTest.
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Wed Nov 29 2023 03:56:26 by
doxygen 1.8.17 written
by
Dimitri van Heesch, © 1997-2006
KDE's Doxygen guidelines are available online.