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; } } |