Open Source Repository

Home /hibernate/hibernate-3.2.7.ga | Repository Home



org/hibernate/sql/SelectFragment.java
//$Id: SelectFragment.java 7479 2005-07-14 23:56:53Z oneovthafew $
package org.hibernate.sql;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import org.hibernate.util.StringHelper;

/**
 * A fragment of an SQL <tt>SELECT</tt> clause
 *
 @author Gavin King
 */
public class SelectFragment {
  private String suffix;
  private List columns = new ArrayList();
  //private List aliases = new ArrayList();
  private List columnAliases = new ArrayList();
  private String extraSelectList;
  private String[] usedAliases;
  
  public SelectFragment() {}
  
  public SelectFragment setUsedAliases(String[] aliases) {
    usedAliases = aliases;
    return this;
  }
  
  public SelectFragment setExtraSelectList(String extraSelectList) {
    this.extraSelectList = extraSelectList;
    return this;
  }
  
  public SelectFragment setExtraSelectList(CaseFragment caseFragment, String fragmentAlias) {
    setExtraSelectListcaseFragment.setReturnColumnName(fragmentAlias, suffix).toFragmentString() );
    return this;
  }

  public SelectFragment setSuffix(String suffix) {
    this.suffix = suffix;
    return this;
  }

  public SelectFragment addColumn(String columnName) {
    addColumn(null, columnName);
    return this;
  }

  public SelectFragment addColumns(String[] columnNames) {
    for (int i=0; i<columnNames.length; i++addColumncolumnNames[i] );
    return this;
  }

  public SelectFragment addColumn(String tableAlias, String columnName) {
    return addColumn(tableAlias, columnName, columnName);
  }

  public SelectFragment addColumn(String tableAlias, String columnName, String columnAlias) {
    columns.addStringHelper.qualify(tableAlias, columnName) );
    //columns.add(columnName);
    //aliases.add(tableAlias);
    columnAliases.add(columnAlias);
    return this;
  }

  public SelectFragment addColumns(String tableAlias, String[] columnNames) {
    for (int i=0; i<columnNames.length; i++addColumntableAlias, columnNames[i] );
    return this;
  }

  public SelectFragment addColumns(String tableAlias, String[] columnNames, String[] columnAliases) {
    for (int i=0; i<columnNames.length; i++) {
      if columnNames[i]!=null addColumntableAlias, columnNames[i], columnAliases[i] );
    }
    return this;
  }

  public SelectFragment addFormulas(String tableAlias, String[] formulas, String[] formulaAliases) {
    for int i=0; i<formulas.length; i++ ) {
      if formulas[i]!=null addFormulatableAlias, formulas[i], formulaAliases[i] );
    }
    return this;
  }

  public SelectFragment addFormula(String tableAlias, String formula, String formulaAlias) {
    columns.addStringHelper.replace(formula, Template.TEMPLATE, tableAlias) );
    columnAliases.add(formulaAlias);
    return this;
  }

  public String toFragmentString() {
    StringBuffer buf = new StringBuffercolumns.size() 10 );
    Iterator iter = columns.iterator();
    Iterator columnAliasIter = columnAliases.iterator();
    //HashMap columnsUnique = new HashMap();
    HashSet columnsUnique = new HashSet();
    if (usedAliases!=nullcolumnsUnique.addAllArrays.asList(usedAliases) );
    while iter.hasNext() ) {
      String column = (Stringiter.next();
      String columnAlias = (StringcolumnAliasIter.next();
      //TODO: eventually put this back in, once we think all is fixed
      //Object otherAlias = columnsUnique.put(qualifiedColumn, columnAlias);
      /*if ( otherAlias!=null && !columnAlias.equals(otherAlias) ) {
        throw new AssertionFailure("bug in Hibernate SQL alias generation");
      }*/
      if columnsUnique.add(columnAlias) ) {
        buf.append(", ")
          .append(column)
          .append(" as ");
        if (suffix==null) {
          buf.append(columnAlias);
        }
        else {
          buf.appendnew Alias(suffix).toAliasString(columnAlias) );
        }
      }
    }
    if (extraSelectList!=null) {
      buf.append(", ")
        .append(extraSelectList);
    }
    return buf.toString();
  }

}