package org.hibernate.sql;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.hibernate.LockMode;
import org.hibernate.LockOptions;
import org.hibernate.dialect.Dialect;
public class SimpleSelect {
public SimpleSelect(Dialect dialect) {
this.dialect = dialect;
}
private String tableName;
private String orderBy;
private Dialect dialect;
private LockOptions lockOptions = new LockOptions( LockMode.READ );
private String ;
private List<String> columns = new ArrayList<String>();
private Map<String, String> aliases = new HashMap<String, String>();
private List<String> whereTokens = new ArrayList<String>();
public SimpleSelect addColumns(String[] columnNames, String[] columnAliases) {
for ( int i = 0; i < columnNames.length; i++ ) {
if ( columnNames[i] != null ) {
addColumn( columnNames[i], columnAliases[i] );
}
}
return this;
}
public SimpleSelect addColumns(String[] columns, String[] aliases, boolean[] ignore) {
for ( int i = 0; i < ignore.length; i++ ) {
if ( !ignore[i] && columns[i] != null ) {
addColumn( columns[i], aliases[i] );
}
}
return this;
}
public SimpleSelect addColumns(String[] columnNames) {
for ( String columnName : columnNames ) {
if ( columnName != null ) {
addColumn( columnName );
}
}
return this;
}
public SimpleSelect addColumn(String columnName) {
columns.add( columnName );
return this;
}
public SimpleSelect addColumn(String columnName, String alias) {
columns.add( columnName );
aliases.put( columnName, alias );
return this;
}
public SimpleSelect setTableName(String tableName) {
this.tableName = tableName;
return this;
}
public SimpleSelect setLockOptions(LockOptions lockOptions) {
LockOptions.copy( lockOptions, this.lockOptions );
return this;
}
public SimpleSelect setLockMode(LockMode lockMode) {
this.lockOptions.setLockMode( lockMode );
return this;
}
public SimpleSelect addWhereToken(String token) {
if (token != null ) {
if (!whereTokens.isEmpty()) {
and();
}
whereTokens.add( token );
}
return this;
}
private void and() {
if ( whereTokens.size() > 0 ) {
whereTokens.add( "and" );
}
}
public SimpleSelect addCondition(String lhs, String op, String rhs) {
and();
whereTokens.add( lhs + ' ' + op + ' ' + rhs );
return this;
}
public SimpleSelect addCondition(String lhs, String condition) {
and();
whereTokens.add( lhs + ' ' + condition );
return this;
}
public SimpleSelect addCondition(String[] lhs, String op, String[] rhs) {
for ( int i = 0; i < lhs.length; i++ ) {
addCondition( lhs[i], op, rhs[i] );
}
return this;
}
public SimpleSelect addCondition(String[] lhs, String condition) {
for ( String lh : lhs ) {
if ( lh != null ) {
addCondition( lh, condition );
}
}
return this;
}
public String toStatementString() {
StringBuilder buf = new StringBuilder(
columns.size() * 10 +
tableName.length() +
whereTokens.size() * 10 +
10
);
if ( comment != null ) {
buf.append( "/* " ).append( comment ).append( " */ " );
}
buf.append( "select " );
Set<String> uniqueColumns = new HashSet<String>();
Iterator<String> iter = columns.iterator();
boolean appendComma = false;
while ( iter.hasNext() ) {
String col = iter.next();
String alias = aliases.get( col );
if ( uniqueColumns.add( alias == null ? col : alias ) ) {
if ( appendComma ) {
buf.append( ", " );
}
buf.append( col );
if ( alias != null && !alias.equals( col ) ) {
buf.append( " as " )
.append( alias );
}
appendComma = true;
}
}
buf.append( " from " )
.append( dialect.appendLockHint( lockOptions, tableName ) );
if ( whereTokens.size() > 0 ) {
buf.append( " where " )
.append( toWhereClause() );
}
if ( orderBy != null ) {
buf.append( orderBy );
}
if ( lockOptions != null ) {
buf = new StringBuilder(dialect.applyLocksToSql( buf.toString(), lockOptions, null ) );
}
return dialect.transformSelectString( buf.toString() );
}
public String toWhereClause() {
StringBuilder buf = new StringBuilder( whereTokens.size() * 5 );
Iterator<String> iter = whereTokens.iterator();
while ( iter.hasNext() ) {
buf.append( iter.next() );
if ( iter.hasNext() ) {
buf.append( ' ' );
}
}
return buf.toString();
}
public SimpleSelect setOrderBy(String orderBy) {
this.orderBy = orderBy;
return this;
}
public SimpleSelect (String comment) {
this.comment = comment;
return this;
}
}