package org.hibernate.hql.internal.ast.tree;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import antlr.SemanticException;
public class ResultVariableRefNode extends HqlSqlWalkerNode {
private SelectExpression selectExpression;
public void setSelectExpression(SelectExpression selectExpression) throws SemanticException {
if ( selectExpression == null || selectExpression.getAlias() == null ) {
throw new SemanticException( "A ResultVariableRefNode must refer to a non-null alias." );
}
this.selectExpression = selectExpression;
}
@Override
public String getRenderText(SessionFactoryImplementor sessionFactory) {
int scalarColumnIndex = selectExpression.getScalarColumnIndex();
if ( scalarColumnIndex < 0 ) {
throw new IllegalStateException(
"selectExpression.getScalarColumnIndex() must be >= 0; actual = " + scalarColumnIndex
);
}
return sessionFactory.getDialect().replaceResultVariableInOrderByClauseWithPosition() ?
getColumnPositionsString( scalarColumnIndex ) :
getColumnNamesString( scalarColumnIndex );
}
private String getColumnPositionsString(int scalarColumnIndex ) {
int startPosition = getWalker().getSelectClause().getColumnNamesStartPosition( scalarColumnIndex );
StringBuilder buf = new StringBuilder();
int nColumns = getWalker().getSelectClause().getColumnNames()[ scalarColumnIndex ].length;
for ( int i = startPosition; i < startPosition + nColumns; i++ ) {
if ( i > startPosition ) {
buf.append( ", " );
}
buf.append( i );
}
return buf.toString();
}
private String getColumnNamesString(int scalarColumnIndex) {
return String.join( ", ", getWalker().getSelectClause().getColumnNames()[scalarColumnIndex] );
}
}