/**
*
*/
package querqy.parser;
import querqy.model.Clause.Occur;
import querqy.model.DisjunctionMaxQuery;
import querqy.model.Query;
import querqy.model.Term;
/**
* A simple QuerqyParser that breaks a query string into clauses at whitespace.
* Clauses are either terms or terms with a boolean operator prefix
* ("+" "-").
*
* @author René Kriegler, @renekrie
*
*/
public class WhiteSpaceQuerqyParser implements QuerqyParser {
enum Status {
DEFAULT, OP, TERM
}
/*
* (non-Javadoc)
*
* @see querqy.parser.QuerqyParser#parse(java.lang.String)
*/
@Override
public Query parse(String input) {
Query query = new Query();
if (input.length() > 0) {
int start = -1;
Status status = Status.DEFAULT;
Occur occur = Occur.SHOULD;
for (int idx = 0, len = input.length(); idx < len; idx++) {
char ch = input.charAt(idx);
switch (ch) {
case ' ':
case '\t':
case '\n':
case '\f':
case '\r':
switch (status) {
case TERM: {
DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(
query, occur, false);
query.addClause(dmq);
Term term = new Term(dmq, input.substring(start, idx));
dmq.addClause(term);
status = Status.DEFAULT;
occur = Occur.SHOULD;
}
break;
case OP: {
DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(
query, Occur.SHOULD, false);
query.addClause(dmq);
Term term = new Term(dmq, occur == Occur.MUST ? "+"
: "-");
dmq.addClause(term);
status = Status.DEFAULT;
occur = Occur.SHOULD;
}
break;
case DEFAULT:
break;
}
break;
case '-':
case '+':
switch (status) {
case DEFAULT:
status = Status.OP;
occur = ch == '+' ? Occur.MUST : Occur.MUST_NOT;
break;
case OP:
status = Status.TERM;
start = idx;
break;
default:
break;
}
break;
default:
if (status != Status.TERM) {
start = idx;
status = Status.TERM;
}
}
}
switch (status) {
case TERM: {
DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(query, occur,
false);
query.addClause(dmq);
Term term = new Term(dmq, input.substring(start));
dmq.addClause(term);
}
break;
case OP: {
DisjunctionMaxQuery dmq = new DisjunctionMaxQuery(
query, Occur.SHOULD, false);
query.addClause(dmq);
Term term = new Term(dmq, occur == Occur.MUST ? "+"
: "-");
dmq.addClause(term);
}
break;
default:
}
}
return query;
}
}