diff --git a/src/engine/transaction.cpp b/src/engine/transaction.cpp --- a/src/engine/transaction.cpp +++ b/src/engine/transaction.cpp @@ -325,7 +325,18 @@ const auto subQueries = query.subQueries(); for (const EngineQuery& q : subQueries) { - vec << postingIterator(q); + auto iterator = postingIterator(q); + if (iterator) { + vec << iterator; + } else if (query.op() == EngineQuery::And) { + return nullptr; + } + } + + if (vec.empty()) { + return nullptr; + } else if (vec.size() == 1) { + return vec.takeFirst(); } if (query.op() == EngineQuery::And) { diff --git a/src/lib/searchstore.cpp b/src/lib/searchstore.cpp --- a/src/lib/searchstore.cpp +++ b/src/lib/searchstore.cpp @@ -165,11 +165,19 @@ vec.reserve(subTerms.size()); for (const Term& t : subTerms) { - vec << constructQuery(tr, t); + auto iterator = constructQuery(tr, t); + // constructQuery returns a nullptr to signal an empty list + if (iterator) { + vec << iterator; + } else if (term.operation() == Term::And) { + return nullptr; + } } if (vec.isEmpty()) { return nullptr; + } else if (vec.size() == 1) { + return vec.takeFirst(); } if (term.operation() == Term::And) {