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]>