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()); | |
} | |
} |