diff --git a/autotests/unit/engine/queryparsertest.cpp b/autotests/unit/engine/queryparsertest.cpp --- a/autotests/unit/engine/queryparsertest.cpp +++ b/autotests/unit/engine/queryparsertest.cpp @@ -35,6 +35,7 @@ void testSimpleQuery(); void testPhraseSearch(); void testPhraseSearchOnly(); + void testUnderscorePhrase(); void testPhraseSearch_sameLimiter(); void testPhraseSearchEmail(); void testAccentSearch(); @@ -106,6 +107,21 @@ QCOMPARE(query, q); } +void QueryParserTest::testUnderscorePhrase() +{ + QueryParser parser; + + EngineQuery query = parser.parseQuery("foo_bar.png"); + + QVector queries; + queries << EngineQuery("foo", 1); + queries << EngineQuery("bar", 2); + queries << EngineQuery("png", 3); + + EngineQuery q(queries, EngineQuery::Phrase); + QCOMPARE(query, q); +} + void QueryParserTest::testPhraseSearch_sameLimiter() { QueryParser parser; @@ -163,10 +179,10 @@ EngineQuery query = parser.parseQuery("The_Fire"); QVector queries; - queries << EngineQuery("the", EngineQuery::StartsWith, 1); - queries << EngineQuery("fire", EngineQuery::StartsWith, 2); + queries << EngineQuery("the", 1); + queries << EngineQuery("fire", 2); - EngineQuery q(queries, EngineQuery::And); + EngineQuery q(queries, EngineQuery::Phrase); QCOMPARE(query, q); diff --git a/src/engine/queryparser.cpp b/src/engine/queryparser.cpp --- a/src/engine/queryparser.cpp +++ b/src/engine/queryparser.cpp @@ -68,7 +68,7 @@ // Check the previous delimiter int pos = bf.position(); if (pos != end) { - QString delim = text.mid(end, pos-end); + QString delim = text_.mid(end, pos-end); if (delim.contains(QLatin1Char('"'))) { if (inDoubleQuotes) { queries << EngineQuery(phraseQueries, EngineQuery::Phrase); @@ -94,8 +94,8 @@ EngineQuery q = queries.takeLast(); q.setOp(EngineQuery::Equal); phraseQueries << q; + inPhrase = true; } - inPhrase = true; } else if (inPhrase && !phraseQueries.isEmpty()) { queries << EngineQuery(phraseQueries, EngineQuery::Phrase);