/* Generated By:JJTree: Do not edit this line. StoredProcedure.java Version 4.3 */
/* JavaCCOptions:MULTI=true,NODE_USES_PARSER=true,VISITOR=true,TRACK_TOKENS=false,NODE_PREFIX=,NODE_EXTENDS=,NODE_FACTORY=,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */
package org.teiid.query.sql.lang;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import org.teiid.designer.query.sql.lang.ISPParameter.ParameterInfo;
import org.teiid.designer.query.sql.lang.IStoredProcedure;
import org.teiid.query.parser.LanguageVisitor;
import org.teiid.query.parser.TeiidNodeFactory.ASTNodes;
import org.teiid.designer.runtime.version.spi.ITeiidServerVersion;
import org.teiid.query.sql.symbol.ElementSymbol;
import org.teiid.query.sql.symbol.Expression;
import org.teiid.query.sql.symbol.GroupSymbol;
import org.teiid.runtime.client.Messages;
/**
*
*/
public class StoredProcedure extends ProcedureContainer
implements TargetedCommand, IStoredProcedure<SPParameter, Expression, LanguageVisitor> {
/** Used as parameters */
private Map<Integer, SPParameter> mapOfParameters = new TreeMap<Integer, SPParameter>();
/** Used to reference result set parameter if there is any */
private Integer resultSetParameterKey;
private boolean isCallableStatement;
private boolean calledWithReturn;
//whether parameters should be displayed in traditional indexed
//manor, or as named parameters
private boolean displayNamedParameters;
private boolean isProcedureRelational;
private String procedureName;
private String callableName;
//stored procedure is treated as a group
private GroupSymbol groupSymbol;
private Object procedureID;
private Object modelID;
/**
* @param p
* @param id
*/
public StoredProcedure(ITeiidServerVersion p, int id) {
super(p, id);
}
/**
* Return type of command.
* @return TYPE_STORED_PROCEDURE
*/
@Override
public int getType() {
return TYPE_STORED_PROCEDURE;
}
/**
* Get this stored procedure's name
*
* @return procedureName the stored procedure's name
*/
public String getProcedureName(){
return this.procedureName;
}
/**
* Set this stored procedure's name
*
* @param procedureName the stored procedure's name
*/
@Override
public void setProcedureName(String procedureName){
this.procedureName = procedureName;
}
@Override
public void setProcedureID(Object procedureID){
this.procedureID = procedureID;
}
@Override
public Object getProcedureID(){
return this.procedureID;
}
@Override
public String getProcedureCallableName(){
return this.callableName != null?this.callableName:this.procedureName;
}
/**
* @param callableName
*/
public void setProcedureCallableName(String callableName){
this.callableName = callableName;
}
/**
* @return is callable statement
*/
public boolean isCallableStatement() {
return isCallableStatement;
}
/**
* @param isCallableStatement
*/
public void setCallableStatement(boolean isCallableStatement) {
this.isCallableStatement = isCallableStatement;
}
private SPParameter getResultSetParameter(){
if (this.resultSetParameterKey != null){
return mapOfParameters.get(resultSetParameterKey);
}
return null;
}
/**
* @return a List of SPParameter objects for this stored procedure
*/
public Collection<SPParameter> getParameters(){
return mapOfParameters.values();
}
/**
* @param index
*
* @return parameter at index
*/
public SPParameter getParameter(int index){
return mapOfParameters.get(new Integer(index));
}
/**
* @return number of parameters
*/
public int getParameterCount() {
return mapOfParameters.size();
}
/**
* Set a stored procedure's parameter
*
* @param parameter <code>StoredProcedureParameter</code> the parameter
* @throws IllegalArgumentException if the parameters (index and parameter)
* are invalid.
*/
@Override
public void setParameter(SPParameter parameter){
if(parameter == null){
throw new IllegalArgumentException(Messages.getString(Messages.ERR.ERR_015_010_0011));
}
Integer key = parameter.getIndex();
if(parameter.getParameterType() == SPParameter.ParameterInfo.RESULT_SET.index()){
resultSetParameterKey = key;
}
mapOfParameters.put(key, parameter);
}
/**
* Clear parameters
*/
public void clearParameters(){
this.mapOfParameters.clear();
}
/**
* @param calledWithReturn
*/
public void setCalledWithReturn(boolean calledWithReturn) {
this.calledWithReturn = calledWithReturn;
}
/**
* @return called with return flag
*/
public boolean isCalledWithReturn() {
return calledWithReturn;
}
/**
* @return the displayNamedParameters
*/
public boolean isDisplayNamedParameters() {
return this.displayNamedParameters;
}
/**
* @param displayNamedParameters the displayNamedParameters to set
*/
@Override
public void setDisplayNamedParameters(boolean displayNamedParameters) {
this.displayNamedParameters = displayNamedParameters;
}
/**
* @return the isProcedureRelational
*/
public boolean isProcedureRelational() {
return this.isProcedureRelational;
}
/**
* @param isProcedureRelational the isProcedureRelational to set
*/
public void setProcedureRelational(boolean isProcedureRelational) {
this.isProcedureRelational = isProcedureRelational;
}
@Override
public boolean returnsResultSet(){
SPParameter param = getResultSetParameter();
return param != null && !param.getResultSetColumns().isEmpty();
}
/**
* @return whether this return any parameters
*/
public boolean returnParameters() {
return isCallableStatement || !returnsResultSet();
}
/**
* @return group symbol
*/
public GroupSymbol getGroupSymbol() {
if(groupSymbol == null) {
groupSymbol = createASTNode(ASTNodes.GROUP_SYMBOL);
groupSymbol.setName(getProcedureCallableName());
}
return groupSymbol;
}
/**
* @param group
*/
public void setGroupSymbol(GroupSymbol group){
this.groupSymbol = group;
}
@Override
public GroupSymbol getGroup() {
return getGroupSymbol();
}
/**
* @param group
*/
public void setGroup(GroupSymbol group){
setGroupSymbol(group);
}
@Override
public String getGroupName() {
return getGroupSymbol().getName();
}
@Override
public List<ElementSymbol> getResultSetColumns(){
SPParameter resultSetParameter = getResultSetParameter();
if(resultSetParameter != null){
List<ElementSymbol> result = new ArrayList<ElementSymbol>(resultSetParameter.getResultSetColumns().size());
for (Iterator<ElementSymbol> i = resultSetParameter.getResultSetColumns().iterator(); i.hasNext();) {
ElementSymbol symbol = i.next().clone();
symbol.setGroupSymbol(getGroupSymbol());
result.add(symbol);
}
return result;
}
return Collections.emptyList();
}
/**
* Get the ordered list of all elements returned by this query. These elements
* may be ElementSymbols or ExpressionSymbols but in all cases each represents a
* single column.
* @return Ordered list of ElementSymbol
*/
@Override
public List getProjectedSymbols(){
if (!returnParameters()) {
return getResultSetColumns();
}
//add result set columns
List<ElementSymbol> result = new ArrayList<ElementSymbol>(getResultSetColumns());
//add out/inout parameter symbols
for (SPParameter parameter : mapOfParameters.values()) {
if(parameter.getParameterType() == ParameterInfo.RETURN_VALUE.index()){
ElementSymbol symbol = parameter.getParameterSymbol();
symbol.setGroupSymbol(this.getGroupSymbol());
result.add(0, symbol);
} else if(parameter.getParameterType() == ParameterInfo.INOUT.index() || parameter.getParameterType() == ParameterInfo.OUT.index()){
ElementSymbol symbol = parameter.getParameterSymbol();
symbol.setGroupSymbol(this.getGroupSymbol());
result.add(symbol);
}
}
return result;
}
@Override
public List<SPParameter> getInputParameters() {
List<SPParameter> parameters = new ArrayList<SPParameter>(getParameters());
Iterator<SPParameter> params = parameters.iterator();
while (params.hasNext()) {
SPParameter param = params.next();
if(param.getParameterType() != ParameterInfo.IN.index() && param.getParameterType() != ParameterInfo.INOUT.index()) {
params.remove();
}
}
return parameters;
}
/**
* @return model id
*/
public Object getModelID(){
return modelID;
}
/**
* @param modelID
*/
public void setModelID(Object modelID){
this.modelID = modelID;
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + (this.calledWithReturn ? 1231 : 1237);
result = prime * result + (this.displayNamedParameters ? 1231 : 1237);
result = prime * result + (this.isCallableStatement ? 1231 : 1237);
result = prime * result + (this.isProcedureRelational ? 1231 : 1237);
result = prime * result + ((this.mapOfParameters == null) ? 0 : this.mapOfParameters.hashCode());
result = prime * result + ((this.procedureName == null) ? 0 : this.procedureName.hashCode());
result = prime * result + ((this.resultSetParameterKey == null) ? 0 : this.resultSetParameterKey.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!super.equals(obj)) return false;
if (getClass() != obj.getClass()) return false;
StoredProcedure other = (StoredProcedure)obj;
if (this.calledWithReturn != other.calledWithReturn) return false;
if (this.displayNamedParameters != other.displayNamedParameters) return false;
if (this.isCallableStatement != other.isCallableStatement) return false;
if (this.isProcedureRelational != other.isProcedureRelational) return false;
if (this.mapOfParameters == null) {
if (other.mapOfParameters != null) return false;
} else if (!this.mapOfParameters.equals(other.mapOfParameters)) return false;
if (this.procedureName == null) {
if (other.procedureName != null) return false;
} else if (!this.procedureName.equals(other.procedureName)) return false;
if (this.resultSetParameterKey == null) {
if (other.resultSetParameterKey != null) return false;
} else if (!this.resultSetParameterKey.equals(other.resultSetParameterKey)) return false;
return true;
}
/** Accept the visitor. **/
@Override
public void acceptVisitor(LanguageVisitor visitor) {
visitor.visit(this);
}
@Override
public StoredProcedure clone() {
StoredProcedure clone = new StoredProcedure(getTeiidVersion(), this.id);
if(getProcedureName() != null)
clone.setProcedureName(getProcedureName());
clone.setCallableStatement(isCallableStatement());
if(getParameters() != null) {
for (SPParameter parameter : getParameters()) {
clone.setParameter(parameter.clone());
}
}
clone.setCalledWithReturn(isCalledWithReturn());
clone.setDisplayNamedParameters(isDisplayNamedParameters());
clone.setProcedureRelational(isProcedureRelational());
if(getSourceHint() != null)
clone.setSourceHint(getSourceHint());
if(getOption() != null)
clone.setOption(getOption().clone());
copyMetadataState(clone);
return clone;
}
}
/* JavaCC - OriginalChecksum=c312e9c5d62fcc77b0a38cf092591213 (do not edit this line) */