Search in sources :

Example 6 with Type

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;
}
Also used : Type(org.teiid.query.sql.symbol.AggregateSymbol.Type) JoinType(org.teiid.query.sql.lang.JoinType) SourceCapabilities(org.teiid.query.optimizer.capabilities.SourceCapabilities)

Example 7 with Type

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());
    }
}
Also used : Type(org.teiid.query.sql.symbol.AggregateSymbol.Type) LanguageObject(org.teiid.query.sql.LanguageObject)

Aggregations

Type (org.teiid.query.sql.symbol.AggregateSymbol.Type)7 ArrayList (java.util.ArrayList)2 AggregateAttributes (org.teiid.metadata.AggregateAttributes)2 LanguageObject (org.teiid.query.sql.LanguageObject)2 JoinType (org.teiid.query.sql.lang.JoinType)2 HashSet (java.util.HashSet)1 LinkedHashSet (java.util.LinkedHashSet)1 List (java.util.List)1 FunctionExecutionException (org.teiid.api.exception.query.FunctionExecutionException)1 TeiidRuntimeException (org.teiid.core.TeiidRuntimeException)1 FunctionMethod (org.teiid.metadata.FunctionMethod)1 SourceCapabilities (org.teiid.query.optimizer.capabilities.SourceCapabilities)1 LanguageVisitor (org.teiid.query.sql.LanguageVisitor)1 CompareCriteria (org.teiid.query.sql.lang.CompareCriteria)1 OrderByItem (org.teiid.query.sql.lang.OrderByItem)1 ElementSymbol (org.teiid.query.sql.symbol.ElementSymbol)1 Expression (org.teiid.query.sql.symbol.Expression)1 TextLine (org.teiid.query.sql.symbol.TextLine)1 SaxonXQueryExpression (org.teiid.query.xquery.saxon.SaxonXQueryExpression)1