Commit 00348fb1 authored by tristaZero's avatar tristaZero
Browse files

Merge branch 'dev' of ssh://github.com/shardingjdbc/sharding-jdbc into dev

parents 5b9dae5b 63433930
Loading
Loading
Loading
Loading
+7 −11
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ import java.util.Map;
public final class ShardingTableMetaData {
    
    @Getter
    private final Map<String, TableMetaData> tableMetaDataMap;
    private final Map<String, TableMetaData> tables;
    
    /**
     * Get table meta data by table name.
@@ -43,7 +43,7 @@ public final class ShardingTableMetaData {
     * @return table mata data
     */
    public TableMetaData get(final String logicTableName) {
        return tableMetaDataMap.get(logicTableName);
        return tables.get(logicTableName);
    }
    
    /**
@@ -53,7 +53,7 @@ public final class ShardingTableMetaData {
     * @param tableMetaData table meta data
     */
    public void put(final String logicTableName, final TableMetaData tableMetaData) {
        tableMetaDataMap.put(logicTableName, tableMetaData);
        tables.put(logicTableName, tableMetaData);
    }
    
    /**
@@ -62,7 +62,7 @@ public final class ShardingTableMetaData {
     * @param logicTableName logic table name
     */
    public void remove(final String logicTableName) {
        tableMetaDataMap.remove(logicTableName);
        tables.remove(logicTableName);
    }
    
    /**
@@ -72,7 +72,7 @@ public final class ShardingTableMetaData {
     * @return contains table from table meta data or not
     */
    public boolean containsTable(final String tableName) {
        return tableMetaDataMap.containsKey(tableName);
        return tables.containsKey(tableName);
    }
    
    /**
@@ -83,7 +83,7 @@ public final class ShardingTableMetaData {
     * @return contains column from table meta data or not
     */
    public boolean containsColumn(final String tableName, final String column) {
        return containsTable(tableName) && tableMetaDataMap.get(tableName).getAllColumnNames().contains(column.toLowerCase());
        return containsTable(tableName) && tables.get(tableName).getColumns().keySet().contains(column.toLowerCase());
    }
    
    /**
@@ -93,10 +93,6 @@ public final class ShardingTableMetaData {
     * @return column names.
     */
    public Collection<String> getAllColumnNames(final String tableName) {
        TableMetaData tableMeta = tableMetaDataMap.get(tableName);
        if (null == tableMeta) {
            return Collections.emptyList();
        }
        return tableMeta.getAllColumnNames();
        return tables.containsKey(tableName) ? tables.get(tableName).getColumns().keySet() : Collections.<String>emptyList();
    }
}
+6 −13
Original line number Diff line number Diff line
@@ -19,35 +19,28 @@ package io.shardingsphere.core.metadata.table;

import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;

import java.util.Collection;
import java.util.LinkedList;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * Table metadata.
 *
 * @author panjuan
 */
@RequiredArgsConstructor
@Getter
@EqualsAndHashCode
@ToString
public final class TableMetaData {
    
    private final Collection<ColumnMetaData> columnMetaDataList;
    private final Map<String, ColumnMetaData> columns;
    
    /**
     * Get all column names.
     *
     * @return column names
     */
    public Collection<String> getAllColumnNames() {
        Collection<String> result = new LinkedList<>();
    public TableMetaData(final Collection<ColumnMetaData> columnMetaDataList) {
        columns = new LinkedHashMap<>(columnMetaDataList.size(), 1);
        for (ColumnMetaData each : columnMetaDataList) {
            result.add(each.getColumnName().toLowerCase());
            columns.put(each.getColumnName(), each);
        }
        return result;
    }
}
+155 −0
Original line number Diff line number Diff line
/*
 * Copyright 2016-2018 shardingsphere.io.
 * <p>
 * Licensed 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.
 * </p>
 */

package io.shardingsphere.core.metadata.table;

import com.google.common.base.Function;
import com.google.common.collect.Lists;
import io.shardingsphere.core.parsing.antlr.sql.segment.definition.column.ColumnDefinitionSegment;
import io.shardingsphere.core.parsing.antlr.sql.segment.definition.column.position.ColumnAfterPositionSegment;
import io.shardingsphere.core.parsing.antlr.sql.segment.definition.column.position.ColumnFirstPositionSegment;
import io.shardingsphere.core.parsing.antlr.sql.segment.definition.column.position.ColumnPositionSegment;
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.
 *
 * @author zhangliang
 */
public final class TableMetaDataFactory {
    
