I'll look into the patch tonight, and see if we can commit it.
On Thu, 2002-02-14 at 08:16, [EMAIL PROTECTED] wrote:
>
> Hi community,
>
> Here's a patch for generic driver and sequence key generator engine.
>
> Changes:
> - "FROM ... LEFT OUTER JOIN ... " statement part generation code rewritten.
> Now it uses recursive algorithm and seems to be clear and correct (so far).
> This patch would fix some possible table aliasing and relation mapping problems.
> - simple fix in sequence generator for postgresql character case handling
>
> Read on, and hope this will help someone.
> I will be happy to get any feedback from you. (=
>
> [8<... cut ...>8]
>
> Index: JDBCQueryExpression.java
> ===================================================================
> RCS file:
>/cvs/castor/castor/src/main/org/exolab/castor/jdo/drivers/JDBCQueryExpression.java,v
> retrieving revision 1.22
> diff -u -r1.22 JDBCQueryExpression.java
> --- JDBCQueryExpression.java 6 Sep 2001 22:59:36 -0000 1.22
> +++ JDBCQueryExpression.java 14 Feb 2002 14:19:18 -0000
> @@ -50,6 +50,7 @@
> import java.util.Hashtable;
> import java.util.Vector;
> import java.util.Enumeration;
> +import java.util.StringTokenizer;
> import org.exolab.castor.jdo.engine.JDBCSyntax;
> import org.exolab.castor.persist.spi.QueryExpression;
> import org.exolab.castor.persist.spi.PersistenceFactory;
> @@ -320,6 +321,97 @@
> return getStandardStatement( lock, true ).toString();
> }
>
> + protected static String align(String str) {
> + StringBuffer buf = new StringBuffer();
> + StringTokenizer st = new StringTokenizer(str, "\r\n");
> +
> + while(st.hasMoreTokens())
> + buf.append(" ").append(st.nextToken()).append('\n');
> +
> + return buf.toString();
> + }
> +
> +
> + protected boolean hasLeftPart(String alias) {
> + for ( int i = 0 ; i < _joins.size() ; ++i ) {
> + Join j = (Join) _joins.elementAt(i);
> +
> + if(!j.outer || j.rightTable.equals(alias))
> + return true;
> + }
> +
> + return false;
> + }
> +
> + protected String getFrom(boolean oj) {
> + StringBuffer buf = new StringBuffer( JDBCSyntax.From );
> + boolean first = true;
> +
> + for(Enumeration e = _tables.keys();e.hasMoreElements();) {
> + String alias = (String) e.nextElement();
> +
> + /*
> + * make sure we have root table
> + * (it should not be used as right part of any join clause)
> + */
> + if(hasLeftPart(alias))
> + continue;
> +
> + if ( first )
> + first = false;
> + else
> + buf.append( JDBCSyntax.TableSeparator );
> +
> + buf.append( getJoin(alias, oj) );
> + }
> +
> + return buf.toString();
> + }
> +
> + protected String getJoin(String alias, boolean oj) {
> + StringBuffer buf = new StringBuffer();
> +
> + String tableName = (String) _tables.get( alias );
> +
> + if(tableName == null) {
> + buf.append( _factory.quoteName( alias ) );
> + } else if( alias.equals( tableName ) ) {
> + buf.append( _factory.quoteName( tableName ) );
> + } else {
> + buf.append( _factory.quoteName( tableName ) + " " +
> + _factory.quoteName( alias ) );
> + }
> +
> + for (int i = 0;i < _joins.size();i++) {
> + Join join = (Join) _joins.elementAt(i);
> +
> + if(!join.outer)
> + continue;
> +
> + if(join.leftTable.equals(alias)) {
> + buf.append( JDBCSyntax.LeftJoin );
> + buf.append( getJoin(join.rightTable, oj) );
> + buf.append( JDBCSyntax.On );
> +
> + for (int j = 0 ; j < join.leftColumns.length;j++) {
> + if ( j > 0 )
> + buf.append( JDBCSyntax.And );
> +
> + buf.append( _factory.quoteName( join.leftTable +
>JDBCSyntax.TableColumnSeparator +
> + join.leftColumns[ j ] ) );
> + buf.append( OpEquals );
> + buf.append( _factory.quoteName( join.rightTable +
>JDBCSyntax.TableColumnSeparator +
> + join.rightColumns[ j ] ) );
> + }
> + }
> + }
> +
> + if(oj)
> + buf.insert(0, "{oj ").append("}");
> +
> + return buf.toString();
> + }
> +
> /**
> * Helper method. Can be used in two cases:
> * 1) for JDBC drivers which support "{oj ...OUTER JOIN ...}" notation (in
>accordance with
> @@ -348,91 +440,7 @@
> else
> sql.append( _select).append(" ");
>
> - sql.append( JDBCSyntax.From );
> -
> - // Use outer join syntax for all outer joins. Inner joins come later.
> - tables = (Hashtable) _tables.clone();
> - first = true;
> - // gather all outer joins with the same left part
> - for ( int i = 0 ; i < _joins.size() ; ++i ) {
> - Join join;
> -
> - join = (Join) _joins.elementAt( i );
> -
> - if ( ! join.outer || done.contains( join.leftTable ) )
> - continue;
> - if ( first )
> - first = false;
> - else
> - sql.append( JDBCSyntax.TableSeparator );
> - if ( oj )
> - sql.append( "{oj " );
> - sql.append( _factory.quoteName( join.leftTable ) );
> - sql.append( JDBCSyntax.LeftJoin );
> - tableName = (String) tables.get( join.rightTable );
> - if( join.rightTable.equals( tableName ) ) {
> - sql.append( _factory.quoteName( tableName ) );
> - } else {
> - sql.append( _factory.quoteName( tableName ) + " " +
> - _factory.quoteName( join.rightTable ) );
> - }
> - sql.append( JDBCSyntax.On );
> - for ( int j = 0 ; j < join.leftColumns.length ; ++j ) {
> - if ( j > 0 )
> - sql.append( JDBCSyntax.And );
> - sql.append( _factory.quoteName( join.leftTable +
>JDBCSyntax.TableColumnSeparator +
> - join.leftColumns[ j ] ) ).append(
>OpEquals );
> - sql.append( _factory.quoteName( join.rightTable +
>JDBCSyntax.TableColumnSeparator +
> - join.rightColumns[ j ] ) );
> - }
> -
> - tables.remove( join.leftTable );
> - tables.remove( join.rightTable );
> - for ( int k = i + 1 ; k < _joins.size() ; ++k ) {
> - Join join2;
> -
> - join2 = (Join) _joins.elementAt( k );
> - if ( ! join2.outer || ! join.leftTable.equals( join2.leftTable ) )
> - continue;
> - sql.append( JDBCSyntax.LeftJoin );
> - tableName = (String) tables.get( join2.rightTable );
> -
> - if( join2.rightTable.equals( tableName ) ) {
> - sql.append( _factory.quoteName( tableName ) );
> - } else {
> - sql.append( _factory.quoteName( tableName ) + " " +
> - _factory.quoteName( join2.rightTable ) );
> - }
> - sql.append( JDBCSyntax.On );
> - for ( int j = 0 ; j < join2.leftColumns.length ; ++j ) {
> - if ( j > 0 )
> - sql.append( JDBCSyntax.And );
> - sql.append( _factory.quoteName( join2.leftTable +
>JDBCSyntax.TableColumnSeparator +
> - join2.leftColumns[ j ] )
>).append( OpEquals );
> - sql.append( _factory.quoteName( join2.rightTable +
>JDBCSyntax.TableColumnSeparator +
> - join2.rightColumns[ j ] ) );
> - }
> - tables.remove( join2.rightTable );
> - }
> - if ( oj )
> - sql.append( "}" );
> - done.addElement( join.leftTable );
> - }
> - enum = tables.keys();
> - while ( enum.hasMoreElements() ) {
> - if ( first )
> - first = false;
> - else
> - sql.append( JDBCSyntax.TableSeparator );
> - tableAlias = (String) enum.nextElement();
> - tableName = (String) tables.get( tableAlias );
> - if( tableAlias.equals( tableName ) ) {
> - sql.append( _factory.quoteName( tableName ) );
> - } else {
> - sql.append( _factory.quoteName( tableName ) + " " +
> - _factory.quoteName( tableAlias ) );
> - }
> - }
> + sql.append( getFrom(oj) );
>
> // Use standard join syntax for all inner joins
> first = true;
> Index: SequenceKeyGenerator.java
> ===================================================================
> RCS file:
>/cvs/castor/castor/src/main/org/exolab/castor/jdo/drivers/SequenceKeyGenerator.java,v
> retrieving revision 1.18
> diff -u -r1.18 SequenceKeyGenerator.java
> --- SequenceKeyGenerator.java 20 Dec 2001 15:14:59 -0000 1.18
> +++ SequenceKeyGenerator.java 14 Feb 2002 14:19:19 -0000
> @@ -176,6 +176,9 @@
> stmt = conn.prepareStatement("SELECT nextval FOR \"" + seqName +
>"\" FROM " + table);
> rs = stmt.executeQuery();
> } else {
> + if (_factory.getFactoryName().equals("postgresql"))
> + seqName = _factory.quoteName( seqName );
> +
> if ( _style == BEFORE_INSERT ) {
> stmt = conn.prepareStatement("SELECT nextval('" + seqName +
>"')" );
> rs = stmt.executeQuery();
>
> -----------------------------------------------------------
> If you wish to unsubscribe from this mailing, send mail to
> [EMAIL PROTECTED] with a subject of:
> unsubscribe castor-dev
>
-- Virtually, Ned Wolpert <[EMAIL PROTECTED]> 4e75 1024D/5DEA314E: 7FFB 99C3 BF90 6135 12F4 07B8 0B23 2E5C 5DEA 314E
signature.asc
Description: This is a digitally signed message part
