package org.araqne.logdb.query.parser;
import java.util.Stack;
import org.araqne.logdb.query.expr.BooleanConstant;
import org.araqne.logdb.query.expr.EvalField;
import org.araqne.logdb.query.expr.Expression;
import org.araqne.logdb.query.expr.NullConstant;
import org.araqne.logdb.query.expr.NumberConstant;
import org.araqne.logdb.query.expr.StringConstant;
import org.araqne.logdb.query.parser.ExpressionParser.TokenTerm;
public class EvalTermEmitterFactory implements TermEmitterFactory {
@Override
public void emit(Stack<Expression> exprStack, TokenTerm t) {
if (!t.getText().equals("(") && !t.getText().equals(")")) {
String token = ((TokenTerm) t).getText().trim();
Expression expr = parseTokenExpr(exprStack, token);
exprStack.add(expr);
}
}
private Expression parseTokenExpr(Stack<Expression> exprStack, String token) {
// is quoted?
if (token.startsWith("\"") && token.endsWith("\""))
return new StringConstant(token.substring(1, token.length() - 1));
if (token.equals("true") || token.equals("false"))
return new BooleanConstant(Boolean.parseBoolean(token));
if (token.equals("null"))
return new NullConstant();
try {
long v = Long.parseLong(token);
if (Integer.MIN_VALUE <= v && v <= Integer.MAX_VALUE)
return new NumberConstant((int) v);
return new NumberConstant(v);
} catch (NumberFormatException e1) {
try {
double v = Double.parseDouble(token);
return new NumberConstant(v);
} catch (NumberFormatException e2) {
return new EvalField(token);
}
}
}
}