|
From: <one...@us...> - 2003-01-20 18:45:32
|
Update of /cvsroot/hibernate/Hibernate2/src/net/sf/hibernate/sql
In directory sc8-pr-cvs1:/tmp/cvs-serv9798/sf/hibernate/sql
Added Files:
ANSIOuterJoinFragment.java CaseFragment.java
ConditionFragment.java Delete.java InFragment.java Insert.java
OracleOuterJoinFragment.java OuterJoinFragment.java
Select.java SelectFragment.java SimpleSelect.java Update.java
Log Message:
refactorings to create SQL generation layer
--- NEW FILE: ANSIOuterJoinFragment.java ---
//$Id: ANSIOuterJoinFragment.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
import net.sf.hibernate.util.StringHelper;
public class ANSIOuterJoinFragment extends OuterJoinFragment {
private StringBuffer buffer = new StringBuffer();
public void addJoin(String tableName, String alias, String[] fkColumns, String[] pkColumns, boolean innerJoin) {
buffer.append( innerJoin ? " inner join " : " left outer join ")
.append(tableName)
.append(' ')
.append(alias)
.append(" on ");
for ( int j=0; j<fkColumns.length; j++) {
buffer.append( fkColumns[j] )
.append('=')
.append(alias)
.append(StringHelper.DOT)
.append( pkColumns[j] );
if ( j<fkColumns.length-1 ) buffer.append(" and ");
}
}
public String toFromFragmentString() {
return buffer.toString();
}
public String toWhereFragmentString() {
return StringHelper.EMPTY_STRING;
}
public void addJoins(String fromFragment, String whereFragment) {
buffer.append(fromFragment);
//where fragment must be empty!
}
}
--- NEW FILE: CaseFragment.java ---
//$Id: CaseFragment.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
import java.util.Iterator;
import java.util.Map;
import net.sf.hibernate.util.StringHelper;
import org.apache.commons.collections.SequencedHashMap;
/**
* Represents an SQL <tt>case when .... then .... end as ...</tt>
*/
public class CaseFragment {
private String returnColumnName;
private Map cases = new SequencedHashMap();
public CaseFragment setReturnColumnName(String returnColumnName) {
this.returnColumnName = returnColumnName;
return this;
}
public CaseFragment setReturnColumnName(String returnColumnName, String suffix) {
return setReturnColumnName( StringHelper.suffix(returnColumnName, suffix) );
}
public CaseFragment addWhenColumnNotNull(String alias, String columnName, String value) {
cases.put( alias + StringHelper.DOT + columnName + " is not null", value );
return this;
}
public String toFragmentString() {
StringBuffer buf = new StringBuffer( cases.size() * 15 + 10 );
buf.append("case");
Iterator iter = cases.entrySet().iterator();
while ( iter.hasNext() ) {
Map.Entry me = (Map.Entry) iter.next();
buf.append(" when ")
.append( me.getKey() )
.append(" then ")
.append( me.getValue() );
}
return buf.append(" end as ")
.append(returnColumnName)
.toString();
}
}
--- NEW FILE: ConditionFragment.java ---
//$Id: ConditionFragment.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
import net.sf.hibernate.util.ArrayHelper;
import net.sf.hibernate.util.StringHelper;
/**
*/
public class ConditionFragment {
private String tableAlias;
private String[] lhs;
private String[] rhs;
private String op = "=";
/**
* Sets the op.
* @param op The op to set
*/
public ConditionFragment setOp(String op) {
this.op = op;
return this;
}
/**
* Sets the tableAlias.
* @param tableAlias The tableAlias to set
*/
public ConditionFragment setTableAlias(String tableAlias) {
this.tableAlias = tableAlias;
return this;
}
public ConditionFragment setCondition(String[] lhs, String[] rhs) {
this.lhs = lhs;
this.rhs = rhs;
return this;
}
public ConditionFragment setCondition(String[] lhs, String rhs) {
this.lhs = lhs;
this.rhs = ArrayHelper.fillArray(rhs, lhs.length);
return this;
}
public String toFragmentString() {
StringBuffer buf = new StringBuffer( lhs.length * 10 );
for ( int i=0; i<lhs.length; i++ ) {
buf.append(tableAlias)
.append(StringHelper.DOT)
.append( lhs[i] )
.append(op)
.append( rhs[i] );
if (i<lhs.length-1) buf.append(" and ");
}
return buf.toString();
}
}
--- NEW FILE: Delete.java ---
//$Id: Delete.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
import net.sf.hibernate.util.StringHelper;
/**
* An SQL <tt>INSERT</tt> statement
*/
public class Delete {
private String tableName;
private String[] primaryKeyColumnNames;
private String versionColumnName;
public Delete setTableName(String tableName) {
this.tableName = tableName;
return this;
}
public String toStatementString() {
StringBuffer buf = new StringBuffer( tableName.length() + 10 );
buf.append("delete from ")
.append(tableName)
.append(" where ")
.append( StringHelper.join("=? and ", primaryKeyColumnNames) )
.append("=?");
if (versionColumnName!=null) {
buf.append(" and ")
.append(versionColumnName)
.append("=?");
}
return buf.toString();
}
public Delete setPrimaryKeyColumnNames(String[] primaryKeyColumnNames) {
this.primaryKeyColumnNames = primaryKeyColumnNames;
return this;
}
public Delete setVersionColumnName(String versionColumnName) {
this.versionColumnName = versionColumnName;
return this;
}
}
--- NEW FILE: InFragment.java ---
//$Id: InFragment.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import net.sf.hibernate.util.StringHelper;
/**
* Represents an <tt>... in(...)</tt> expression
*/
public class InFragment {
private String columnName;
private Set values = new HashSet();
public InFragment addValue(String value) {
values.add(value);
return this;
}
public InFragment setColumn(String columnName) {
this.columnName = columnName;
return this;
}
public InFragment setColumn(String alias, String columnName) {
return setColumn( this.columnName = alias + StringHelper.DOT + columnName );
}
public String toFragmentString() {
StringBuffer buf = new StringBuffer( values.size() * 5 );
buf.append(columnName);
if ( values.size()>1 ) {
buf.append(" in (");
Iterator iter = values.iterator();
while ( iter.hasNext() ) {
buf.append( iter.next() );
if ( iter.hasNext() ) buf.append(StringHelper.COMMA_SPACE);
}
buf.append(StringHelper.CLOSE_PAREN);
}
else {
buf.append("=").append( values.iterator().next() );
}
return buf.toString();
}
}
--- NEW FILE: Insert.java ---
//$Id: Insert.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
import java.util.Iterator;
import java.util.Map;
import net.sf.hibernate.dialect.Dialect;
import net.sf.hibernate.type.LiteralType;
import net.sf.hibernate.util.StringHelper;
import org.apache.commons.collections.SequencedHashMap;
/**
* An SQL <tt>INSERT</tt> statement
*/
public class Insert {
public Insert(Dialect dialect) {
this.dialect = dialect;
}
private Dialect dialect;
private String tableName;
private Map columns = new SequencedHashMap();
public Insert addColumn(String columnName) {
return addColumn(columnName, "?");
}
public Insert addColumns(String[] columnNames) {
for ( int i=0; i<columnNames.length; i++ ) {
addColumn( columnNames[i] );
}
return this;
}
public Insert addColumn(String columnName, String value) {
columns.put(columnName, value);
return this;
}
public Insert addColumn(String columnName, Object value, LiteralType type) throws Exception {
return addColumn( columnName, type.objectToSQLString(value) );
}
public Insert addIdentityColumn(String columnName) {
String value = dialect.getIdentityInsertString();
if (value!=null) addColumn(columnName, value);
return this;
}
public Insert setTableName(String tableName) {
this.tableName = tableName;
return this;
}
public String toStatementString() {
StringBuffer buf = new StringBuffer( columns.size()*15 + tableName.length() + 10 );
buf.append("insert into ")
.append(tableName);
if ( columns.size()==0 ) {
buf.append(' ').append( dialect.getNoColumnsInsertString() );
}
else {
buf.append(" (");
Iterator iter = columns.keySet().iterator();
while ( iter.hasNext() ) {
buf.append( iter.next() );
if ( iter.hasNext() ) buf.append(StringHelper.COMMA_SPACE);
}
buf.append(") values (");
iter = columns.values().iterator();
while ( iter.hasNext() ) {
buf.append( iter.next() );
if ( iter.hasNext() ) buf.append(StringHelper.COMMA_SPACE);
}
buf.append(')');
}
return buf.toString();
}
}
--- NEW FILE: OracleOuterJoinFragment.java ---
//$Id: OracleOuterJoinFragment.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
import net.sf.hibernate.util.StringHelper;
public class OracleOuterJoinFragment extends OuterJoinFragment {
private StringBuffer afterFrom = new StringBuffer();
private StringBuffer afterWhere = new StringBuffer();
public void addJoin(String tableName, String alias, String[] fkColumns, String[] pkColumns, boolean innerJoin) {
afterFrom.append(StringHelper.COMMA_SPACE)
.append(tableName)
.append(' ')
.append(alias);
for ( int j=0; j<fkColumns.length; j++) {
afterWhere.append(" and ")
.append( fkColumns[j] )
.append('=')
.append(alias)
.append(StringHelper.DOT)
.append( pkColumns[j] );
if (!innerJoin) afterWhere.append("(+)");
}
}
public String toFromFragmentString() {
return afterFrom.toString();
}
public String toWhereFragmentString() {
return afterWhere.toString();
}
public void addJoins(String fromFragment, String whereFragment) {
afterFrom.append(fromFragment);
afterWhere.append(whereFragment);
}
}
--- NEW FILE: OuterJoinFragment.java ---
//$Id: OuterJoinFragment.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
public abstract class OuterJoinFragment {
public abstract void addJoin(String tableName, String alias, String[] fkColumns, String[] pkColumns, boolean innerJoin);
public abstract void addJoins(String fromFragment, String whereFragment);
public abstract String toFromFragmentString();
public abstract String toWhereFragmentString();
}
--- NEW FILE: Select.java ---
//$Id: Select.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
/**
*/
public class Select {
private String selectClause;
private String fromClause;
private String outerJoinsAfterFrom;
private String whereClause;
private String outerJoinsAfterWhere;
private String orderByClause;
/**
* Construct an SQL <tt>SELECT</tt> statement from the given clauses
*/
public String toStatementString() {
StringBuffer buf = new StringBuffer(
selectClause.length() + fromClause.length() + outerJoinsAfterFrom.length() + whereClause.length() + outerJoinsAfterWhere.length() + 20
);
buf.append("SELECT ").append(selectClause)
.append(" FROM ").append(fromClause)
.append(outerJoinsAfterFrom)
.append(" WHERE ").append(whereClause)
.append(outerJoinsAfterWhere);
if (orderByClause!=null) buf.append(" ORDER BY ").append(orderByClause);
return buf.toString();
}
/**
* Sets the fromClause.
* @param fromClause The fromClause to set
*/
public Select setFromClause(String fromClause) {
this.fromClause = fromClause;
return this;
}
public Select setFromClause(String tableName, String alias) {
this.fromClause = tableName + ' ' + alias;
return this;
}
/**
* Sets the orderByClause.
* @param orderByClause The orderByClause to set
*/
public Select setOrderByClause(String orderByClause) {
this.orderByClause = orderByClause;
return this;
}
/**
* Sets the outerJoins.
* @param outerJoinsAfterFrom The outerJoinsAfterFrom to set
* @param outerJoinsAfterWhere The outerJoinsAfterWhere to set
*/
public Select setOuterJoins(String outerJoinsAfterFrom, String outerJoinsAfterWhere) {
this.outerJoinsAfterFrom = outerJoinsAfterFrom;
this.outerJoinsAfterWhere = outerJoinsAfterWhere;
return this;
}
/**
* Sets the selectClause.
* @param selectClause The selectClause to set
*/
public Select setSelectClause(String selectClause) {
this.selectClause = selectClause;
return this;
}
/**
* Sets the whereClause.
* @param whereClause The whereClause to set
*/
public Select setWhereClause(String whereClause) {
this.whereClause = whereClause;
return this;
}
}
--- NEW FILE: SelectFragment.java ---
//$Id: SelectFragment.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import net.sf.hibernate.util.StringHelper;
/**
* Represents part of an SQL <tt>SELECT</tt> clause
*/
public class SelectFragment {
private String suffix;
private List columns = new ArrayList();
private List aliases = new ArrayList();
private List columnAliases = new ArrayList();
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++) addColumn( columnNames[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.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++) addColumn( tableAlias, columnNames[i] );
return this;
}
public SelectFragment addColumns(String tableAlias, String[] columnNames, String[] columnAliases) {
for (int i=0; i<columnNames.length; i++) addColumn( tableAlias, columnNames[i], columnAliases[i] );
return this;
}
public String toFragmentString() {
StringBuffer buf = new StringBuffer( columns.size() * 10 );
Iterator iter = columns.iterator();
Iterator aliasIter = aliases.iterator();
Iterator columnAliasIter = columnAliases.iterator();
while ( iter.hasNext() ) {
String col = (String) iter.next();
buf.append(StringHelper.COMMA_SPACE);
String alias = (String) aliasIter.next();
if (alias!=null) buf.append(alias).append(StringHelper.DOT);
String columnAlias = (String) columnAliasIter.next();
buf.append(col)
.append(" as ")
.append( StringHelper.suffix( columnAlias, suffix) );
}
return buf.toString();
}
}
--- NEW FILE: SimpleSelect.java ---
//$Id: SimpleSelect.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import net.sf.hibernate.util.StringHelper;
/**
* An SQL <tt>SELECT</tt> statement
*/
public class SimpleSelect {
private String tableName;
private String orderBy;
private List columns = new ArrayList();
private List whereTokens = new ArrayList();
public SimpleSelect addColumns(String[] columnNames) {
for ( int i=0; i<columnNames.length; i++ ) {
addColumn( columnNames[i] );
}
return this;
}
public SimpleSelect addColumn(String columnName) {
columns.add(columnName);
return this;
}
public SimpleSelect setTableName(String tableName) {
this.tableName = tableName;
return this;
}
public SimpleSelect addWhereToken(String token) {
whereTokens.add(token);
return this;
}
public SimpleSelect addCondition(String lhs, String op, String rhs) {
whereTokens.add( lhs + ' ' + op + ' ' + rhs );
return this;
}
public SimpleSelect addCondition(String lhs, String condition) {
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] );
if ( i!=lhs.length-1) whereTokens.add("and");
}
return this;
}
public SimpleSelect addCondition(String[] lhs, String condition) {
for ( int i=0; i<lhs.length; i++ ) {
addCondition( lhs[i], condition );
if ( i!=lhs.length-1) whereTokens.add("and");
}
return this;
}
public String toStatementString() {
StringBuffer buf = new StringBuffer( columns.size()*10 + tableName.length() + whereTokens.size() * 10 + 10 );
buf.append("select ");
Iterator iter = columns.iterator();
while ( iter.hasNext() ) {
buf.append( iter.next() );
if ( iter.hasNext() ) buf.append(StringHelper.COMMA_SPACE);
}
buf.append(" from ")
.append(tableName);
if ( whereTokens.size() > 0 ) {
buf.append(" where ")
.append( toWhereClause() );
}
if (orderBy!=null) buf.append(orderBy);
return buf.toString();
}
public String toWhereClause() {
StringBuffer buf = new StringBuffer( whereTokens.size() * 5 );
Iterator iter = whereTokens.iterator();
while ( iter.hasNext() ) {
buf.append( iter.next() );
if ( iter.hasNext() ) buf.append(' ');
}
return buf.toString();
}
public void setOrderBy(String orderBy) {
this.orderBy = orderBy;
}
}
--- NEW FILE: Update.java ---
//$Id: Update.java,v 1.1 2003/01/20 18:45:18 oneovthafew Exp $
package net.sf.hibernate.sql;
import java.util.Iterator;
import java.util.Map;
import net.sf.hibernate.type.LiteralType;
import net.sf.hibernate.util.StringHelper;
import org.apache.commons.collections.SequencedHashMap;
/**
* An SQL <tt>UPDATE</tt> statement
*/
public class Update {
private String tableName;
private String primaryKeyColumnNames[];
private String versionColumnName;
private Map columns = new SequencedHashMap();
public Update addColumns(String[] columnNames) {
for ( int i=0; i<columnNames.length; i++ ) {
addColumn( columnNames[i] );
}
return this;
}
public Update addColumns(String[] columnNames, String value) {
for ( int i=0; i<columnNames.length; i++ ) {
addColumn( columnNames[i], value );
}
return this;
}
public Update addColumn(String columnName) {
return addColumn(columnName, "?");
}
public Update addColumn(String columnName, String value) {
columns.put(columnName, value);
return this;
}
public Update addColumn(String columnName, Object value, LiteralType type) throws Exception {
return addColumn( columnName, type.objectToSQLString(value) );
}
public Update setTableName(String tableName) {
this.tableName = tableName;
return this;
}
public String toStatementString() {
StringBuffer buf = new StringBuffer( columns.size()*15 + tableName.length() + 10 );
buf.append("update ")
.append(tableName)
.append(" set ");
Iterator iter = columns.entrySet().iterator();
while ( iter.hasNext() ) {
Map.Entry e = (Map.Entry) iter.next();
buf.append( e.getKey() )
.append('=')
.append( e.getValue() );
if ( iter.hasNext() ) buf.append(StringHelper.COMMA_SPACE);
}
buf.append(" where ")
.append( StringHelper.join("=? and ", primaryKeyColumnNames) )
.append("=?");
if (versionColumnName!=null) {
buf.append(" and ")
.append(versionColumnName)
.append("=?");
}
return buf.toString();
}
public Update setPrimaryKeyColumnNames(String[] primaryKeyColumnNames) {
this.primaryKeyColumnNames = primaryKeyColumnNames;
return this;
}
public Update setVersionColumnName(String versionColumnName) {
this.versionColumnName = versionColumnName;
return this;
}
}
|