/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.query;
import java.util.List;
import org.teiid.designer.query.metadata.IMetadataID;
import org.teiid.designer.query.metadata.IQueryNode;
import org.teiid.designer.query.metadata.IStoredProcedureInfo;
import org.teiid.designer.query.sql.lang.IBetweenCriteria;
import org.teiid.designer.query.sql.lang.ICommand;
import org.teiid.designer.query.sql.lang.ICompareCriteria;
import org.teiid.designer.query.sql.lang.ICompoundCriteria;
import org.teiid.designer.query.sql.lang.ICriteria;
import org.teiid.designer.query.sql.lang.IDelete;
import org.teiid.designer.query.sql.lang.IExistsCriteria;
import org.teiid.designer.query.sql.lang.IExpression;
import org.teiid.designer.query.sql.lang.IFrom;
import org.teiid.designer.query.sql.lang.IFromClause;
import org.teiid.designer.query.sql.lang.IGroupBy;
import org.teiid.designer.query.sql.lang.IInsert;
import org.teiid.designer.query.sql.lang.IIsNullCriteria;
import org.teiid.designer.query.sql.lang.IJoinPredicate;
import org.teiid.designer.query.sql.lang.IJoinType;
import org.teiid.designer.query.sql.lang.ILanguageObject;
import org.teiid.designer.query.sql.lang.IMatchCriteria;
import org.teiid.designer.query.sql.lang.INotCriteria;
import org.teiid.designer.query.sql.lang.IOption;
import org.teiid.designer.query.sql.lang.IOrderBy;
import org.teiid.designer.query.sql.lang.IQuery;
import org.teiid.designer.query.sql.lang.IQueryCommand;
import org.teiid.designer.query.sql.lang.ISPParameter;
import org.teiid.designer.query.sql.lang.ISPParameter.ParameterInfo;
import org.teiid.designer.query.sql.lang.ISelect;
import org.teiid.designer.query.sql.lang.ISetCriteria;
import org.teiid.designer.query.sql.lang.ISetQuery;
import org.teiid.designer.query.sql.lang.ISetQuery.Operation;
import org.teiid.designer.query.sql.lang.IStoredProcedure;
import org.teiid.designer.query.sql.lang.ISubqueryCompareCriteria;
import org.teiid.designer.query.sql.lang.ISubqueryFromClause;
import org.teiid.designer.query.sql.lang.ISubquerySetCriteria;
import org.teiid.designer.query.sql.lang.IUnaryFromClause;
import org.teiid.designer.query.sql.lang.IUpdate;
import org.teiid.designer.query.sql.proc.IAssignmentStatement;
import org.teiid.designer.query.sql.proc.IBlock;
import org.teiid.designer.query.sql.proc.ICommandStatement;
import org.teiid.designer.query.sql.proc.ICreateProcedureCommand;
import org.teiid.designer.query.sql.proc.IDeclareStatement;
import org.teiid.designer.query.sql.proc.IRaiseStatement;
import org.teiid.designer.query.sql.symbol.IAggregateSymbol;
import org.teiid.designer.query.sql.symbol.IAggregateSymbol.Type;
import org.teiid.designer.query.sql.symbol.IAliasSymbol;
import org.teiid.designer.query.sql.symbol.IConstant;
import org.teiid.designer.query.sql.symbol.IElementSymbol;
import org.teiid.designer.query.sql.symbol.IExpressionSymbol;
import org.teiid.designer.query.sql.symbol.IFunction;
import org.teiid.designer.query.sql.symbol.IGroupSymbol;
import org.teiid.designer.query.sql.symbol.IMultipleElementSymbol;
import org.teiid.designer.query.sql.symbol.IReference;
import org.teiid.designer.query.sql.symbol.IScalarSubquery;
/**
*
*/
public interface IQueryFactory<E extends IExpression,
SES extends IExpression /* SingleElementSymbol */,
F extends IFromClause,
ES extends IElementSymbol,
C extends ICommand,
QC extends IQueryCommand,
CR extends ICriteria,
CO extends IConstant,
B extends IBlock,
SS extends ILanguageObject /* SelectSymbol */,
GS extends IGroupSymbol,
JT extends IJoinType> {
/**
* Create a new function
*
* @param name
* @param arguments
*
* @return instance of {@link IFunction}
*/
IFunction createFunction(String name, List<? extends E> arguments);
/**
* Create a new aggregate symbol
*
* @param functionName
* @param functionType
* @param isDistinct
* @param expression
*
* @return instance of {@link IAggregateSymbol}
*/
IAggregateSymbol createAggregateSymbol(String functionName, Type functionType, boolean isDistinct, E expression);
/**
* Create a new element symbol
*
* @param name
*
* @return instance of {@link IElementSymbol}
*/
IElementSymbol createElementSymbol(String name);
/**
* Create a new element symbol
*
* @param name
* @param displayFullyQualified True if should display fully qualified
*
* @return instance of {@link IElementSymbol}
*/
IElementSymbol createElementSymbol(String name, boolean displayFullyQualified);
/**
* Create an alias symbol
*
* @param name
* @param symbol
*
* @return instance of {@link IAliasSymbol}
*/
IAliasSymbol createAliasSymbol(String name, SES symbol);
/**
* Create a new group symbol
*
* @param name
*
* @return instance of {@link IGroupSymbol}
*/
IGroupSymbol createGroupSymbol(String name);
/**
* Create a new group symbol
*
* @param name
* @param definition
*
* @return instance of {@link IGroupSymbol}
*/
IGroupSymbol createGroupSymbol(String name, String definition);
/**
* Create an expression symbol
*
* @param name
* @param expression
*
* @return instance of {@link IExpressionSymbol}
*/
IExpressionSymbol createExpressionSymbol(String name, E expression);
/**
* Create an multiple element symbol
*
* @return instance of {@link IMultipleElementSymbol}
*/
IMultipleElementSymbol createMultipleElementSymbol();
/**
* Create a new constant
*
* @param value
*
* @return instance of {@link IConstant}
*/
IConstant createConstant(Object value);
/**
* Create a new declare statement.
*
* @param variable The <code>ElementSymbol</code> object that is the variable
* @param valueType The type of this variable
*
* @return instance of {@link IDeclareStatement}
*/
IDeclareStatement createDeclareStatement(ES variable, String valueType);
/**
* Create a command statement
*
* @param command
*
* @return instance of {@link ICommandStatement}
*/
ICommandStatement createCommandStatement(C command);
/**
* Create a raise statement
*
* @param expression
*
* @return instance of {@link IRaiseStatement}
*/
IRaiseStatement createRaiseStatement(E expression);
/**
* Create a query
*
* @return instance of {@link IQuery}
*/
IQuery createQuery();
/**
* Create a set query
*
* @param operation
* @param all
* @param leftQuery
* @param rightQuery
*
* @return instance of {@link ISetQuery}
*/
ISetQuery createSetQuery(Operation operation,
boolean all,
QC leftQuery,
QC rightQuery);
/**
* Create a set query
*
* @param operation
*
* @return instance of {@link ISetQuery}
*/
ISetQuery createSetQuery(Operation operation);
/**
* Create a compare criteria
*
* @return instance of {@link ICompareCriteria}
*/
ICompareCriteria createCompareCriteria();
/**
* Create a compare criteria
*
* @param expression1
* @param operator
* @param expression2
*
* @return instance of {@link ICompareCriteria}
*/
ICompareCriteria createCompareCriteria(E expression1,
int operator,
E expression2);
/**
* Create an is null criteria
*
* @return instance of {@link IIsNullCriteria}
*/
IIsNullCriteria createIsNullCriteria();
/**
* Create an is null criteria
*
* @param expression
*
* @return instance of {@link IIsNullCriteria}
*/
IIsNullCriteria createIsNullCriteria(E expression);
/**
* Create a not criteria
*
* @return instance of {@link INotCriteria}
*/
INotCriteria createNotCriteria();
/**
* Create a not criteria
*
* @param criteria
*
* @return instance of {@link INotCriteria}
*/
INotCriteria createNotCriteria(CR criteria);
/**
* Create a match criteria
*
* @return instance of {@link IMatchCriteria}
*/
IMatchCriteria createMatchCriteria();
/**
* Create a set criteria
*
* @return instance of {@link ISetCriteria}
*/
ISetCriteria createSetCriteria();
/**
* Create a subquery set criteria
*
* @return instance of {@link ISubquerySetCriteria}
*/
ISubquerySetCriteria createSubquerySetCriteria();
/**
* Create a subquery set criteria
*
* @param expression
* @param command
*
* @return instance of {@link ISubquerySetCriteria}
*/
ISubquerySetCriteria createSubquerySetCriteria(E expression, QC command);
/**
* Create a subquery compare criteria
*
* @param leftExpression
* @param command
* @param operator
* @param predicateQuantifier
*
* @return instance of {@link ISubqueryCompareCriteria}
*/
ISubqueryCompareCriteria createSubqueryCompareCriteria(E leftExpression, QC command, int operator, int predicateQuantifier);
/**
* Create a scalar sub query
*
* @param queryCommand
*
* @return instance of {@link IScalarSubquery}
*/
IScalarSubquery createScalarSubquery(QC queryCommand);
/**
* Create an in-between criteria
*
* @param elementSymbol
* @param constant1
* @param constant2
*
* @return instance of {@link IBetweenCriteria}
*/
IBetweenCriteria createBetweenCriteria(ES elementSymbol,
CO constant1,
CO constant2);
/**
* Create a compound criteria
*
* @param operator
* @param criteria
*
* @return instance of {@link ICompoundCriteria}
*/
ICompoundCriteria createCompoundCriteria(int operator, List<? extends CR> criteria);
/**
* Create an exists criteria
*
* @param queryCommand
*
* @return instance of {@link IExistsCriteria}
*/
IExistsCriteria createExistsCriteria(QC queryCommand);
/**
* Create a block
*
* @return instance of {@link IBlock}
*/
IBlock createBlock();
/**
* Create a create-procedure statement
*
* @param block
*
* @return instance of {@link ICreateProcedureCommand}
*/
ICreateProcedureCommand createCreateProcedureCommand(B block);
/**
* Create an assignment statement
*
* @param elementSymbol
* @param expression
*
* @return instance of {@link IAssignmentStatement}
*/
IAssignmentStatement createAssignmentStatement(ES elementSymbol, E expression);
/**
* Create an assignment statement
*
* @param elementSymbol
* @param queryCommand
*
* @return instance of {@link IAssignmentStatement}
*/
IAssignmentStatement createAssignmentStatement(ES elementSymbol, QC queryCommand);
/**
* Create a select
*
* @return instance of {@link ISelect}
*/
ISelect createSelect();
/**
* Create a select
*
* @param symbols
*
* @return instance of {@link ISelect}
*/
ISelect createSelect(List<? extends SS> symbols);
/**
* Create a from
*
* @return instance of {@link IFrom}
*/
IFrom createFrom();
/**
* Create a from
*
* @param fromClauses
*
* @return instance of {@link IFrom}
*/
IFrom createFrom(List<? extends F> fromClauses);
/**
* Create a unary from clause
*
* @param symbol
*
* @return instance of {@link IUnaryFromClause}
*/
IUnaryFromClause createUnaryFromClause(GS symbol);
/**
* Create a subquery from clause
*
* @param name
* @param command
*
* @return instance of {@link ISubqueryFromClause}
*/
ISubqueryFromClause createSubqueryFromClause(String name, QC command);
/**
* Create a join type
*
* @param joinType
*
* @return instance of {@link IJoinType}
*/
IJoinType getJoinType(IJoinType.Types joinType);
/**
* Create a join predicate
*
* @param leftClause
* @param rightClause
* @param joinType
*
* @return instance of {@link IJoinPredicate}
*/
IJoinPredicate createJoinPredicate(F leftClause,
F rightClause,
JT joinType);
/**
* Create a join predicate
*
* @param leftClause
* @param rightClause
* @param joinType
* @param criteria
*
* @return instance of {@link IJoinPredicate}
*/
IJoinPredicate createJoinPredicate(F leftClause,
F rightClause,
JT joinType,
List<CR> criteria);
/**
* Create a group by
*
* @return instance of {@link IGroupBy}
*/
IGroupBy createGroupBy();
/**
* Create an order by
*
* @return instance of {@link IOrderBy}
*/
IOrderBy createOrderBy();
/**
* Create an option
*
* @return instance of {@link IOption}
*/
IOption createOption();
/**
* Create an update
*
* @return instance of {@link IUpdate}
*/
IUpdate createUpdate();
/**
* Create a delete
*
* @return instance of {@link IDelete}
*/
IDelete createDelete();
/**
* Create an insert
*
* @return instance of {@link IInsert}
*/
IInsert createInsert();
/**
* Create a stored procedure
*
* @return instance of {@link IStoredProcedure}
*/
IStoredProcedure createStoredProcedure();
/**
* Create a stored procedure parameter
*
* @param index
* @param expression
*
* @return instance of {@link ISPParameter}
*/
ISPParameter createSPParameter(int index, E expression);
/**
* Create a stored procedure parameter
*
* @param index
* @param parameterType
* @param name
*
* @return instance of {@link ISPParameter}
*/
ISPParameter createSPParameter(int index, ParameterInfo parameterType, String name);
/**
* Create a reference
*
* @param index
*
* @return instance of {@link IReference}
*/
IReference createReference(int index);
/**
* Create a metadata id
*
* @param upperCase
* @param clazz
*
* @return instance of {@link IMetadataID}
*/
IMetadataID createMetadataID(String upperCase, Class clazz);
/**
* Create a stored procedure info
*
* @return instance of {@link IStoredProcedureInfo}
*/
IStoredProcedureInfo createStoredProcedureInfo();
/**
* Create a query node
*
* @param queryPlan
*
* @return instance of {@link IQueryNode}
*/
IQueryNode createQueryNode(String queryPlan);
}