/** * @see OptimizerRule#execute(PlanNode, QueryMetadataInterface, RuleStack) */ public PlanNode execute(PlanNode plan, QueryMetadataInterface metadata, CapabilitiesFinder capFinder, RuleStack rules, AnalysisRecord analysisRecord, CommandContext context) throws QueryPlannerException, TeiidComponentException { dependent = false; processSubqueries(plan); if (dependent) { rules.push(RuleConstants.PUSH_SELECT_CRITERIA); } return plan; }
/** * @see OptimizerRule#execute(PlanNode, QueryMetadataInterface, RuleStack) */ public PlanNode execute(PlanNode plan, QueryMetadataInterface metadata, CapabilitiesFinder capFinder, RuleStack rules, AnalysisRecord analysisRecord, CommandContext context) throws QueryPlannerException, TeiidComponentException { dependent = false; processSubqueries(plan); if (dependent) { rules.push(RuleConstants.PUSH_SELECT_CRITERIA); } return plan; }
/** * @see OptimizerRule#execute(PlanNode, QueryMetadataInterface, RuleStack) */ public PlanNode execute(PlanNode plan, QueryMetadataInterface metadata, CapabilitiesFinder capFinder, RuleStack rules, AnalysisRecord analysisRecord, CommandContext context) throws QueryPlannerException, TeiidComponentException { boolean pushRaiseNull = false; pushRaiseNull = clean(plan, !rules.contains(RuleConstants.COPY_CRITERIA)); if (pushRaiseNull) { rules.push(RuleConstants.RAISE_NULL); } return plan; }
/** * @see OptimizerRule#execute(PlanNode, QueryMetadataInterface, RuleStack) */ public PlanNode execute(PlanNode plan, QueryMetadataInterface metadata, CapabilitiesFinder capFinder, RuleStack rules, AnalysisRecord analysisRecord, CommandContext context) throws QueryPlannerException, TeiidComponentException { boolean pushRaiseNull = false; pushRaiseNull = clean(plan, !rules.contains(RuleConstants.COPY_CRITERIA)); if (pushRaiseNull) { rules.push(RuleConstants.RAISE_NULL); } return plan; }
/** * @see OptimizerRule#execute(PlanNode, QueryMetadataInterface, RuleStack) */ public PlanNode execute(PlanNode plan, QueryMetadataInterface metadata, CapabilitiesFinder capFinder, RuleStack rules, AnalysisRecord analysisRecord, CommandContext context) throws QueryPlannerException, TeiidComponentException { boolean pushRaiseNull = false; pushRaiseNull = clean(plan, !rules.contains(RuleConstants.COPY_CRITERIA)); if (pushRaiseNull) { rules.push(RuleConstants.RAISE_NULL); } return plan; }
/** * @see OptimizerRule#execute(PlanNode, QueryMetadataInterface, RuleStack) */ public PlanNode execute(PlanNode plan, QueryMetadataInterface metadata, CapabilitiesFinder capFinder, RuleStack rules, AnalysisRecord analysisRecord, CommandContext context) throws QueryPlannerException, TeiidComponentException { dependent = false; // Find strings of criteria and merge them, removing duplicates List<PlanNode> criteriaChains = new ArrayList<PlanNode>(); findCriteriaChains(plan, criteriaChains, analysisRecord); // Merge chains for (PlanNode critNode : criteriaChains) { mergeChain(critNode, metadata); } if (dependent) { //rules.push(new RuleAssignOutputElements(true)); rules.push(RuleConstants.PUSH_SELECT_CRITERIA); } return plan; }
public void testContains() { // Set up RuleStack stack = new RuleStack(); stack.push(RuleConstants.ACCESS_PATTERN_VALIDATION); stack.push(RuleConstants.COLLAPSE_SOURCE); assertEquals(true, stack.contains(RuleConstants.ACCESS_PATTERN_VALIDATION)); assertEquals(false, stack.contains(RuleConstants.PLACE_ACCESS)); }
public void testRemove() { // Set up RuleStack stack = new RuleStack(); stack.push(RuleConstants.ACCESS_PATTERN_VALIDATION); stack.push(RuleConstants.COLLAPSE_SOURCE); stack.push(RuleConstants.ACCESS_PATTERN_VALIDATION); // Remove all instances of ASSIGN_OUTPUT_ELEMENTS stack.remove(RuleConstants.ACCESS_PATTERN_VALIDATION); // Verify size and pop'ed values assertEquals(1, stack.size()); assertEquals(RuleConstants.COLLAPSE_SOURCE, stack.pop()); assertEquals(null, stack.pop()); }
rules.push(RuleConstants.PUSH_SELECT_CRITERIA);
rules.push(RuleConstants.PUSH_SELECT_CRITERIA);
rules.push(RuleConstants.PUSH_SELECT_CRITERIA);
public void testPopOneRule() { RuleStack stack = new RuleStack(); int expectedSize = stack.size(); OptimizerRule rule = new RulePushSelectCriteria(); stack.push(rule); helpTestPop(stack, rule, expectedSize); }
rules.push(RuleConstants.RAISE_NULL);
rules.push(RuleConstants.RAISE_NULL);
private boolean addLimit(RuleStack rules, PlanNode parent, QueryMetadataInterface metadata, CapabilitiesFinder capabilitiesFinder) throws QueryMetadataException, TeiidComponentException { PlanNode accessNode = NodeEditor.findParent(parent.getFirstChild(), NodeConstants.Types.ACCESS); if (accessNode != null) { Object mid = RuleRaiseAccess.getModelIDFromAccess(accessNode, metadata); if (!CapabilitiesUtil.supports(Capability.ROW_LIMIT, mid, metadata, capabilitiesFinder)) { if (NodeEditor.findParent(parent, NodeConstants.Types.SET_OP | NodeConstants.Types.JOIN, NodeConstants.Types.ACCESS) != null) { return false; //access node is too high } parent = accessNode; } } PlanNode limit = NodeFactory.getNewNode(NodeConstants.Types.TUPLE_LIMIT); limit.setProperty(Info.MAX_TUPLE_LIMIT, new Constant(1)); if (!rules.contains(RuleConstants.PUSH_LIMIT)) { rules.push(RuleConstants.PUSH_LIMIT); } if (parent.getParent() == null) { if (parent.getType() == NodeConstants.Types.ACCESS) { return false; } parent = parent.getFirstChild(); } parent.addAsParent(limit); return true; }
private boolean addLimit(RuleStack rules, PlanNode parent, QueryMetadataInterface metadata, CapabilitiesFinder capabilitiesFinder) throws QueryMetadataException, TeiidComponentException { PlanNode accessNode = NodeEditor.findParent(parent.getFirstChild(), NodeConstants.Types.ACCESS); if (accessNode != null) { Object mid = RuleRaiseAccess.getModelIDFromAccess(accessNode, metadata); if (!CapabilitiesUtil.supports(Capability.ROW_LIMIT, mid, metadata, capabilitiesFinder)) { if (NodeEditor.findParent(parent, NodeConstants.Types.SET_OP | NodeConstants.Types.JOIN, NodeConstants.Types.ACCESS) != null) { return false; //access node is too high } parent = accessNode; } } PlanNode limit = NodeFactory.getNewNode(NodeConstants.Types.TUPLE_LIMIT); limit.setProperty(Info.MAX_TUPLE_LIMIT, new Constant(1)); if (!rules.contains(RuleConstants.PUSH_LIMIT)) { rules.push(RuleConstants.PUSH_LIMIT); } if (parent.getParent() == null) { if (parent.getType() == NodeConstants.Types.ACCESS) { return false; } parent = parent.getFirstChild(); } parent.addAsParent(limit); return true; }
private boolean addLimit(RuleStack rules, PlanNode parent, QueryMetadataInterface metadata, CapabilitiesFinder capabilitiesFinder) throws QueryMetadataException, TeiidComponentException { PlanNode accessNode = NodeEditor.findParent(parent.getFirstChild(), NodeConstants.Types.ACCESS); if (accessNode != null) { Object mid = RuleRaiseAccess.getModelIDFromAccess(accessNode, metadata); if (!CapabilitiesUtil.supports(Capability.ROW_LIMIT, mid, metadata, capabilitiesFinder)) { if (NodeEditor.findParent(parent, NodeConstants.Types.SET_OP | NodeConstants.Types.JOIN, NodeConstants.Types.ACCESS) != null) { return false; //access node is too high } parent = accessNode; } } PlanNode limit = NodeFactory.getNewNode(NodeConstants.Types.TUPLE_LIMIT); limit.setProperty(Info.MAX_TUPLE_LIMIT, new Constant(1)); if (!rules.contains(RuleConstants.PUSH_LIMIT)) { rules.push(RuleConstants.PUSH_LIMIT); } if (parent.getParent() == null) { if (parent.getType() == NodeConstants.Types.ACCESS) { return false; } parent = parent.getFirstChild(); } parent.addAsParent(limit); return true; }