diff --git a/autotests/unit/lib/advancedqueryparsertest.cpp b/autotests/unit/lib/advancedqueryparsertest.cpp --- a/autotests/unit/lib/advancedqueryparsertest.cpp +++ b/autotests/unit/lib/advancedqueryparsertest.cpp @@ -22,6 +22,7 @@ #include +Q_DECLARE_METATYPE(Baloo::Term) using namespace Baloo; class AdvancedQueryParserTest : public QObject @@ -37,6 +38,8 @@ void testDateTime(); void testOperators(); void testBinaryOperatorMissingFirstArg(); + void testOptimizedLogic(); + void testOptimizedLogic_data(); }; void AdvancedQueryParserTest::testSimpleProperty() @@ -126,8 +129,8 @@ expectedTerm.addSubTerm(Term(QStringLiteral("artist"), "Coldplay")); expectedTerm.addSubTerm(Term(QStringLiteral("type"), "song")); expectedTerm.addSubTerm(Term(QLatin1String(""), "stars")); - QCOMPARE(term, expectedTerm); + } void AdvancedQueryParserTest::testNesting() @@ -199,7 +202,67 @@ QCOMPARE(term, expectedTerm); } +void AdvancedQueryParserTest::testOptimizedLogic() +{ + QFETCH(QString, phrase); + QFETCH(QString, failmessage); + QFETCH(Term, expected); + AdvancedQueryParser parser; + const auto term = parser.parse(phrase); + qDebug() << " result term" << term; + qDebug() << "expected term" << expected; + if (!failmessage.isEmpty()) { + QEXPECT_FAIL("", qPrintable(failmessage), Continue); + } + + QCOMPARE(term, expected); +} + +void AdvancedQueryParserTest::testOptimizedLogic_data() +{ + QTest::addColumn("phrase"); + QTest::addColumn("expected"); + QTest::addColumn("failmessage"); + const QString nofail; + QString phrase; + phrase = QStringLiteral("a AND b AND c AND d"); + QTest::newRow(qPrintable(phrase)) + << phrase + << Term{Term::And, QList{ + Term{QStringLiteral(""), QStringLiteral("a"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("b"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("c"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("d"), Term::Contains}, + }} + << nofail + ; + phrase = QStringLiteral("(a AND b) AND (c OR d)"); + QTest::newRow(qPrintable(phrase)) + << phrase + << Term{Term::And, QList{ + Term{QStringLiteral(""), QStringLiteral("a"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("b"), Term::Contains}, + Term{Term::Or, QList{ + Term{QStringLiteral(""), QStringLiteral("c"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("d"), Term::Contains}, + }} + }} + << nofail + ; + phrase = QStringLiteral("(a AND (b AND (c AND d)))"); + QTest::newRow(qPrintable(phrase)) + << phrase + << Term{Term::And, QList{ + Term{QStringLiteral(""), QStringLiteral("a"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("b"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("c"), Term::Contains}, + Term{QStringLiteral(""), QStringLiteral("d"), Term::Contains}, + }} + << QStringLiteral("no optimization") + ; + +} QTEST_MAIN(AdvancedQueryParserTest) #include "advancedqueryparsertest.moc"