/** * Construct a JoinPredicate between two clauses of the specified type. * @param leftClause Left from clause * @param rightClause Right from clause * @param type Type of join * @param criteria List of Criteria for this join predicate */ public JoinPredicate(FromClause leftClause, FromClause rightClause, JoinType type, Criteria criteria) { this.leftClause = leftClause; this.rightClause = rightClause; this.joinType = type; this.joinCriteria = Criteria.separateCriteriaByAnd(criteria); }
/** * Construct a JoinPredicate between two clauses of the specified type. * @param leftClause Left from clause * @param rightClause Right from clause * @param type Type of join * @param criteria List of Criteria for this join predicate */ public JoinPredicate(FromClause leftClause, FromClause rightClause, JoinType type, Criteria criteria) { this.leftClause = leftClause; this.rightClause = rightClause; this.joinType = type; this.joinCriteria = Criteria.separateCriteriaByAnd(criteria); }
/** * Construct a JoinPredicate between two clauses of the specified type. * @param leftClause Left from clause * @param rightClause Right from clause * @param type Type of join * @param criteria List of Criteria for this join predicate */ public JoinPredicate(FromClause leftClause, FromClause rightClause, JoinType type, Criteria criteria) { this.leftClause = leftClause; this.rightClause = rightClause; this.joinType = type; this.joinCriteria = Criteria.separateCriteriaByAnd(criteria); }
private List<String> getCriteriaList() { List<String> critList = new ArrayList<String>(); if (leftExpressions != null) { for(int i=0; i < this.leftExpressions.size(); i++) { critList.add(this.leftExpressions.get(i).toString() + "=" + this.rightExpressions.get(i).toString()); //$NON-NLS-1$ } } if (this.joinCriteria != null) { for (Criteria crit : (List<Criteria>)Criteria.separateCriteriaByAnd(joinCriteria)) { critList.add(crit.toString()); } } return critList; }
private List<String> getCriteriaList() { List<String> critList = new ArrayList<String>(); if (leftExpressions != null) { for(int i=0; i < this.leftExpressions.size(); i++) { critList.add(this.leftExpressions.get(i).toString() + "=" + this.rightExpressions.get(i).toString()); //$NON-NLS-1$ } } if (this.joinCriteria != null) { for (Criteria crit : (List<Criteria>)Criteria.separateCriteriaByAnd(joinCriteria)) { critList.add(crit.toString()); } } return critList; }
private List<String> getCriteriaList() { List<String> critList = new ArrayList<String>(); if (leftExpressions != null) { for(int i=0; i < this.leftExpressions.size(); i++) { critList.add(this.leftExpressions.get(i).toString() + "=" + this.rightExpressions.get(i).toString()); //$NON-NLS-1$ } } if (this.joinCriteria != null) { for (Criteria crit : (List<Criteria>)Criteria.separateCriteriaByAnd(joinCriteria)) { critList.add(crit.toString()); } } return critList; }
/** * Will combine the where criteria with the on criteria. * * A full rewrite call is not necessary here, but it will attempt to flatten the criteria. * * @param query * @param joinCrits */ private void moveWhereClauseIntoOnClause(Query query, List joinCrits) { if (query.getCriteria() == null) { return; } LinkedHashSet combinedCrits = new LinkedHashSet(); combinedCrits.addAll(joinCrits); combinedCrits.addAll(Criteria.separateCriteriaByAnd(query.getCriteria())); joinCrits.clear(); joinCrits.addAll(combinedCrits); query.setCriteria(null); }
/** * Will combine the where criteria with the on criteria. * * A full rewrite call is not necessary here, but it will attempt to flatten the criteria. * * @param query * @param joinCrits */ private void moveWhereClauseIntoOnClause(Query query, List joinCrits) { if (query.getCriteria() == null) { return; } LinkedHashSet combinedCrits = new LinkedHashSet(); combinedCrits.addAll(joinCrits); combinedCrits.addAll(Criteria.separateCriteriaByAnd(query.getCriteria())); joinCrits.clear(); joinCrits.addAll(combinedCrits); query.setCriteria(null); }
/** * Will combine the where criteria with the on criteria. * * A full rewrite call is not necessary here, but it will attempt to flatten the criteria. * * @param query * @param joinCrits */ private void moveWhereClauseIntoOnClause(Query query, List joinCrits) { if (query.getCriteria() == null) { return; } LinkedHashSet combinedCrits = new LinkedHashSet(); combinedCrits.addAll(joinCrits); combinedCrits.addAll(Criteria.separateCriteriaByAnd(query.getCriteria())); joinCrits.clear(); joinCrits.addAll(combinedCrits); query.setCriteria(null); }
/** * Attach all criteria above the join nodes. The optimizer will push these * criteria down to the appropriate source. * @param plan Existing plan, which joins all source groups * @param criteria Criteria from query * @return Updated tree */ private static PlanNode attachCriteria(PlanNode plan, Criteria criteria, boolean isHaving) { List<Criteria> crits = Criteria.separateCriteriaByAnd(criteria); for (Criteria crit : crits) { PlanNode critNode = createSelectNode(crit, isHaving); attachLast(critNode, plan); plan = critNode; } return plan; }
/** * Attach all criteria above the join nodes. The optimizer will push these * criteria down to the appropriate source. * @param plan Existing plan, which joins all source groups * @param criteria Criteria from query * @return Updated tree */ private static PlanNode attachCriteria(PlanNode plan, Criteria criteria, boolean isHaving) { List<Criteria> crits = Criteria.separateCriteriaByAnd(criteria); for (Criteria crit : crits) { PlanNode critNode = createSelectNode(crit, isHaving); attachLast(critNode, plan); plan = critNode; } return plan; }
/** * Attach all criteria above the join nodes. The optimizer will push these * criteria down to the appropriate source. * @param plan Existing plan, which joins all source groups * @param criteria Criteria from query * @return Updated tree */ private static PlanNode attachCriteria(PlanNode plan, Criteria criteria, boolean isHaving) { List<Criteria> crits = Criteria.separateCriteriaByAnd(criteria); for (Criteria crit : crits) { PlanNode critNode = createSelectNode(crit, isHaving); attachLast(critNode, plan); plan = critNode; } return plan; }
private void visitSelectNode(PlanNode node, Set<Criteria> toCopy, Set<Criteria> allCriteria) { //First examine criteria in critNode for suitability Criteria crit = (Criteria) node.getProperty(NodeConstants.Info.SELECT_CRITERIA); if(node.getGroups().size() == 1) { List<Criteria> crits = Criteria.separateCriteriaByAnd(crit); if(!node.hasBooleanProperty(NodeConstants.Info.IS_HAVING) && node.getSubqueryContainers().isEmpty()) { if (!node.hasBooleanProperty(NodeConstants.Info.IS_COPIED)) { toCopy.addAll(crits); } allCriteria.addAll(crits); } } }
private void visitSelectNode(PlanNode node, Set<Criteria> toCopy, Set<Criteria> allCriteria) { //First examine criteria in critNode for suitability Criteria crit = (Criteria) node.getProperty(NodeConstants.Info.SELECT_CRITERIA); if(node.getGroups().size() == 1) { List<Criteria> crits = Criteria.separateCriteriaByAnd(crit); if(!node.hasBooleanProperty(NodeConstants.Info.IS_HAVING) && node.getSubqueryContainers().isEmpty()) { if (!node.hasBooleanProperty(NodeConstants.Info.IS_COPIED)) { toCopy.addAll(crits); } allCriteria.addAll(crits); } } }
private void visitSelectNode(PlanNode node, Set<Criteria> toCopy, Set<Criteria> allCriteria) { //First examine criteria in critNode for suitability Criteria crit = (Criteria) node.getProperty(NodeConstants.Info.SELECT_CRITERIA); if(node.getGroups().size() == 1) { List<Criteria> crits = Criteria.separateCriteriaByAnd(crit); if(!node.hasBooleanProperty(NodeConstants.Info.IS_HAVING) && node.getSubqueryContainers().isEmpty()) { if (!node.hasBooleanProperty(NodeConstants.Info.IS_COPIED)) { toCopy.addAll(crits); } allCriteria.addAll(crits); } } }
public void helpTestSeparateCriteria(Criteria originalCrit, Criteria[] partsArray) { Collection<Criteria> expectedParts = Arrays.asList(partsArray); Collection<Criteria> actualParts = Criteria.separateCriteriaByAnd(originalCrit); assertEquals("Didn't get the same parts ", expectedParts, actualParts); //$NON-NLS-1$ }
Iterator<Criteria> conjunctIter = Criteria.separateCriteriaByAnd(obj).iterator();
private void processCriteria(Collection<GroupSymbol> leftGroups, PlannedResult plannedResult, List<GroupSymbol> rightGroups, Set<Expression> requiredExpressions, final SymbolMap refs, Criteria joinCriteria, GroupBy groupBy, boolean where) { if (joinCriteria == null) { return; } List<Criteria> crits = Criteria.separateCriteriaByAnd((Criteria)joinCriteria.clone()); for (Iterator<Criteria> critIter = crits.iterator(); critIter.hasNext();) { Criteria conjunct = critIter.next(); List<Expression> additionalRequired = new LinkedList<Expression>(); AggregateSymbolCollectorVisitor.getAggregates(conjunct, additionalRequired, additionalRequired, additionalRequired, null, groupBy!=null?groupBy.getSymbols():null); ReferenceReplacementVisitor emv = new ReferenceReplacementVisitor(refs); DeepPostOrderNavigator.doVisit(conjunct, emv); if (!emv.replacedAny) { //if not correlated, then leave it on the query critIter.remove(); if (where) { plannedResult.query.setCriteria(Criteria.combineCriteria(plannedResult.query.getCriteria(), conjunct)); } else { plannedResult.query.setHaving(Criteria.combineCriteria(plannedResult.query.getHaving(), conjunct)); } } else { requiredExpressions.addAll(additionalRequired); } } RuleChooseJoinStrategy.separateCriteria(leftGroups, rightGroups, plannedResult.leftExpressions, plannedResult.rightExpressions, crits, plannedResult.nonEquiJoinCriteria); }
private void processCriteria(Collection<GroupSymbol> leftGroups, PlannedResult plannedResult, List<GroupSymbol> rightGroups, Set<Expression> requiredExpressions, final SymbolMap refs, Criteria joinCriteria, GroupBy groupBy, boolean where) { if (joinCriteria == null) { return; } List<Criteria> crits = Criteria.separateCriteriaByAnd((Criteria)joinCriteria.clone()); for (Iterator<Criteria> critIter = crits.iterator(); critIter.hasNext();) { Criteria conjunct = critIter.next(); List<Expression> additionalRequired = new LinkedList<Expression>(); AggregateSymbolCollectorVisitor.getAggregates(conjunct, additionalRequired, additionalRequired, additionalRequired, null, groupBy!=null?groupBy.getSymbols():null); ReferenceReplacementVisitor emv = new ReferenceReplacementVisitor(refs); DeepPostOrderNavigator.doVisit(conjunct, emv); if (!emv.replacedAny) { //if not correlated, then leave it on the query critIter.remove(); if (where) { plannedResult.query.setCriteria(Criteria.combineCriteria(plannedResult.query.getCriteria(), conjunct)); } else { plannedResult.query.setHaving(Criteria.combineCriteria(plannedResult.query.getHaving(), conjunct)); } } else { requiredExpressions.addAll(additionalRequired); } } RuleChooseJoinStrategy.separateCriteria(leftGroups, rightGroups, plannedResult.leftExpressions, plannedResult.rightExpressions, crits, plannedResult.nonEquiJoinCriteria); }
/** * Because we lack a cost value based upon complexity the * heurstic is to look that the dependent set is fully pushed. * there are situations where it won't be fully pushed, but * for which it will still be a better plan and we'll reject */ private boolean isUsingDependentJoin(String id, RelationalNode rn) { if (rn instanceof DependentAccessNode) { DependentAccessNode dan = (DependentAccessNode)rn; Query qc = (Query) dan.getCommand(); Criteria c = qc.getCriteria(); for (Criteria crit : Criteria.separateCriteriaByAnd(c)) { if (crit instanceof DependentSetCriteria) { DependentSetCriteria dsc = (DependentSetCriteria)crit; if (dsc.getContextSymbol().equals(id)) { return true; } } } } RelationalNode[] children = rn.getChildren(); for (int i=0; i<rn.getChildCount(); i++) { if (isUsingDependentJoin(id, children[i])) { return true; } } return false; }