protected EvalNode visitCaseWhen(CONTEXT context, CaseWhenEval evalNode, Stack<EvalNode> stack) { stack.push(evalNode); for (CaseWhenEval.IfThenEval ifThenEval : evalNode.getIfThenEvals()) { visitIfThen(context, ifThenEval, stack); } if (evalNode.hasElse()) { visit(context, evalNode.getElse(), stack); } stack.pop(); return evalNode; }
@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; }
for (CaseWhenEval.IfThenEval ifThen : caseWhenEval.getIfThenEvals()) { ifThen.setResult(convertType(ctx, ifThen.getResult(), toType)); if (caseWhenEval.hasElse()) { caseWhenEval.setElseResult(convertType(ctx, caseWhenEval.getElse(), toType));
EvalNode commonTerm = extractCommonTerm(caseWhen.getIfThenEvals()); int casesNum = caseWhen.getIfThenEvals().size(); List<CaseWhenEval.IfThenEval> ifThenList = caseWhen.getIfThenEvals(); TajoGeneratorAdapter.SwitchCase[] cases = new TajoGeneratorAdapter.SwitchCase[casesNum]; for (int i = 0; i < caseWhen.getIfThenEvals().size(); i++) { int key = getSwitchIndex(ifThenList.get(i).getCondition()); EvalNode result = ifThenList.get(i).getResult(); cases[i] = new TajoGeneratorAdapter.SwitchCase(key, result); CaseWhenSwitchGenerator gen = new CaseWhenSwitchGenerator(codeGen, context, stack, cases, caseWhen.getElse()); codeGen.visit(context, caseWhen.getElse(), stack); int casesNum = caseWhen.getIfThenEvals().size(); Label [] labels = new Label[casesNum - 1]; CaseWhenEval.IfThenEval ifThenEval = caseWhen.getIfThenEvals().get(i); if (caseWhen.hasElse()) { stack.push(caseWhen); codeGen.visit(context, caseWhen.getElse(), stack); stack.pop(); context.gotoLabel(afterAll); context.pushDummyValue(caseWhen.getValueType()); context.pushNullFlag(false);
if (caseWhen.hasElse() && caseWhen.getElse().equals(evalNode)) { caseWhen.setElseResult(tobeReplaced);
CaseWhenEval caseWhenEval = new CaseWhenEval(); caseWhenEval.addIfCond(new CaseWhenEval.IfThenEval(binEval, new ConstEval(DatumFactory.createInt4(1)))); try { caseWhenEval.eval(null); fail("EvalNode is not binded"); } catch (IllegalStateException e) { assertEquals(caseWhenEval.bind(null, null).eval(null).asInt4(), 1);
CaseWhenEval caseWhenEval = new CaseWhenEval(); for (int i = 0; i < caseWhenProto.getIfCondsCount(); i++) { caseWhenEval.addIfCond((CaseWhenEval.IfThenEval) evalNodeMap.get(caseWhenProto.getIfConds(i))); caseWhenEval.setElseResult(evalNodeMap.get(caseWhenProto.getElse()));
@Override public EvalNode visitCaseWhen(EvalTreeProtoBuilderContext context, CaseWhenEval caseWhen, Stack<EvalNode> stack) { // visiting and registering childs super.visitCaseWhen(context, caseWhen, stack); int [] childIds = registerGetChildIds(context, caseWhen); Preconditions.checkState(childIds.length > 0, "Case When must have at least one child, but there is no child"); // building itself PlanProto.CaseWhenEval.Builder caseWhenBuilder = PlanProto.CaseWhenEval.newBuilder(); int ifCondsNum = childIds.length - (caseWhen.hasElse() ? 1 : 0); for (int i = 0; i < ifCondsNum; i++) { caseWhenBuilder.addIfConds(childIds[i]); } if (caseWhen.hasElse()) { caseWhenBuilder.setElse(childIds[childIds.length - 1]); } // registering itself and building EvalNode PlanProto.EvalNode.Builder builder = createEvalBuilder(context, caseWhen); builder.setCasewhen(caseWhenBuilder); context.treeBuilder.addNodes(builder); return caseWhen; }
context.pushDummyValue(caseWhen.getValueType()); } else { throw new CompilationError("Cannot find matched type in the stack: " + constEval);
for (CaseWhenEval.IfThenEval ifThen : caseWhenEval.getIfThenEvals()) { ifThen.setResult(convertType(ctx, ifThen.getResult(), toType)); if (caseWhenEval.hasElse()) { caseWhenEval.setElseResult(convertType(ctx, caseWhenEval.getElse(), toType));
EvalNode commonTerm = extractCommonTerm(caseWhen.getIfThenEvals()); int casesNum = caseWhen.getIfThenEvals().size(); List<CaseWhenEval.IfThenEval> ifThenList = caseWhen.getIfThenEvals(); TajoGeneratorAdapter.SwitchCase[] cases = new TajoGeneratorAdapter.SwitchCase[casesNum]; for (int i = 0; i < caseWhen.getIfThenEvals().size(); i++) { int key = getSwitchIndex(ifThenList.get(i).getCondition()); EvalNode result = ifThenList.get(i).getResult(); cases[i] = new TajoGeneratorAdapter.SwitchCase(key, result); CaseWhenSwitchGenerator gen = new CaseWhenSwitchGenerator(codeGen, context, stack, cases, caseWhen.getElse()); codeGen.visit(context, caseWhen.getElse(), stack); int casesNum = caseWhen.getIfThenEvals().size(); Label [] labels = new Label[casesNum - 1]; CaseWhenEval.IfThenEval ifThenEval = caseWhen.getIfThenEvals().get(i); if (caseWhen.hasElse()) { stack.push(caseWhen); codeGen.visit(context, caseWhen.getElse(), stack); stack.pop(); context.gotoLabel(afterAll); context.pushDummyValue(caseWhen.getValueType()); context.pushNullFlag(false);
if (caseWhen.hasElse() && caseWhen.getElse().equals(evalNode)) { caseWhen.setElseResult(tobeReplaced);
CaseWhenEval caseWhenEval = new CaseWhenEval(); for (int i = 0; i < caseWhenProto.getIfCondsCount(); i++) { caseWhenEval.addIfCond((CaseWhenEval.IfThenEval) evalNodeMap.get(caseWhenProto.getIfConds(i))); caseWhenEval.setElseResult(evalNodeMap.get(caseWhenProto.getElse()));
@Override public EvalNode visitCaseWhen(EvalTreeProtoBuilderContext context, CaseWhenEval caseWhen, Stack<EvalNode> stack) { // visiting and registering childs super.visitCaseWhen(context, caseWhen, stack); int [] childIds = registerGetChildIds(context, caseWhen); Preconditions.checkState(childIds.length > 0, "Case When must have at least one child, but there is no child"); // building itself PlanProto.CaseWhenEval.Builder caseWhenBuilder = PlanProto.CaseWhenEval.newBuilder(); int ifCondsNum = childIds.length - (caseWhen.hasElse() ? 1 : 0); for (int i = 0; i < ifCondsNum; i++) { caseWhenBuilder.addIfConds(childIds[i]); } if (caseWhen.hasElse()) { caseWhenBuilder.setElse(childIds[childIds.length - 1]); } // registering itself and building EvalNode PlanProto.EvalNode.Builder builder = createEvalBuilder(context, caseWhen); builder.setCasewhen(caseWhenBuilder); context.treeBuilder.addNodes(builder); return caseWhen; }
context.pushDummyValue(caseWhen.getValueType()); } else { throw new CompilationError("Cannot find matched type in the stack: " + constEval);
protected EvalNode visitCaseWhen(CONTEXT context, CaseWhenEval evalNode, Stack<EvalNode> stack) { stack.push(evalNode); for (CaseWhenEval.IfThenEval ifThenEval : evalNode.getIfThenEvals()) { visitIfThen(context, ifThenEval, stack); } if (evalNode.hasElse()) { visit(context, evalNode.getElse(), stack); } stack.pop(); return evalNode; }
@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 RESULT visitCaseWhen(CONTEXT context, CaseWhenEval evalNode, Stack<EvalNode> stack) { RESULT result = null; stack.push(evalNode); for (CaseWhenEval.IfThenEval ifThenEval : evalNode.getIfThenEvals()) { result = visitIfThen(context, ifThenEval, stack); } if (evalNode.hasElse()) { result = visit(context, evalNode.getElse(), stack); } stack.pop(); return result; }
@Override public RESULT visitCaseWhen(CONTEXT context, CaseWhenEval evalNode, Stack<EvalNode> stack) { RESULT result = null; stack.push(evalNode); for (CaseWhenEval.IfThenEval ifThenEval : evalNode.getIfThenEvals()) { result = visitIfThen(context, ifThenEval, stack); } if (evalNode.hasElse()) { result = visit(context, evalNode.getElse(), stack); } stack.pop(); return result; }
@Override protected EvalNode visitCaseWhen(Context context, CaseWhenEval evalNode, Stack<EvalNode> stack) { stack.push(evalNode); context.append("CASE"); for (CaseWhenEval.IfThenEval ifThenEval : evalNode.getIfThenEvals()) { visitIfThen(context, ifThenEval, stack); } context.append("ELSE"); if (evalNode.hasElse()) { visit(context, evalNode.getElse(), stack); } stack.pop(); context.append("END"); return evalNode; }