visit(ctx, stack, when.getCondition()); condition = queries.pop(); visit(ctx, stack, when.getResult());
@Override public RESULT visitCaseWhen(CONTEXT ctx, Stack<Expr> stack, CaseWhenPredicate expr) throws TajoException { stack.push(expr); RESULT result = null; for (CaseWhenPredicate.WhenExpr when : expr.getWhens()) { result = visit(ctx, stack, when.getCondition()); visit(ctx, stack, when.getResult()); } if (expr.hasElseResult()) { visit(ctx, stack, expr.getElseResult()); } stack.pop(); return result; }
@Override public RESULT visitCaseWhen(CONTEXT ctx, Stack<Expr> stack, CaseWhenPredicate expr) throws TajoException { stack.push(expr); RESULT result = null; for (CaseWhenPredicate.WhenExpr when : expr.getWhens()) { result = visit(ctx, stack, when.getCondition()); visit(ctx, stack, when.getResult()); } if (expr.hasElseResult()) { visit(ctx, stack, expr.getElseResult()); } stack.pop(); return result; }
caseWhen.getWhens().toArray(whenExprs); BinaryOperator condition = (BinaryOperator) whenExprs[0].getCondition(); assertEquals(OpType.GreaterThan, condition.getType());
@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; }
@Override public EvalNode visitCaseWhen(Context ctx, Stack<Expr> stack, CaseWhenPredicate caseWhen) throws TajoException { CaseWhenEval caseWhenEval = new CaseWhenEval(); EvalNode condition; EvalNode result; for (CaseWhenPredicate.WhenExpr when : caseWhen.getWhens()) { condition = visit(ctx, stack, when.getCondition()); result = visit(ctx, stack, when.getResult()); caseWhenEval.addIfCond(condition, result); } if (caseWhen.hasElseResult()) { caseWhenEval.setElseResult(visit(ctx, stack, caseWhen.getElseResult())); } // Getting the widest type from all if-then expressions and else expression. DataType widestType = convert(caseWhenEval.getIfThenEvals().get(0).getResult().getValueType()).getDataType(); for (int i = 1; i < caseWhenEval.getIfThenEvals().size(); i++) { widestType = CatalogUtil.getWidestType( convert(caseWhenEval.getIfThenEvals().get(i).getResult().getValueType()).getDataType(), widestType); } if (caseWhen.hasElseResult()) { widestType = CatalogUtil.getWidestType( widestType, convert(caseWhenEval.getElse().getValueType()).getDataType()); } assertEval(widestType != null, "Invalid Type Conversion for CaseWhen"); // implicit type conversion caseWhenEval = (CaseWhenEval) convertType(ctx, caseWhenEval, TypeConverter.convert(widestType)); return caseWhenEval; }
@Override public EvalNode visitCaseWhen(Context ctx, Stack<Expr> stack, CaseWhenPredicate caseWhen) throws TajoException { CaseWhenEval caseWhenEval = new CaseWhenEval(); EvalNode condition; EvalNode result; for (CaseWhenPredicate.WhenExpr when : caseWhen.getWhens()) { condition = visit(ctx, stack, when.getCondition()); result = visit(ctx, stack, when.getResult()); caseWhenEval.addIfCond(condition, result); } if (caseWhen.hasElseResult()) { caseWhenEval.setElseResult(visit(ctx, stack, caseWhen.getElseResult())); } // Getting the widest type from all if-then expressions and else expression. DataType widestType = caseWhenEval.getIfThenEvals().get(0).getResult().getValueType(); for (int i = 1; i < caseWhenEval.getIfThenEvals().size(); i++) { widestType = CatalogUtil.getWidestType(caseWhenEval.getIfThenEvals().get(i).getResult().getValueType(), widestType); } if (caseWhen.hasElseResult()) { widestType = CatalogUtil.getWidestType(widestType, caseWhenEval.getElse().getValueType()); } assertEval(widestType != null, "Invalid Type Conversion for CaseWhen"); // implicit type conversion caseWhenEval = (CaseWhenEval) convertType(ctx, caseWhenEval, widestType); return caseWhenEval; }