diff --git a/autotests/searchjobtest.cpp b/autotests/searchjobtest.cpp --- a/autotests/searchjobtest.cpp +++ b/autotests/searchjobtest.cpp @@ -164,6 +164,19 @@ << "S: A000001 OK search done"; QTest::newRow("uidbased NOT NEW search") << scenario << true << 6 << KIMAP::Term(KIMAP::Term::New).setNegated(true); } + + { + QList scenario; + scenario << FakeServer::preauth() + << "C: A000001 UID SEARCH OR HEADER Message-Id \"<1234567@mail.box>\" (OR HEADER Message-Id \"<7654321@mail.box>\" (OR HEADER Message-Id \"\" HEADER Message-Id \"\"))" + << "S: * SEARCH 1 2 3 4" + << "S: A000001 OK search done"; + KIMAP::Term term{KIMAP::Term::Or, {KIMAP::Term{QStringLiteral("Message-Id"), QStringLiteral("<1234567@mail.box>")}, + KIMAP::Term{QStringLiteral("Message-Id"), QStringLiteral("<7654321@mail.box>")}, + KIMAP::Term{QStringLiteral("Message-Id"), QStringLiteral("")}, + KIMAP::Term{QStringLiteral("Message-Id"), QStringLiteral("")}}}; + QTest::newRow("OR with multiple subterms") << scenario << true << 4 << term; + } } void testSearchTerm() diff --git a/src/searchjob.cpp b/src/searchjob.cpp --- a/src/searchjob.cpp +++ b/src/searchjob.cpp @@ -69,25 +69,24 @@ : d(new Term::Private) { if (subterms.size() >= 2) { - d->command += "("; if (relation == KIMAP::Term::Or) { - d->command += "OR "; - d->command += subterms.at(0).serialize() + ' '; - if (subterms.size() >= 3) { - Term t(relation, subterms.mid(1)); - d->command += t.serialize(); - } else if (subterms.size() == 2) { - d->command += subterms.at(1).serialize(); + for (int i = 0; i < subterms.size() - 1; ++i) { + d->command += "(OR " + subterms[i].serialize() + " "; + } + d->command += subterms.back().serialize(); + for (int i = 0; i < subterms.size() - 1; ++i) { + d->command += ")"; } } else { + d->command += "("; for (const Term &t : subterms) { d->command += t.serialize() + ' '; } if (!subterms.isEmpty()) { d->command.chop(1); } + d->command += ")"; } - d->command += ")"; } else if (subterms.size() == 1) { d->command += subterms.first().serialize(); } else {