use of org.teiid.query.sql.symbol.AggregateSymbol.Type in project teiid by teiid.
the class CapabilitiesUtil method supportsAggregateFunction.
public static boolean supportsAggregateFunction(Object modelID, AggregateSymbol aggregate, QueryMetadataInterface metadata, CapabilitiesFinder capFinder) throws QueryMetadataException, TeiidComponentException {
if (metadata.isVirtualModel(modelID)) {
return false;
}
// Find capabilities
SourceCapabilities caps = getCapabilities(modelID, metadata, capFinder);
// Check particular function
Type func = aggregate.getAggregateFunction();
switch(func) {
case COUNT:
if (aggregate.getArgs().length == 0) {
if (!caps.supportsCapability(Capability.QUERY_AGGREGATES_COUNT_STAR)) {
return false;
}
} else {
if (!caps.supportsCapability(Capability.QUERY_AGGREGATES_COUNT)) {
return false;
}
}
break;
case SUM:
if (!caps.supportsCapability(Capability.QUERY_AGGREGATES_SUM)) {
return false;
}
break;
case AVG:
if (!caps.supportsCapability(Capability.QUERY_AGGREGATES_AVG)) {
return false;
}
break;
case MIN:
if (!caps.supportsCapability(Capability.QUERY_AGGREGATES_MIN)) {
return false;
}
break;
case MAX:
if (!caps.supportsCapability(Capability.QUERY_AGGREGATES_MAX)) {
return false;
}
break;
case ARRAY_AGG:
if (!caps.supportsCapability(Capability.QUERY_AGGREGATES_ARRAY)) {
return false;
}
break;
case STRING_AGG:
if (!caps.supportsCapability(Capability.QUERY_AGGREGATES_STRING)) {
return false;
}
break;
case RANK:
case DENSE_RANK:
case ROW_NUMBER:
case FIRST_VALUE:
case LAST_VALUE:
case LEAD:
case LAG:
if (!caps.supportsCapability(Capability.ELEMENTARY_OLAP)) {
return false;
}
break;
case USER_DEFINED:
if (!supportsScalarFunction(modelID, aggregate, metadata, capFinder)) {
return false;
}
break;
default:
if (aggregate.isEnhancedNumeric()) {
if (!caps.supportsCapability(Capability.QUERY_AGGREGATES_ENHANCED_NUMERIC)) {
return false;
}
} else {
return false;
}
break;
}
// Check DISTINCT if necessary
if (aggregate.isDistinct() && !caps.supportsCapability(Capability.QUERY_AGGREGATES_DISTINCT)) {
return false;
}
if (aggregate.getCondition() != null && !caps.supportsCapability(Capability.ADVANCED_OLAP)) {
return false;
}
// Passed all the checks!
return true;
}
use of org.teiid.query.sql.symbol.AggregateSymbol.Type in project teiid by teiid.
the class ValidationVisitor method visit.
@Override
public void visit(WindowFunction windowFunction) {
AggregateSymbol.Type type = windowFunction.getFunction().getAggregateFunction();
switch(type) {
case RANK:
case DENSE_RANK:
case ROW_NUMBER:
if (windowFunction.getWindowSpecification().getOrderBy() == null) {
// $NON-NLS-1$
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.ranking_requires_order_by", windowFunction), windowFunction);
}
break;
case TEXTAGG:
case ARRAY_AGG:
case JSONARRAY_AGG:
case XMLAGG:
case STRING_AGG:
if (windowFunction.getWindowSpecification().getOrderBy() != null) {
// $NON-NLS-1$
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.window_order_by", windowFunction), windowFunction);
}
break;
case LAST_VALUE:
case FIRST_VALUE:
if (windowFunction.getWindowSpecification().getOrderBy() == null) {
// $NON-NLS-1$
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.value_requires_order_by", windowFunction), windowFunction);
}
if (windowFunction.getFunction().getArgs().length != 1) {
// $NON-NLS-1$
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.value_one_argument", windowFunction), windowFunction);
}
if (windowFunction.getFunction().isDistinct() || windowFunction.getFunction().getCondition() != null) {
// $NON-NLS-1$
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.analytic_restriction", windowFunction), windowFunction);
}
break;
case LEAD:
case LAG:
if (windowFunction.getWindowSpecification().getOrderBy() == null) {
// $NON-NLS-1$
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.value_requires_order_by", windowFunction), windowFunction);
}
if (windowFunction.getFunction().getArgs().length > 3 || windowFunction.getFunction().getArgs().length == 0) {
// $NON-NLS-1$
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.value_three_arguments", windowFunction), windowFunction);
}
if (windowFunction.getFunction().isDistinct() || windowFunction.getFunction().getCondition() != null) {
// $NON-NLS-1$
handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.analytic_restriction", windowFunction), windowFunction);
}
break;
}
validateNoSubqueriesOrOuterReferences(windowFunction);
if (windowFunction.getFunction().getOrderBy() != null || (windowFunction.getFunction().isDistinct() && windowFunction.getWindowSpecification().getOrderBy() != null)) {
// $NON-NLS-1$
handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0042", new Object[] { windowFunction.getFunction(), windowFunction }), windowFunction);
}
if (windowFunction.getWindowSpecification().getPartition() != null) {
validateSortable(windowFunction.getWindowSpecification().getPartition());
}
}
Aggregations