Commit 63433930 authored by terrymanu's avatar terrymanu
Browse files

refactor TableMetaDataFactory

parent b48e9155
Loading
Loading
Loading
Loading
+32 −33
Original line number Diff line number Diff line
@@ -26,9 +26,11 @@ import io.shardingsphere.core.parsing.antlr.sql.segment.definition.column.positi
import io.shardingsphere.core.parsing.antlr.sql.statement.ddl.AlterTableStatement;
import io.shardingsphere.core.parsing.antlr.sql.statement.ddl.CreateTableStatement;

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * Table meta data factory.
@@ -61,51 +63,48 @@ public final class TableMetaDataFactory {
     * @return instance of table meta data
     */
    public static TableMetaData newInstance(final AlterTableStatement alterTableStatement, final TableMetaData oldTableMetaData) {
        List<ColumnMetaData> columnMetaDataList = createNewColumnMetaDataList(alterTableStatement, oldTableMetaData);
        fillAddedColumnDefinitions(alterTableStatement, columnMetaDataList);
        changeColumnDefinitionPositions(alterTableStatement, columnMetaDataList);
        dropColumnDefinitions(alterTableStatement, columnMetaDataList);
        return new TableMetaData(columnMetaDataList);
        List<ColumnMetaData> result = createColumnMetaDataList(alterTableStatement.getModifiedColumnDefinitions(), alterTableStatement.isDropPrimaryKey(), oldTableMetaData);
        result.addAll(createColumnMetaDataList(alterTableStatement.getAddedColumnDefinitions(), alterTableStatement.isDropPrimaryKey()));
        changeColumnDefinitionPositions(alterTableStatement.getChangedPositionColumns(), result);
        dropColumnDefinitions(alterTableStatement.getDroppedColumnNames(), result);
        return new TableMetaData(result);
    }
    
    private static List<ColumnMetaData> createNewColumnMetaDataList(final AlterTableStatement alterTableStatement, final TableMetaData oldTableMetaData) {
    private static List<ColumnMetaData> createColumnMetaDataList(
            final Map<String, ColumnDefinitionSegment> modifiedColumnDefinitions, final boolean dropPrimaryKey, final TableMetaData oldTableMetaData) {
        List<ColumnMetaData> result = new LinkedList<>();
        for (ColumnMetaData each : oldTableMetaData.getColumns().values()) {
            String columnName;
            String dataType;
            boolean primaryKey;
            if (alterTableStatement.getModifiedColumnDefinitions().containsKey(each.getColumnName())) {
                ColumnDefinitionSegment modifiedColumnDefinition = alterTableStatement.getModifiedColumnDefinitions().get(each.getColumnName());
                columnName = modifiedColumnDefinition.getColumnName();
                dataType = modifiedColumnDefinition.getDataType();
                primaryKey = !alterTableStatement.isDropPrimaryKey() && modifiedColumnDefinition.isPrimaryKey();
            ColumnMetaData columnMetaData;
            if (modifiedColumnDefinitions.containsKey(each.getColumnName())) {
                ColumnDefinitionSegment columnDefinition = modifiedColumnDefinitions.get(each.getColumnName());
                columnMetaData = new ColumnMetaData(columnDefinition.getColumnName(), columnDefinition.getDataType(), !dropPrimaryKey && columnDefinition.isPrimaryKey());
            } else {
                columnName = each.getColumnName();
                dataType = each.getDataType();
                primaryKey = !alterTableStatement.isDropPrimaryKey() && each.isPrimaryKey();
                columnMetaData = new ColumnMetaData(each.getColumnName(), each.getDataType(), !dropPrimaryKey && each.isPrimaryKey());
            }
            result.add(new ColumnMetaData(columnName, dataType, primaryKey));
            result.add(columnMetaData);
        }
        return result;
    }
    
    private static void fillAddedColumnDefinitions(final AlterTableStatement alterTableStatement, final List<ColumnMetaData> columnMetaDataList) {
        for (ColumnDefinitionSegment each : alterTableStatement.getAddedColumnDefinitions()) {
            columnMetaDataList.add(new ColumnMetaData(each.getColumnName(), each.getDataType(), !alterTableStatement.isDropPrimaryKey() && each.isPrimaryKey()));
    private static List<ColumnMetaData> createColumnMetaDataList(final Collection<ColumnDefinitionSegment> addedColumnDefinitions, final boolean dropPrimaryKey) {
        List<ColumnMetaData> result = new LinkedList<>();
        for (ColumnDefinitionSegment each : addedColumnDefinitions) {
            result.add(new ColumnMetaData(each.getColumnName(), each.getDataType(), !dropPrimaryKey && each.isPrimaryKey()));
        }
        return result;
    }
    
    private static void changeColumnDefinitionPositions(final AlterTableStatement alterTableStatement, final List<ColumnMetaData> columnMetaDataList) {
        for (ColumnPositionSegment each : alterTableStatement.getChangedPositionColumns()) {
    private static void changeColumnDefinitionPositions(final Collection<ColumnPositionSegment> changedPositionColumns, final List<ColumnMetaData> columnMetaDataList) {
        for (ColumnPositionSegment each : changedPositionColumns) {
            if (each instanceof ColumnFirstPositionSegment) {
                adjustFirst(columnMetaDataList, (ColumnFirstPositionSegment) each);
                changeColumnDefinitionPosition((ColumnFirstPositionSegment) each, columnMetaDataList);
            } else {
                adjustAfter(columnMetaDataList, (ColumnAfterPositionSegment) each);
                changeColumnDefinitionPosition((ColumnAfterPositionSegment) each, columnMetaDataList);
            }
        }
    }
    
    private static void adjustFirst(final List<ColumnMetaData> columnMetaDataList, final ColumnFirstPositionSegment columnFirstPositionSegment) {
    private static void changeColumnDefinitionPosition(final ColumnFirstPositionSegment columnFirstPositionSegment, final List<ColumnMetaData> columnMetaDataList) {
        ColumnMetaData firstColumnMetaData = null;
        Iterator<ColumnMetaData> iterator = columnMetaDataList.iterator();
        while (iterator.hasNext()) {
@@ -121,7 +120,7 @@ public final class TableMetaDataFactory {
        }
    }
    
    private static void adjustAfter(final List<ColumnMetaData> columnMetaDataList, final ColumnAfterPositionSegment columnAfterPositionSegment) {
    private static void changeColumnDefinitionPosition(final ColumnAfterPositionSegment columnAfterPositionSegment, final List<ColumnMetaData> columnMetaDataList) {
        int afterIndex = -1;
        int adjustColumnIndex = -1;
        for (int i = 0; i < columnMetaDataList.size(); i++) {
@@ -144,13 +143,13 @@ public final class TableMetaDataFactory {
        }
    }
    
    private static void dropColumnDefinitions(final AlterTableStatement alterTableStatement, final List<ColumnMetaData> newColumnMetaData) {
        Iterator<ColumnMetaData> iterator = newColumnMetaData.iterator();
        while (iterator.hasNext()) {
            ColumnMetaData each = iterator.next();
            if (alterTableStatement.getDropColumnNames().contains(each.getColumnName())) {
                iterator.remove();
    private static void dropColumnDefinitions(final Collection<String> droppedColumnNames, final List<ColumnMetaData> columnMetaDataList) {
        List<ColumnMetaData> droppedColumnMetaDataList = new LinkedList<>();
        for (ColumnMetaData each : columnMetaDataList) {
            if (droppedColumnNames.contains(each.getColumnName())) {
                droppedColumnMetaDataList.add(each);
            }
        }
        columnMetaDataList.removeAll(droppedColumnMetaDataList);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -34,6 +34,6 @@ public final class DropColumnDefinitionFiller implements SQLStatementFiller<Drop
    @Override
    public void fill(final DropColumnDefinitionSegment sqlSegment, 
                     final SQLStatement sqlStatement, final String sql, final ShardingRule shardingRule, final ShardingTableMetaData shardingTableMetaData) {
        ((AlterTableStatement) sqlStatement).getDropColumnNames().add(sqlSegment.getColumnName());
        ((AlterTableStatement) sqlStatement).getDroppedColumnNames().add(sqlSegment.getColumnName());
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -44,10 +44,10 @@ public final class AlterTableStatement extends DDLStatement {
    
    private final Map<String, ColumnDefinitionSegment> modifiedColumnDefinitions = new LinkedHashMap<>();
    
    private final Collection<String> dropColumnNames = new LinkedList<>();
    
    private final Collection<ColumnPositionSegment> changedPositionColumns = new TreeSet<>();
    
    private final Collection<String> droppedColumnNames = new LinkedList<>();
    
    private boolean dropPrimaryKey;
    
    private String newTableName;
+2 −2
Original line number Diff line number Diff line
@@ -50,8 +50,8 @@ public final class TableMetaDataFactoryTest {
        alterTableStatement.getAddedColumnDefinitions().add(new ColumnDefinitionSegment("new_column_2", "varchar", false));
        alterTableStatement.getModifiedColumnDefinitions().put("id", new ColumnDefinitionSegment("user_id", "bigint", true));
        alterTableStatement.getModifiedColumnDefinitions().put("status", new ColumnDefinitionSegment("status", "char", false));
        alterTableStatement.getDropColumnNames().add("drop_column_1");
        alterTableStatement.getDropColumnNames().add("drop_column_2");
        alterTableStatement.getDroppedColumnNames().add("drop_column_1");
        alterTableStatement.getDroppedColumnNames().add("drop_column_2");
        TableMetaData oldTableMetaData = new TableMetaData(Arrays.asList(new ColumnMetaData("id", "bigint", true), 
                new ColumnMetaData("status", "varchar", false), new ColumnMetaData("drop_column_1", "varchar", false), new ColumnMetaData("drop_column_2", "varchar", false)));
        TableMetaData actual = TableMetaDataFactory.newInstance(alterTableStatement, oldTableMetaData);
+1 −1
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@ public final class AlterTableAssert {
     * @param expected expected alter table
     */
    public void assertAlterTable(final AlterTableStatement actual, final ExpectedAlterTable expected) {
        assertThat(assertMessage.getFullAssertMessage("Drop names assertion error: "), Joiner.on(",").join(actual.getDropColumnNames()), is(expected.getDropColumns()));
        assertThat(assertMessage.getFullAssertMessage("Drop names assertion error: "), Joiner.on(",").join(actual.getDroppedColumnNames()), is(expected.getDropColumns()));
        assertSame(assertMessage.getFullAssertMessage("Drop primary key assertion error: "), actual.isDropPrimaryKey(), expected.isDropPrimaryKey());
        assertThat(assertMessage.getFullAssertMessage("Rename new table name assertion error: "), actual.getNewTableName().orNull(), is(expected.getNewTableName()));
        assertAddColumns(actual, expected.getAddColumns());