All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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