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 2006/05/02 22:19:05 UTC

svn commit: r399036 - in /db/ddlutils/trunk/src: java/org/apache/ddlutils/platform/SqlBuilder.java test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java

Author: tomdz
Date: Tue May  2 13:19:04 2006
New Revision: 399036

URL: http://svn.apache.org/viewcvs?rev=399036&view=rev
Log:
Finished initial implementation of the new alteration algorithm

Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java
    db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java?rev=399036&r1=399035&r2=399036&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java (original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/platform/SqlBuilder.java Tue May  2 13:19:04 2006
@@ -27,6 +27,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
 
 import org.apache.commons.collections.Closure;
 import org.apache.commons.collections.CollectionUtils;
@@ -616,6 +617,9 @@
             }
             changesForTable.add(change);
         }
+        // we also need to drop the foreign keys of the unchanged tables referencing the changed tables
+        addRelevantFKsFromUnchangedTables(currentModel, desiredModel, changesPerTable.keySet(), unchangedFKs);
+
         // we're dropping the unchanged foreign keys
         for (Iterator tableFKIt = unchangedFKs.entrySet().iterator(); tableFKIt.hasNext();)
         {
@@ -677,6 +681,60 @@
             }
         }
         return unchangedFKs;
+    }
+
+    /**
+     * Adds the foreign keys of the unchanged tables that reference changed tables
+     * to the given map.
+     * 
+     * @param currentModel              The current model
+     * @param desiredModel              The desired model
+     * @param namesOfKnownChangedTables The known names of changed tables
+     * @param fksPerTable               The map table name -> foreign keys to which
+     *                                  found foreign keys will be added to
+     */
+    private void addRelevantFKsFromUnchangedTables(Database currentModel,
+                                                   Database desiredModel,
+                                                   Set      namesOfKnownChangedTables,
+                                                   Map      fksPerTable)
+    {
+        boolean caseSensitive = getPlatform().isDelimitedIdentifierModeOn();
+
+        for (int tableIdx = 0; tableIdx < desiredModel.getTableCount(); tableIdx++)
+        {
+            Table  targetTable = desiredModel.getTable(tableIdx);
+            String name        = targetTable.getName();
+            Table  sourceTable = currentModel.findTable(name, caseSensitive);
+            List   relevantFks = null;
+
+            if (!caseSensitive)
+            {
+                name = name.toUpperCase();
+            }
+            if ((sourceTable != null) && !namesOfKnownChangedTables.contains(name))
+            {
+                for (int fkIdx = 0; fkIdx < targetTable.getForeignKeyCount(); fkIdx++)
+                {
+                    ForeignKey targetFk = targetTable.getForeignKey(fkIdx);
+                    ForeignKey sourceFk = sourceTable.findForeignKey(targetFk, caseSensitive);
+                    String     refName  = targetFk.getForeignTable().getName();
+
+                    if (!caseSensitive)
+                    {
+                        refName = refName.toUpperCase();
+                    }
+                    if ((sourceFk != null) && namesOfKnownChangedTables.contains(refName))
+                    {
+                        if (relevantFks == null)
+                        {
+                            relevantFks = new ArrayList();
+                            fksPerTable.put(name, relevantFks);
+                        }
+                        relevantFks.add(targetFk);
+                    }
+                }
+            }
+        }
     }
     
     /**

Modified: db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java
URL: http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java?rev=399036&r1=399035&r2=399036&view=diff
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java (original)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestAlterationAlgorithm.java Tue May  2 13:19:04 2006
@@ -1320,6 +1320,7 @@
             "CREATE TABLE \"TableA_\"\n"+
             "(\n"+
             "    \"ColPK\" INTEGER NOT NULL,\n"+
+            "    \"Col\" DOUBLE,\n"+
             "    PRIMARY KEY (\"ColPK\")\n"+
             ");\n"+
             "INSERT INTO \"TableA_\" (\"ColPK\") SELECT \"ColPK\" FROM \"TableA\";\n"+
@@ -2464,22 +2465,6 @@
             ");\n"+
             "INSERT INTO \"TableA\" (\"ColPK\") SELECT \"ColPK\" FROM \"TableA_\";\n"+
             "DROP TABLE \"TableA_\";\n"+
-            "CREATE TABLE \"TABLEB_\"\n"+
-            "(\n"+
-            "    \"COLPK\" INTEGER NOT NULL,\n"+
-            "    \"COLFK\" INTEGER,\n"+
-            "    PRIMARY KEY (\"COLPK\")\n"+
-            ");\n"+
-            "INSERT INTO \"TABLEB_\" (\"COLPK\",\"COLFK\") SELECT \"COLPK\",\"COLFK\" FROM \"TABLEB\";\n"+
-            "DROP TABLE \"TABLEB\";\n"+
-            "CREATE TABLE \"TABLEB\"\n"+
-            "(\n"+
-            "    \"COLPK\" INTEGER NOT NULL,\n"+
-            "    \"COLFK\" INTEGER,\n"+
-            "    PRIMARY KEY (\"COLPK\")\n"+
-            ");\n"+
-            "INSERT INTO \"TABLEB\" (\"COLPK\",\"COLFK\") SELECT \"COLPK\",\"COLFK\" FROM \"TABLEB_\";\n"+
-            "DROP TABLE \"TABLEB_\";\n"+
             "ALTER TABLE \"TABLEB\" ADD CONSTRAINT \"TESTFK\" FOREIGN KEY (\"COLFK\") REFERENCES \"TableA\" (\"ColPK\");\n",
             getAlterDatabaseSQL(MODEL1, MODEL2));
     }