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

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to