/** * Adds an expression and returns a reference name. * @param expr added expression */ public String addExpr(Expr expr) { if (idToExprBiMap.inverse().containsKey(expr)) { int refId = idToExprBiMap.inverse().get(expr); return idToNamesMap.get(refId).get(0); } if (block.isRegisteredConst(expr)) { return block.getConstReference(expr); } String generatedName = plan.generateUniqueColumnName(expr); return addExpr(expr, generatedName); }
/** * Adds an expression and returns a reference name. * @param expr added expression */ public String addExpr(Expr expr) { if (idToExprBiMap.inverse().containsKey(expr)) { int refId = idToExprBiMap.inverse().get(expr); return idToNamesMap.get(refId).get(0); } if (block.isRegisteredConst(expr)) { return block.getConstReference(expr); } String generatedName = plan.generateUniqueColumnName(expr); return addExpr(expr, generatedName); }
@Override public Expr visitFunction(ExprNormalizedResult ctx, Stack<Expr> stack, FunctionExpr expr) throws TajoException { stack.push(expr); Expr param; Expr[] paramExprs = expr.getParams(); if (paramExprs != null) { for (int i = 0; i < paramExprs.length; i++) { param = paramExprs[i]; visit(ctx, stack, param); if (OpType.isAggregationFunction(param.getType())) { String referenceName = ctx.plan.generateUniqueColumnName(param); ctx.aggExprs.add(new NamedExpr(param, referenceName)); expr.getParams()[i] = new ColumnReferenceExpr(referenceName); } } } stack.pop(); return expr; }
@Override public Expr visitFunction(ExprNormalizedResult ctx, Stack<Expr> stack, FunctionExpr expr) throws TajoException { stack.push(expr); Expr param; Expr[] paramExprs = expr.getParams(); if (paramExprs != null) { for (int i = 0; i < paramExprs.length; i++) { param = paramExprs[i]; visit(ctx, stack, param); if (OpType.isAggregationFunction(param.getType())) { String referenceName = ctx.plan.generateUniqueColumnName(param); ctx.aggExprs.add(new NamedExpr(param, referenceName)); expr.getParams()[i] = new ColumnReferenceExpr(referenceName); } } } stack.pop(); return expr; }
/** * Adds an expression without any name. It returns an automatically * generated name. It can be also used for referring this expression. */ public String add(EvalNode evalNode) throws DuplicateColumnException { String name; if (evalNode.getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) evalNode; if (nameToIdBiMap.containsKey(fieldEval.getName())) { int refId = nameToIdBiMap.get(fieldEval.getName()); return getPrimaryName(refId); } } if (idToEvalBiMap.inverse().containsKey(evalNode)) { int refId = idToEvalBiMap.inverse().get(evalNode); return getPrimaryName(refId); } if (evalNode.getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) evalNode; name = fieldEval.getName(); } else { name = plan.generateUniqueColumnName(evalNode); } return add(name, evalNode); }
/** * Adds an expression without any name. It returns an automatically * generated name. It can be also used for referring this expression. */ public String add(EvalNode evalNode) throws DuplicateColumnException { String name; if (evalNode.getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) evalNode; if (nameToIdBiMap.containsKey(fieldEval.getName())) { int refId = nameToIdBiMap.get(fieldEval.getName()); return getPrimaryName(refId); } } if (idToEvalBiMap.inverse().containsKey(evalNode)) { int refId = idToEvalBiMap.inverse().get(evalNode); return getPrimaryName(refId); } if (evalNode.getType() == EvalType.FIELD) { FieldEval fieldEval = (FieldEval) evalNode; name = fieldEval.getName(); } else { name = plan.generateUniqueColumnName(evalNode); } return add(name, evalNode); }
firstPhaseEvalNames[i] = plan.generateUniqueColumnName(firstPhaseEvals.get(i)); FieldEval param = new FieldEval(firstPhaseEvalNames[i], firstPhaseEvals.get(i).getValueType());
/** * It builds non-from statement (only expressions) like '<code>SELECT 1+3 as plus</code>'. */ private EvalExprNode buildPlanForNoneFromStatement(PlanContext context, Stack<Expr> stack, Projection projection) throws TajoException { QueryBlock block = context.queryBlock; List<Target> targets = new ArrayList<>(); for (NamedExpr namedExpr: projection.getNamedExprs()) { Expr expr = namedExpr.getExpr(); EvalNode evalNode = exprAnnotator.createEvalNode(context, expr, NameResolvingMode.RELS_ONLY); String alias = namedExpr.hasAlias() ? namedExpr.getAlias() : context.plan.generateUniqueColumnName(expr); targets.add(new Target(evalNode, alias)); } EvalExprNode evalExprNode = context.queryBlock.getNodeFromExpr(projection); evalExprNode.setTargets(targets); evalExprNode.setOutSchema(PlannerUtil.targetToSchema(targets)); // it's for debugging or unit testing block.setRawTargets(targets); return evalExprNode; }
private List<Target> buildTargets(LogicalPlanner.PlanContext context, List<NamedExpr> exprs) throws TajoException { List<Target> targets = new ArrayList<>(); for (NamedExpr namedExpr : exprs) { TajoDataTypes.DataType dataType = typeDeterminant.determineDataType(context, namedExpr.getExpr()); if (dataType.getType() == RECORD) { throw new NotImplementedException("record projection"); } if (namedExpr.hasAlias()) { targets.add(new Target(new FieldEval(new Column(namedExpr.getAlias(), dataType)))); } else { String generatedName = context.getPlan().generateUniqueColumnName(namedExpr.getExpr()); targets.add(new Target(new FieldEval(new Column(generatedName, dataType)))); } } return targets; }
rewritten.firstStageEvals[0] = createCountFunction(function.getArgs()); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); rewritten.firstStageTargets.add(0, new Target(fieldEval)); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); rewritten.firstStageTargets.add(0, new Target(fieldEval)); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); rewritten.firstStageTargets.add(0, new Target(fieldEval)); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); rewritten.firstStageTargets.add(0, new Target(fieldEval));
for (AggregationFunctionCallEval aggFunction: firstStageGroupbyNode.getAggFunctions()) { aggFunction.setFirstPhase(); String firstEvalNames = plan.generateUniqueColumnName(aggFunction); FieldEval firstEval = new FieldEval(firstEvalNames, aggFunction.getValueType()); firstGroupbyTargets.add(new Target(firstEval));
rewritten.firstStageEvals[0] = createCountFunction(function.getArgs()); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); rewritten.firstStageTargets[0] = new Target(fieldEval); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); rewritten.firstStageTargets[0] = new Target(fieldEval); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); rewritten.firstStageTargets[0] = new Target(fieldEval); String referenceName = plan.generateUniqueColumnName(rewritten.firstStageEvals[0]); FieldEval fieldEval = new FieldEval(referenceName, rewritten.firstStageEvals[0].getValueType()); rewritten.firstStageTargets[0] = new Target(fieldEval);
public List<Integer> normalize(PlanContext context, Projection projection, ExprNormalizedResult [] normalizedExprList, Matcher matcher) throws TajoException { List<Integer> targetIds = new ArrayList<>(); for (int i = 0; i < projection.size(); i++) { NamedExpr namedExpr = projection.getNamedExprs().get(i); if (PlannerUtil.existsAggregationFunction(namedExpr)) { context.queryBlock.setAggregationRequire(); } if (matcher.isMatch(namedExpr.getExpr())) { // If a value is constant value, it adds the constant value with a proper name to the constant map // of the current block if (!namedExpr.hasAlias() && OpType.isLiteralType(namedExpr.getExpr().getType())) { String generatedName = context.plan.generateUniqueColumnName(namedExpr.getExpr()); ConstEval constEval = (ConstEval) exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_ONLY); context.getQueryBlock().addConstReference(generatedName, namedExpr.getExpr(), constEval); normalizedExprList[i] = new ExprNormalizedResult(context, false); normalizedExprList[i].baseExpr = new ColumnReferenceExpr(generatedName); } else { // dissect an expression into multiple parts (at most dissected into three parts) normalizedExprList[i] = normalizer.normalize(context, namedExpr.getExpr()); } targetIds.add(i); } } return targetIds; }
firstPhaseEvalNames[i] = plan.generateUniqueColumnName(firstPhaseEvals[i]); FieldEval param = new FieldEval(firstPhaseEvalNames[i], firstPhaseEvals[i].getValueType());
for (AggregationFunctionCallEval aggFunction: firstStageGroupbyNode.getAggFunctions()) { aggFunction.setFirstPhase(); String firstEvalNames = plan.generateUniqueColumnName(aggFunction); FieldEval firstEval = new FieldEval(firstEvalNames, aggFunction.getValueType()); firstGroupbyTargets.add(new Target(firstEval));
public List<Integer> normalize(PlanContext context, Projection projection, ExprNormalizedResult [] normalizedExprList, Matcher matcher) throws TajoException { List<Integer> targetIds = new ArrayList<Integer>(); for (int i = 0; i < projection.size(); i++) { NamedExpr namedExpr = projection.getNamedExprs()[i]; if (PlannerUtil.existsAggregationFunction(namedExpr)) { context.queryBlock.setAggregationRequire(); } if (matcher.isMatch(namedExpr.getExpr())) { // If a value is constant value, it adds the constant value with a proper name to the constant map // of the current block if (!namedExpr.hasAlias() && OpType.isLiteralType(namedExpr.getExpr().getType())) { String generatedName = context.plan.generateUniqueColumnName(namedExpr.getExpr()); ConstEval constEval = (ConstEval) exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_ONLY); context.getQueryBlock().addConstReference(generatedName, namedExpr.getExpr(), constEval); normalizedExprList[i] = new ExprNormalizedResult(context, false); normalizedExprList[i].baseExpr = new ColumnReferenceExpr(generatedName); } else { // dissect an expression into multiple parts (at most dissected into three parts) normalizedExprList[i] = normalizer.normalize(context, namedExpr.getExpr()); } targetIds.add(i); } } return targetIds; }
/** * It builds non-from statement (only expressions) like '<code>SELECT 1+3 as plus</code>'. */ private EvalExprNode buildPlanForNoneFromStatement(PlanContext context, Stack<Expr> stack, Projection projection) throws TajoException { LogicalPlan plan = context.plan; QueryBlock block = context.queryBlock; int finalTargetNum = projection.getNamedExprs().length; Target [] targets = new Target[finalTargetNum]; for (int i = 0; i < targets.length; i++) { NamedExpr namedExpr = projection.getNamedExprs()[i]; EvalNode evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.RELS_ONLY); if (namedExpr.hasAlias()) { targets[i] = new Target(evalNode, namedExpr.getAlias()); } else { targets[i] = new Target(evalNode, context.plan.generateUniqueColumnName(namedExpr.getExpr())); } } EvalExprNode evalExprNode = context.queryBlock.getNodeFromExpr(projection); evalExprNode.setTargets(targets); evalExprNode.setOutSchema(PlannerUtil.targetToSchema(targets)); // it's for debugging or unit testing block.setRawTargets(targets); return evalExprNode; }
private Target [] buildTargets(LogicalPlanner.PlanContext context, NamedExpr [] exprs) throws TajoException { Target [] targets = new Target[exprs.length]; for (int i = 0; i < exprs.length; i++) { NamedExpr namedExpr = exprs[i]; TajoDataTypes.DataType dataType = typeDeterminant.determineDataType(context, namedExpr.getExpr()); if (namedExpr.hasAlias()) { targets[i] = new Target(new FieldEval(new Column(namedExpr.getAlias(), dataType))); } else { String generatedName = context.getPlan().generateUniqueColumnName(namedExpr.getExpr()); targets[i] = new Target(new FieldEval(new Column(generatedName, dataType))); } } return targets; }