private List<Target> buildTargets(PlanContext context, String[] referenceNames) throws TajoException { QueryBlock block = context.queryBlock; List<Target> targets = new ArrayList<>(); for (String refName : referenceNames) { if (block.isConstReference(refName)) { targets.add(new Target(block.getConstByReference(refName), refName)); } else if (block.namedExprsMgr.isEvaluated(refName)) { targets.add(block.namedExprsMgr.getTarget(refName)); } else { NamedExpr namedExpr = block.namedExprsMgr.getNamedExpr(refName); EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_AND_SUBEXPRS); block.namedExprsMgr.markAsEvaluated(refName, evalNode); targets.add(new Target(evalNode, refName)); } } return targets; }
@Override public EvalNode visitUnaryEval(LogicalPlanner.PlanContext context, UnaryEval unaryEval, Stack<EvalNode> stack) { stack.push(unaryEval); if (unaryEval.getChild().getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) unaryEval.getChild(); if (context.getQueryBlock().isConstReference(fieldEval.getName())) { unaryEval.setChild(context.getQueryBlock().getConstByReference(fieldEval.getName())); stack.pop(); return unaryEval; } } visit(context, unaryEval.getChild(), stack); stack.pop(); return unaryEval; }
@Override public EvalNode visitUnaryEval(LogicalPlanner.PlanContext context, UnaryEval unaryEval, Stack<EvalNode> stack) { stack.push(unaryEval); if (unaryEval.getChild().getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) unaryEval.getChild(); if (context.getQueryBlock().isConstReference(fieldEval.getName())) { unaryEval.setChild(context.getQueryBlock().getConstByReference(fieldEval.getName())); stack.pop(); return unaryEval; } } visit(context, unaryEval.getChild(), stack); stack.pop(); return unaryEval; }
if (!windowFuncIndices.contains(i)) { if (block.isConstReference(referenceNames[i])) { targets.add(new Target(block.getConstByReference(referenceNames[i]), referenceNames[i])); } else { targets.add(block.namedExprsMgr.getTarget(referenceNames[i]));
if (!windowFuncIndices.contains(i)) { if (block.isConstReference(referenceNames[i])) { targets[targetIdx++] = new Target(block.getConstByReference(referenceNames[i]), referenceNames[i]); } else { targets[targetIdx++] = block.namedExprsMgr.getTarget(referenceNames[i]);
private Target [] buildTargets(PlanContext context, String[] referenceNames) throws TajoException { QueryBlock block = context.queryBlock; Target [] targets = new Target[referenceNames.length]; for (int i = 0; i < referenceNames.length; i++) { String refName = referenceNames[i]; if (block.isConstReference(refName)) { targets[i] = new Target(block.getConstByReference(refName), refName); } else if (block.namedExprsMgr.isEvaluated(refName)) { targets[i] = block.namedExprsMgr.getTarget(refName); } else { NamedExpr namedExpr = block.namedExprsMgr.getNamedExpr(refName); EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_AND_SUBEXPRS); block.namedExprsMgr.markAsEvaluated(refName, evalNode); targets[i] = new Target(evalNode, refName); } } return targets; }
@Override public EvalNode visitFuncCall(LogicalPlanner.PlanContext context, FunctionEval function, Stack<EvalNode> stack) { stack.push(function); for (int i = 0; i < function.getArgs().length; i++) { if (function.getArgs()[i].getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) function.getArgs()[i]; if (context.getQueryBlock().isConstReference(fieldEval.getName())) { function.setArg(i, context.getQueryBlock().getConstByReference(fieldEval.getName())); continue; } } visit(context, function.getArgs()[i], stack); } stack.pop(); return function; } }
@Override public EvalNode visitFuncCall(LogicalPlanner.PlanContext context, FunctionEval function, Stack<EvalNode> stack) { stack.push(function); for (int i = 0; i < function.getArgs().length; i++) { if (function.getArgs()[i].getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) function.getArgs()[i]; if (context.getQueryBlock().isConstReference(fieldEval.getName())) { function.setArg(i, context.getQueryBlock().getConstByReference(fieldEval.getName())); continue; } } visit(context, function.getArgs()[i], stack); } stack.pop(); return function; } }
@Override public EvalNode visitBinaryEval(LogicalPlanner.PlanContext context, Stack<EvalNode> stack, BinaryEval binaryEval) { stack.push(binaryEval); for (int i = 0; i < 2; i++) { if (binaryEval.getChild(i).getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) binaryEval.getChild(i); if (context.getQueryBlock().isConstReference(fieldEval.getName())) { binaryEval.setChild(i, context.getQueryBlock().getConstByReference(fieldEval.getName())); continue; } } visit(context, binaryEval.getChild(i), stack); } stack.pop(); return binaryEval; }
@Override public EvalNode visitBinaryEval(LogicalPlanner.PlanContext context, Stack<EvalNode> stack, BinaryEval binaryEval) { stack.push(binaryEval); for (int i = 0; i < 2; i++) { if (binaryEval.getChild(i).getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) binaryEval.getChild(i); if (context.getQueryBlock().isConstReference(fieldEval.getName())) { binaryEval.setChild(i, context.getQueryBlock().getConstByReference(fieldEval.getName())); continue; } } visit(context, binaryEval.getChild(i), stack); } stack.pop(); return binaryEval; }
@Override public EvalNode optimize(LogicalPlanner.PlanContext context, EvalNode evalNode) { if (evalNode.getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) evalNode; // if a reference points to a const value if (context.getQueryBlock().isConstReference(fieldEval.getName())) { return context.getQueryBlock().getConstByReference(fieldEval.getName()); } else { return evalNode; // otherwise, it just returns. } } else { return visit(context, evalNode, new Stack<EvalNode>()); } }
@Override public EvalNode optimize(LogicalPlanner.PlanContext context, EvalNode evalNode) { if (evalNode.getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) evalNode; // if a reference points to a const value if (context.getQueryBlock().isConstReference(fieldEval.getName())) { return context.getQueryBlock().getConstByReference(fieldEval.getName()); } else { return evalNode; // otherwise, it just returns. } } else { return visit(context, evalNode, new Stack<>()); } }