@Override public Object visitCaseWhen(ExprNormalizedResult ctx, Stack<Expr> stack, CaseWhenPredicate expr) throws TajoException { stack.push(expr); for (CaseWhenPredicate.WhenExpr when : expr.getWhens()) { visit(ctx, stack, when.getCondition()); visit(ctx, stack, when.getResult()); if (OpType.isAggregationFunction(when.getCondition().getType())) { String referenceName = ctx.block.namedExprsMgr.addExpr(when.getCondition()); ctx.aggExprs.add(new NamedExpr(when.getCondition(), referenceName)); when.setCondition(new ColumnReferenceExpr(referenceName)); } if (OpType.isAggregationFunction(when.getResult().getType())) { String referenceName = ctx.block.namedExprsMgr.addExpr(when.getResult()); ctx.aggExprs.add(new NamedExpr(when.getResult(), referenceName)); when.setResult(new ColumnReferenceExpr(referenceName)); } } if (expr.hasElseResult()) { visit(ctx, stack, expr.getElseResult()); if (OpType.isAggregationFunction(expr.getElseResult().getType())) { String referenceName = ctx.block.namedExprsMgr.addExpr(expr.getElseResult()); ctx.aggExprs.add(new NamedExpr(expr.getElseResult(), referenceName)); expr.setElseResult(new ColumnReferenceExpr(referenceName)); } } stack.pop(); return expr; }
@Override public Object visitCaseWhen(ExprNormalizedResult ctx, Stack<Expr> stack, CaseWhenPredicate expr) throws TajoException { stack.push(expr); for (CaseWhenPredicate.WhenExpr when : expr.getWhens()) { visit(ctx, stack, when.getCondition()); visit(ctx, stack, when.getResult()); if (OpType.isAggregationFunction(when.getCondition().getType())) { String referenceName = ctx.block.namedExprsMgr.addExpr(when.getCondition()); ctx.aggExprs.add(new NamedExpr(when.getCondition(), referenceName)); when.setCondition(new ColumnReferenceExpr(referenceName)); } if (OpType.isAggregationFunction(when.getResult().getType())) { String referenceName = ctx.block.namedExprsMgr.addExpr(when.getResult()); ctx.aggExprs.add(new NamedExpr(when.getResult(), referenceName)); when.setResult(new ColumnReferenceExpr(referenceName)); } } if (expr.hasElseResult()) { visit(ctx, stack, expr.getElseResult()); if (OpType.isAggregationFunction(expr.getElseResult().getType())) { String referenceName = ctx.block.namedExprsMgr.addExpr(expr.getElseResult()); ctx.aggExprs.add(new NamedExpr(expr.getElseResult(), referenceName)); expr.setElseResult(new ColumnReferenceExpr(referenceName)); } } stack.pop(); return expr; }