jvanzyl     2002/09/20 13:34:38

  Modified:    sql/src/java/org/apache/commons/sql/builder SqlBuilder.java
               sql/src/java/org/apache/commons/sql/model Table.java
               sql/src/test/org/apache/commons/sql
                        TestDataModelRoundTrip.java
               sql/src/test/org/apache/commons/sql/builder TestBuilder.java
               sql/src/test-input datamodel.xml
  Log:
  o Applying John Thorhauer's patches for Postgresql:
  
  I have attatched a file that includes the patches that add support for
  Postgres and indexes along with unit tests for the commons-sql package.
  
  Revision  Changes    Path
  1.8       +76 -0     
jakarta-commons-sandbox/sql/src/java/org/apache/commons/sql/builder/SqlBuilder.java
  
  Index: SqlBuilder.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/sql/src/java/org/apache/commons/sql/builder/SqlBuilder.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- SqlBuilder.java   16 Sep 2002 14:50:19 -0000      1.7
  +++ SqlBuilder.java   20 Sep 2002 20:34:38 -0000      1.8
  @@ -69,6 +69,8 @@
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
   
  +import org.apache.commons.sql.model.Index;
  +import org.apache.commons.sql.model.IndexColumn;
   import org.apache.commons.sql.model.Column;
   import org.apache.commons.sql.model.Database;
   import org.apache.commons.sql.model.ForeignKey;
  @@ -109,6 +111,9 @@
       /** Whether or not foreign key constraints are embedded inside the create table 
statement */
       private boolean foreignKeysEmbedded;
   
  +    /** Whether or not indexes are embedded inside the create table statement */
  +    private boolean indexesEmbedded;
  +
       /** Should foreign key constraints be explicitly named */
       private boolean foreignKeyConstraintsNamed;
   
  @@ -201,6 +206,9 @@
           if (isForeignKeysEmbedded()) {
               writeForeignKeys(table);
           }
  +        if (isIndexesEmbedded()) {
  +            writeEmbeddedIndexes(table);
  +        }
           println();
           print(")");
           printEndOfStatement();
  @@ -211,6 +219,9 @@
           if (!isForeignKeysEmbedded()) {
               writeForeignKeysAlterTable(table);
           }
  +        if (!isIndexesEmbedded()) {
  +            writeIndexes(table);
  +        }
       }
   
       /** 
  @@ -302,7 +313,23 @@
           this.foreignKeysEmbedded = foreignKeysEmbedded;
       }
   
  +    /**
  +     * @return whether the indexes are embedded in the create 
  +     * table clause or as seperate statements.
  +     * The default is false.
  +     */
  +    public boolean isIndexesEmbedded() {
  +        return indexesEmbedded;
  +    }
   
  +    /**
  +     * Sets whether the indexes are embedded in the create 
  +     * table clause or as seperate statements.
  +     * The default is false.
  +     */
  +    public void setIndexesEmbedded(boolean indexesEmbedded) {
  +        this.indexesEmbedded = indexesEmbedded;
  +    }
   
       /**
        * Returns whether foreign key constraints should be named when they are 
embedded inside
  @@ -504,6 +531,55 @@
                   printEndOfStatement();
               }
           }
  +    }
  +
  +    /**
  +     * Writes the indexes.
  +     */
  +    protected void writeIndexes(Table table) throws IOException{
  +        for (Iterator indexIter = table.getIndexes().iterator();
  +            indexIter.hasNext();
  +            ) {
  +            Index index = (Index) indexIter.next();
  +            if (index.getName() == null) {
  +                log.warn( "Index Name is null for index: " + index);
  +            }
  +            else {
  +                print("CREATE INDEX ");
  +                print(index.getName());
  +                print(" ON ");
  +                print(table.getName());
  +
  +                print(" (");
  +                
  +                for (Iterator idxColumnIter = index.getIndexColumns().iterator();
  +                    idxColumnIter.hasNext();
  +                    ) 
  +                {
  +                    IndexColumn idxColumn = (IndexColumn)idxColumnIter.next();
  +                    if (idxColumnIter.hasNext())
  +                    {
  +                        print(idxColumn.getName() + ", ");             
  +                    }
  +                    else
  +                    {
  +                        print(idxColumn.getName());
  +                    }
  +                }
  +
  +                print(")");
  +                printEndOfStatement();
  +            }
  +        }
  +    }
  +
  +
  +    /**
  +     * Writes the indexes embedded within the create table statement. not
  +     * yet implemented
  +     */
  +    protected void writeEmbeddedIndexes(Table table) throws IOException 
  +    {
       }
   
       /**
  
  
  
  1.5       +17 -0     
jakarta-commons-sandbox/sql/src/java/org/apache/commons/sql/model/Table.java
  
  Index: Table.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/sql/src/java/org/apache/commons/sql/model/Table.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Table.java        16 Sep 2002 15:18:29 -0000      1.4
  +++ Table.java        20 Sep 2002 20:34:38 -0000      1.5
  @@ -72,6 +72,8 @@
       private List columns = new ArrayList();
       
       private List foreignKeys = new ArrayList();
  +
  +    private List indexes = new ArrayList();
       
       public Table() 
       {
  @@ -117,6 +119,21 @@
           return (ForeignKey) foreignKeys.get(index);
       }        
       
  +    public void addIndex(Index index)
  +    {
  +        indexes.add(index);
  +    }
  +    
  +    public List getIndexes()
  +    {
  +        return indexes;
  +    }
  +
  +    public Index getIndex(int index)
  +    {
  +        return (Index) indexes.get(index);
  +    }
  +
       
       // Helper methods
       //-------------------------------------------------------------------------     
           
  
  
  
  1.4       +37 -10    
jakarta-commons-sandbox/sql/src/test/org/apache/commons/sql/TestDataModelRoundTrip.java
  
  Index: TestDataModelRoundTrip.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/sql/src/test/org/apache/commons/sql/TestDataModelRoundTrip.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TestDataModelRoundTrip.java       12 Sep 2002 17:56:50 -0000      1.3
  +++ TestDataModelRoundTrip.java       20 Sep 2002 20:34:38 -0000      1.4
  @@ -86,37 +86,64 @@
               assertTrue("Parsed a Database object", database != null);
               assertEquals("bookstore", database.getName());
               
  -            assertTrue("more than one table found", database.getTables().size() > 0 
);
  +            assertTrue("More that one table should be found", 
  +                        database.getTables().size() > 1 );
               
               // Test our first table which is the 'book' table
               Table t1 = database.getTable(1);
               assertEquals("book", t1.getName());
               
  +            assertTrue("book table does not have primary", t1.hasPrimaryKey());
  +
  +            Index idx1 = (Index)t1.getIndex(0);
  +            assertTrue("Did not find an index", idx1 != null);
  +
  +            ForeignKey key = (ForeignKey) t1.getForeignKey(0);
  +            assertTrue("Did not find a foreign key", key != null);
  +
               Column c0 = t1.getColumn(0);
               assertEquals("book_id", c0.getName());
  -            assertTrue("book_id is required", c0.isRequired());
  -            assertTrue("book_id is primary key", c0.isPrimaryKey());
  +            assertTrue("book_id should be required", c0.isRequired());
  +            assertTrue("book_id should be primary key", c0.isPrimaryKey());
               
               Column c1 = t1.getColumn(1);
               assertEquals("isbn", c1.getName());
  -            assertTrue("isbn is required", c1.isRequired());
  -            assertTrue("isbn is not primary key", ! c1.isPrimaryKey());
  +            assertTrue("isbn should be required", c1.isRequired());
  +            assertTrue("isbn should not be primary key but is", 
  +                        ! c1.isPrimaryKey());
   
               List keyList1 = t1.getForeignKeys();
               assertEquals( "Foreign key count", 1, keyList1.size() );
               
               ForeignKey key0 = (ForeignKey) keyList1.get(0);
  -            assertEquals("foreignTable is correct", "author", 
key0.getForeignTable());
  +            assertEquals("foreignTable value correct", "author", 
  +                        key0.getForeignTable());
               
               List refList1 = key0.getReferences();
  -            assertEquals( "Reference count", 1, refList1.size() );
  +            assertEquals( "Reference count not correct", 1, refList1.size() );
               
               Reference r1 = (Reference) refList1.get(0);
  -            assertTrue("Found a reference", r1 != null);
  +            assertTrue("Could not find a reference", r1 != null);
                           
  -            assertEquals("local is correct", "author_id", r1.getLocal());
  -            assertEquals("foreign is correct", "author_id", r1.getForeign());
  +            assertEquals("local reference is incorrect", "author_id", 
  +                         r1.getLocal());
  +            assertEquals("foreign reference is incorrect", "author_id", 
  +                         r1.getForeign());
               
  +            List idxList = t1.getIndexes();
  +            assertEquals( "Index count", 1, idxList.size() );
  +
  +
  +            Index idx2 = (Index)idxList.get(0);
  +            assertTrue("Did not find an index", idx2 != null);
  +            assertEquals("Index name is incorrect", "book_isbn", idx2.getName());
  +
  +            List idxColumns = idx2.getIndexColumns();
  +            IndexColumn idxColumn = (IndexColumn) idxColumns.get(0);
  +            assertTrue("Did not find an index column", idxColumn != null);
  +            assertEquals("Index column name is incorrect", "isbn", 
  +                          idxColumn.getName());
  +
               // Write out the bean
               //writeBean(database);
           }
  
  
  
  1.5       +38 -1     
jakarta-commons-sandbox/sql/src/test/org/apache/commons/sql/builder/TestBuilder.java
  
  Index: TestBuilder.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/sql/src/test/org/apache/commons/sql/builder/TestBuilder.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- TestBuilder.java  12 Sep 2002 17:56:49 -0000      1.4
  +++ TestBuilder.java  20 Sep 2002 20:34:38 -0000      1.5
  @@ -13,6 +13,8 @@
   import java.io.IOException;
   import java.io.FileInputStream;
   import java.io.FileWriter;
  +import java.io.StringWriter;
  +import java.io.Writer;
   
   import junit.framework.Test;
   import junit.framework.TestCase;
  @@ -68,8 +70,8 @@
           
           DatabaseReader reader = new DatabaseReader ();
           database = (Database) reader.parse(new FileInputStream(uri));
  -        
           assertTrue("Loaded a valid database", database != null);
  +
       }
   
       /**
  @@ -78,22 +80,57 @@
       public void testBuilders()
           throws Exception
       {
  +
           testBuilder( new AxionBuilder(), "axion.sql" );
           testBuilder( new HsqlDbBuilder(), "hsqldb.sql" );
           testBuilder( new MSSqlBuilder(), "mssql.sql" );        
           testBuilder( new MySqlBuilder(), "mysql.sql" );
           testBuilder( new OracleBuilder(), "oracle.sql" );
  +        testBuilder( new PostgreSqlBuilder(), "postgres.sql" );
           testBuilder( new SybaseBuilder(), "sybase.sql" );
  +
       }
       
  +    /**
  +     * A unit test for JUnit
  +     */
  +    public void testBaseBuilder()
  +        throws Exception
  +    {
  +    
  +        SqlBuilder builder = new SqlBuilder();
  +        StringWriter sw = new StringWriter();
  +        builder.setWriter(sw);
  +        builder.dropDatabase(database);       
  +
  +        String drop = sw.toString();
  +        int bookIdx = drop.indexOf("drop table book");
  +        int authIdx = drop.indexOf("drop table author");
  +
  +        assertTrue("dropDatabase Failed to create proper drop statement for " +
  +                    "book table. Here is the statment created:\n" + drop, 
  +                    bookIdx > 0);
  +        
  +        assertTrue("dropDatabase Failed to create proper drop statement for " +
  +                    "author table. Here is the statment created:\n" + drop,
  +                     authIdx > 0);
  +
  +        Writer wr = builder.getWriter();
  +        assertTrue("Couldnt find writer", wr != null);  
  +
  +
  +    }
  +
       protected void testBuilder(SqlBuilder builder, String fileName) throws 
Exception 
       {
  +
           String name = baseDir + "/target/" + fileName;
           
           FileWriter writer = new FileWriter( name );
           builder.setWriter( writer );
           builder.createDatabase( database );
           writer.close();
  +
       }
   }
   
  
  
  
  1.4       +8 -3      jakarta-commons-sandbox/sql/src/test-input/datamodel.xml
  
  Index: datamodel.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/sql/src/test-input/datamodel.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- datamodel.xml     12 Sep 2002 17:56:49 -0000      1.3
  +++ datamodel.xml     20 Sep 2002 20:34:38 -0000      1.4
  @@ -21,9 +21,14 @@
       <column name="author_id" type="INTEGER" required="true"/>
       <column name="title" type="VARCHAR" size="255" required="true"/>
            
  -       <foreign-key foreignTable="author">
  -         <reference local="author_id" foreign="author_id"/>
  -       </foreign-key>  
  +    <foreign-key foreignTable="author">
  +    <reference local="author_id" foreign="author_id"/>
  +    </foreign-key>  
  +
  +    <index name="book_isbn">
  +     <index-column name="isbn"/>
  +    </index>
  +              
     </table>
   
   </database>
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to