Clover Coverage Report - Liquibase Core 2.0.2
Coverage timestamp: Wed Aug 3 2011 19:29:16 EDT
../../../img/srcFileCovDistChart1.png 62% of files have more coverage
54   180   25   2.45
4   134   0.46   22
22     1.14  
1    
 
  MergeColumnChange       Line # 23 54 0% 25 78 2.5% 0.025
 
  (2)
 
1    package liquibase.change.core;
2   
3    import liquibase.change.AbstractChange;
4    import liquibase.change.ChangeMetaData;
5    import liquibase.change.ColumnConfig;
6    import liquibase.database.Database;
7    import liquibase.database.core.DerbyDatabase;
8    import liquibase.database.core.SQLiteDatabase;
9    import liquibase.database.core.SQLiteDatabase.AlterTableVisitor;
10    import liquibase.database.structure.Index;
11    import liquibase.exception.UnsupportedChangeException;
12    import liquibase.statement.SqlStatement;
13    import liquibase.statement.core.RawSqlStatement;
14    import liquibase.util.StringUtils;
15   
16    import java.util.ArrayList;
17    import java.util.Arrays;
18    import java.util.List;
19   
20    /**
21    * Combines data from two existing columns into a new column and drops the original columns.
22    */
 
23    public class MergeColumnChange extends AbstractChange {
24   
25    private String schemaName;
26    private String tableName;
27    private String column1Name;
28    private String joinString;
29    private String column2Name;
30    private String finalColumnName;
31    private String finalColumnType;
32   
 
33  10 toggle public MergeColumnChange() {
34  10 super("mergeColumns", "Merge Column", ChangeMetaData.PRIORITY_DEFAULT);
35    }
36   
 
37  0 toggle public String getSchemaName() {
38  0 return schemaName;
39    }
40   
 
41  0 toggle public void setSchemaName(String schemaName) {
42  0 this.schemaName = StringUtils.trimToNull(schemaName);
43    }
44   
 
45  0 toggle public String getTableName() {
46  0 return tableName;
47    }
48   
 
49  0 toggle public void setTableName(String tableName) {
50  0 this.tableName = tableName;
51    }
52   
 
53  0 toggle public String getColumn1Name() {
54  0 return column1Name;
55    }
56   
 
57  0 toggle public void setColumn1Name(String column1Name) {
58  0 this.column1Name = column1Name;
59    }
60   
 
61  0 toggle public String getJoinString() {
62  0 return joinString;
63    }
64   
 
65  0 toggle public void setJoinString(String joinString) {
66  0 this.joinString = joinString;
67    }
68   
 
69  0 toggle public String getColumn2Name() {
70  0 return column2Name;
71    }
72   
 
73  0 toggle public void setColumn2Name(String column2Name) {
74  0 this.column2Name = column2Name;
75    }
76   
 
77  0 toggle public String getFinalColumnName() {
78  0 return finalColumnName;
79    }
80   
 
81  0 toggle public void setFinalColumnName(String finalColumnName) {
82  0 this.finalColumnName = finalColumnName;
83    }
84   
 
85  0 toggle public String getFinalColumnType() {
86  0 return finalColumnType;
87    }
88   
 
89  0 toggle public void setFinalColumnType(String finalColumnType) {
90  0 this.finalColumnType = finalColumnType;
91    }
92   
 
93  0 toggle public SqlStatement[] generateStatements(Database database) {
94   
95  0 List<SqlStatement> statements = new ArrayList<SqlStatement>();
96   
97  0 AddColumnChange addNewColumnChange = new AddColumnChange();
98  0 String schemaName = getSchemaName() == null ? database.getDefaultSchemaName() : getSchemaName();
99  0 addNewColumnChange.setSchemaName(schemaName);
100  0 addNewColumnChange.setTableName(getTableName());
101  0 ColumnConfig columnConfig = new ColumnConfig();
102  0 columnConfig.setName(getFinalColumnName());
103  0 columnConfig.setType(getFinalColumnType());
104  0 addNewColumnChange.addColumn(columnConfig);
105  0 statements.addAll(Arrays.asList(addNewColumnChange.generateStatements(database)));
106   
107  0 String updateStatement = "UPDATE " + database.escapeTableName(schemaName, getTableName()) + " SET "
108    + getFinalColumnName() + " = "
109    + database.getConcatSql(getColumn1Name(), "'" + getJoinString() + "'", getColumn2Name());
110   
111  0 statements.add(new RawSqlStatement(updateStatement));
112   
113  0 if (database instanceof SQLiteDatabase) {
114    // SQLite does not support this ALTER TABLE operation until now.
115    // For more information see: http://www.sqlite.org/omitted.html
116    // This is a small work around...
117   
118    // define alter table logic
119  0 AlterTableVisitor rename_alter_visitor = new AlterTableVisitor() {
 
120  0 toggle public ColumnConfig[] getColumnsToAdd() {
121  0 ColumnConfig[] new_columns = new ColumnConfig[1];
122  0 ColumnConfig new_column = new ColumnConfig();
123  0 new_column.setName(getFinalColumnName());
124  0 new_column.setType(getFinalColumnType());
125  0 new_columns[0] = new ColumnConfig(new_column);
126  0 return new_columns;
127    }
128   
 
129  0 toggle public boolean copyThisColumn(ColumnConfig column) {
130  0 return !(column.getName().equals(getColumn1Name()) || column.getName().equals(getColumn2Name()));
131    }
132   
 
133  0 toggle public boolean createThisColumn(ColumnConfig column) {
134  0 return !(column.getName().equals(getColumn1Name()) || column.getName().equals(getColumn2Name()));
135    }
136   
 
137  0 toggle public boolean createThisIndex(Index index) {
138  0 return !(index.getColumns().contains(getColumn1Name()) || index.getColumns().contains(
139    getColumn2Name()));
140    }
141    };
142   
143  0 try {
144    // alter table
145  0 statements.addAll(SQLiteDatabase.getAlterTableStatements(rename_alter_visitor, database,
146    getSchemaName(), getTableName()));
147    } catch (Exception e) {
148  0 e.printStackTrace();
149    }
150   
151    } else {
152    // ...if it is not a SQLite database
153   
154  0 DropColumnChange dropColumn1Change = new DropColumnChange();
155  0 dropColumn1Change.setSchemaName(schemaName);
156  0 dropColumn1Change.setTableName(getTableName());
157  0 dropColumn1Change.setColumnName(getColumn1Name());
158  0 statements.addAll(Arrays.asList(dropColumn1Change.generateStatements(database)));
159   
160  0 DropColumnChange dropColumn2Change = new DropColumnChange();
161  0 dropColumn2Change.setSchemaName(schemaName);
162  0 dropColumn2Change.setTableName(getTableName());
163  0 dropColumn2Change.setColumnName(getColumn2Name());
164  0 statements.addAll(Arrays.asList(dropColumn2Change.generateStatements(database)));
165   
166    }
167  0 return statements.toArray(new SqlStatement[statements.size()]);
168   
169    }
170   
 
171  0 toggle public SqlStatement[] generateStatements(@SuppressWarnings("unused") DerbyDatabase database)
172    throws UnsupportedChangeException {
173  0 throw new UnsupportedChangeException("Derby does not currently support merging columns");
174    }
175   
 
176  0 toggle public String getConfirmationMessage() {
177  0 return "Columns " + getTableName() + "." + getColumn1Name() + " and " + getTableName() + "." + getColumn2Name()
178    + " merged";
179    }
180    }