public boolean hasAggregates() { return getGroupBy() != null || getHaving() != null || !AggregateSymbolCollectorVisitor.getAggregates(getSelect(), false).isEmpty(); }
public boolean hasAggregates() { return getGroupBy() != null || getHaving() != null || !AggregateSymbolCollectorVisitor.getAggregates(getSelect(), false).isEmpty(); }
public boolean hasAggregates() { return getGroupBy() != null || getHaving() != null || !AggregateSymbolCollectorVisitor.getAggregates(getSelect(), false).isEmpty(); }
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 boolean requiresDistinctRows(Query query) { Set<AggregateSymbol> aggs = new HashSet<AggregateSymbol>(); aggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(query.getSelect(), false)); aggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(query.getHaving(), false)); if (!aggs.isEmpty() || query.getGroupBy() != null) { if (!AggregateSymbol.areAggregatesCardinalityDependent(aggs)) { return false; } } else if (query.getSelect().isDistinct()) { for (Expression projectSymbol : query.getSelect().getProjectedSymbols()) { Expression ex = SymbolMap.getExpression(projectSymbol); if (FunctionCollectorVisitor.isNonDeterministic(ex)) { return true; } if (!ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(ex).isEmpty()) { return true; } } return false; } return true; }
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); }
/** * Return true if the result from the subquery may be different * if non-distinct rows are used as input * @param query * @return */ public static boolean requiresDistinctRows(Query query) { Set<AggregateSymbol> aggs = new HashSet<AggregateSymbol>(); aggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(query.getSelect(), false)); aggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(query.getHaving(), false)); if (!aggs.isEmpty() || query.getGroupBy() != null) { if (!AggregateSymbol.areAggregatesCardinalityDependent(aggs)) { return false; } } else if (query.getSelect().isDistinct()) { for (Expression projectSymbol : query.getSelect().getProjectedSymbols()) { Expression ex = SymbolMap.getExpression(projectSymbol); if (FunctionCollectorVisitor.isNonDeterministic(ex)) { return true; } if (!ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(ex).isEmpty()) { return true; } } return false; } return true; }
private boolean canRaiseInputset(Command command, Collection<ElementSymbol> bindings) { // check to see if this is query. if (!(command instanceof Query)) { return false; } Query query = (Query)command; Criteria crit = query.getCriteria(); if (crit != null && (query.getGroupBy() != null || query.getHaving() != null || query.getLimit() != null)) { return false; } //temporarily remove the criteria query.setCriteria(null); //just throw away order by query.setOrderBy(null); List<ElementSymbol> references = QueryUtil.getBindingsReferences(query, bindings); query.setCriteria(crit); //if there are any input set bindings in the rest of the command, don't convert return references.isEmpty(); }
/** * Return true if the result from the subquery may be different * if non-distinct rows are used as input * @param query * @return */ public static boolean requiresDistinctRows(Query query) { Set<AggregateSymbol> aggs = new HashSet<AggregateSymbol>(); aggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(query.getSelect(), false)); aggs.addAll(AggregateSymbolCollectorVisitor.getAggregates(query.getHaving(), false)); if (!aggs.isEmpty() || query.getGroupBy() != null) { if (!AggregateSymbol.areAggregatesCardinalityDependent(aggs)) { return false; } } else if (query.getSelect().isDistinct()) { for (Expression projectSymbol : query.getSelect().getProjectedSymbols()) { Expression ex = SymbolMap.getExpression(projectSymbol); if (FunctionCollectorVisitor.isNonDeterministic(ex)) { return true; } if (!ValueIteratorProviderCollectorVisitor.getValueIteratorProviders(ex).isEmpty()) { return true; } } return false; } return true; }
/** * visit the query in definition order */ public void visit(Query obj) { visitNodes(obj.getWith()); if (obj.getOrderBy() != null || obj.getLimit() != null) { visitor.namingContext.aliasColumns = !stripColumnAliases; } visitNode(obj.getFrom()); if (this.aliasMapping != null) { HashSet<String> newSymbols = new HashSet<String>(); for (Map.Entry<String, String> entry : this.visitor.namingContext.groupNames.entrySet()) { if (!newSymbols.add(entry.getValue())) { throw new TeiidRuntimeException(new QueryPlannerException(QueryPlugin.Event.TEIID31126, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31126, entry.getValue()))); } } } visitNode(obj.getCriteria()); visitNode(obj.getGroupBy()); visitNode(obj.getHaving()); visitNode(obj.getSelect()); visitNode(obj.getOrderBy()); }
/** * visit the query in definition order */ public void visit(Query obj) { visitNodes(obj.getWith()); if (obj.getOrderBy() != null || obj.getLimit() != null) { visitor.namingContext.aliasColumns = !stripColumnAliases; } visitNode(obj.getFrom()); if (this.aliasMapping != null) { HashSet<String> newSymbols = new HashSet<String>(); for (Map.Entry<String, String> entry : this.visitor.namingContext.groupNames.entrySet()) { if (!newSymbols.add(entry.getValue())) { throw new TeiidRuntimeException(new QueryPlannerException(QueryPlugin.Event.TEIID31126, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31126, entry.getValue()))); } } } visitNode(obj.getCriteria()); visitNode(obj.getGroupBy()); visitNode(obj.getHaving()); visitNode(obj.getSelect()); visitNode(obj.getOrderBy()); }
@Test public void testRewriteCorrelatedSubqueryInHaving() throws Exception { String sql = "select pm1.g1.e1 from pm1.g1 group by pm1.g1.e1 having pm1.g1.e1 in (select pm1.g1.e1 from pm1.g2)"; //$NON-NLS-1$ String expected = "SELECT pm1.g1.e1 FROM pm1.g1 GROUP BY pm1.g1.e1 HAVING pm1.g1.e1 IN (SELECT pm1.g1.e1 FROM pm1.g2)"; //$NON-NLS-1$ Query query = (Query)helpTestRewriteCommand(sql, expected); List<Reference> refs = new LinkedList<Reference>(); GroupSymbol gs = new GroupSymbol("pm1.g1"); ResolverUtil.resolveGroup(gs, RealMetadataFactory.example1Cached()); CorrelatedReferenceCollectorVisitor.collectReferences(query.getHaving(), Arrays.asList(gs), refs, RealMetadataFactory.example1Cached());//$NON-NLS-1$ assertEquals(1, refs.size()); }
/** * visit the query in definition order */ public void visit(Query obj) { visitNodes(obj.getWith()); if (obj.getOrderBy() != null || obj.getLimit() != null) { visitor.namingContext.aliasColumns = !stripColumnAliases; } visitNode(obj.getFrom()); if (this.aliasMapping != null) { HashSet<String> newSymbols = new HashSet<String>(); for (Map.Entry<String, String> entry : this.visitor.namingContext.groupNames.entrySet()) { if (!newSymbols.add(entry.getValue())) { throw new TeiidRuntimeException(new QueryPlannerException(QueryPlugin.Event.TEIID31126, QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31126, entry.getValue()))); } } } visitNode(obj.getCriteria()); visitNode(obj.getGroupBy()); visitNode(obj.getHaving()); visitNode(obj.getSelect()); visitNode(obj.getOrderBy()); }
/** * Compare two queries for equality. Queries will only evaluate to equal if * they are IDENTICAL: select variables are in the same order, criteria are in * the same exact structure. * @param obj Other object * @return True if equal */ public boolean equals(Object obj) { if(this == obj) { return true; } if(!(obj instanceof Query)) { return false; } Query other = (Query) obj; return EquivalenceUtil.areEqual(getSelect(), other.getSelect()) && EquivalenceUtil.areEqual(getFrom(), other.getFrom()) && EquivalenceUtil.areEqual(getCriteria(), other.getCriteria()) && EquivalenceUtil.areEqual(getGroupBy(), other.getGroupBy()) && EquivalenceUtil.areEqual(getHaving(), other.getHaving()) && EquivalenceUtil.areEqual(getOrderBy(), other.getOrderBy()) && EquivalenceUtil.areEqual(getLimit(), other.getLimit()) && EquivalenceUtil.areEqual(getWith(), other.getWith()) && sameOptionAndHint(other); }
/** * Compare two queries for equality. Queries will only evaluate to equal if * they are IDENTICAL: select variables are in the same order, criteria are in * the same exact structure. * @param obj Other object * @return True if equal */ public boolean equals(Object obj) { if(this == obj) { return true; } if(!(obj instanceof Query)) { return false; } Query other = (Query) obj; return EquivalenceUtil.areEqual(getSelect(), other.getSelect()) && EquivalenceUtil.areEqual(getFrom(), other.getFrom()) && EquivalenceUtil.areEqual(getCriteria(), other.getCriteria()) && EquivalenceUtil.areEqual(getGroupBy(), other.getGroupBy()) && EquivalenceUtil.areEqual(getHaving(), other.getHaving()) && EquivalenceUtil.areEqual(getOrderBy(), other.getOrderBy()) && EquivalenceUtil.areEqual(getLimit(), other.getLimit()) && EquivalenceUtil.areEqual(getWith(), other.getWith()) && sameOptionAndHint(other); }
private void validateXMLQuery(Query obj) { if(obj.getGroupBy() != null) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0031"), obj); //$NON-NLS-1$ } if(obj.getHaving() != null) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0032"), obj); //$NON-NLS-1$ } if(obj.getLimit() != null) { handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.limit_not_valid_for_xml"), obj); //$NON-NLS-1$ } if (obj.getOrderBy() != null) { OrderBy orderBy = obj.getOrderBy(); for (OrderByItem item : orderBy.getOrderByItems()) { if (!(item.getSymbol() instanceof ElementSymbol)) { handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.orderby_expression_xml"), obj); //$NON-NLS-1$ } } } }
/** * Compare two queries for equality. Queries will only evaluate to equal if * they are IDENTICAL: select variables are in the same order, criteria are in * the same exact structure. * @param obj Other object * @return True if equal */ public boolean equals(Object obj) { if(this == obj) { return true; } if(!(obj instanceof Query)) { return false; } Query other = (Query) obj; return EquivalenceUtil.areEqual(getSelect(), other.getSelect()) && EquivalenceUtil.areEqual(getFrom(), other.getFrom()) && EquivalenceUtil.areEqual(getCriteria(), other.getCriteria()) && EquivalenceUtil.areEqual(getGroupBy(), other.getGroupBy()) && EquivalenceUtil.areEqual(getHaving(), other.getHaving()) && EquivalenceUtil.areEqual(getOrderBy(), other.getOrderBy()) && EquivalenceUtil.areEqual(getLimit(), other.getLimit()) && EquivalenceUtil.areEqual(getWith(), other.getWith()) && getIsXML() == other.getIsXML() && sameOptionAndHint(other); }
public void visit(Query obj) { preVisitVisitor(obj); visitNodes(obj.getWith()); visitNode(obj.getSelect()); visitNode(obj.getInto()); visitNode(obj.getFrom()); visitNode(obj.getCriteria()); visitNode(obj.getGroupBy()); visitNode(obj.getHaving()); visitNode(obj.getOrderBy()); visitNode(obj.getLimit()); visitNode(obj.getOption()); postVisitVisitor(obj); } public void visit(RaiseStatement obj) {
public void visit(Query obj) { preVisitVisitor(obj); visitNodes(obj.getWith()); visitNode(obj.getSelect()); visitNode(obj.getInto()); visitNode(obj.getFrom()); visitNode(obj.getCriteria()); visitNode(obj.getGroupBy()); visitNode(obj.getHaving()); visitNode(obj.getOrderBy()); visitNode(obj.getLimit()); visitNode(obj.getOption()); postVisitVisitor(obj); } public void visit(RaiseStatement obj) {
public void visit(Query obj) { preVisitVisitor(obj); visitNodes(obj.getWith()); visitNode(obj.getSelect()); visitNode(obj.getInto()); visitNode(obj.getFrom()); visitNode(obj.getCriteria()); visitNode(obj.getGroupBy()); visitNode(obj.getHaving()); visitNode(obj.getOrderBy()); visitNode(obj.getLimit()); visitNode(obj.getOption()); postVisitVisitor(obj); } public void visit(RaiseStatement obj) {