You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ddlutils-dev@db.apache.org by to...@apache.org on 2007/02/12 02:29:22 UTC

svn commit: r506209 - in /db/ddlutils/trunk/src: java/org/apache/ddlutils/ java/org/apache/ddlutils/platform/ java/org/apache/ddlutils/platform/hsqldb/ test/org/apache/ddlutils/io/

Author: tomdz
Date: Sun Feb 11 17:29:21 2007
New Revision: 506209

URL: http://svn.apache.org/viewvc?view=rev&rev=506209
Log:
Fixed system index support in the HsqlDb platform
Made complex model test more robust

Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/JdbcModelReader.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbModelReader.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbPlatform.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestMisc.java

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java?view=diff&rev=506209&r1=506208&r2=506209
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/PlatformInfo.java Sun Feb 11 17:29:21 2007
@@ -74,6 +74,10 @@
         reading a model from a database. */
     private boolean _systemIndicesReturned = true;
 
+    /** Whether system indices for foreign keys are always non-unique or can be
+        unique (i.e. if a primary key column is used to establish the foreign key). */
+    private boolean _systemForeignKeyIndicesAlwaysNonUnique = false;
+    
     /** Whether the database returns a synthetic default value for non-identity required columns. */ 
     private boolean _syntheticDefaultValueForRequiredReturned = false;
 
@@ -391,6 +395,30 @@
     public void setSystemIndicesReturned(boolean returningSystemIndices)
     {
         _systemIndicesReturned = returningSystemIndices;
+    }
+
+    /**
+     * Determines whether system indices for foreign keys are always non-unique or can be
+     * unique (i.e. if a primary key column is used to establish the foreign key).
+     * 
+     * @return <code>true</code> if system foreign key indices are always non-unique;
+     *         default is <code>false</code>
+     */
+    public boolean isSystemForeignKeyIndicesAlwaysNonUnique()
+    {
+        return _systemForeignKeyIndicesAlwaysNonUnique;
+    }
+
+    /**
+     * Specifies whether system indices for foreign keys are always non-unique or can be
+     * unique (i.e. if a primary key column is used to establish the foreign key).
+     * 
+     * @param alwaysNonUnique <code>true</code> if system foreign key indices are always
+     *                        non-unique
+     */
+    public void setSystemForeignKeyIndicesAlwaysNonUnique(boolean alwaysNonUnique)
+    {
+        _systemForeignKeyIndicesAlwaysNonUnique = alwaysNonUnique;
     }
 
     /**

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/JdbcModelReader.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/JdbcModelReader.java?view=diff&rev=506209&r1=506208&r2=506209
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/JdbcModelReader.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/JdbcModelReader.java Sun Feb 11 17:29:21 2007
@@ -638,7 +638,7 @@
     protected void removeInternalForeignKeyIndex(DatabaseMetaDataWrapper metaData, Table table, ForeignKey fk) throws SQLException
     {
         List    columnNames  = new ArrayList();
-        boolean mustBeUnique = true;
+        boolean mustBeUnique = !getPlatformInfo().isSystemForeignKeyIndicesAlwaysNonUnique();
 
         for (int columnIdx = 0; columnIdx < fk.getReferenceCount(); columnIdx++)
         {
@@ -646,7 +646,7 @@
             Column localColumn = table.findColumn(name,
                                                   getPlatform().isDelimitedIdentifierModeOn());
 
-            if (!localColumn.isPrimaryKey())
+            if (mustBeUnique && !localColumn.isPrimaryKey())
             {
                 mustBeUnique = false;
             }

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbModelReader.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbModelReader.java?view=diff&rev=506209&r1=506208&r2=506209
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbModelReader.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbModelReader.java Sun Feb 11 17:29:21 2007
@@ -102,6 +102,6 @@
     {
         String name = index.getName();
 
-        return (name != null) && name.startsWith("SYS_PK_");
+        return (name != null) && (name.startsWith("SYS_PK_") || name.startsWith("SYS_IDX_"));
     }
 }

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbPlatform.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbPlatform.java?view=diff&rev=506209&r1=506208&r2=506209
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbPlatform.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/hsqldb/HsqlDbPlatform.java Sun Feb 11 17:29:21 2007
@@ -51,6 +51,7 @@
 
         info.setNonPKIdentityColumnsSupported(false);
         info.setIdentityOverrideAllowed(false);
+        info.setSystemForeignKeyIndicesAlwaysNonUnique(true);
 
         info.addNativeTypeMapping(Types.ARRAY,       "LONGVARBINARY", Types.LONGVARBINARY);
         info.addNativeTypeMapping(Types.BLOB,        "LONGVARBINARY", Types.LONGVARBINARY);

Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestMisc.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestMisc.java?view=diff&rev=506209&r1=506208&r2=506209
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestMisc.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/io/TestMisc.java Sun Feb 11 17:29:21 2007
@@ -22,11 +22,14 @@
 import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 
 import junit.framework.Test;
 
 import org.apache.commons.beanutils.DynaBean;
+import org.apache.ddlutils.platform.hsqldb.HsqlDbPlatform;
 import org.dom4j.Document;
 import org.dom4j.Element;
 import org.dom4j.io.SAXReader;
@@ -254,6 +257,12 @@
      */
     public void testSelfReferenceIdentityOverrideOff() throws Exception
     {
+        // Hsqldb does not allow rows to reference themselves
+        if (HsqlDbPlatform.DATABASENAME.equals(getPlatform().getName()))
+        {
+            return;
+        }
+
         final String modelXml = 
             "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+
             "<database name='roundtriptest'>\n"+
@@ -662,27 +671,53 @@
             pkColumnName = pkColumnName.toUpperCase();
         }
         assertEquals("1", ((Element)rows.get(0)).attributeValue(pkColumnName));
