![JAR search and dependency download from the Maven repository](/logo.png)
org.hibernate.hql.ast.tree.QueryNode Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate Show documentation
Show all versions of hibernate Show documentation
Relational Persistence for Java
// $Id: QueryNode.java 7486 2005-07-15 04:39:41Z oneovthafew $
package org.hibernate.hql.ast.tree;
import org.hibernate.hql.antlr.HqlSqlTokenTypes;
import org.hibernate.hql.antlr.SqlTokenTypes;
import org.hibernate.hql.ast.util.ASTUtil;
import org.hibernate.hql.ast.util.ColumnHelper;
import org.hibernate.type.Type;
import antlr.SemanticException;
import antlr.collections.AST;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Defines a top-level AST node representing an HQL select statement.
*
* @author Joshua Davis
*/
public class QueryNode extends AbstractRestrictableStatement implements SelectExpression {
private static final Log log = LogFactory.getLog( QueryNode.class );
private OrderByClause orderByClause;
/**
* @see Statement#getStatementType()
*/
public int getStatementType() {
return HqlSqlTokenTypes.QUERY;
}
/**
* @see Statement#needsExecutor()
*/
public boolean needsExecutor() {
return false;
}
protected int getWhereClauseParentTokenType() {
return SqlTokenTypes.FROM;
}
protected Log getLog() {
return log;
}
/**
* Locate the select clause that is part of this select statement.
*
* Note, that this might return null as derived select clauses (i.e., no
* select clause at the HQL-level) get generated much later than when we
* get created; thus it depends upon lifecycle.
*
* @return Our select clause, or null.
*/
public final SelectClause getSelectClause() {
// Due to the complexity in initializing the SelectClause, do not generate one here.
// If it is not found; simply return null...
//
// Also, do not cache since it gets generated well after we are created.
return ( SelectClause ) ASTUtil.findTypeInChildren( this, SqlTokenTypes.SELECT_CLAUSE );
}
public final boolean hasOrderByClause() {
OrderByClause orderByClause = locateOrderByClause();
return orderByClause != null && orderByClause.getNumberOfChildren() > 0;
}
public final OrderByClause getOrderByClause() {
if ( orderByClause == null ) {
orderByClause = locateOrderByClause();
// if there is no order by, make one
if ( orderByClause == null ) {
log.debug( "getOrderByClause() : Creating a new ORDER BY clause" );
orderByClause = ( OrderByClause ) ASTUtil.create( getWalker().getASTFactory(), SqlTokenTypes.ORDER, "ORDER" );
// Find the WHERE; if there is no WHERE, find the FROM...
AST prevSibling = ASTUtil.findTypeInChildren( this, SqlTokenTypes.WHERE );
if ( prevSibling == null ) {
prevSibling = ASTUtil.findTypeInChildren( this, SqlTokenTypes.FROM );
}
// Now, inject the newly built ORDER BY into the tree
orderByClause.setNextSibling( prevSibling.getNextSibling() );
prevSibling.setNextSibling( orderByClause );
}
}
return orderByClause;
}
private OrderByClause locateOrderByClause() {
return ( OrderByClause ) ASTUtil.findTypeInChildren( this, SqlTokenTypes.ORDER );
}
private String alias;
public String getAlias() {
return alias;
}
public FromElement getFromElement() {
return null;
}
public boolean isConstructor() {
return false;
}
public boolean isReturnableEntity() throws SemanticException {
return false;
}
public boolean isScalar() throws SemanticException {
return true;
}
public void setAlias(String alias) {
this.alias = alias;
}
public void setScalarColumnText(int i) throws SemanticException {
ColumnHelper.generateSingleScalarColumn( this, i );
}
public Type getDataType() {
return ( (SelectExpression) getSelectClause().getFirstSelectExpression() ).getDataType();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy