static Collection<ElementSymbol> getElementsIncriteria(Criteria crit) { Collection<ElementSymbol> elements = new HashSet<ElementSymbol>(); boolean first = true; if(crit instanceof CompoundCriteria) { CompoundCriteria compCrit = (CompoundCriteria) crit; for(Criteria subCrit : compCrit.getCriteria()) { if(compCrit.getOperator() == CompoundCriteria.AND || first) { first = false; elements.addAll(getElementsIncriteria(subCrit)); } else { elements.retainAll(getElementsIncriteria(subCrit)); } } } else { elements.addAll(ElementCollectorVisitor.getElements(crit, true)); } return elements; }
PlanNode sourceNode = findOriginatingNode(metadata, capFinder, critNode, analysisRecord); continue; boolean moved = pushTowardOriginatingNode(sourceNode, critNode, metadata, capFinder); if(critNode.hasBooleanProperty(Info.IS_PUSHED) || (critNode.getGroups().isEmpty() && critNode.getSubqueryContainers().isEmpty()) || !atBoundary(critNode, sourceNode)) { deadNodes.add(critNode); movedAnyNode |= moved; case NodeConstants.Types.SOURCE: Boolean acrossFrame = pushAcrossFrame(sourceNode, critNode, metadata, capFinder, context); if (acrossFrame != null) { moved = acrossFrame; moved = handleJoinCriteria(sourceNode, critNode, metadata); moved = pushAcrossGroupBy(sourceNode, critNode, metadata, true, capFinder);
static void collectUnionChildren(PlanNode unionNode, List<PlanNode> unionChildren) { for (PlanNode child : unionNode.getChildren()) { if(child.getType() == NodeConstants.Types.SET_OP) { collectUnionChildren(child, unionChildren); } else { unionChildren.add(child); } } }
private boolean splitSet(PlanNode critNode, DependentNodeTest test, DependentSetCriteria dscOrig, PlanNode destination) throws QueryMetadataException, TeiidComponentException, QueryPlannerException { boolean result = false; List<DependentSetCriteria> dscList = splitDependentSetCriteria(dscOrig, false, null); List<DependentSetCriteria.AttributeComparison> pushable = new ArrayList<AttributeComparison>(); List<DependentSetCriteria.AttributeComparison> nonPushable = new ArrayList<AttributeComparison>(); for (DependentSetCriteria dsc : dscList) { PlanNode copyNode = copyNode(critNode); setCriteria(dsc, copyNode); if (test.isValid(copyNode)) { pushable.add(dsc.getAttributes().get(0)); } else { nonPushable.add(dsc.getAttributes().get(0)); } } if (!pushable.isEmpty()) { result = true; //signal that we should run again if (nonPushable.isEmpty()) { throw new AssertionError("should not be completely pushed"); //$NON-NLS-1$ } setCriteria(RuleChooseDependent.createDependentSetCriteria(dscOrig.getContextSymbol(), nonPushable), critNode); PlanNode copyNode = copyNode(critNode); setCriteria(RuleChooseDependent.createDependentSetCriteria(dscOrig.getContextSymbol(), pushable), copyNode); destination.addAsParent(copyNode); //it should be pushed in the next run } return result; }
final PlanNode destination = examinePath(critNode, sourceNode, metadata, capFinder); boolean result = false; if (createdNodes == null & destination.getType() == NodeConstants.Types.ACCESS && isDependentFinalDestination(critNode, destination)) { Criteria crit = (Criteria)critNode.getProperty(NodeConstants.Info.SELECT_CRITERIA); if (isMultiAttributeDependentSet(crit)) { result = splitSet(critNode, new DependentNodeTest() {
initial.getFirstChild().addAsParent(critNode); target = rpsc.examinePath(critNode, sourceNode, metadata, capFinder); critNode.getParent().replaceChild(critNode, critNode.getFirstChild()); if (!rpsc.pushAcrossFrame(sourceNode, critNode, metadata, capFinder, null)) { if (target.hasBooleanProperty(Info.MAKE_NOT_DEP)) { targets.clear(); depExpressions.add(dsc.getExpression()); List<PlanNode> createdNodes = rpsc.getCreatedNodes(); for (PlanNode planNode : createdNodes) { critNodes.add(planNode); NodeEditor.removeChildNode(planNode.getParent(), planNode); rpsc.getCreatedNodes().clear(); break; if (rpsc.pushAcrossGroupBy(sourceNode, critNode, metadata, false, capFinder)) { critNodes.add(critNode); initialTargets.add(sourceNode.getFirstChild());
GroupSymbol virtualGroup = sourceNode.getGroups().iterator().next(); if (createdNodes == null) { satisfyConditions(critNode, sourceNode, metadata); collectUnionChildren(setOp, unionChildren); if(placeConvertedSelectNode(critNode, virtualGroup, projectNode, childMap, metadata)) { if (handleSetOp) { PlanNode newSelect = projectNode.getFirstChild(); markDependent(newSelect, accessNode, metadata, capFinder); } else {
Collection<ElementSymbol> elements = getElementsIncriteria(crit); boolean removeAps = satisfyAccessPatterns(aps, elements); if (removeAps) { sourceNode.removeProperty(NodeConstants.Info.ACCESS_PATTERNS);
RulePushSelectCriteria rpsc = new RulePushSelectCriteria(); rpsc.setCreatedNodes(new LinkedList<PlanNode>());
GroupSymbol virtualGroup = sourceNode.getGroups().iterator().next(); if (createdNodes == null) { satisfyConditions(critNode, sourceNode, metadata); collectUnionChildren(setOp, unionChildren); if(placeConvertedSelectNode(critNode, virtualGroup, projectNode, childMap, metadata)) { if (handleSetOp) { PlanNode newSelect = projectNode.getFirstChild(); if (!placeConvertedSelectNode(critNode, virtualGroup, project, childMap, metadata)) {
Boolean conversionResult = checkConversion(symbolMap, cols); && checkConversion(symbolMap, critNode.getCorrelatedReferenceElements()) != null) { return null; //not convertable, or has an aggregate for a correlated reference PlanNode copyNode = copyNode(critNode);
markDependent(critNode, accessNode, metadata, capFinder); critNode.setProperty(Info.IS_HAVING, true); return false; PlanNode copy = copyNode(critNode); critNode.setProperty(Info.IS_PUSHED, true); critNode.setProperty(Info.IS_HAVING, true); PlanNode accessNode = NodeEditor.findParent(critNode, NodeConstants.Types.ACCESS); if (accessNode != null) { markDependent(critNode, accessNode, metadata, capFinder); moved = false; //terminal position
@Test public void testPushAcrossFrameWithAccessNode() throws Exception { QueryMetadataInterface metadata = new TempMetadataAdapter(RealMetadataFactory.example1Cached(), new TempMetadataStore()); Command command = TestOptimizer.helpGetCommand("select * from (select * from pm1.g1 union select * from pm1.g2) x where e1 = 1", metadata); //$NON-NLS-1$ Command subCommand = TestOptimizer.helpGetCommand("select * from pm1.g1 union select * from pm1.g2", metadata); //$NON-NLS-1$ RelationalPlanner p = new RelationalPlanner(); CommandContext cc = new CommandContext(); p.initialize(command, null, metadata, null, null, cc); PlanNode root = p.generatePlan(command); PlanNode child = p.generatePlan(subCommand); PlanNode sourceNode = NodeEditor.findNodePreOrder(root, NodeConstants.Types.SOURCE); sourceNode.addFirstChild(child); sourceNode.setProperty(NodeConstants.Info.SYMBOL_MAP, SymbolMap.createSymbolMap(sourceNode.getGroups().iterator().next(), (List<Expression>)child.getFirstChild().getProperty(Info.PROJECT_COLS), metadata)); //add a dummy access node PlanNode accessNode = NodeFactory.getNewNode(NodeConstants.Types.ACCESS); accessNode.addGroups(child.getFirstChild().getGroups()); child.getFirstChild().addAsParent(accessNode); new RulePushSelectCriteria().execute(root, metadata, new DefaultCapabilitiesFinder(), new RuleStack(), AnalysisRecord.createNonRecordingRecord(), cc); // the select node should still be above the access node accessNode = NodeEditor.findNodePreOrder(root, NodeConstants.Types.ACCESS); assertEquals(NodeConstants.Types.SELECT, accessNode.getParent().getType()); assertNull(NodeEditor.findNodePreOrder(accessNode, NodeConstants.Types.SELECT)); }
public void testPopOneRule() { RuleStack stack = new RuleStack(); int expectedSize = stack.size(); OptimizerRule rule = new RulePushSelectCriteria(); stack.push(rule); helpTestPop(stack, rule, expectedSize); }
private boolean placeConvertedSelectNode(PlanNode critNode, GroupSymbol sourceGroup, PlanNode projectNode, SymbolMap symbolMap, QueryMetadataInterface metadata) throws QueryPlannerException { PlanNode copyNode = createConvertedSelectNode(critNode, sourceGroup, projectNode, symbolMap, metadata); if (copyNode == null) { return false; } PlanNode intermediateParent = NodeEditor.findParent(projectNode, NodeConstants.Types.ACCESS, NodeConstants.Types.SOURCE | NodeConstants.Types.SET_OP); if (intermediateParent != null) { intermediateParent.addAsParent(copyNode); } else { projectNode.getFirstChild().addAsParent(copyNode); } return true; }
final PlanNode destination = examinePath(critNode, sourceNode, metadata, capFinder); boolean result = false; if (createdNodes == null & destination.getType() == NodeConstants.Types.ACCESS && isDependentFinalDestination(critNode, destination)) { Criteria crit = (Criteria)critNode.getProperty(NodeConstants.Info.SELECT_CRITERIA); if (isMultiAttributeDependentSet(crit)) { result = splitSet(critNode, new DependentNodeTest() {
initial.getFirstChild().addAsParent(critNode); target = rpsc.examinePath(critNode, sourceNode, metadata, capFinder); critNode.getParent().replaceChild(critNode, critNode.getFirstChild()); if (!rpsc.pushAcrossFrame(sourceNode, critNode, metadata, capFinder, null)) { if (target.hasBooleanProperty(Info.MAKE_NOT_DEP)) { targets.clear(); depExpressions.add(dsc.getExpression()); List<PlanNode> createdNodes = rpsc.getCreatedNodes(); for (PlanNode planNode : createdNodes) { critNodes.add(planNode); NodeEditor.removeChildNode(planNode.getParent(), planNode); rpsc.getCreatedNodes().clear(); break; if (rpsc.pushAcrossGroupBy(sourceNode, critNode, metadata, false, capFinder)) { critNodes.add(critNode); initialTargets.add(sourceNode.getFirstChild());
private boolean splitSet(PlanNode critNode, DependentNodeTest test, DependentSetCriteria dscOrig, PlanNode destination) throws QueryMetadataException, TeiidComponentException, QueryPlannerException { boolean result = false; List<DependentSetCriteria> dscList = splitDependentSetCriteria(dscOrig, false, null); List<DependentSetCriteria.AttributeComparison> pushable = new ArrayList<AttributeComparison>(); List<DependentSetCriteria.AttributeComparison> nonPushable = new ArrayList<AttributeComparison>(); for (DependentSetCriteria dsc : dscList) { PlanNode copyNode = copyNode(critNode); setCriteria(dsc, copyNode); if (test.isValid(copyNode)) { pushable.add(dsc.getAttributes().get(0)); } else { nonPushable.add(dsc.getAttributes().get(0)); } } if (!pushable.isEmpty()) { result = true; //signal that we should run again if (nonPushable.isEmpty()) { throw new AssertionError("should not be completely pushed"); //$NON-NLS-1$ } setCriteria(RuleChooseDependent.createDependentSetCriteria(dscOrig.getContextSymbol(), nonPushable), critNode); PlanNode copyNode = copyNode(critNode); setCriteria(RuleChooseDependent.createDependentSetCriteria(dscOrig.getContextSymbol(), pushable), copyNode); destination.addAsParent(copyNode); //it should be pushed in the next run } return result; }
Collection<ElementSymbol> elements = getElementsIncriteria(crit); boolean removeAps = satisfyAccessPatterns(aps, elements); if (removeAps) { sourceNode.removeProperty(NodeConstants.Info.ACCESS_PATTERNS);
RulePushSelectCriteria rpsc = new RulePushSelectCriteria(); rpsc.setCreatedNodes(new LinkedList<PlanNode>());