QueryPtr WildcardQuery::rewrite(const IndexReaderPtr& reader) {
    if (termIsPrefix) {
        MultiTermQueryPtr rewritten(newLucene<PrefixQuery>(term->createTerm(term->text().substr(0, term->text().find('*')))));
        rewritten->setBoost(getBoost());
        rewritten->setRewriteMethod(getRewriteMethod());
        return rewritten;
    } else {
        return MultiTermQuery::rewrite(reader);
    }
}
 QueryPtr FilteredQuery::rewrite(IndexReaderPtr reader)
 {
     QueryPtr rewritten(query->rewrite(reader));
     if (rewritten != query)
     {
         FilteredQueryPtr cloneQuery(boost::dynamic_pointer_cast<FilteredQuery>(clone()));
         cloneQuery->query = rewritten;
         return cloneQuery;
     }
     else
         return shared_from_this();
 }