    /**
     * New instance of table meta data.
     * 
     * @param createTableStatement create table statement
     * @return instance of table meta data
     */
    public static TableMetaData newInstance(final CreateTableStatement createTableStatement) {
        return new TableMetaData(Lists.transform(createTableStatement.getColumnDefinitions(), new Function<ColumnDefinitionSegment, ColumnMetaData>() {
            
            @Override
            public ColumnMetaData apply(final ColumnDefinitionSegment input) {
                return new ColumnMetaData(input.getColumnName(), input.getDataType(), input.isPrimaryKey());
            }
        }));
    }
    
    /**
     * New instance of table meta data.
     *
     * @param alterTableStatement alter table statement
     * @param oldTableMetaData old table meta data
     * @return instance of table meta data
     */
    public static TableMetaData newInstance(final AlterTableStatement alterTableStatement, final TableMetaData oldTableMetaData) {
        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> createColumnMetaDataList(
            final Map<String, ColumnDefinitionSegment> modifiedColumnDefinitions, final boolean dropPrimaryKey, final TableMetaData oldTableMetaData) {
        List<ColumnMetaData> result = new LinkedList<>();
        for (ColumnMetaData each : oldTableMetaData.getColumns().values()) {
            ColumnMetaData columnMetaData;
            if (modifiedColumnDefinitions.containsKey(each.getColumnName())) {
                ColumnDefinitionSegment columnDefinition = modifiedColumnDefinitions.get(each.getColumnName());
                columnMetaData = new ColumnMetaData(columnDefinition.getColumnName(), columnDefinition.getDataType(), !dropPrimaryKey && columnDefinition.isPrimaryKey());
            } else {
                columnMetaData = new ColumnMetaData(each.getColumnName(), each.getDataType(), !dropPrimaryKey && each.isPrimaryKey());
            }
            result.add(columnMetaData);
        }
        return result;
    }
    
    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 Collection<ColumnPositionSegment> changedPositionColumns, final List<ColumnMetaData> columnMetaDataList) {
        for (ColumnPositionSegment each : changedPositionColumns) {
            if (each instanceof ColumnFirstPositionSegment) {
                changeColumnDefinitionPosition((ColumnFirstPositionSegment) each, columnMetaDataList);
            } else {
                changeColumnDefinitionPosition((ColumnAfterPositionSegment) each, columnMetaDataList);
            }
        }
    }
    
    private static void changeColumnDefinitionPosition(final ColumnFirstPositionSegment columnFirstPositionSegment, final List<ColumnMetaData> columnMetaDataList) {
        ColumnMetaData firstColumnMetaData = null;
        Iterator<ColumnMetaData> iterator = columnMetaDataList.iterator();
        while (iterator.hasNext()) {
            ColumnMetaData each = iterator.next();
            if (each.getColumnName().equals(columnFirstPositionSegment.getColumnName())) {
                firstColumnMetaData = each;
                iterator.remove();
                break;
            }
        }
        if (null != firstColumnMetaData) {
            columnMetaDataList.add(0, firstColumnMetaData);
        }
    }
    
    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++) {
            if (columnMetaDataList.get(i).getColumnName().equals(columnAfterPositionSegment.getColumnName())) {
                adjustColumnIndex = i;
            }
            if (columnMetaDataList.get(i).getColumnName().equals(columnAfterPositionSegment.getAfterColumnName())) {
                afterIndex = i;
            }
            if (adjustColumnIndex >= 0 && afterIndex >= 0) {
                break;
            }
        }
        if (adjustColumnIndex >= 0 && afterIndex >= 0 && adjustColumnIndex != afterIndex + 1) {
            ColumnMetaData adjustColumnMetaData = columnMetaDataList.remove(adjustColumnIndex);
            if (afterIndex < adjustColumnIndex) {
                afterIndex = afterIndex + 1;
            }
            columnMetaDataList.add(afterIndex, adjustColumnMetaData);
        }
    }
    
    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());
    }
}
+3 −3
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;
@@ -84,7 +84,7 @@ public final class AlterTableStatement extends DDLStatement {
        if (!shardingTableMetaData.containsTable(getTables().getSingleTableName())) {
            return Optional.absent();
        }
        for (ColumnMetaData each : shardingTableMetaData.get(getTables().getSingleTableName()).getColumnMetaDataList()) {
        for (ColumnMetaData each : shardingTableMetaData.get(getTables().getSingleTableName()).getColumns().values()) {
            if (columnName.equalsIgnoreCase(each.getColumnName())) {
                return Optional.of(new ColumnDefinitionSegment(columnName, each.getDataType(), each.isPrimaryKey()));
            }
Loading