package org.araqne.logdb.query.parser;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import org.araqne.logdb.FunctionRegistry;
import org.araqne.logdb.QueryContext;
import org.araqne.logdb.query.expr.Comma;
import org.araqne.logdb.query.expr.Expression;
import org.araqne.logdb.query.parser.ExpressionParser.FuncTerm;
public class EvalFuncEmitterFactory implements FuncEmitterFactory {
private FunctionRegistry functionRegistry;
public EvalFuncEmitterFactory(FunctionRegistry functionRegistry) {
this.functionRegistry = functionRegistry;
}
@Override
public void emit(QueryContext context, Stack<Expression> exprStack, FuncTerm f) {
if (functionRegistry == null)
throw new IllegalStateException("function registry not set");
List<Expression> args = getArgsFromStack(f, exprStack);
Expression func = functionRegistry.newFunction(context, f.getName(), args);
exprStack.add(func);
}
private List<Expression> getArgsFromStack(FuncTerm f, Stack<Expression> exprStack) {
List<Expression> exprs = null;
if (exprStack.isEmpty() || !f.hasArgument())
return new ArrayList<Expression>();
Expression arg = exprStack.pop();
if (arg instanceof Comma) {
exprs = ((Comma) arg).getList();
} else {
exprs = new ArrayList<Expression>();
exprs.add(arg);
}
return exprs;
}
}