matches = findCandidate(plan, metadata, analysisRecord); Collections.reverse(matches); } else { if (!traditionalOnly) { plan = new RuleChooseDependent(true).execute(plan, metadata, capFinder, rules, analysisRecord, context); matches = findCandidate(plan, metadata, analysisRecord); PlanNode chosenNode = chooseDepWithoutCosting(sourceNode, siblingNode, analysisRecord, bothCandidates); if(chosenNode != null) { pushCriteria |= markDependent(chosenNode, joinNode, metadata, null, false, capFinder, context, rules, analysisRecord); continue; pushCriteria |= markDependent(dependentNode, joinNode, metadata, dca, null, capFinder, context, rules, analysisRecord); } else { float sourceCost = NewCalculateCostUtil.computeCostForTree(sourceNode, metadata); pushCriteria |= markDependent(siblingNode, joinNode, metadata, null, sourceCost > RuleChooseDependent.DEFAULT_INDEPENDENT_CARDINALITY?true:null, capFinder, context, rules, analysisRecord); } else if (siblingNdv != NewCalculateCostUtil.UNKNOWN_VALUE && ((siblingNdv <= RuleChooseDependent.DEFAULT_INDEPENDENT_CARDINALITY && siblingNdv < sourceNdv && siblingCost < 4*sourceCost) || (sourceCost == NewCalculateCostUtil.UNKNOWN_VALUE && siblingNdv <= UNKNOWN_INDEPENDENT_CARDINALITY))) { pushCriteria |= markDependent(sourceNode, joinNode, metadata, null, siblingCost > RuleChooseDependent.DEFAULT_INDEPENDENT_CARDINALITY?true:null, capFinder, context, rules, analysisRecord);
public void helpTestValidJoin(PlanNode joinNode, PlanNode accessNode, boolean expectedValid) throws QueryMetadataException, TeiidComponentException { RuleChooseDependent rule = new RuleChooseDependent(); RuleChooseJoinStrategy.chooseJoinStrategy(joinNode, metadata); boolean isValid = rule.isValidJoin(joinNode, accessNode, AnalysisRecord.createNonRecordingRecord()); assertEquals("Valid join check is wrong ", expectedValid, isValid); //$NON-NLS-1$ }
static PlanNode createDependentSetNode(String id, List<DependentSetCriteria.AttributeComparison> expressions) { DependentSetCriteria crit = createDependentSetCriteria(id, expressions); return RelationalPlanner.createSelectNode(crit, false); }
fullyPush(sourceNode, joinNode, metadata, capabilitiesFinder, context, indNode, rules, makeDep, analysisRecord, independentExpressions); return false; String id = nextId(); if (!depNode.hasCollectionProperty(Info.ACCESS_PATTERNS)) { handleDuplicate(joinNode, isLeft, independentExpressions, dependentExpressions); handleDuplicate(joinNode, !isLeft, dependentExpressions, independentExpressions); PlanNode crit = getDependentCriteriaNode(id, independentExpressions, dependentExpressions, indNode, metadata, dca, bound, makeDep);
RuleChooseDependent ruleChooseDependent = new RuleChooseDependent(); ruleChooseDependent.traditionalOnly = true; ruleCopy.push(ruleChooseDependent);
criteria = RuleChooseDependent.createDependentSetCriteria(dsc.getContextSymbol(), joinExprs); PlanNode left = RuleChooseDependent.createDependentSetNode(dsc.getContextSymbol(), leftExprs); if (left != null) { moved = true; joinNode.getFirstChild().addAsParent(left); PlanNode right = RuleChooseDependent.createDependentSetNode(dsc.getContextSymbol(), rightExprs); if (right != null) { moved = true;
String id = RuleChooseDependent.nextId(); PlanNode dep = RuleChooseDependent.getDependentCriteriaNode(id, plannedResult.rightExpressions, plannedResult.leftExpressions, node, metadata, null, false, null); semiJoin.getFirstChild().addAsParent(dep); semiJoin.setProperty(NodeConstants.Info.DEPENDENT_VALUE_SOURCE, id);
RuleChooseDependent rule = new RuleChooseDependent(); RuleChooseJoinStrategy.chooseJoinStrategy(joinNode, metadata); FakeCapabilitiesFinder capFinder = new FakeCapabilitiesFinder(); capFinder.addCapabilities("pm4", TestOptimizer.getTypicalCapabilities()); //$NON-NLS-1$ rule.execute(bogusParentNode, metadata, capFinder, new RuleStack(), null, new CommandContext());
child = FrameUtil.findJoinSourceNode(child); if(child.hasBooleanProperty(NodeConstants.Info.MAKE_NOT_DEP) || !isValidJoin(joinNode, child, analysisRecord)) { continue;
PlanNode result = createDependentSetNode(id, expressions); if (makeDep != null) { DependentSetCriteria dsc = (DependentSetCriteria)result.getProperty(Info.SELECT_CRITERIA);
boolean result = fullyPush(sourceNode, joinNode, metadata, capabilitiesFinder, context, indNode, rules, makeDep, analysisRecord, independentExpressions); String id = nextId(); if (!depNode.hasCollectionProperty(Info.ACCESS_PATTERNS)) { handleDuplicate(joinNode, isLeft, independentExpressions, dependentExpressions); handleDuplicate(joinNode, !isLeft, dependentExpressions, independentExpressions); PlanNode crit = getDependentCriteriaNode(id, independentExpressions, dependentExpressions, indNode, metadata, dca, bound, makeDep);
RuleChooseDependent ruleChooseDependent = new RuleChooseDependent(); ruleChooseDependent.traditionalOnly = true; ruleCopy.push(ruleChooseDependent);
criteria = RuleChooseDependent.createDependentSetCriteria(dsc.getContextSymbol(), joinExprs); PlanNode left = RuleChooseDependent.createDependentSetNode(dsc.getContextSymbol(), leftExprs); if (left != null) { moved = true; joinNode.getFirstChild().addAsParent(left); PlanNode right = RuleChooseDependent.createDependentSetNode(dsc.getContextSymbol(), rightExprs); if (right != null) { moved = true;
id = RuleChooseDependent.nextId(); PlanNode dep = RuleChooseDependent.getDependentCriteriaNode(id, plannedResult.leftExpressions, plannedResult.rightExpressions, root, metadata, null, false, null); Criteria crit = (Criteria)dep.getProperty(Info.SELECT_CRITERIA); plannedResult.query.setCriteria(Criteria.combineCriteria(plannedResult.query.getCriteria(), crit)); this.dependent = true; } else if (plannedResult.makeInd && !plannedResult.not) { id = RuleChooseDependent.nextId(); PlanNode dep = RuleChooseDependent.getDependentCriteriaNode(id, plannedResult.rightExpressions, plannedResult.leftExpressions, node, metadata, null, false, null); semiJoin.getFirstChild().addAsParent(dep); semiJoin.setProperty(NodeConstants.Info.DEPENDENT_VALUE_SOURCE, id);
child = FrameUtil.findJoinSourceNode(child); if(child.hasBooleanProperty(NodeConstants.Info.MAKE_NOT_DEP) || !isValidJoin(joinNode, child, analysisRecord)) { continue;
PlanNode result = createDependentSetNode(id, expressions); if (makeDep != null) { DependentSetCriteria dsc = (DependentSetCriteria)result.getProperty(Info.SELECT_CRITERIA);
matches = findCandidate(plan, metadata, analysisRecord); Collections.reverse(matches); } else { if (!traditionalOnly) { plan = new RuleChooseDependent(true).execute(plan, metadata, capFinder, rules, analysisRecord, context); matches = findCandidate(plan, metadata, analysisRecord); PlanNode chosenNode = chooseDepWithoutCosting(sourceNode, bothCandidates?siblingNode:null, analysisRecord); if(chosenNode != null) { pushCriteria |= markDependent(chosenNode, joinNode, metadata, null, false, capFinder, context, rules, analysisRecord); continue; pushCriteria |= markDependent(dependentNode, joinNode, metadata, dca, null, capFinder, context, rules, analysisRecord); } else { float sourceCost = NewCalculateCostUtil.computeCostForTree(sourceNode, metadata); pushCriteria |= markDependent(siblingNode, joinNode, metadata, null, sourceCost > RuleChooseDependent.DEFAULT_INDEPENDENT_CARDINALITY?true:null, capFinder, context, rules, analysisRecord); } else if (siblingNdv != NewCalculateCostUtil.UNKNOWN_VALUE && ((siblingNdv <= RuleChooseDependent.DEFAULT_INDEPENDENT_CARDINALITY && siblingNdv < sourceNdv && siblingCost < 4*sourceCost) || (sourceCost == NewCalculateCostUtil.UNKNOWN_VALUE && siblingNdv <= UNKNOWN_INDEPENDENT_CARDINALITY))) { pushCriteria |= markDependent(sourceNode, joinNode, metadata, null, siblingCost > RuleChooseDependent.DEFAULT_INDEPENDENT_CARDINALITY?true:null, capFinder, context, rules, analysisRecord);
boolean result = fullyPush(sourceNode, joinNode, metadata, capabilitiesFinder, context, indNode, rules, makeDep, analysisRecord, independentExpressions); String id = nextId(); if (!depNode.hasCollectionProperty(Info.ACCESS_PATTERNS)) { handleDuplicate(joinNode, isLeft, independentExpressions, dependentExpressions); handleDuplicate(joinNode, !isLeft, dependentExpressions, independentExpressions); PlanNode crit = getDependentCriteriaNode(id, independentExpressions, dependentExpressions, indNode, metadata, dca, bound, makeDep);
RuleChooseDependent ruleChooseDependent = new RuleChooseDependent(); ruleChooseDependent.traditionalOnly = true; ruleCopy.push(ruleChooseDependent);
criteria = RuleChooseDependent.createDependentSetCriteria(dsc.getContextSymbol(), joinExprs); PlanNode left = RuleChooseDependent.createDependentSetNode(dsc.getContextSymbol(), leftExprs); if (left != null) { moved = true; joinNode.getFirstChild().addAsParent(left); PlanNode right = RuleChooseDependent.createDependentSetNode(dsc.getContextSymbol(), rightExprs); if (right != null) { moved = true;