Query* BooleanQuery::rewrite(Searcher *inSearcher) { size_t size = clauses.size(); // Optimize 1-clause queries if (size == 1) { BooleanClause* c = clauses[0]; // Just return clause if (!c->prohibited) { // Rewrite first Query* query = c->query->rewrite(inSearcher); // If the query doesn't actually get re-written, then return a clone // (because the BooleanQuery will register different to the returned query) if (query == c->query) query = query->clone(); // Incorporate boost if (getBoost() != 1.0f) { query->setBoost(getBoost() * query->getBoost()); } return query; } } // Recursively rewrite BooleanQuery* clone = NULL; for (uint32_t i = 0 ; i < size; i++) { BooleanClause* c = clauses[i]; Query* query = c->query->rewrite(inSearcher); if (query != c->query) { // Clause rewrote: must clone if (clone == NULL) clone = static_cast<BooleanQuery *>(this->clone()); // todo: check if delete query should be on... // in fact we should try and get rid of these for compatibility sake clone->clauses.set(i, _CLNEW BooleanClause(query, true, c->required, c->prohibited)); } } if (clone != NULL) { return clone; // Some clauses rewrote } else return this; // No clauses rewrote }