]> cloud.milkyroute.net Git - dolphin.git/commitdiff
[search] Fix corner cases when using quotes in filenames
authorIsmael Asensio <isma.af@gmail.com>
Sat, 4 Jul 2020 14:23:24 +0000 (16:23 +0200)
committerElvis Angelaccio <elvis.angelaccio@kde.org>
Sun, 5 Jul 2020 17:15:31 +0000 (17:15 +0000)
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\"\""
```

src/search/dolphinquery.cpp
src/tests/dolphinquerytest.cpp

index 0581a02ece041fcc242ca13388d72131ca5e44d4..663ed9909ded157bf6df0a1a560024dae79ee576 100644 (file)
@@ -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;
index a0774e88c8f63a4a682ad06a72eda36ae228ce3d..25bd26b815b6b688cfc336827fd6cc78d17ef916 100644 (file)
@@ -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;