@Override public void visit(Function function) { // all aggregate functions (SUM, AVG, COUNT, MAX, MIN) have only one parameter (Expression) // although COUNT(*) has no parameters // EXTRACT_YEAR has one parameter // if you change this method, NameProjectVisitor.visit(Function) has to be changed as well ExpressionList params = function.getParameters(); int numParams = 0; if (params != null) { params.accept(this); // in order to determine the size List<Expression> listParams = params.getExpressions(); numParams = listParams.size(); } List<ValueExpression> expressions = new ArrayList<ValueExpression>(); for (int i = 0; i < numParams; i++) { expressions.add(_exprStack.pop()); } Collections.reverse(expressions); // at the stack top is the lastly added VE String fnName = function.getName(); if (fnName.equalsIgnoreCase("EXTRACT_YEAR")) { if (numParams != 1) { throw new RuntimeException("EXTRACT_YEAR function has exactly one parameter!"); } ValueExpression expr = expressions.get(0); ValueExpression ve = new IntegerYearFromDate(expr); _exprStack.push(ve); } }
public void visit(Function function) throws Exception { if (function.getParameters() == null) return; for (Expression exp : function.getParameters().getExpressions()) { exp.accept(this); } }