private void optimizeJoinOrder(LogicalPlan plan, String blockName) throws TajoException { LogicalPlan.QueryBlock block = plan.getBlock(blockName); if (block.hasNode(NodeType.JOIN)) { String originalOrder = JoinOrderStringBuilder.buildJoinOrderString(plan, block); double nonOptimizedJoinCost = JoinCostComputer.computeCost(plan, block); // finding relations and filter expressions JoinGraphContext joinGraphContext = JoinGraphBuilder.buildJoinGraph(plan, block); // finding join order and restore remaining filters FoundJoinOrder order = joinOrderAlgorithm.findBestOrder(plan, block, joinGraphContext); // replace join node with FoundJoinOrder. JoinNode newJoinNode = order.getOrderedJoin(); LogicalNode newNode = handleRemainingFiltersIfNecessary(joinGraphContext, plan, block, newJoinNode); JoinNode old = PlannerUtil.findTopNode(block.getRoot(), NodeType.JOIN); JoinTargetCollector collector = new JoinTargetCollector(); Set<Target> targets = new LinkedHashSet<Target>(); collector.visitJoin(targets, plan, block, old, new Stack<LogicalNode>()); if (targets.size() == 0) { newJoinNode.setTargets(PlannerUtil.schemaToTargets(old.getOutSchema())); } else { newJoinNode.setTargets(targets.toArray(new Target[targets.size()])); } PlannerUtil.replaceNode(plan, block.getRoot(), old, newNode); // End of replacement logic String optimizedOrder = JoinOrderStringBuilder.buildJoinOrderString(plan, block); block.addPlanHistory("Non-optimized join order: " + originalOrder + " (cost: " + nonOptimizedJoinCost + ")"); block.addPlanHistory("Optimized join order : " + optimizedOrder + " (cost: " + order.getCost() + ")"); joinGraphContext.clear(); } }
private void optimizeJoinOrder(LogicalPlan plan, String blockName) throws TajoException { LogicalPlan.QueryBlock block = plan.getBlock(blockName); if (block.hasNode(NodeType.JOIN)) { String originalOrder = JoinOrderStringBuilder.buildJoinOrderString(plan, block); double nonOptimizedJoinCost = JoinCostComputer.computeCost(plan, block); // finding relations and filter expressions JoinGraphContext joinGraphContext = JoinGraphBuilder.buildJoinGraph(plan, block); // finding join order and restore remaining filters FoundJoinOrder order = joinOrderAlgorithm.findBestOrder(plan, block, joinGraphContext); // replace join node with FoundJoinOrder. JoinNode newJoinNode = order.getOrderedJoin(); LogicalNode newNode = handleRemainingFiltersIfNecessary(joinGraphContext, plan, block, newJoinNode); JoinNode old = PlannerUtil.findTopNode(block.getRoot(), NodeType.JOIN); JoinTargetCollector collector = new JoinTargetCollector(); Set<Target> targets = new LinkedHashSet<>(); collector.visitJoin(targets, plan, block, old, new Stack<>()); if (targets.size() == 0) { newJoinNode.setTargets(PlannerUtil.schemaToTargets(old.getOutSchema())); } else { newJoinNode.setTargets(new ArrayList<>(targets)); } PlannerUtil.replaceNode(plan, block.getRoot(), old, newNode); // End of replacement logic String optimizedOrder = JoinOrderStringBuilder.buildJoinOrderString(plan, block); block.addPlanHistory("Non-optimized join order: " + originalOrder + " (cost: " + nonOptimizedJoinCost + ")"); block.addPlanHistory("Optimized join order : " + optimizedOrder + " (cost: " + order.getCost() + ")"); joinGraphContext.clear(); } }