/*
* 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.runtime.client.query;
import java.util.ArrayList;
import java.util.List;
import org.teiid.designer.query.IQueryFactory;
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.ICompareCriteria;
import org.teiid.designer.query.sql.lang.ICompoundCriteria;
import org.teiid.designer.query.sql.lang.IDelete;
import org.teiid.designer.query.sql.lang.IExistsCriteria;
import org.teiid.designer.query.sql.lang.IFrom;
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.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.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.IAliasSymbol;
import org.teiid.designer.query.sql.symbol.IConstant;
import org.teiid.designer.query.sql.symbol.IElementSymbol;
import org.teiid.designer.query.sql.symbol.IElementSymbol.DisplayMode;
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;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.designer.runtime.version.spi.TeiidServerVersion.Version;
import org.teiid.query.mapping.relational.QueryNode;
import org.teiid.query.metadata.StoredProcedureInfo;
import org.teiid.query.metadata.TempMetadataID;
import org.teiid.query.parser.TeiidNodeFactory;
import org.teiid.query.parser.TeiidNodeFactory.ASTNodes;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.query.sql.lang.BetweenCriteria;
import org.teiid.query.sql.lang.Command;
import org.teiid.query.sql.lang.CompareCriteria;
import org.teiid.query.sql.lang.CompoundCriteria;
import org.teiid.query.sql.lang.Criteria;
import org.teiid.query.sql.lang.CriteriaOperator.Operator;
import org.teiid.query.sql.lang.Delete;
import org.teiid.query.sql.lang.ExistsCriteria;
import org.teiid.query.sql.lang.From;
import org.teiid.query.sql.lang.FromClause;
import org.teiid.query.sql.lang.GroupBy;
import org.teiid.query.sql.lang.Insert;
import org.teiid.query.sql.lang.IsNullCriteria;
import org.teiid.query.sql.lang.JoinPredicate;
import org.teiid.query.sql.lang.JoinType;
import org.teiid.query.sql.lang.LanguageObject;
import org.teiid.query.sql.lang.MatchCriteria;
import org.teiid.query.sql.lang.NotCriteria;
import org.teiid.query.sql.lang.Option;
import org.teiid.query.sql.lang.OrderBy;
import org.teiid.query.sql.lang.Query;
import org.teiid.query.sql.lang.QueryCommand;
import org.teiid.query.sql.lang.SPParameter;
import org.teiid.query.sql.lang.Select;
import org.teiid.query.sql.lang.SetCriteria;
import org.teiid.query.sql.lang.SetQuery;
import org.teiid.query.sql.lang.StoredProcedure;
import org.teiid.query.sql.lang.SubqueryCompareCriteria;
import org.teiid.query.sql.lang.SubqueryCompareCriteria.PredicateQuantifier;
import org.teiid.query.sql.lang.SubqueryFromClause;
import org.teiid.query.sql.lang.SubquerySetCriteria;
import org.teiid.query.sql.lang.UnaryFromClause;
import org.teiid.query.sql.lang.Update;
import org.teiid.query.sql.proc.AssignmentStatement;
import org.teiid.query.sql.proc.Block;
import org.teiid.query.sql.proc.CommandStatement;
import org.teiid.query.sql.proc.CreateProcedureCommand;
import org.teiid.query.sql.proc.CreateUpdateProcedureCommand;
import org.teiid.query.sql.proc.DeclareStatement;
import org.teiid.query.sql.proc.RaiseErrorStatement;
import org.teiid.query.sql.proc.RaiseStatement;
import org.teiid.query.sql.symbol.AggregateSymbol;
import org.teiid.query.sql.symbol.AliasSymbol;
import org.teiid.query.sql.symbol.Constant;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.ExpressionSymbol;
import org.teiid.query.sql.symbol.Function;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.query.sql.symbol.MultipleElementSymbol;
import org.teiid.query.sql.symbol.Reference;
import org.teiid.query.sql.symbol.ScalarSubquery;
/**
*
*/
public class SyntaxFactory implements IQueryFactory <Expression,
Expression,
FromClause,
ElementSymbol,
Command,
QueryCommand,
Criteria,
Constant,
Block,
Expression,
GroupSymbol,
JoinType> {
private ITeiidServerVersion teiidVersion;
private final TeiidNodeFactory nodeFactory = TeiidNodeFactory.getInstance();
/**
* @param teiidVersion
*/
public SyntaxFactory(ITeiidServerVersion teiidVersion) {
this.teiidVersion = teiidVersion;
}
private boolean isGreaterThanOrEqualTo(Version teiidVersion) {
ITeiidServerVersion minVersion = this.teiidVersion.getMinimumVersion();
return minVersion.equals(teiidVersion.get()) || minVersion.isGreaterThan(teiidVersion.get());
}
private <T extends LanguageObject> T create(ASTNodes nodeType) {
return nodeFactory.create(teiidVersion, nodeType);
}
@Override
public IFunction createFunction(String name, List<? extends Expression> arguments) {
if (arguments == null) {
arguments = new ArrayList<Expression>();
}
Function function = create(ASTNodes.FUNCTION);
function.setName(name);
function.setArgs(arguments.toArray(new Expression[0]));
return function;
}
@Override
public IAggregateSymbol createAggregateSymbol(String functionName, AggregateSymbol.Type functionType, boolean isDistinct, Expression expression) {
AggregateSymbol aggregateSymbol = create(ASTNodes.AGGREGATE_SYMBOL);
aggregateSymbol.setName(functionName);
aggregateSymbol.setAggregateFunction(functionType);
aggregateSymbol.setDistinct(isDistinct);
if (expression != null) {
aggregateSymbol.setArgs(new Expression[] { expression });
}
return aggregateSymbol;
}
@Override
public IElementSymbol createElementSymbol(String name) {
ElementSymbol elementSymbol = create(ASTNodes.ELEMENT_SYMBOL);
elementSymbol.setName(name);
return elementSymbol;
}
@Override
public IElementSymbol createElementSymbol(String name, boolean displayFullyQualified) {
ElementSymbol elementSymbol = create(ASTNodes.ELEMENT_SYMBOL);
elementSymbol.setName(name);
if (displayFullyQualified)
elementSymbol.setDisplayMode(DisplayMode.FULLY_QUALIFIED);
else
elementSymbol.setDisplayMode(DisplayMode.SHORT_OUTPUT_NAME);
return elementSymbol;
}
@Override
public IAliasSymbol createAliasSymbol(String name, Expression symbol) {
AliasSymbol aliasSymbol = create(ASTNodes.ALIAS_SYMBOL);
aliasSymbol.setName(name);
aliasSymbol.setSymbol(symbol);
return aliasSymbol;
}
@Override
public IGroupSymbol createGroupSymbol(String name) {
GroupSymbol groupSymbol = create(ASTNodes.GROUP_SYMBOL);
groupSymbol.setName(name);
return groupSymbol;
}
@Override
public IGroupSymbol createGroupSymbol(String name, String definition) {
GroupSymbol groupSymbol = create(ASTNodes.GROUP_SYMBOL);
groupSymbol.setName(name);
groupSymbol.setDefinition(definition);
return groupSymbol;
}
@Override
public IExpressionSymbol createExpressionSymbol(String name, Expression expression) {
ExpressionSymbol expressionSymbol = create(ASTNodes.EXPRESSION_SYMBOL);
expressionSymbol.setName(name);
expressionSymbol.setExpression(expression);
return expressionSymbol;
}
@Override
public IMultipleElementSymbol createMultipleElementSymbol() {
MultipleElementSymbol multipleElementSymbol = create(ASTNodes.MULTIPLE_ELEMENT_SYMBOL);
return multipleElementSymbol;
}
@Override
public IConstant createConstant(Object value) {
Constant constant = create(ASTNodes.CONSTANT);
constant.setValue(value);
return constant;
}
@Override
public IDeclareStatement createDeclareStatement(ElementSymbol variable, String valueType) {
DeclareStatement declareStatement = create(ASTNodes.DECLARE_STATEMENT);
declareStatement.setVariable(variable);
declareStatement.setVariableType(valueType);
return declareStatement;
}
@Override
public ICommandStatement createCommandStatement(Command command) {
CommandStatement commandStatement = create(ASTNodes.COMMAND_STATEMENT);
commandStatement.setCommand(command);
return commandStatement;
}
@Override
public IRaiseStatement createRaiseStatement(Expression expression) {
RaiseStatement raiseStatement = create(ASTNodes.RAISE_STATEMENT);
raiseStatement.setExpression(expression);
return raiseStatement;
}
@Override
public IQuery createQuery() {
Query query = create(ASTNodes.QUERY);
return query;
}
@Override
public ISetQuery createSetQuery(Operation operation, boolean all, QueryCommand leftQuery, QueryCommand rightQuery) {
SetQuery setQuery = create(ASTNodes.SET_QUERY);
setQuery.setLeftQuery(leftQuery);
setQuery.setAll(all);
setQuery.setOperation(operation);
setQuery.setRightQuery(rightQuery);
return setQuery;
}
@Override
public ISetQuery createSetQuery(Operation operation) {
SetQuery setQuery = create(ASTNodes.SET_QUERY);
setQuery.setOperation(operation);
return setQuery;
}
@Override
public ICompareCriteria createCompareCriteria() {
CompareCriteria compareCriteria = create(ASTNodes.COMPARE_CRITERIA);
return compareCriteria;
}
@Override
public ICompareCriteria createCompareCriteria(Expression expression1, int operator, Expression expression2) {
CompareCriteria compareCriteria = create(ASTNodes.COMPARE_CRITERIA);
compareCriteria.setLeftExpression(expression1);
compareCriteria.setOperator(Operator.findOperator(operator));
compareCriteria.setRightExpression(expression2);
return compareCriteria;
}
@Override
public IIsNullCriteria createIsNullCriteria() {
IsNullCriteria isNullCriteria = create(ASTNodes.IS_NULL_CRITERIA);
return isNullCriteria;
}
@Override
public IIsNullCriteria createIsNullCriteria(Expression expression) {
IsNullCriteria isNullCriteria = create(ASTNodes.IS_NULL_CRITERIA);
isNullCriteria.setExpression(expression);
return isNullCriteria;
}
@Override
public INotCriteria createNotCriteria() {
NotCriteria notCriteria = create(ASTNodes.NOT_CRITERIA);
return notCriteria;
}
@Override
public INotCriteria createNotCriteria(Criteria criteria) {
NotCriteria notCriteria = create(ASTNodes.NOT_CRITERIA);
notCriteria.setCriteria(criteria);
return notCriteria;
}
@Override
public IMatchCriteria createMatchCriteria() {
MatchCriteria matchCriteria = create(ASTNodes.MATCH_CRITERIA);
return matchCriteria;
}
@Override
public ISetCriteria createSetCriteria() {
SetCriteria setCriteria = create(ASTNodes.SET_CRITERIA);
return setCriteria;
}
@Override
public ISubquerySetCriteria createSubquerySetCriteria() {
SubquerySetCriteria subquerySetCriteria = create(ASTNodes.SUBQUERY_SET_CRITERIA);
return subquerySetCriteria;
}
@Override
public ISubquerySetCriteria createSubquerySetCriteria(Expression expression, QueryCommand command) {
SubquerySetCriteria subquerySetCriteria = create(ASTNodes.SUBQUERY_SET_CRITERIA);
subquerySetCriteria.setExpression(expression);
subquerySetCriteria.setCommand(command);
return subquerySetCriteria;
}
@Override
public ISubqueryCompareCriteria createSubqueryCompareCriteria(Expression leftExpression, QueryCommand command, int operator, int predicateQuantifier) {
SubqueryCompareCriteria subqueryCompareCriteria = create(ASTNodes.SUBQUERY_COMPARE_CRITERIA);
subqueryCompareCriteria.setLeftExpression(leftExpression);
subqueryCompareCriteria.setCommand(command);
subqueryCompareCriteria.setOperator(Operator.findOperator(operator));
subqueryCompareCriteria.setPredicateQuantifier(PredicateQuantifier.findQuantifier(predicateQuantifier));
return subqueryCompareCriteria;
}
@Override
public IScalarSubquery createScalarSubquery(QueryCommand queryCommand) {
ScalarSubquery scalarSubquery = create(ASTNodes.SCALAR_SUBQUERY);
scalarSubquery.setCommand(queryCommand);
return scalarSubquery;
}
@Override
public IBetweenCriteria createBetweenCriteria(ElementSymbol elementSymbol, Constant constant1, Constant constant2) {
BetweenCriteria betweenCriteria = create(ASTNodes.BETWEEN_CRITERIA);
betweenCriteria.setExpression(elementSymbol);
betweenCriteria.setLowerExpression(constant1);
betweenCriteria.setUpperExpression(constant2);
return betweenCriteria;
}
@Override
public ICompoundCriteria createCompoundCriteria(int operator, List<? extends Criteria> criteria) {
CompoundCriteria compoundCriteria = create(ASTNodes.COMPOUND_CRITERIA);
compoundCriteria.setOperator(operator);
compoundCriteria.setCriteria(criteria);
return compoundCriteria;
}
@Override
public IExistsCriteria createExistsCriteria(QueryCommand queryCommand) {
ExistsCriteria existsCriteria = create(ASTNodes.EXISTS_CRITERIA);
existsCriteria.setCommand(queryCommand);
return existsCriteria;
}
@Override
public IBlock createBlock() {
Block block = create(ASTNodes.BLOCK);
return block;
}
@Override
public ICreateProcedureCommand createCreateProcedureCommand(Block block) {
CreateProcedureCommand command = create(ASTNodes.CREATE_PROCEDURE_COMMAND);
command.setBlock(block);
return command;
}
@Override
public IAssignmentStatement createAssignmentStatement(ElementSymbol elementSymbol, Expression expression) {
AssignmentStatement assignmentStatement = create(ASTNodes.ASSIGNMENT_STATEMENT);
assignmentStatement.setVariable(elementSymbol);
assignmentStatement.setExpression(expression);
return assignmentStatement;
}
@Override
public IAssignmentStatement createAssignmentStatement(ElementSymbol elementSymbol, QueryCommand queryCommand) {
AssignmentStatement assignmentStatement = create(ASTNodes.ASSIGNMENT_STATEMENT);
assignmentStatement.setVariable(elementSymbol);
assignmentStatement.setCommand(queryCommand);
return assignmentStatement;
}
@Override
public ISelect createSelect() {
Select select = create(ASTNodes.SELECT);
return select;
}
@Override
public ISelect createSelect(List<? extends Expression> symbols) {
Select select = create(ASTNodes.SELECT);
select.setSymbols(symbols);
return select;
}
@Override
public IFrom createFrom() {
From from = create(ASTNodes.FROM);
return from;
}
@Override
public IFrom createFrom(List<? extends FromClause> fromClauses) {
From from = create(ASTNodes.FROM);
from.setClauses(fromClauses);
return from;
}
@Override
public IUnaryFromClause createUnaryFromClause(GroupSymbol symbol) {
UnaryFromClause unaryFromClause = create(ASTNodes.UNARY_FROM_CLAUSE);
unaryFromClause.setGroup(symbol);
return unaryFromClause;
}
@Override
public ISubqueryFromClause createSubqueryFromClause(String name, QueryCommand command) {
SubqueryFromClause subqueryFromClause = create(ASTNodes.SUBQUERY_FROM_CLAUSE);
subqueryFromClause.setName(name);
subqueryFromClause.setCommand(command);
return subqueryFromClause;
}
@Override
public IJoinType getJoinType(IJoinType.Types joinType) {
JoinType join = create(ASTNodes.JOIN_TYPE);
join.setKind(joinType);
return join;
}
@Override
public IJoinPredicate createJoinPredicate(FromClause leftClause, FromClause rightClause, JoinType joinType) {
JoinPredicate joinPredicate = create(ASTNodes.JOIN_PREDICATE);
joinPredicate.setJoinType(joinType);
joinPredicate.setLeftClause(leftClause);
joinPredicate.setRightClause(rightClause);
return joinPredicate;
}
@Override
public IJoinPredicate createJoinPredicate(FromClause leftClause, FromClause rightClause, JoinType joinType, List<Criteria> criteria) {
JoinPredicate joinPredicate = create(ASTNodes.JOIN_PREDICATE);
joinPredicate.setJoinType(joinType);
joinPredicate.setLeftClause(leftClause);
joinPredicate.setRightClause(rightClause);
joinPredicate.setJoinCriteria(criteria);
return joinPredicate;
}
@Override
public IGroupBy createGroupBy() {
GroupBy groupBy = create(ASTNodes.GROUP_BY);
return groupBy;
}
@Override
public IOrderBy createOrderBy() {
OrderBy orderBy = create(ASTNodes.ORDER_BY);
return orderBy;
}
@Override
public IOption createOption() {
Option option = create(ASTNodes.OPTION);
return option;
}
@Override
public IUpdate createUpdate() {
Update update = create(ASTNodes.UPDATE);
return update;
}
@Override
public IDelete createDelete() {
Delete delete = create(ASTNodes.DELETE);
return delete;
}
@Override
public IInsert createInsert() {
Insert insert = create(ASTNodes.INSERT);
return insert;
}
@Override
public IStoredProcedure createStoredProcedure() {
StoredProcedure storedProcedure = create(ASTNodes.STORED_PROCEDURE);
return storedProcedure;
}
@Override
public ISPParameter createSPParameter(int index, Expression expression) {
return new SPParameter(teiidVersion, index, expression);
}
@Override
public ISPParameter createSPParameter(int index, ParameterInfo parameterType, String name) {
return new SPParameter(teiidVersion, index, parameterType.index(), name);
}
@Override
public IReference createReference(int index) {
Reference reference = create(ASTNodes.REFERENCE);
reference.setIndex(index);
return reference;
}
@Override
public IMetadataID createMetadataID(String id, Class clazz) {
return new TempMetadataID(id, clazz);
}
@Override
public IStoredProcedureInfo createStoredProcedureInfo() {
return new StoredProcedureInfo();
}
@Override
public IQueryNode createQueryNode(String queryPlan) {
return new QueryNode(queryPlan);
}
}