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/12/10 09:21:39 UTC

svn commit: r602807 [9/15] - in /db/ddlutils/trunk: ./ src/java/org/apache/ddlutils/ src/java/org/apache/ddlutils/alteration/ src/java/org/apache/ddlutils/model/ src/java/org/apache/ddlutils/platform/ src/java/org/apache/ddlutils/platform/axion/ src/ja...

Added: db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestIndexComparison.java
URL: http://svn.apache.org/viewvc/db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestIndexComparison.java?rev=602807&view=auto
==============================================================================
--- db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestIndexComparison.java (added)
+++ db/ddlutils/trunk/src/test/org/apache/ddlutils/alteration/TestIndexComparison.java Mon Dec 10 00:20:47 2007
@@ -0,0 +1,1065 @@
+package org.apache.ddlutils.alteration;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.sql.Types;
+import java.util.List;
+
+import org.apache.ddlutils.model.Database;
+
+/**
+ * Tests the model comparison.
+ * 
+ * TODO: need tests with indexes without a name
+ * 
+ * @version $Revision: $
+ */
+public class TestIndexComparison extends TestComparisonBase
+{
+    /**
+     * Tests the addition of an index with one column.
+     */
+    public void testAddSingleColumnIndex1()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col' type='INTEGER'/>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL' type='INTEGER'/>\n" +
+            "    <index name='TESTINDEX'>\n" +
+            "      <index-column name='COL'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(1,
+                     changes.size());
+
+        AddIndexChange change = (AddIndexChange)changes.get(0);
+
+        assertEquals("TableA",
+                     change.getChangedTable());
+        assertIndex("TESTINDEX", false, new String[] { "COL" },
+                    change.getNewIndex());
+    }
+
+    /**
+     * Tests the addition of an index with one column.
+     */
+    public void testAddSingleColumnIndex2()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL' type='INTEGER'/>\n" +
+            "    <index name='TESTINDEX'>\n" +
+            "      <index-column name='COL'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(2,
+                     changes.size());
+
+        AddColumnChange colChange   = (AddColumnChange)changes.get(0);
+        AddIndexChange  indexChange = (AddIndexChange)changes.get(1);
+
+        assertEquals("TableA",
+                     colChange.getChangedTable());
+        assertColumn("COL", Types.INTEGER, null, null, false, false, false,
+                     colChange.getNewColumn());
+        assertEquals("ColPK",
+                     colChange.getPreviousColumn());
+        assertNull(colChange.getNextColumn());
+
+        assertEquals("TableA",
+                     indexChange.getChangedTable());
+        assertIndex("TESTINDEX", false, new String[] { "COL" },
+                     indexChange.getNewIndex());
+    }
+
+    /**
+     * Tests the addition of an index with multiple columns.
+     */
+    public void testAddMultiColumnIndex1()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col1' type='INTEGER'/>\n" +
+            "    <column name='Col2' type='DOUBLE'/>\n" +
+            "    <column name='Col3' type='VARCHAR' size='32'/>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "      <unique-column name='COL2'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(1,
+                     changes.size());
+
+        AddIndexChange change = (AddIndexChange)changes.get(0);
+
+        assertEquals("TableA",
+                     change.getChangedTable());
+        assertIndex("TESTINDEX", true, new String[] { "COL3", "COL1", "COL2" },
+                    change.getNewIndex());
+    }
+
+    /**
+     * Tests the addition of an index with multiple columns.
+     */
+    public void testAddMultiColumnIndex2()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "      <unique-column name='COL2'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(4,
+                     changes.size());
+
+        AddColumnChange colChange1  = (AddColumnChange)changes.get(0);
+        AddColumnChange colChange2  = (AddColumnChange)changes.get(1);
+        AddColumnChange colChange3  = (AddColumnChange)changes.get(2);
+        AddIndexChange  indexChange = (AddIndexChange)changes.get(3);
+
+        assertEquals("TableA",
+                     colChange1.getChangedTable());
+        assertColumn("COL1", Types.INTEGER, null, null, false, false, false,
+                     colChange1.getNewColumn());
+        assertEquals("ColPK",
+                     colChange1.getPreviousColumn());
+        assertNull(colChange1.getNextColumn());
+
+        assertEquals("TableA",
+                     colChange2.getChangedTable());
+        assertColumn("COL2", Types.DOUBLE, null, null, false, false, false,
+                     colChange2.getNewColumn());
+        assertEquals("COL1",
+                     colChange2.getPreviousColumn());
+        assertNull(colChange2.getNextColumn());
+
+        assertEquals("TableA",
+                     colChange3.getChangedTable());
+        assertColumn("COL3", Types.VARCHAR, "32", null, false, false, false,
+                     colChange3.getNewColumn());
+        assertEquals("COL2",
+                     colChange3.getPreviousColumn());
+        assertNull(colChange3.getNextColumn());
+
+        assertEquals("TableA",
+                     indexChange.getChangedTable());
+        assertIndex("TESTINDEX", true, new String[] { "COL3", "COL1", "COL2" },
+                    indexChange.getNewIndex());
+    }
+
+    /**
+     * Tests the addition of a column into an existing index with multiple columns.
+     */
+    public void testAddNewColumnToMultiColumnIndex()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "      <unique-column name='COL2'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(3,
+                     changes.size());
+
+        RemoveIndexChange indexChange1 = (RemoveIndexChange)changes.get(0);
+        AddColumnChange   colChange    = (AddColumnChange)changes.get(1);
+        AddIndexChange    indexChange2 = (AddIndexChange)changes.get(2);
+
+        assertEquals("TableA",
+                     indexChange1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     indexChange1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     colChange.getChangedTable());
+        assertColumn("COL2", Types.DOUBLE, null, null, false, false, false,
+                     colChange.getNewColumn());
+        assertEquals("COL1",
+                     colChange.getPreviousColumn());
+        assertEquals("COL3",
+                     colChange.getNextColumn());
+
+        assertEquals("TableA",
+                     indexChange2.getChangedTable());
+        assertIndex("TESTINDEX", true, new String[] { "COL3", "COL1", "COL2" },
+                    indexChange2.getNewIndex());
+    }
+
+    /**
+     * Tests the addition of columns to an existing index with a single column.
+     */
+    public void testAddNewColumnsToSingleColumnIndex()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "      <unique-column name='COL2'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(4,
+                     changes.size());
+
+        RemoveIndexChange indexChange1 = (RemoveIndexChange)changes.get(0);
+        AddColumnChange   colChange1   = (AddColumnChange)changes.get(1);
+        AddColumnChange   colChange2   = (AddColumnChange)changes.get(2);
+        AddIndexChange    indexChange2 = (AddIndexChange)changes.get(3);
+
+        assertEquals("TableA",
+                     indexChange1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     indexChange1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     colChange1.getChangedTable());
+        assertColumn("COL1", Types.INTEGER, null, null, false, false, false,
+                     colChange1.getNewColumn());
+        assertEquals("ColPK",
+                     colChange1.getPreviousColumn());
+        assertEquals("COL3",
+                     colChange1.getNextColumn());
+
+        assertEquals("TableA",
+                     colChange2.getChangedTable());
+        assertColumn("COL2", Types.DOUBLE, null, null, false, false, false,
+                     colChange2.getNewColumn());
+        assertEquals("COL1",
+                     colChange2.getPreviousColumn());
+        assertEquals("COL3",
+                     colChange2.getNextColumn());
+
+        assertEquals("TableA",
+                     indexChange2.getChangedTable());
+        assertIndex("TESTINDEX", true, new String[] { "COL1", "COL3", "COL2" },
+                    indexChange2.getNewIndex());
+    }
+
+    /**
+     * Tests the addition of a column to an index with multiple columns.
+     */
+    public void testAddColumnToMultiColumnIndex()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <index name='TESTINDEX'>\n" +
+            "      <index-column name='COL3'/>\n" +
+            "      <index-column name='COL2'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <index name='TESTINDEX'>\n" +
+            "      <index-column name='COL3'/>\n" +
+            "      <index-column name='COL1'/>\n" +
+            "      <index-column name='COL2'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(2,
+                     changes.size());
+
+        RemoveIndexChange indexChange1 = (RemoveIndexChange)changes.get(0);
+        AddIndexChange    indexChange2 = (AddIndexChange)changes.get(1);
+
+        assertEquals("TableA",
+                     indexChange1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     indexChange1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     indexChange2.getChangedTable());
+        assertIndex("TESTINDEX", false, new String[] { "COL3", "COL1", "COL2" },
+                    indexChange2.getNewIndex());
+    }
+
+    /**
+     * Tests the addition of columns to an index with a single column.
+     */
+    public void testAddColumnsToSingleColumnIndex()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "      <unique-column name='COL2'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(2,
+                     changes.size());
+
+        RemoveIndexChange indexChange1 = (RemoveIndexChange)changes.get(0);
+        AddIndexChange    indexChange2 = (AddIndexChange)changes.get(1);
+
+        assertEquals("TableA",
+                     indexChange1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     indexChange1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     indexChange2.getChangedTable());
+        assertIndex("TESTINDEX", true, new String[] { "COL3", "COL1", "COL2" },
+                    indexChange2.getNewIndex());
+    }
+
+    /**
+     * Tests the addition and removal of an index because of the change of column order.
+     */
+    public void testChangeIndexColumnOrder()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col1' type='INTEGER'/>\n" +
+            "    <column name='Col2' type='DOUBLE'/>\n" +
+            "    <unique name='TestIndex'>\n" +
+            "      <unique-column name='Col1'/>\n" +
+            "      <unique-column name='Col2'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col1' type='INTEGER'/>\n" +
+            "    <column name='Col2' type='DOUBLE'/>\n" +
+            "    <unique name='TestIndex'>\n" +
+            "      <unique-column name='Col2'/>\n" +
+            "      <unique-column name='Col1'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(2,
+                     changes.size());
+
+        RemoveIndexChange change1 = (RemoveIndexChange)changes.get(0);
+        AddIndexChange    change2 = (AddIndexChange)changes.get(1);
+
+        assertEquals("TableA",
+                     change1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     change1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     change2.getChangedTable());
+        assertIndex("TestIndex", true, new String[] { "Col2", "Col1" }, 
+                     change2.getNewIndex());
+    }
+    
+    /**
+     * Tests the recreation of an index because of the addition of an index column.
+     */
+    public void testAddIndexColumn()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col1' type='INTEGER'/>\n" +
+            "    <column name='Col2' type='DOUBLE'/>\n" +
+            "    <index name='TestIndex'>\n" +
+            "      <index-column name='Col1'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col1' type='INTEGER'/>\n" +
+            "    <column name='Col2' type='DOUBLE'/>\n" +
+            "    <index name='TestIndex'>\n" +
+            "      <index-column name='Col1'/>\n" +
+            "      <index-column name='Col2'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(2,
+                     changes.size());
+
+        RemoveIndexChange change1 = (RemoveIndexChange)changes.get(0);
+        AddIndexChange    change2 = (AddIndexChange)changes.get(1);
+
+        assertEquals("TableA",
+                     change1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     change1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     change2.getChangedTable());
+        assertIndex("TestIndex", false, new String[] { "Col1", "Col2" }, 
+                     change2.getNewIndex());
+    }
+   
+    /**
+     * Tests the addition and removal of an index because of the removal of an index column.
+     */
+    public void testRemoveIndexColumn()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col1' type='INTEGER'/>\n" +
+            "    <column name='Col2' type='DOUBLE'/>\n" +
+            "    <index name='TestIndex'>\n" +
+            "      <index-column name='Col1'/>\n" +
+            "      <index-column name='Col2'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col1' type='INTEGER'/>\n" +
+            "    <column name='Col2' type='DOUBLE'/>\n" +
+            "    <index name='TestIndex'>\n" +
+            "      <index-column name='Col1'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(2,
+                     changes.size());
+
+        RemoveIndexChange change1 = (RemoveIndexChange)changes.get(0);
+        AddIndexChange    change2 = (AddIndexChange)changes.get(1);
+
+        assertEquals("TableA",
+                     change1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     change1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     change2.getChangedTable());
+        assertIndex("TestIndex", false, new String[] { "Col1" }, 
+                    change2.getNewIndex());
+    }
+
+    /**
+     * Tests changing the type of an index.
+     */
+    public void testChangeIndexType()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col1' type='INTEGER'/>\n" +
+            "    <column name='Col2' type='DOUBLE'/>\n" +
+            "    <index name='TestIndex'>\n" +
+            "      <index-column name='Col1'/>\n" +
+            "      <index-column name='Col2'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col1' type='INTEGER'/>\n" +
+            "    <column name='Col2' type='DOUBLE'/>\n" +
+            "    <unique name='TestIndex'>\n" +
+            "      <unique-column name='Col1'/>\n" +
+            "      <unique-column name='Col2'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(2,
+                     changes.size());
+
+        RemoveIndexChange change1 = (RemoveIndexChange)changes.get(0);
+        AddIndexChange    change2 = (AddIndexChange)changes.get(1);
+
+        assertEquals("TableA",
+                     change1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     change1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     change2.getChangedTable());
+        assertIndex("TestIndex", true, new String[] { "Col1", "Col2" }, 
+                    change2.getNewIndex());
+    }
+
+    /**
+     * Tests the removal of a column that is the single column in an index.
+     */
+    public void testDropColumnFromSingleColumnIndex()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <index name='TESTINDEX'>\n" +
+            "      <index-column name='COL1'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(2,
+                     changes.size());
+
+        RemoveIndexChange  indexChange = (RemoveIndexChange)changes.get(0);
+        RemoveColumnChange colChange   = (RemoveColumnChange)changes.get(1);
+
+        assertEquals("TableA",
+                     indexChange.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     indexChange.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     colChange.getChangedTable());
+        assertEquals("COL1",
+                     colChange.getChangedColumn());
+    }
+
+    /**
+     * Tests the removal of a column that is part of an index.
+     */
+    public void testDropColumnFromMultiColumnIndex()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "      <unique-column name='COL2'/>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(3,
+                     changes.size());
+
+        RemoveIndexChange  indexChange1 = (RemoveIndexChange)changes.get(0);
+        RemoveColumnChange colChange    = (RemoveColumnChange)changes.get(1);
+        AddIndexChange     indexChange2 = (AddIndexChange)changes.get(2);
+
+        assertEquals("TableA",
+                     indexChange1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     indexChange1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     colChange.getChangedTable());
+        assertEquals("COL2",
+                     colChange.getChangedColumn());
+
+        assertEquals("TableA",
+                     indexChange2.getChangedTable());
+        assertIndex("TESTINDEX", true, new String[] { "COL3", "COL1" },
+                    indexChange2.getNewIndex());
+    }
+
+    /**
+     * Tests the addition of a column and changing the order of the columns in an index.
+     */
+    public void testAddColumnAndChangeIndexColumnOrder()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "      <unique-column name='COL2'/>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(3,
+                     changes.size());
+
+        RemoveIndexChange indexChange1 = (RemoveIndexChange)changes.get(0);
+        AddColumnChange   colChange    = (AddColumnChange)changes.get(1);
+        AddIndexChange    indexChange2 = (AddIndexChange)changes.get(2);
+
+        assertEquals("TableA",
+                     indexChange1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     indexChange1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     colChange.getChangedTable());
+        assertColumn("COL2", Types.DOUBLE, null, null, false, false, false,
+                     colChange.getNewColumn());
+        assertEquals("COL1",
+                     colChange.getPreviousColumn());
+        assertEquals("COL3",
+                     colChange.getNextColumn());
+
+        assertEquals("TableA",
+                     indexChange2.getChangedTable());
+        assertIndex("TESTINDEX", true, new String[] { "COL1", "COL2", "COL3" },
+                    indexChange2.getNewIndex());
+    }
+
+    /**
+     * Tests the removal of a column and changing the order of the columns in an index.
+     */
+    public void testDropColumnAndChangeIndexColumnOrder()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "      <unique-column name='COL2'/>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <unique name='TESTINDEX'>\n" +
+            "      <unique-column name='COL1'/>\n" +
+            "      <unique-column name='COL3'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(3,
+                     changes.size());
+
+        RemoveIndexChange  indexChange1 = (RemoveIndexChange)changes.get(0);
+        RemoveColumnChange colChange    = (RemoveColumnChange)changes.get(1);
+        AddIndexChange     indexChange2 = (AddIndexChange)changes.get(2);
+
+        assertEquals("TableA",
+                     indexChange1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     indexChange1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     colChange.getChangedTable());
+        assertEquals("COL2",
+                     colChange.getChangedColumn());
+
+        assertEquals("TableA",
+                     indexChange2.getChangedTable());
+        assertIndex("TESTINDEX", true, new String[] { "COL1", "COL3" },
+                    indexChange2.getNewIndex());
+    }
+    
+    /**
+     * Tests the removal of an index.
+     */
+    public void testDropIndex1()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col' type='INTEGER'/>\n" +
+            "    <unique name='TestIndex'>\n" +
+            "      <unique-column name='Col'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col' type='INTEGER'/>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(true).getChanges(model1, model2);
+
+        assertEquals(1,
+                     changes.size());
+
+        RemoveIndexChange change = (RemoveIndexChange)changes.get(0);
+
+        assertEquals("TableA",
+                     change.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     change.findChangedIndex(model1, true));
+    }
+
+    /**
+     * Tests the removal of an index.
+     */
+    public void testDropIndex2()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "    <index name='TESTINDEX'>\n" +
+            "      <index-column name='COL3'/>\n" +
+            "      <index-column name='COL2'/>\n" +
+            "      <index-column name='COL1'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TABLEA'>\n" +
+            "    <column name='COLPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='COL1' type='INTEGER'/>\n" +
+            "    <column name='COL2' type='DOUBLE'/>\n" +
+            "    <column name='COL3' type='VARCHAR' size='32'/>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(false).getChanges(model1, model2);
+
+        assertEquals(1,
+                     changes.size());
+
+        RemoveIndexChange indexChange = (RemoveIndexChange)changes.get(0);
+
+        assertEquals("TableA",
+                     indexChange.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     indexChange.findChangedIndex(model1, false));
+    }
+    
+    /**
+     * Tests the recreation of an index because of the change of type of the index.
+     */
+    public void testAddAndDropIndex()
+    {
+        final String MODEL1 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col' type='INTEGER'/>\n" +
+            "    <unique name='TestIndex'>\n" +
+            "      <unique-column name='Col'/>\n" +
+            "    </unique>\n" +
+            "  </table>\n" +
+            "</database>";
+        final String MODEL2 = 
+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n" +
+            "<database name='test'>\n" +
+            "  <table name='TableA'>\n" +
+            "    <column name='ColPK' type='INTEGER' primaryKey='true' required='true'/>\n" +
+            "    <column name='Col' type='INTEGER'/>\n" +
+            "    <index name='TestIndex'>\n" +
+            "      <index-column name='Col'/>\n" +
+            "    </index>\n" +
+            "  </table>\n" +
+            "</database>";
+
+        Database model1  = parseDatabaseFromString(MODEL1);
+        Database model2  = parseDatabaseFromString(MODEL2);
+        List     changes = getPlatform(true).getChanges(model1, model2);
+
+        assertEquals(2,
+                     changes.size());
+
+        RemoveIndexChange change1 = (RemoveIndexChange)changes.get(0);
+        AddIndexChange    change2 = (AddIndexChange)changes.get(1);
+
+        assertEquals("TableA",
+                     change1.getChangedTable());
+        assertEquals(model1.findTable("TableA").getIndex(0),
+                     change1.findChangedIndex(model1, false));
+
+        assertEquals("TableA",
+                     change2.getChangedTable());
+        assertIndex("TestIndex", false, new String[] { "Col" }, 
+                     change2.getNewIndex());
+    }
+}