package org.araqne.logdb.query.parser;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
import org.araqne.logdb.QueryParseException;
import org.araqne.logdb.query.expr.Add;
import org.araqne.logdb.query.expr.And;
import org.araqne.logdb.query.expr.Comma;
import org.araqne.logdb.query.expr.Div;
import org.araqne.logdb.query.expr.Eq;
import org.araqne.logdb.query.expr.Expression;
import org.araqne.logdb.query.expr.Gt;
import org.araqne.logdb.query.expr.Gte;
import org.araqne.logdb.query.expr.Lt;
import org.araqne.logdb.query.expr.Lte;
import org.araqne.logdb.query.expr.Mul;
import org.araqne.logdb.query.expr.Neg;
import org.araqne.logdb.query.expr.Neq;
import org.araqne.logdb.query.expr.Or;
import org.araqne.logdb.query.expr.Sub;
public class EvalOpEmitterFactory implements OpEmitterFactory {
@Override
public void emit(Stack<Expression> exprStack, Term term) {
EvalOpTerm op = (EvalOpTerm) term;
// is unary op?
if (op.isUnary()) {
Expression expr = exprStack.pop();
exprStack.add(new Neg(expr));
return;
}
// reversed order by stack
if (exprStack.size() < 2){
// throw new QueryParseException("broken-expression", -1, "operator is [" + op + "]");
Map<String, String> params = new HashMap<String, String > ();
params.put("option", op.toString());
throw new QueryParseException("90100", -1, -1, params);
}
Expression rhs = exprStack.pop();
Expression lhs = exprStack.pop();
switch (op) {
case Add:
exprStack.add(new Add(lhs, rhs));
break;
case Sub:
exprStack.add(new Sub(lhs, rhs));
break;
case Mul:
exprStack.add(new Mul(lhs, rhs));
break;
case Div:
exprStack.add(new Div(lhs, rhs));
break;
case Gte:
exprStack.add(new Gte(lhs, rhs));
break;
case Lte:
exprStack.add(new Lte(lhs, rhs));
break;
case Lt:
exprStack.add(new Lt(lhs, rhs));
break;
case Gt:
exprStack.add(new Gt(lhs, rhs));
break;
case And:
exprStack.add(new And(lhs, rhs));
break;
case Or:
exprStack.add(new Or(lhs, rhs));
break;
case Eq:
exprStack.add(new Eq(lhs, rhs));
break;
case Neq:
exprStack.add(new Neq(lhs, rhs));
break;
case Comma:
exprStack.add(new Comma(lhs, rhs));
break;
case ListEndComma:
exprStack.add(new Comma(lhs, rhs, true));
break;
default:
// throw new QueryParseException("unsupported operator", -1, op + " is not supported");
Map<String, String> params = new HashMap<String, String > ();
params.put("op", op.toString());
throw new QueryParseException("90101", -1, -1, params);
}
}
}