if (joinRegion.getJoinSourceNodes().size() + joinRegion.getDependentJoinSourceNodes().size() < 2) { joinRegionIter.remove(); if (joinRegion.getLeft() != null) { leftOuterJoinRegions.add(joinRegion); joinRegion.initializeJoinInformation(); for (PlanNode joinSource : joinRegion.getJoinSourceNodes().keySet()) { SymbolMap map = (SymbolMap)joinSource.getProperty(NodeConstants.Info.CORRELATED_REFERENCES); if (map !=null) { joinSource.setProperty(NodeConstants.Info.REQUIRED_ACCESS_PATTERN_GROUPS, GroupsUsedByElementsVisitor.getGroups(map.getValues())); joinRegion.setContainsNestedTable(true); if (joinRegion.getUnsatisfiedAccessPatterns().isEmpty()) { continue; if (!joinRegion.isSatisfiable()) { throw new QueryPlannerException(QueryPlugin.Event.TEIID30275, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30275, joinRegion.getUnsatisfiedAccessPatterns())); joinRegion.getJoinSourceNodes().putAll(joinRegion.getDependentJoinSourceNodes()); joinRegion.getCriteriaNodes().addAll(joinRegion.getDependentCriteriaNodes()); joinRegion.getDependentJoinSourceNodes().clear(); joinRegion.getDependentCriteriaNodes().clear(); if (joinRegion.getJoinSourceNodes().size() < 2) { joinRegion.reconstructJoinRegoin(); joinRegionIter.remove(); continue;
JoinRegion joinRegion) throws QueryMetadataException, TeiidComponentException, AssertionError { if (joinRegion.getLeft() == null || joinRegion.getJoinRoot().getLastChild().getType() != NodeConstants.Types.ACCESS || joinRegion.getJoinRoot().getFirstChild().getType() == NodeConstants.Types.ACCESS) { return; PlanNode planNodeRight = joinRegion.getJoinRoot().getLastChild(); Map<Object, List<PlanNode>> accessMapLeft = getAccessMap(metadata, capabilitiesFinder, joinRegion.getLeft()); List<Criteria> joinCriteria = (List<Criteria>)joinRegion.getJoinRoot().getProperty(Info.JOIN_CRITERIA); for (Criteria crit : joinCriteria) { if (!RuleRaiseAccess.isSupportedJoinCriteria(sjc, crit, modelId, metadata, capabilitiesFinder, null)) { joinRegion.getLeft().getJoinSourceNodes().remove(planNode); for (Set<PlanNode> source : joinRegion.getLeft().getCritieriaToSourceMap().values()) { if (source.remove(planNode)) { source.add(newAccess); joinRegion.getLeft().getJoinSourceNodes().put(newAccess, newAccess); PlanNode root = joinRegion.getJoinRoot(); joinRegion.getLeft().reconstructJoinRegoin(); break;
public void initializeCostingInformation(QueryMetadataInterface metadata) throws QueryMetadataException, TeiidComponentException { for (PlanNode node : joinSourceNodes.values()) { NewCalculateCostUtil.computeCostForTree(node, metadata); } estimateCriteriaSelectivity(metadata); }
int regionCount = region.getJoinSourceNodes().size(); Object[] order = permIter.next(); double score = region.scoreRegion(order, 0, metadata, capFinder, context, partial); if(score < bestSubScore) { bestSubScore = score; double partialScore = region.scoreRegion(order.toArray(), bestSubOrder.length - 1, metadata, capFinder, context, true);
currentRegion = new JoinRegion(); joinRegions.add(currentRegion); currentRegion.addJoinSourceNode(root); && root.getLastChild().getType() == NodeConstants.Types.ACCESS && !((JoinType)root.getFirstChild().getProperty(Info.JOIN_TYPE)).isOuter()) { next = new JoinRegion(); joinRegions.add(next); findJoinRegions(root.getFirstChild(), next, joinRegions); currentRegion.setLeft(next); return; currentRegion.addParentCriteria(root); currentRegion.addJoinCriteriaList((List)root.getProperty(NodeConstants.Info.JOIN_CRITERIA)); currentRegion.addJoinSourceNode(root); currentRegion.addJoinSourceNode(root);
List<PlanNode> criteriaNodes = joinRegion.getCriteriaNodes(); LinkedList<Criteria> joinCriteria = new LinkedList<Criteria>(); for (PlanNode critNode : criteriaNodes) { Set<PlanNode> sources = joinRegion.getCritieriaToSourceMap().get(critNode); joinRegion.getCritieriaToSourceMap().keySet().removeAll(joinCriteriaNodes); joinRegion.getCriteriaNodes().removeAll(joinCriteriaNodes); joinRegion.getJoinSourceNodes().remove(accessNode1); joinRegion.getJoinSourceNodes().remove(accessNode2); accessNodes.remove(i); accessNodes.remove(k < i ? k : k - 1); for (Set<PlanNode> source : joinRegion.getCritieriaToSourceMap().values()) { if (source.remove(accessNode1) || source.remove(accessNode2)) { source.add(newAccess); joinRegion.getJoinSourceNodes().put(newAccess, newAccess); accessNodes.add(newAccess); i = accessNodes.size(); joinRegion.reconstructJoinRegoin();
/** * Simple test to ensure that the reconstruction logic doesn't fail with a single source */ public void testReconstructionOf1Source() { PlanNode source = NodeFactory.getNewNode(NodeConstants.Types.SOURCE); PlanNode accessNode = NodeFactory.getNewNode(NodeConstants.Types.ACCESS); source.addFirstChild(accessNode); JoinRegion region = new JoinRegion(); region.addJoinSourceNode(accessNode); region.reconstructJoinRegoin(); assertEquals(NodeConstants.Types.ACCESS, region.getJoinRoot().getType()); }
if (joinRegion.getJoinSourceNodes().isEmpty()) { throw new QueryPlannerException(QueryPlugin.Event.TEIID30275, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30275, joinRegion.getUnsatisfiedAccessPatterns())); for (PlanNode joinSource : joinRegion.getJoinSourceNodes().keySet()) { currentGroups.addAll(joinSource.getGroups()); HashMap<PlanNode, PlanNode> dependentNodes = new HashMap<PlanNode, PlanNode>(joinRegion.getDependentJoinSourceNodes()); HashSet<GroupSymbol> allRequiredGroups = new HashSet<GroupSymbol>(); for (ElementSymbol symbol : ap.getUnsatisfied()) { Set<Collection<GroupSymbol>> requiredGroupsSet = joinRegion.getDependentCriteriaElements().get(symbol); boolean elementSatisfied = false; if (requiredGroupsSet != null) { throw new QueryPlannerException(QueryPlugin.Event.TEIID30275, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30275, joinRegion.getUnsatisfiedAccessPatterns()));
assertEquals(3, region.getJoinSourceNodes().size()); assertEquals(joinRoot, region.getJoinRoot()); region.changeJoinOrder(new Object[] {new Integer(1), new Integer(0), new Integer(2)}); region.reconstructJoinRegoin(); PlanNode root = region.getJoinRoot();
for (Iterator<PlanNode> i = getCriteriaNodes().iterator(); i.hasNext();) { PlanNode node = i.next(); if (containsFunctionsThatCannotBePushed(expr==0?compareCriteria.getRightExpression():compareCriteria.getLeftExpression())) { continue;
/** * Return a map of Access Nodes to JoinSources that may be eligible for pushdown as * joins. */ private Map<Object, List<PlanNode>> getAccessMap(QueryMetadataInterface metadata, CapabilitiesFinder capFinder, JoinRegion joinRegion) throws QueryMetadataException, TeiidComponentException { Map<Object, List<PlanNode>> accessMap = new HashMap(); for (PlanNode node : joinRegion.getJoinSourceNodes().values()) { /* check to see if we are directly over an access node. in the event that the join source root * looks like select->access, we still won't consider this node for pushing */ if (node.getType() != NodeConstants.Types.ACCESS) { continue; } Object accessModelID = RuleRaiseAccess.getModelIDFromAccess(node, metadata); if (accessModelID == null || !CapabilitiesUtil.supportsJoin(accessModelID, JoinType.JOIN_INNER, metadata, capFinder)) { continue; } RulePlanUnions.buildModelMap(metadata, capFinder, accessMap, node, accessModelID); } return accessMap; }
currentRegion = new JoinRegion(); joinRegions.add(currentRegion); currentRegion.addJoinSourceNode(root); && root.getLastChild().getType() == NodeConstants.Types.ACCESS && !((JoinType)root.getFirstChild().getProperty(Info.JOIN_TYPE)).isOuter()) { next = new JoinRegion(); joinRegions.add(next); findJoinRegions(root.getFirstChild(), next, joinRegions); currentRegion.setLeft(next); return; currentRegion.addParentCriteria(root); currentRegion.addJoinCriteriaList((List)root.getProperty(NodeConstants.Info.JOIN_CRITERIA)); currentRegion.addJoinSourceNode(root); currentRegion.addJoinSourceNode(root);
List<PlanNode> criteriaNodes = joinRegion.getCriteriaNodes(); LinkedList<Criteria> joinCriteria = new LinkedList<Criteria>(); for (PlanNode critNode : criteriaNodes) { Set<PlanNode> sources = joinRegion.getCritieriaToSourceMap().get(critNode); joinRegion.getCritieriaToSourceMap().keySet().removeAll(joinCriteriaNodes); joinRegion.getCriteriaNodes().removeAll(joinCriteriaNodes); joinRegion.getJoinSourceNodes().remove(accessNode1); joinRegion.getJoinSourceNodes().remove(accessNode2); accessNodes.remove(i); accessNodes.remove(k < i ? k : k - 1); for (Set<PlanNode> source : joinRegion.getCritieriaToSourceMap().values()) { if (source.remove(accessNode1) || source.remove(accessNode2)) { source.add(newAccess); joinRegion.getJoinSourceNodes().put(newAccess, newAccess); accessNodes.add(newAccess); i = accessNodes.size(); joinRegion.reconstructJoinRegoin();
if (joinRegion.getJoinSourceNodes().isEmpty()) { throw new QueryPlannerException(QueryPlugin.Event.TEIID30275, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30275, joinRegion.getUnsatisfiedAccessPatterns())); for (PlanNode joinSource : joinRegion.getJoinSourceNodes().keySet()) { currentGroups.addAll(joinSource.getGroups()); HashMap<PlanNode, PlanNode> dependentNodes = new HashMap<PlanNode, PlanNode>(joinRegion.getDependentJoinSourceNodes()); HashSet<GroupSymbol> allRequiredGroups = new HashSet<GroupSymbol>(); for (ElementSymbol symbol : ap.getUnsatisfied()) { Set<Collection<GroupSymbol>> requiredGroupsSet = joinRegion.getDependentCriteriaElements().get(symbol); boolean elementSatisfied = false; if (requiredGroupsSet != null) { throw new QueryPlannerException(QueryPlugin.Event.TEIID30275, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30275, joinRegion.getUnsatisfiedAccessPatterns()));
int regionCount = region.getJoinSourceNodes().size(); Object[] order = permIter.next(); double score = region.scoreRegion(order, 0, metadata, capFinder, context, partial); if(score < bestSubScore) { bestSubScore = score; double partialScore = region.scoreRegion(order.toArray(), bestSubOrder.length - 1, metadata, capFinder, context, true);
for (Iterator<PlanNode> i = getCriteriaNodes().iterator(); i.hasNext();) { PlanNode node = i.next(); if (containsFunctionsThatCannotBePushed(expr==0?compareCriteria.getRightExpression():compareCriteria.getLeftExpression())) { continue;
/** * Return a map of Access Nodes to JoinSources that may be eligible for pushdown as * joins. */ private Map<Object, List<PlanNode>> getAccessMap(QueryMetadataInterface metadata, CapabilitiesFinder capFinder, JoinRegion joinRegion) throws QueryMetadataException, TeiidComponentException { Map<Object, List<PlanNode>> accessMap = new HashMap(); for (PlanNode node : joinRegion.getJoinSourceNodes().values()) { /* check to see if we are directly over an access node. in the event that the join source root * looks like select->access, we still won't consider this node for pushing */ if (node.getType() != NodeConstants.Types.ACCESS) { continue; } Object accessModelID = RuleRaiseAccess.getModelIDFromAccess(node, metadata); if (accessModelID == null || !CapabilitiesUtil.supportsJoin(accessModelID, JoinType.JOIN_INNER, metadata, capFinder)) { continue; } RulePlanUnions.buildModelMap(metadata, capFinder, accessMap, node, accessModelID); } return accessMap; }
if (joinRegion.getJoinSourceNodes().size() + joinRegion.getDependentJoinSourceNodes().size() < 2) { joinRegionIter.remove(); if (joinRegion.getLeft() != null) { leftOuterJoinRegions.add(joinRegion); joinRegion.initializeJoinInformation(); for (PlanNode joinSource : joinRegion.getJoinSourceNodes().keySet()) { SymbolMap map = (SymbolMap)joinSource.getProperty(NodeConstants.Info.CORRELATED_REFERENCES); if (map !=null) { joinSource.setProperty(NodeConstants.Info.REQUIRED_ACCESS_PATTERN_GROUPS, GroupsUsedByElementsVisitor.getGroups(map.getValues())); joinRegion.setContainsNestedTable(true); if (joinRegion.getUnsatisfiedAccessPatterns().isEmpty()) { continue; if (!joinRegion.isSatisfiable()) { throw new QueryPlannerException(QueryPlugin.Event.TEIID30275, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID30275, joinRegion.getUnsatisfiedAccessPatterns())); joinRegion.getJoinSourceNodes().putAll(joinRegion.getDependentJoinSourceNodes()); joinRegion.getCriteriaNodes().addAll(joinRegion.getDependentCriteriaNodes()); joinRegion.getDependentJoinSourceNodes().clear(); joinRegion.getDependentCriteriaNodes().clear(); if (joinRegion.getJoinSourceNodes().size() < 2) { joinRegion.reconstructJoinRegoin(); joinRegionIter.remove(); continue;
JoinRegion joinRegion) throws QueryMetadataException, TeiidComponentException, AssertionError { if (joinRegion.getLeft() == null || joinRegion.getJoinRoot().getLastChild().getType() != NodeConstants.Types.ACCESS || joinRegion.getJoinRoot().getFirstChild().getType() == NodeConstants.Types.ACCESS) { return; PlanNode planNodeRight = joinRegion.getJoinRoot().getLastChild(); Map<Object, List<PlanNode>> accessMapLeft = getAccessMap(metadata, capabilitiesFinder, joinRegion.getLeft()); List<Criteria> joinCriteria = (List<Criteria>)joinRegion.getJoinRoot().getProperty(Info.JOIN_CRITERIA); for (Criteria crit : joinCriteria) { if (!RuleRaiseAccess.isSupportedJoinCriteria(sjc, crit, modelId, metadata, capabilitiesFinder, null)) { joinRegion.getLeft().getJoinSourceNodes().remove(planNode); for (Set<PlanNode> source : joinRegion.getLeft().getCritieriaToSourceMap().values()) { if (source.remove(planNode)) { source.add(newAccess); joinRegion.getLeft().getJoinSourceNodes().put(newAccess, newAccess); PlanNode root = joinRegion.getJoinRoot(); joinRegion.getLeft().reconstructJoinRegoin(); break;
currentRegion = new JoinRegion(); joinRegions.add(currentRegion); currentRegion.addJoinSourceNode(root); && root.getLastChild().getType() == NodeConstants.Types.ACCESS && !((JoinType)root.getFirstChild().getProperty(Info.JOIN_TYPE)).isOuter()) { next = new JoinRegion(); joinRegions.add(next); findJoinRegions(root.getFirstChild(), next, joinRegions); currentRegion.setLeft(next); return; currentRegion.addParentCriteria(root); currentRegion.addJoinCriteriaList((List)root.getProperty(NodeConstants.Info.JOIN_CRITERIA)); currentRegion.addJoinSourceNode(root); currentRegion.addJoinSourceNode(root);