/*
* JBoss, Home of Professional Open Source.
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership. Some portions may be licensed
* to Red Hat, Inc. under one or more contributor license agreements.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
package org.teiid.query.optimizer.capabilities;
import org.teiid.translator.ExecutionFactory.Format;
public interface SourceCapabilities {
public enum Capability {
/**
* Support indicates connector can accept queries with SELECT DISTINCT
*/
QUERY_SELECT_DISTINCT,
/**
* Support indicates connector can accept queries non-elements in the SELECT
*/
QUERY_SELECT_EXPRESSION,
/**
* Support indicates connector can accept joins where groups have aliases (required for QUERY_FROM_JOIN_SELFJOIN)
*
* @since 3.1 SP2
*/
QUERY_FROM_GROUP_ALIAS("TableAlias"), //$NON-NLS-1$
/**
* Max number of groups appearing in a from clause
*/
MAX_QUERY_FROM_GROUPS,
/**
* @since 6.1.0
*/
JOIN_CRITERIA_ALLOWED,
/**
* Support indicates connector can accept inner joins
*
* @since 3.1 SP2
*/
QUERY_FROM_JOIN_INNER,
/**
* Indicates that the source prefers ANSI style joins
*
* @since 6.0.0
*/
QUERY_FROM_ANSI_JOIN,
/**
* Support indicates connector can accept self-joins where a group is joined to itself with aliases
*
* @since 3.1 SP2
*/
QUERY_FROM_JOIN_SELFJOIN("SelfJoins"), //$NON-NLS-1$
/**
* Support indicates connector can accept right or left outer joins
*
* @since 3.1 SP2
*/
QUERY_FROM_JOIN_OUTER,
/**
* Support indicates connector can push down inline views
*
* @since 4.1
*/
QUERY_FROM_INLINE_VIEWS("InlineViews"), //$NON-NLS-1$
/**
* Support indicates connector can accept full outer joins
*
* @since 3.1 SP2
*/
QUERY_FROM_JOIN_OUTER_FULL,
/**
* Support indicates connector accepts criteria of form (element BETWEEN constant AND constant)
*
* @since 4.0
*/
CRITERIA_BETWEEN,
/**
* Support indicates connector accepts criteria of form (element operator constant)
*
* @since 3.1 SP2
*/
CRITERIA_COMPARE_EQ,
CRITERIA_COMPARE_ORDERED,
/**
* Support indicates connector accepts criteria of form (element LIKE constant)
*
* @since 3.1 SP2
*/
CRITERIA_LIKE("LikeCriteria"), //$NON-NLS-1$
/**
* Support indicates connector accepts criteria of form (element LIKE constant ESCAPE char) - CURRENTLY NOT USED
*
* @since 3.1 SP2
*/
CRITERIA_LIKE_ESCAPE("LikeCriteriaEscapeCharacter"), //$NON-NLS-1$
/**
* Support indicates connector accepts criteria of form (element IN set)
*
* @since 3.1 SP2
*/
CRITERIA_IN,
/**
* Support indicates connector accepts IN criteria with a subquery on the right side
*
* @since 4.0
*/
CRITERIA_IN_SUBQUERY,
/**
* Support indicates connector accepts criteria of form (element IS NULL)
*
* @since 3.1 SP2
*/
CRITERIA_ISNULL,
/**
* Support indicates connector accepts logical criteria connected by OR
*
* @since 3.1 SP2
*/
CRITERIA_OR,
/**
* Support indicates connector accepts logical criteria NOT
*
* @since 3.1 SP2
*/
CRITERIA_NOT,
/**
* Support indicates connector accepts the EXISTS criteria
*
* @since 4.0
*/
CRITERIA_EXISTS,
/**
* Support indicates connector accepts the quantified comparison criteria that use SOME
*
* @since 4.0
*/
CRITERIA_QUANTIFIED_SOME,
/**
* Support indicates connector accepts the quantified comparison criteria that use ALL
*
* @since 4.0
*/
CRITERIA_QUANTIFIED_ALL,
CRITERIA_ONLY_LITERAL_COMPARE,
/**
* Support indicates connector accepts ORDER BY clause
*
* @since 3.1 SP2
*/
QUERY_ORDERBY,
QUERY_ORDERBY_UNRELATED,
QUERY_ORDERBY_NULL_ORDERING,
QUERY_ORDERBY_DEFAULT_NULL_ORDER,
/**
* Composite support for group by and having - not
* used by the connector layer
*/
QUERY_AGGREGATES,
/**
* @since 6.1.0 indicates support for GROUP BY
*/
QUERY_GROUP_BY,
/**
* @since 6.1.0 indicates support for HAVING
*/
QUERY_HAVING,
/**
* Support indicates connector can accept the SUM aggregate function
*
* @since 3.1 SP2
*/
QUERY_AGGREGATES_SUM,
/**
* Support indicates connector can accept the AVG aggregate function
*
* @since 3.1 SP2
*/
QUERY_AGGREGATES_AVG,
/**
* Support indicates connector can accept the MIN aggregate function
*
* @since 3.1 SP2
*/
QUERY_AGGREGATES_MIN,
/**
* Support indicates connector can accept the MAX aggregate function
*
* @since 3.1 SP2
*/
QUERY_AGGREGATES_MAX,
/**
* Support indicates connector can accept the enhanced numeric aggregates
*
* @since 3.1 SP2
*/
QUERY_AGGREGATES_ENHANCED_NUMERIC,
/**
* Support indicates connector can accept the COUNT aggregate function
*
* @since 3.1 SP2
*/
QUERY_AGGREGATES_COUNT,
/**
* Support indicates connector can accept the COUNT(*) aggregate function
*
* @since 3.1 SP2
*/
QUERY_AGGREGATES_COUNT_STAR,
/**
* Support indicates connector can accept DISTINCT within aggregate functions
*
* @since 3.1 SP2
*/
QUERY_AGGREGATES_DISTINCT("AggregatesDistinct"), //$NON-NLS-1$
/**
* Support indicates connector can accept scalar subqueries in the SELECT, WHERE, and HAVING clauses
*
* @since 4.0
*/
QUERY_SUBQUERIES_SCALAR,
/**
* Support indicates connector can accept correalted subqueries wherever subqueries are accepted
*
* @since 4.0
*/
QUERY_SUBQUERIES_CORRELATED,
/**
* Support indicates connector can accept queries with non-searched CASE <expression> WHEN <expression> ... END
*
* @since 4.0
*/
QUERY_CASE,
/**
* Support indicates connector can accept queries with searched CASE WHEN <criteria> ... END
*
* @since 4.0
*/
QUERY_SEARCHED_CASE,
/**
* Support indicates connector can accept UNION and UNION ALL
*
* @since 4.2
*/
QUERY_UNION,
/**
* Support indicates connector can accept INTERSECT
*
* @since 5.6
*/
QUERY_INTERSECT,
/**
* Support indicates connector can accept EXCEPT
*
* @since 5.6
*/
QUERY_EXCEPT,
/**
* Support indicates connector can accept SET QUERY with an ORDER BY clause
*
* @since 4.2
*/
QUERY_SET_ORDER_BY,
/**
* Support indicates connector can accept GROUP BY with functions in it.
*
* @since 5.0
*/
QUERY_FUNCTIONS_IN_GROUP_BY,
BATCHED_UPDATES,
BULK_UPDATE,
/**
* Support indicates connector can limit result rows
*
* @since 5.0 SP1
*/
ROW_LIMIT,
/**
* Support indicates connector support a SQL clause whose output rows offset from the query's result rows (similar to
* LIMIT with offset)
*
* @since 5.0 SP1
*/
ROW_OFFSET,
/**
* The Maximum number of values allowed in an IN criteria (Integer)
*
* @since 4.4
*/
MAX_IN_CRITERIA_SIZE,
/**
* The connector ID, which is used by the optimizer to determine when two models are bound to the same connector
*
* @since 5.0.2
*/
CONNECTOR_ID,
/**
* @since 6.0.0 indicates support for where all
*/
REQUIRES_CRITERIA,
INSERT_WITH_QUERYEXPRESSION,
INSERT_WITH_ITERATOR,
COMMON_TABLE_EXPRESSIONS,
MAX_DEPENDENT_PREDICATES,
ADVANCED_OLAP("AdvancedOLAP"), //$NON-NLS-1$
QUERY_AGGREGATES_ARRAY,
ELEMENTARY_OLAP("ElementaryOLAP"), //$NON-NLS-1$
WINDOW_FUNCTION_ORDER_BY_AGGREGATES("WindowOrderByAggregates"), //$NON-NLS-1$
CRITERIA_SIMILAR,
CRITERIA_LIKE_REGEX,
DEPENDENT_JOIN,
WINDOW_FUNCTION_DISTINCT_AGGREGATES("WindowDistinctAggregates"), //$NON-NLS-1$
QUERY_ONLY_SINGLE_TABLE_GROUP_BY,
ONLY_FORMAT_LITERALS,
CRITERIA_ON_SUBQUERY,
ARRAY_TYPE,
QUERY_SUBQUERIES_ONLY_CORRELATED,
QUERY_AGGREGATES_STRING,
FULL_DEPENDENT_JOIN,
SELECT_WITHOUT_FROM,
QUERY_GROUP_BY_ROLLUP,
QUERY_ORDERBY_EXTENDED_GROUPING,
INVALID_EXCEPTION, //property saying why the capabilities are invalid
COLLATION_LOCALE,
RECURSIVE_COMMON_TABLE_EXPRESSIONS,
EXCLUDE_COMMON_TABLE_EXPRESSION_NAME,
CRITERIA_COMPARE_ORDERED_EXCLUSIVE,
PARTIAL_FILTERS,
DEPENDENT_JOIN_BINDINGS,
SUBQUERY_COMMON_TABLE_EXPRESSIONS,
SUBQUERY_CORRELATED_LIMIT,
NO_PROJECTION,
REQUIRED_LIKE_ESCAPE,
QUERY_SUBQUERIES_SCALAR_PROJECTION,
TRANSACTION_SUPPORT,
QUERY_FROM_JOIN_LATERAL,
QUERY_FROM_JOIN_LATERAL_CONDITION,
QUERY_FROM_PROCEDURE_TABLE,
QUERY_GROUP_BY_MULTIPLE_DISTINCT_AGGREGATES,
UPSERT,
QUERY_SELECT_EXPRESSION_ARRAY_TYPE;
private final String toString;
Capability(String toString) {
this.toString = toString;
}
Capability() {
this.toString = name();
}
public String toString() {
return toString;
}
}
/**
* Returns true if the capability is supported. The capability constants are all defined in this interface with the meaning of
* supporting that capability.
*
* @param capability
* Name of capability
* @return True if supported, false otherwise
*/
public boolean supportsCapability(Capability capability);
/**
* This method can be used to check whether a particular function is supported by this connector. This method should only be
* used if the capability FUNCTION is true.
*
* @param functionName
* The function that may be supported
* @return True if function is supported.
*/
public boolean supportsFunction(String functionName);
/**
* This method returns an Object corresponding to the Source Property
*
* @since 4.4
*/
public Object getSourceProperty(Capability propertyName);
/**
*
* @param sourceType
* @param targetType
* @return
*/
public boolean supportsConvert(int sourceType, int targetType);
public boolean supportsFormatLiteral(String literal, Format format);
}