//$Id: Projection.java,v 1.14 2005/02/12 07:19:14 steveebersole Exp $
package org.hibernate.criterion;


import java.io.Serializable;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.type.Type;

/**
 * An object-oriented representation of a query result set projection 
 * in a <tt>Criteria</tt> query. Built-in projection types are provided 
 * by the <tt>Projections</tt> factory class.
 * This interface might be implemented by application classes that
 * define custom projections.
 *
 * @see Projections
 * @see org.hibernate.Criteria
 * @author Gavin King
 */
public interface Projection extends Serializable {

	/**
	 * Render the SQL fragment
	 * @param criteriaQuery
	 * @param columnAlias
	 * @return String
	 * @throws HibernateException
	 */
	public String toSqlString(Criteria criteria, int position, CriteriaQuery criteriaQuery) 
	throws HibernateException;
	
	/**
	 * Render the SQL fragment to be used in the group by clause
	 * @param criteriaQuery
	 * @param columnAlias
	 * @return String
	 * @throws HibernateException
	 */
	public String toGroupSqlString(Criteria criteria, CriteriaQuery criteriaQuery) 
	throws HibernateException;
	
	/**
	 * Return types returned by the rendered SQL fragment
	 * @param criteria
	 * @param criteriaQuery 
	 * @return Type[]
	 * @throws HibernateException
	 */
	public Type[] getTypes(Criteria criteria, CriteriaQuery criteriaQuery) 
	throws HibernateException;
	/**
	 * Return types for a particular user-visible alias
	 */
	public Type[] getTypes(String alias, Criteria criteria, CriteriaQuery criteriaQuery) 
	throws HibernateException;
		
	/**
	 * Get the SQL select clause column aliases
	 */
	public String[] getColumnAliases(int loc);
	/**
	 * Get the SQL select clause column aliases for a particular
	 * user-visible alias
	 */
	public String[] getColumnAliases(String alias, int loc);
	
	/**
	 * Get the user-visible aliases for this projection
	 * (ie. the ones that will be passed to the 
	 * <tt>ResultTransformer</tt>)
	 */
	public String[] getAliases();
	
	/**
	 * Does this projection specify grouping attributes?
	 */
	public boolean isGrouped();
	
}
