findJoinRegions(plan, null, joinRegions); planForDependencies(joinRegion); groupJoinsForPushing(metadata, capabilitiesFinder, joinRegion, context); groupAcrossLeftOuter(metadata, capabilitiesFinder, context, joinRegion); Object[] bestOrder = findBestJoinOrder(joinRegion, metadata, capabilitiesFinder, context);
Map accessMap = getAccessMap(metadata, capFinder, joinRegion); if (joinCriteriaNodes.isEmpty() && (hasJoinCriteria || !canPushCrossJoin(metadata, accessNode1, accessNode2))) { continue; && !canPushCrossJoin(metadata, accessNode1, accessNode2)) { Collection<GroupSymbol> leftGroups = accessNode1.getGroups(); Collection<GroupSymbol> rightGroups = accessNode2.getGroups(); PlanNode joinNode = createJoinNode(accessNode1, accessNode2, joinCriteria, joinType); PlanNode newAccess = RuleRaiseAccess.raiseAccessOverJoin(joinNode, joinNode.getFirstChild(), entry.getKey(), capFinder, metadata, false); for (PlanNode critNode : joinCriteriaNodes) {
Map<Object, List<PlanNode>> accessMapLeft = getAccessMap(metadata, capabilitiesFinder, joinRegion.getLeft()); PlanNode joinNode = createJoinNode(planNode, planNodeRight, joinCriteria, JoinType.JOIN_LEFT_OUTER); PlanNode newAccess = RuleRaiseAccess.raiseAccessOverJoin(joinNode, joinNode.getFirstChild(), modelId, capabilitiesFinder, metadata, false);
public void testFindJoinRegions() { List regions = new ArrayList(); PlanNode joinRoot = TestFrameUtil.getExamplePlan(); PlanNode joinRoot1 = TestFrameUtil.getExamplePlan(); PlanNode outerJoin = NodeFactory.getNewNode(NodeConstants.Types.JOIN); outerJoin.setProperty(NodeConstants.Info.JOIN_TYPE, JoinType.JOIN_LEFT_OUTER); outerJoin.addFirstChild(joinRoot); outerJoin.addFirstChild(joinRoot1); PlanNode source = NodeFactory.getNewNode(NodeConstants.Types.SOURCE); source.addFirstChild(outerJoin); RulePlanJoins.findJoinRegions(source, null, regions); assertEquals(3, regions.size()); JoinRegion region = (JoinRegion)regions.get(0); //ensure that the first region is the trivial region of the outer join assertEquals(1, region.getJoinSourceNodes().size()); }
private PlanNode createJoinNode(PlanNode accessNode1, PlanNode accessNode2, List<Criteria> joinCriteria, JoinType joinType) { PlanNode joinNode = createJoinNode(); joinNode.getGroups().addAll(accessNode1.getGroups()); joinNode.getGroups().addAll(accessNode2.getGroups()); joinNode.addFirstChild(accessNode2); joinNode.addLastChild(accessNode1); joinNode.setProperty(NodeConstants.Info.JOIN_TYPE, joinType); joinNode.setProperty(NodeConstants.Info.JOIN_CRITERIA, joinCriteria); return joinNode; }
Map<Object, List<PlanNode>> accessMapLeft = getAccessMap(metadata, capabilitiesFinder, joinRegion.getLeft()); PlanNode joinNode = createJoinNode(planNode, planNodeRight, joinCriteria, JoinType.JOIN_LEFT_OUTER); PlanNode newAccess = RuleRaiseAccess.raiseAccessOverJoin(joinNode, joinNode.getFirstChild(), modelId, capabilitiesFinder, metadata, false);
RulePlanJoins.findJoinRegions(source, null, regions);
root = combined.values().iterator().next(); } else { root = RulePlanJoins.createJoinNode(); PlanNode parentJoin = RulePlanJoins.createJoinNode(); parentJoin.addFirstChild(root); parentJoin.addGroups(root.getGroups());
findJoinRegions(plan, null, joinRegions); planForDependencies(joinRegion); groupJoinsForPushing(metadata, capabilitiesFinder, joinRegion, context); groupAcrossLeftOuter(metadata, capabilitiesFinder, context, joinRegion); Object[] bestOrder = findBestJoinOrder(joinRegion, metadata, capabilitiesFinder, context);
Map accessMap = getAccessMap(metadata, capFinder, joinRegion); if (joinCriteriaNodes.isEmpty() && (hasJoinCriteria || !canPushCrossJoin(metadata, accessNode1, accessNode2))) { continue; && !canPushCrossJoin(metadata, accessNode1, accessNode2)) { Collection<GroupSymbol> leftGroups = accessNode1.getGroups(); Collection<GroupSymbol> rightGroups = accessNode2.getGroups(); PlanNode joinNode = createJoinNode(accessNode2, accessNode1, joinCriteria, joinType); PlanNode newAccess = RuleRaiseAccess.raiseAccessOverJoin(joinNode, joinNode.getFirstChild(), entry.getKey(), capFinder, metadata, false); for (PlanNode critNode : joinCriteriaNodes) {
Map<Object, List<PlanNode>> accessMapLeft = getAccessMap(metadata, capabilitiesFinder, joinRegion.getLeft()); PlanNode joinNode = createJoinNode(planNode, planNodeRight, joinCriteria, JoinType.JOIN_LEFT_OUTER); PlanNode newAccess = RuleRaiseAccess.raiseAccessOverJoin(joinNode, joinNode.getFirstChild(), modelId, capabilitiesFinder, metadata, false);
next = new JoinRegion(); joinRegions.add(next); findJoinRegions(root.getFirstChild(), next, joinRegions); currentRegion.setLeft(next); return; findJoinRegions(child, next, joinRegions); findJoinRegions(child, root.getChildCount()==1?currentRegion:null, joinRegions);
/** * create a join node with accessNode1 as the left child and accessNode2 as the right * @param accessNode1 * @param accessNode2 * @param joinCriteria * @param joinType * @return */ private PlanNode createJoinNode(PlanNode accessNode1, PlanNode accessNode2, List<Criteria> joinCriteria, JoinType joinType) { PlanNode joinNode = createJoinNode(); joinNode.getGroups().addAll(accessNode1.getGroups()); joinNode.getGroups().addAll(accessNode2.getGroups()); joinNode.addFirstChild(accessNode1); joinNode.addLastChild(accessNode2); joinNode.setProperty(NodeConstants.Info.JOIN_TYPE, joinType); joinNode.setProperty(NodeConstants.Info.JOIN_CRITERIA, joinCriteria); return joinNode; }
findJoinRegions(plan, null, joinRegions); planForDependencies(joinRegion); groupJoinsForPushing(metadata, capabilitiesFinder, joinRegion, context); groupAcrossLeftOuter(metadata, capabilitiesFinder, context, joinRegion); Object[] bestOrder = findBestJoinOrder(joinRegion, metadata, capabilitiesFinder, context);
Map accessMap = getAccessMap(metadata, capFinder, joinRegion); if (joinCriteriaNodes.isEmpty() && (hasJoinCriteria || !canPushCrossJoin(metadata, accessNode1, accessNode2))) { continue; && !canPushCrossJoin(metadata, accessNode1, accessNode2)) { Collection<GroupSymbol> leftGroups = accessNode1.getGroups(); Collection<GroupSymbol> rightGroups = accessNode2.getGroups(); PlanNode joinNode = createJoinNode(accessNode2, accessNode1, joinCriteria, joinType); PlanNode newAccess = RuleRaiseAccess.raiseAccessOverJoin(joinNode, joinNode.getFirstChild(), entry.getKey(), capFinder, metadata, false); for (PlanNode critNode : joinCriteriaNodes) {
next = new JoinRegion(); joinRegions.add(next); findJoinRegions(root.getFirstChild(), next, joinRegions); currentRegion.setLeft(next); return; findJoinRegions(child, next, joinRegions); findJoinRegions(child, root.getChildCount()==1?currentRegion:null, joinRegions);
root = combined.values().iterator().next(); } else { root = RulePlanJoins.createJoinNode(); PlanNode parentJoin = RulePlanJoins.createJoinNode(); parentJoin.addFirstChild(root); parentJoin.addGroups(root.getGroups());
next = new JoinRegion(); joinRegions.add(next); findJoinRegions(root.getFirstChild(), next, joinRegions); currentRegion.setLeft(next); return; findJoinRegions(child, next, joinRegions); findJoinRegions(child, root.getChildCount()==1?currentRegion:null, joinRegions);
root = combined.values().iterator().next(); } else { root = RulePlanJoins.createJoinNode(); PlanNode parentJoin = RulePlanJoins.createJoinNode(); parentJoin.addFirstChild(root); parentJoin.addGroups(root.getGroups());
/** * create a join node with accessNode1 as the left child and accessNode2 as the right * @param accessNode1 * @param accessNode2 * @param joinCriteria * @param joinType * @return */ private PlanNode createJoinNode(PlanNode accessNode1, PlanNode accessNode2, List<Criteria> joinCriteria, JoinType joinType) { PlanNode joinNode = createJoinNode(); joinNode.getGroups().addAll(accessNode1.getGroups()); joinNode.getGroups().addAll(accessNode2.getGroups()); joinNode.addFirstChild(accessNode1); joinNode.addLastChild(accessNode2); joinNode.setProperty(NodeConstants.Info.JOIN_TYPE, joinType); joinNode.setProperty(NodeConstants.Info.JOIN_CRITERIA, joinCriteria); return joinNode; }