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

Reply via email to