in solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java [726:883]
public List<Clause> splitIntoClauses(String s, boolean ignoreQuote) {
ArrayList<Clause> lst = new ArrayList<>(4);
Clause clause;
int pos = 0;
int end = s.length();
char ch = 0;
int start;
boolean disallowUserField;
while (pos < end) {
clause = new Clause();
disallowUserField = true;
ch = s.charAt(pos);
while (Character.isWhitespace(ch)) {
if (++pos >= end) break;
ch = s.charAt(pos);
}
start = pos;
if ((ch == '+' || ch == '-') && (pos + 1) < end) {
clause.must = ch;
pos++;
}
clause.field = getFieldName(s, pos, end);
if (clause.field != null && !config.userFields.isAllowed(clause.field)) {
clause.field = null;
}
if (clause.field != null) {
disallowUserField = false;
int colon = s.indexOf(':', pos);
clause.rawField = s.substring(pos, colon);
pos += colon - pos; // skip the field name
pos++; // skip the ':'
}
if (pos >= end) break;
char inString = 0;
ch = s.charAt(pos);
if (!ignoreQuote && ch == '"') {
clause.isPhrase = true;
inString = '"';
pos++;
}
StringBuilder sb = new StringBuilder();
while (pos < end) {
ch = s.charAt(pos++);
if (ch == '\\') { // skip escaped chars, but leave escaped
sb.append(ch);
if (pos >= end) {
sb.append(ch); // double backslash if we are at the end of the string
break;
}
ch = s.charAt(pos++);
sb.append(ch);
continue;
} else if (inString != 0 && ch == inString) {
inString = 0;
break;
} else if (Character.isWhitespace(ch)) {
clause.hasWhitespace = true;
if (inString == 0) {
// end of the token if we aren't in a string, backing
// up the position.
pos--;
break;
}
}
if (inString == 0) {
if (!ignoreQuote && ch == '"') {
// end of the token if we aren't in a string, backing
// up the position.
pos--;
break;
}
switch (ch) {
case '!':
case '(':
case ')':
case ':':
case '^':
case '[':
case ']':
case '{':
case '}':
case '~':
case '*':
case '?':
case '"':
case '+':
case '-':
case '\\':
case '|':
case '&':
case '/':
clause.hasSpecialSyntax = true;
sb.append('\\');
}
} else if (ch == '"') {
// only char we need to escape in a string is double quote
sb.append('\\');
}
sb.append(ch);
}
clause.val = sb.toString();
if (clause.isPhrase) {
if (inString != 0) {
// detected bad quote balancing... retry
// parsing with quotes like any other char
return splitIntoClauses(s, true);
}
// special syntax in a string isn't special
clause.hasSpecialSyntax = false;
} else {
// an empty clause... must be just a + or - on its own
if (clause.val.length() == 0) {
clause.syntaxError = true;
if (clause.must != 0) {
clause.val = "\\" + clause.must;
clause.must = 0;
clause.hasSpecialSyntax = true;
} else {
// uh.. this shouldn't happen.
clause = null;
}
}
}
if (clause != null) {
if (disallowUserField) {
clause.raw = s.substring(start, pos);
// escape colons, except for "match all" query
if (!"*:*".equals(clause.raw)) {
clause.raw = clause.raw.replaceAll("([^\\\\]):", "$1\\\\:");
}
} else {
clause.raw = s.substring(start, pos);
// Add default userField boost if no explicit boost exists
if (config.userFields.isAllowed(clause.field) && !clause.raw.contains("^")) {
Float boost = config.userFields.getBoost(clause.field);
if (boost != null) clause.raw += "^" + boost;
}
}
lst.add(clause);
}
}
return lst;
}