+
+        // we cannot be sure of the order in which the database returns the rows
+        // per table (some return them in pk order, some in insertion order)
+        // so we don't assume an order in this test
+        HashSet pkValues       = new HashSet();
+        HashSet expectedValues = new HashSet(Arrays.asList(new String[] { "1", "2" }));
+
         assertEquals(uppercase ? "G" : "g", ((Element)rows.get(1)).getName());
-        assertEquals("1", ((Element)rows.get(1)).attributeValue(pkColumnName));
         assertEquals(uppercase ? "G" : "g", ((Element)rows.get(2)).getName());
-        assertEquals("2", ((Element)rows.get(2)).attributeValue(pkColumnName));
+        pkValues.add(((Element)rows.get(1)).attributeValue(pkColumnName));
+        pkValues.add(((Element)rows.get(2)).attributeValue(pkColumnName));
+        assertEquals(pkValues, expectedValues);
+
+        pkValues.clear();
+        
         assertEquals(uppercase ? "A" : "a", ((Element)rows.get(3)).getName());
-        assertEquals("2", ((Element)rows.get(3)).attributeValue(pkColumnName));
         assertEquals(uppercase ? "A" : "a", ((Element)rows.get(4)).getName());
-        assertEquals("1", ((Element)rows.get(4)).attributeValue(pkColumnName));
+        pkValues.add(((Element)rows.get(3)).attributeValue(pkColumnName));
+        pkValues.add(((Element)rows.get(4)).attributeValue(pkColumnName));
+        assertEquals(pkValues, expectedValues);
+
+        pkValues.clear();
 
         assertEquals(uppercase ? "B" : "b", ((Element)rows.get(5)).getName());
-        assertEquals("2", ((Element)rows.get(5)).attributeValue(pkColumnName));
         assertEquals(uppercase ? "B" : "b", ((Element)rows.get(6)).getName());
-        assertEquals("1", ((Element)rows.get(6)).attributeValue(pkColumnName));
+        pkValues.add(((Element)rows.get(5)).attributeValue(pkColumnName));
+        pkValues.add(((Element)rows.get(6)).attributeValue(pkColumnName));
+        assertEquals(pkValues, expectedValues);
+
+        pkValues.clear();
+
         assertEquals(uppercase ? "C" : "c", ((Element)rows.get(7)).getName());
-        assertEquals("2", ((Element)rows.get(7)).attributeValue(pkColumnName));
         assertEquals(uppercase ? "C" : "c", ((Element)rows.get(8)).getName());
-        assertEquals("1", ((Element)rows.get(8)).attributeValue(pkColumnName));
+        pkValues.add(((Element)rows.get(7)).attributeValue(pkColumnName));
+        pkValues.add(((Element)rows.get(8)).attributeValue(pkColumnName));
+        assertEquals(pkValues, expectedValues);
+
+        pkValues.clear();
+
         assertEquals(uppercase ? "D" : "d", ((Element)rows.get(9)).getName());
-        assertEquals("2", ((Element)rows.get(9)).attributeValue(pkColumnName));
         assertEquals(uppercase ? "D" : "d", ((Element)rows.get(10)).getName());
-        assertEquals("1", ((Element)rows.get(10)).attributeValue(pkColumnName));
+        pkValues.add(((Element)rows.get(9)).attributeValue(pkColumnName));
+        pkValues.add(((Element)rows.get(10)).attributeValue(pkColumnName));
+        assertEquals(pkValues, expectedValues);
+
+        pkValues.clear();
+
         assertEquals(uppercase ? "F" : "f", ((Element)rows.get(11)).getName());
         assertEquals("1", ((Element)rows.get(11)).attributeValue(pkColumnName));