┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIsmael Asensio <[email protected]>2020-07-04 16:23:24 +0200
committerElvis Angelaccio <[email protected]>2020-07-05 17:15:31 +0000
commitee97db4dfc10e87f637d8387fb3f4d3590d95697 (patch)
tree42987295290e46b280801392f1d85e69897c5135
parentec03435022efa72a428a43eb106eaf31f503a9e6 (diff)
[search] Fix corner cases when using quotes in filenames
The `filename` term in a search query is enclosed into quotes. As the user can have additional quotes in the search term, there were several corner cases where the parsing would fail to correctly split the terms New test cases have been added to cover this possibility Previous tests still passes to avoid regressions BEFORE: ``` (filename/quoted) Compared values are not the same Actual (query.text()): "xyz\"\"" Expected (expectedText): "\"abc xyz\"" (filename/mixed) Compared values are not the same Actual (query.text()): "xyz\" tuv\"" Expected (expectedText): "\"abc xyz\" tuv" (content+filename/quoted) Compared values are not the same Actual (query.text()): "abc xyz xyz\"\"" Expected (expectedText): "abc xyz filename:\"\"abc xyz\"\"" ```
-rw-r--r--src/search/dolphinquery.cpp6
-rw-r--r--src/tests/dolphinquerytest.cpp12
2 files changed, 17 insertions, 1 deletions
diff --git a/src/search/dolphinquery.cpp b/src/search/dolphinquery.cpp
index 0581a02ec..663ed9909 100644
--- a/src/search/dolphinquery.cpp
+++ b/src/search/dolphinquery.cpp
@@ -59,7 +59,11 @@ namespace {
QStringList splitOutsideQuotes(const QString& text)
{
- const QRegularExpression subTermsRegExp("(\\S*?\"[^\"]*?\"|(?<=\\s|^)\\S+(?=\\s|$))");
+ // Match groups on 3 possible conditions:
+ // - Groups with two leading quotes must close both on them (filename:""abc xyz" tuv")
+ // - Groups enclosed in quotes
+ // - Words separated by spaces
+ const QRegularExpression subTermsRegExp("(\\S*?\"\"[^\"]+\"[^\"]+\"+|\\S*?\"[^\"]+\"+|(?<=\\s|^)\\S+(?=\\s|$))");
auto subTermsMatchIterator = subTermsRegExp.globalMatch(text);
QStringList textParts;
diff --git a/src/tests/dolphinquerytest.cpp b/src/tests/dolphinquerytest.cpp
index a0774e88c..25bd26b81 100644
--- a/src/tests/dolphinquerytest.cpp
+++ b/src/tests/dolphinquerytest.cpp
@@ -72,8 +72,13 @@ void DolphinSearchBoxTest::testBalooSearchParsing_data()
const QString text = QStringLiteral("abc");
const QString textS = QStringLiteral("abc xyz");
+ const QString textQ = QStringLiteral("\"abc xyz\"");
+ const QString textM = QStringLiteral("\"abc xyz\" tuv");
+
const QString filename = QStringLiteral("filename:\"%1\"").arg(text);
const QString filenameS = QStringLiteral("filename:\"%1\"").arg(textS);
+ const QString filenameQ = QStringLiteral("filename:\"%1\"").arg(textQ);
+ const QString filenameM = QStringLiteral("filename:\"%1\"").arg(textM);
const QString rating = QStringLiteral("rating>=2");
const QString modified = QStringLiteral("modified>=2019-08-07");
@@ -85,6 +90,7 @@ void DolphinSearchBoxTest::testBalooSearchParsing_data()
// Test for "Content"
QTest::newRow("content") << balooQueryUrl(text) << text << QStringList() << true << false;
QTest::newRow("content/space") << balooQueryUrl(textS) << textS << QStringList() << true << false;
+ QTest::newRow("content/quoted") << balooQueryUrl(textQ) << textS << QStringList() << true << false;
QTest::newRow("content/empty") << balooQueryUrl("") << "" << QStringList() << false << false;
QTest::newRow("content/single_quote") << balooQueryUrl("\"") << "\"" << QStringList() << true << false;
QTest::newRow("content/double_quote") << balooQueryUrl("\"\"") << "" << QStringList() << false << false;
@@ -92,6 +98,8 @@ void DolphinSearchBoxTest::testBalooSearchParsing_data()
// Test for "FileName"
QTest::newRow("filename") << balooQueryUrl(filename) << text << QStringList() << false << true;
QTest::newRow("filename/space") << balooQueryUrl(filenameS) << textS << QStringList() << false << true;
+ QTest::newRow("filename/quoted") << balooQueryUrl(filenameQ) << textQ << QStringList() << false << true;
+ QTest::newRow("filename/mixed") << balooQueryUrl(filenameM) << textM << QStringList() << false << true;
QTest::newRow("filename/empty") << balooQueryUrl("filename:") << "" << QStringList() << false << false;
QTest::newRow("filename/single_quote") << balooQueryUrl("filename:\"") << "\"" << QStringList() << false << true;
QTest::newRow("filename/double_quote") << balooQueryUrl("filename:\"\"") << "" << QStringList() << false << false;
@@ -101,6 +109,10 @@ void DolphinSearchBoxTest::testBalooSearchParsing_data()
<< balooQueryUrl(text + " " + filename)
<< text + " " + filename << QStringList() << true << true;
+ QTest::newRow("content+filename/quoted")
+ << balooQueryUrl(textQ + " " + filenameQ)
+ << textS + " " + filenameQ << QStringList() << true << true;
+
// Test for rating
QTest::newRow("rating") << balooQueryUrl(rating) << "" << QStringList({rating}) << false << false;
QTest::newRow("rating+content") << balooQueryUrl(rating + " " + text) << text << QStringList({rating}) << true << false;