String PhraseQuery::toString(const String& field)
 {
     StringStream buffer;
     if (this->field != field)
         buffer << this->field << L":";
     buffer << L"\"";
     Collection<String> pieces(Collection<String>::newInstance(maxPosition + 1));
     for (int32_t i = 0; i < terms.size(); ++i)
     {
         int32_t pos = positions[i];
         String s(pieces[pos]);
         if (!s.empty())
             s += L"|";
         s += terms[i]->text();
         pieces[pos] = s;
     }
     for (int32_t i = 0; i < pieces.size(); ++i)
     {
         if (i > 0)
             buffer << L" ";
         String s(pieces[i]);
         buffer << (s.empty() ? L"?" : s);
     }
     buffer << L"\"";
     
     if (slop != 0)
         buffer << L"~" << slop;
     
     buffer << boostString();
     
     return buffer.str();
 }
String FuzzyQuery::toString(const String& field) {
    StringStream buffer;
    if (term->field() != field) {
        buffer << term->field() << L":";
    }
    buffer << term->text() << L"~" << minimumSimilarity << boostString();
    return buffer.str();
}
String WildcardQuery::toString(const String& field) {
    StringStream buffer;
    if (term->field() != field) {
        buffer << term->field() << L":";
    }
    buffer << term->text() << boostString();
    return buffer.str();
}
String SpanOrQuery::toString(const String& field) {
    StringStream buffer;
    buffer << L"SpanOr([";
    for (Collection<SpanQueryPtr>::iterator clause = clauses.begin(); clause != clauses.end(); ++clause) {
        if (clause != clauses.begin()) {
            buffer << L", ";
        }
        buffer << (*clause)->toString(field);
    }
    buffer << L"])" << boostString();
    return buffer.str();
}
String NumericRangeQuery::toString(const String& field) {
    StringStream buffer;
    if (this->field != field) {
        buffer << this->field << L":";
    }
    buffer << (minInclusive ? L"[" : L"{");
    if (VariantUtils::isNull(min)) {
        buffer << L"*";
    } else {
        buffer << min;
    }
    buffer << L" TO ";
    if (VariantUtils::isNull(max)) {
        buffer << L"*";
    } else {
        buffer << max;
    }
    buffer << (maxInclusive ? L"]" : L"}");
    buffer << boostString();
    return buffer.str();
}
String SpanNotQuery::toString(const String& field) {
    StringStream buffer;
    buffer << L"spanNot(" << include->toString(field) << L", " << exclude->toString(field) << L")";
    buffer << boostString();
    return buffer.str();
}
 String FilteredQuery::toString(const String& field)
 {
     StringStream buffer;
     buffer << L"filtered(" << query->toString(field) << L")->" << filter->toString() << boostString();
     return buffer.str();
 }