private LogicalNode createCartesianProduct(PlanContext context, LogicalNode left, LogicalNode right) throws TajoException { LogicalPlan plan = context.plan; QueryBlock block = context.queryBlock; Schema merged = SchemaUtil.merge(left.getOutSchema(), right.getOutSchema()); JoinNode join = plan.createNode(JoinNode.class); join.init(JoinType.CROSS, left, right); join.setInSchema(merged); block.addJoinType(join.getJoinType()); EvalNode evalNode; List<String> newlyEvaluatedExprs = new ArrayList<>(); for (Iterator<NamedExpr> it = block.namedExprsMgr.getIteratorForUnevaluatedExprs(); it.hasNext();) { NamedExpr namedExpr = it.next(); try { evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.LEGACY); if (EvalTreeUtil.findDistinctAggFunction(evalNode).size() == 0 && EvalTreeUtil.findWindowFunction(evalNode).size() == 0) { block.namedExprsMgr.markAsEvaluated(namedExpr.getAlias(), evalNode); newlyEvaluatedExprs.add(namedExpr.getAlias()); } } catch (UndefinedColumnException ve) {} } List<Target> targets = new ArrayList<>(PlannerUtil.schemaToTargets(merged)); for (String newAddedExpr : newlyEvaluatedExprs) { targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } join.setTargets(targets); return join; }
private LogicalNode createCartesianProduct(PlanContext context, LogicalNode left, LogicalNode right) throws TajoException { LogicalPlan plan = context.plan; QueryBlock block = context.queryBlock; Schema merged = SchemaUtil.merge(left.getOutSchema(), right.getOutSchema()); JoinNode join = plan.createNode(JoinNode.class); join.init(JoinType.CROSS, left, right); join.setInSchema(merged); block.addJoinType(join.getJoinType()); EvalNode evalNode; List<String> newlyEvaluatedExprs = TUtil.newList(); for (Iterator<NamedExpr> it = block.namedExprsMgr.getIteratorForUnevaluatedExprs(); it.hasNext();) { NamedExpr namedExpr = it.next(); try { evalNode = exprAnnotator.createEvalNode(context, namedExpr.getExpr(), NameResolvingMode.LEGACY); if (EvalTreeUtil.findDistinctAggFunction(evalNode).size() == 0 && EvalTreeUtil.findWindowFunction(evalNode).size() == 0) { block.namedExprsMgr.markAsEvaluated(namedExpr.getAlias(), evalNode); newlyEvaluatedExprs.add(namedExpr.getAlias()); } } catch (UndefinedColumnException ve) {} } List<Target> targets = TUtil.newList(PlannerUtil.schemaToTargets(merged)); for (String newAddedExpr : newlyEvaluatedExprs) { targets.add(block.namedExprsMgr.getTarget(newAddedExpr, true)); } join.setTargets(targets.toArray(new Target[targets.size()])); return join; }
@Override public LogicalNode visitJoin(LogicalPlanner.PlanContext ctx, Stack<Expr> stack, Join expr) throws TajoException { stack.push(expr); LogicalNode left = visit(ctx, stack, expr.getLeft()); LogicalNode right = visit(ctx, stack, expr.getRight()); stack.pop(); JoinNode joinNode = ctx.getPlan().createNode(JoinNode.class); joinNode.setJoinType(expr.getJoinType()); Schema merged = SchemaUtil.merge(left.getOutSchema(), right.getOutSchema()); joinNode.setInSchema(merged); joinNode.setOutSchema(merged); ctx.getQueryBlock().addJoinType(expr.getJoinType()); return joinNode; }
@Override public LogicalNode visitJoin(LogicalPlanner.PlanContext ctx, Stack<Expr> stack, Join expr) throws TajoException { stack.push(expr); LogicalNode left = visit(ctx, stack, expr.getLeft()); LogicalNode right = visit(ctx, stack, expr.getRight()); stack.pop(); JoinNode joinNode = ctx.getPlan().createNode(JoinNode.class); joinNode.setJoinType(expr.getJoinType()); Schema merged = SchemaUtil.merge(left.getOutSchema(), right.getOutSchema()); joinNode.setInSchema(merged); joinNode.setOutSchema(merged); ctx.getQueryBlock().addJoinType(expr.getJoinType()); return joinNode; }
merged = SchemaUtil.merge(left.getOutSchema(), right.getOutSchema()); joinNode.setInSchema(merged);
node.setInSchema(merged);
node.setInSchema(merged);
merged = SchemaUtil.merge(left.getOutSchema(), right.getOutSchema()); joinNode.setInSchema(merged);
@Override public LogicalNode visitJoin(ProcessorContext ctx, Stack<Expr> stack, Join expr) throws TajoException { super.visitJoin(ctx, stack, expr); JoinNode node = getNodeFromExpr(ctx.planContext.getPlan(), expr); LogicalNode leftChild = getNonRelationListExpr(ctx.planContext.getPlan(), expr.getLeft()); LogicalNode rightChild = getNonRelationListExpr(ctx.planContext.getPlan(), expr.getRight()); node.setInSchema(SchemaUtil.merge(leftChild.getOutSchema(), rightChild.getOutSchema())); node.setOutSchema(node.getInSchema()); return node; }
@Override public LogicalNode visitJoin(ProcessorContext ctx, Stack<Expr> stack, Join expr) throws TajoException { super.visitJoin(ctx, stack, expr); JoinNode node = getNodeFromExpr(ctx.planContext.getPlan(), expr); LogicalNode leftChild = getNonRelationListExpr(ctx.planContext.getPlan(), expr.getLeft()); LogicalNode rightChild = getNonRelationListExpr(ctx.planContext.getPlan(), expr.getRight()); node.setInSchema(SchemaUtil.merge(leftChild.getOutSchema(), rightChild.getOutSchema())); node.setOutSchema(node.getInSchema()); return node; }
private static JoinNode convertJoin(OverridableConf context, EvalContext evalContext, Map<Integer, LogicalNode> nodeMap, PlanProto.LogicalNode protoNode) { PlanProto.JoinNode joinProto = protoNode.getJoin(); JoinNode join = new JoinNode(protoNode.getNodeId()); join.setLeftChild(nodeMap.get(joinProto.getLeftChildSeq())); join.setRightChild(nodeMap.get(joinProto.getRightChilSeq())); join.setJoinType(convertJoinType(joinProto.getJoinType())); join.setInSchema(convertSchema(protoNode.getInSchema())); join.setOutSchema(convertSchema(protoNode.getOutSchema())); if (joinProto.hasJoinQual()) { join.setJoinQual(EvalNodeDeserializer.deserialize(context, evalContext, joinProto.getJoinQual())); } if (joinProto.getExistsTargets()) { join.setTargets(convertTargets(context, evalContext, joinProto.getTargetsList())); } return join; }
private static JoinNode convertJoin(OverridableConf context, EvalContext evalContext, Map<Integer, LogicalNode> nodeMap, PlanProto.LogicalNode protoNode) { PlanProto.JoinNode joinProto = protoNode.getJoin(); JoinNode join = new JoinNode(protoNode.getNodeId()); join.setLeftChild(nodeMap.get(joinProto.getLeftChildSeq())); join.setRightChild(nodeMap.get(joinProto.getRightChilSeq())); join.setJoinType(convertJoinType(joinProto.getJoinType())); join.setInSchema(convertSchema(protoNode.getInSchema())); join.setOutSchema(convertSchema(protoNode.getOutSchema())); if (joinProto.hasJoinQual()) { join.setJoinQual(EvalNodeDeserializer.deserialize(context, evalContext, joinProto.getJoinQual())); } if (joinProto.getExistsTargets()) { join.setTargets(convertTargets(context, evalContext, joinProto.getTargetsList())); } return join; }
joinNode.setInSchema(inSchema); joinNode.setOutSchema(node.getOutSchema());
joinNode.setInSchema(inSchema); joinNode.setOutSchema(node.getOutSchema());
@Override public LogicalNode buildPlan(LogicalPlan plan, LogicalPlan.QueryBlock block) { // TODO LogicalNode leftChild = joinEdge.getLeftVertex().buildPlan(plan, block); LogicalNode rightChild = joinEdge.getRightVertex().buildPlan(plan, block); JoinNode joinNode = plan.createNode(JoinNode.class); if (PlannerUtil.isCommutativeJoinType(joinEdge.getJoinType())) { // if only one operator is relation if ((leftChild instanceof RelationNode) && !(rightChild instanceof RelationNode)) { // for left deep joinNode.init(joinEdge.getJoinType(), rightChild, leftChild); } else { // if both operators are relation or if both are relations // we don't need to concern the left-right position. joinNode.init(joinEdge.getJoinType(), leftChild, rightChild); } } else { joinNode.init(joinEdge.getJoinType(), leftChild, rightChild); } Schema mergedSchema = SchemaUtil.merge(joinNode.getLeftChild().getOutSchema(), joinNode.getRightChild().getOutSchema()); joinNode.setInSchema(mergedSchema); joinNode.setOutSchema(mergedSchema); if (joinEdge.hasJoinQual()) { joinNode.setJoinQual(joinEdge.getSingletonJoinQual()); } block.registerNode(joinNode); return joinNode; }
@Override public LogicalNode buildPlan(LogicalPlan plan, LogicalPlan.QueryBlock block) { // TODO LogicalNode leftChild = joinEdge.getLeftVertex().buildPlan(plan, block); LogicalNode rightChild = joinEdge.getRightVertex().buildPlan(plan, block); JoinNode joinNode = plan.createNode(JoinNode.class); if (PlannerUtil.isCommutativeJoinType(joinEdge.getJoinType())) { // if only one operator is relation if ((leftChild instanceof RelationNode) && !(rightChild instanceof RelationNode)) { // for left deep joinNode.init(joinEdge.getJoinType(), rightChild, leftChild); } else { // if both operators are relation or if both are relations // we don't need to concern the left-right position. joinNode.init(joinEdge.getJoinType(), leftChild, rightChild); } } else { joinNode.init(joinEdge.getJoinType(), leftChild, rightChild); } Schema mergedSchema = SchemaUtil.merge(joinNode.getLeftChild().getOutSchema(), joinNode.getRightChild().getOutSchema()); joinNode.setInSchema(mergedSchema); joinNode.setOutSchema(mergedSchema); if (joinEdge.hasJoinQual()) { joinNode.setJoinQual(joinEdge.getSingletonJoinQual()); } block.registerNode(joinNode); return joinNode; }