Loading sharding-core/src/main/java/io/shardingsphere/core/metadata/table/ShardingTableMetaData.java +7 −11 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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()); } /** Loading @@ -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(); } } sharding-core/src/main/java/io/shardingsphere/core/metadata/table/TableMetaData.java +6 −13 Original line number Diff line number Diff line Loading @@ -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; } } sharding-core/src/main/java/io/shardingsphere/core/metadata/table/TableMetaDataFactory.java 0 → 100644 +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); } } sharding-core/src/main/java/io/shardingsphere/core/parsing/antlr/filler/impl/ddl/alter/DropColumnDefinitionFiller.java +1 −1 Original line number Diff line number Diff line Loading @@ -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()); } } sharding-core/src/main/java/io/shardingsphere/core/parsing/antlr/sql/statement/ddl/AlterTableStatement.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
sharding-core/src/main/java/io/shardingsphere/core/metadata/table/ShardingTableMetaData.java +7 −11 Original line number Diff line number Diff line Loading @@ -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. Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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); } /** Loading @@ -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()); } /** Loading @@ -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(); } }
sharding-core/src/main/java/io/shardingsphere/core/metadata/table/TableMetaData.java +6 −13 Original line number Diff line number Diff line Loading @@ -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; } }
sharding-core/src/main/java/io/shardingsphere/core/metadata/table/TableMetaDataFactory.java 0 → 100644 +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); } }
sharding-core/src/main/java/io/shardingsphere/core/parsing/antlr/filler/impl/ddl/alter/DropColumnDefinitionFiller.java +1 −1 Original line number Diff line number Diff line Loading @@ -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()); } }
sharding-core/src/main/java/io/shardingsphere/core/parsing/antlr/sql/statement/ddl/AlterTableStatement.java +3 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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