Commit ee97db4d authored by Ismael Asensio's avatar Ismael Asensio Committed by Elvis Angelaccio
Browse files

[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\"\""
```
parent ec034350
......@@ -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;
......
......@@ -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;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment