
com.github.wz2cool.canal.utils.converter.db2.Db2AlterSqlConverter Maven / Gradle / Ivy
The newest version!
package com.github.wz2cool.canal.utils.converter.db2;
import com.github.wz2cool.canal.utils.converter.BaseAlterSqlConverter;
import com.github.wz2cool.canal.utils.converter.IColDataTypeConverter;
import com.github.wz2cool.canal.utils.model.AlterColumnExpression;
import com.github.wz2cool.canal.utils.model.EnhancedAlterOperation;
import net.sf.jsqlparser.statement.create.table.ColDataType;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
public class Db2AlterSqlConverter extends BaseAlterSqlConverter {
private final Db2ColDataTypeConverter db2ColDataTypeConverter = new Db2ColDataTypeConverter();
@Override
protected IColDataTypeConverter getColDataTypeConverter() {
return this.db2ColDataTypeConverter;
}
@Override
protected Optional convertToAddColumnSql(AlterColumnExpression alterColumnExpression) {
String tableName = alterColumnExpression.getTableName();
String columnName = alterColumnExpression.getColumnName();
ColDataType colDataType = alterColumnExpression.getColDataType();
String dataTypeString = getDataTypeString(colDataType);
String sql = String.format("ALTER TABLE %s ADD COLUMN %s %s",
tableName, columnName, dataTypeString);
return Optional.of(sql);
}
@Override
protected Optional convertToChangeColumnTypeSql(AlterColumnExpression alterColumnExpression) {
String tableName = alterColumnExpression.getTableName();
String columnName = alterColumnExpression.getColumnName();
ColDataType colDataType = alterColumnExpression.getColDataType();
String dataTypeString = getDataTypeString(colDataType);
String sql = String.format("ALTER TABLE %s ALTER COLUMN %s SET DATA TYPE %s",
tableName, columnName, dataTypeString);
return Optional.of(sql);
}
@Override
protected Optional convertToRenameColumnSql(AlterColumnExpression alterColumnExpression) {
String tableName = alterColumnExpression.getTableName();
String columnName = alterColumnExpression.getColumnName();
String oldColumnName = alterColumnExpression.getColOldName();
String sql = String.format("ALTER TABLE %s RENAME COLUMN %s To %s",
tableName, oldColumnName, columnName);
return Optional.of(sql);
}
@Override
protected Optional convertToDropColumnSql(AlterColumnExpression alterColumnExpression) {
String columnName = alterColumnExpression.getColumnName();
String tableName = alterColumnExpression.getTableName();
String sql = String.format("ALTER TABLE %s DROP COLUMN %s", tableName, columnName);
return Optional.of(sql);
}
@Override
protected List convertToOtherColumnActionSqlList(List alterColumnExpressions) {
return getReorgTableSqlList(alterColumnExpressions);
}
// https://dba.stackexchange.com/questions/127848/db2-reorg-recommended-commands
private List getReorgTableSqlList(final List alterColumnExpressions) {
// need reorg table if drop column and change column type
List result = new ArrayList<>();
if (alterColumnExpressions == null || alterColumnExpressions.isEmpty()) {
return result;
}
List needReorgTables = alterColumnExpressions.stream()
.filter(x -> x.getOperation() == EnhancedAlterOperation.DROP_COLUMN
|| x.getOperation() == EnhancedAlterOperation.CHANGE_COLUMN_TYPE)
.map(AlterColumnExpression::getTableName)
.distinct()
.collect(Collectors.toList());
for (String tableName : needReorgTables) {
String sql = String.format("Call Sysproc.admin_cmd ('reorg Table %s')", tableName);
result.add(sql);
}
return result;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy