@Override protected EvalNode visitCaseWhen(Object o, CaseWhenEval evalNode, Stack<EvalNode> stack) { stack.push(evalNode); CaseWhenPredicate caseWhenPredicate = new CaseWhenPredicate(); for (CaseWhenEval.IfThenEval ifThenEval : evalNode.getIfThenEvals()) { visit(o, ifThenEval.getCondition(), stack); Expr condition = exprs.pop(); visit(o, ifThenEval.getResult(), stack); Expr result = exprs.pop(); caseWhenPredicate.addWhen(condition, result); } if (evalNode.hasElse()) { visit(o, evalNode.getElse(), stack); Expr elseResult = exprs.pop(); caseWhenPredicate.setElseResult(elseResult); } exprs.push(caseWhenPredicate); stack.pop(); return null; } }
public void addIfCond(EvalNode condition, EvalNode result) { whens.add(new IfThenEval(condition, result)); }
@Override public Object clone() throws CloneNotSupportedException { CaseWhenEval caseWhenEval = (CaseWhenEval) super.clone(); caseWhenEval.whens = new ArrayList<>(); for (IfThenEval ifThenEval : whens) { caseWhenEval.whens.add((IfThenEval) ifThenEval.clone()); } caseWhenEval.elseResult = elseResult; return caseWhenEval; }
current = new CaseWhenEval.IfThenEval(evalNodeMap.get(ifCondProto.getCondition()), evalNodeMap.get(ifCondProto.getThen()));
current = new CaseWhenEval.IfThenEval(evalNodeMap.get(ifCondProto.getCondition()), evalNodeMap.get(ifCondProto.getThen()));
int key = getSwitchIndex(ifThenList.get(i).getCondition()); EvalNode result = ifThenList.get(i).getResult(); cases[i] = new TajoGeneratorAdapter.SwitchCase(key, result); codeGen.visit(context, ifThenEval.getCondition(), stack); int NULL_FLAG = context.istore(); int CHILD = context.store(ifThenEval.getCondition().getValueType()); context.load(ifThenEval.getCondition().getValueType(), CHILD); context.methodvisitor.visitJumpInsn(Opcodes.IF_ICMPNE, (casesNum - 1) < i ? labels[i] : defaultLabel); // false codeGen.visit(context, ifThenEval.getResult(), stack); context.gotoLabel(afterAll); stack.pop();
int key = getSwitchIndex(ifThenList.get(i).getCondition()); EvalNode result = ifThenList.get(i).getResult(); cases[i] = new TajoGeneratorAdapter.SwitchCase(key, result); codeGen.visit(context, ifThenEval.getCondition(), stack); int NULL_FLAG = context.istore(); int CHILD = context.store(ifThenEval.getCondition().getValueType()); context.load(ifThenEval.getCondition().getValueType(), CHILD); context.methodvisitor.visitJumpInsn(Opcodes.IF_ICMPNE, (casesNum - 1) < i ? labels[i] : defaultLabel); // false codeGen.visit(context, ifThenEval.getResult(), stack); context.gotoLabel(afterAll); stack.pop();
if (ifThen.getCondition().equals(evalNode)) { ifThen.setCondition(tobeReplaced); if (ifThen.getResult().equals(evalNode)) { ifThen.setResult(tobeReplaced);
if (ifThen.getCondition().equals(evalNode)) { ifThen.setCondition(tobeReplaced); if (ifThen.getResult().equals(evalNode)) { ifThen.setResult(tobeReplaced);
caseWhenEval.addIfCond(new CaseWhenEval.IfThenEval(binEval, new ConstEval(DatumFactory.createInt4(1)))); try { caseWhenEval.eval(null);
@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; }
private static EvalNode extractCommonTerm(List<CaseWhenEval.IfThenEval> ifThenEvals) { EvalNode commonTerm = null; for (CaseWhenEval.IfThenEval ifThenEval : ifThenEvals) { EvalNode predicate = ifThenEval.getCondition(); if (!checkIfSimplePredicate(predicate)) { return null; } BinaryEval bin = (BinaryEval) predicate; EvalNode baseTerm; if (bin.getLeftExpr().getType() == EvalType.CONST) { baseTerm = bin.getRightExpr(); } else { baseTerm = bin.getLeftExpr(); } if (commonTerm == null) { commonTerm = baseTerm; } else { if (!baseTerm.equals(commonTerm)) { return null; } } } return commonTerm; }
@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; }
private static EvalNode extractCommonTerm(List<CaseWhenEval.IfThenEval> ifThenEvals) { EvalNode commonTerm = null; for (int i = 0; i < ifThenEvals.size(); i++) { EvalNode predicate = ifThenEvals.get(i).getCondition(); if (!checkIfSimplePredicate(predicate)) { return null; } BinaryEval bin = (BinaryEval) predicate; EvalNode baseTerm; if (bin.getLeftExpr().getType() == EvalType.CONST) { baseTerm = bin.getRightExpr(); } else { baseTerm = bin.getLeftExpr(); } if (commonTerm == null) { commonTerm = baseTerm; } else { if (!baseTerm.equals(commonTerm)) { return null; } } } return commonTerm; }
@Override public boolean equals(Object obj) { if (obj instanceof CaseWhenEval) { CaseWhenEval other = (CaseWhenEval) obj; for (int i = 0; i < other.whens.size(); i++) { if (!whens.get(i).equals(other.whens.get(i))) { return false; } } return TUtil.checkEquals(elseResult, other.elseResult); } else { return false; } }
@Override @SuppressWarnings("unchecked") public Datum eval(Tuple tuple) { super.eval(tuple); for (IfThenEval eval : whens) { if (eval.checkIfCondition(tuple)) { return eval.eval(tuple); } } if (elseResult != null) { // without else clause return elseResult.eval(tuple); } return NullDatum.get(); }
@Override @SuppressWarnings("unchecked") public Datum eval(Tuple tuple) { super.eval(tuple); for (IfThenEval eval : whens) { if (eval.checkIfCondition(tuple)) { return eval.eval(tuple); } } if (elseResult != null) { // without else clause return elseResult.eval(tuple); } return NullDatum.get(); }
@Override public boolean equals(Object obj) { if (obj instanceof CaseWhenEval) { CaseWhenEval other = (CaseWhenEval) obj; for (int i = 0; i < other.whens.size(); i++) { if (!whens.get(i).equals(other.whens.get(i))) { return false; } } return TUtil.checkEquals(elseResult, other.elseResult); } else { return false; } }