提交 57b8764a 编写于 作者: T terrymanu

for #2900, add ShardingTableMetaData

上级 f9ec9865
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.metadata.table.impl;
package org.apache.shardingsphere.core.metadata.table;
import lombok.EqualsAndHashCode;
import lombok.Getter;
......@@ -23,7 +23,7 @@ import lombok.RequiredArgsConstructor;
import lombok.ToString;
/**
* Column metadata.
* Column meta data.
*
* @author panjuan
*/
......
......@@ -15,7 +15,7 @@
* limitations under the License.
*/
package org.apache.shardingsphere.core.metadata.table.impl;
package org.apache.shardingsphere.core.metadata.table;
import lombok.EqualsAndHashCode;
import lombok.Getter;
......@@ -25,25 +25,21 @@ import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* Table metadata.
* Table meta data.
*
* @author panjuan
*/
@Getter
@EqualsAndHashCode
@ToString
public final class TableMetaData {
public class TableMetaData {
private final Map<String, ColumnMetaData> columns;
private final Collection<String> logicIndexes;
public TableMetaData(final Collection<ColumnMetaData> columnMetaDataList, final Collection<String> logicIndexes) {
public TableMetaData(final Collection<ColumnMetaData> columnMetaDataList) {
columns = getColumns(columnMetaDataList);
this.logicIndexes = new CopyOnWriteArraySet<>(logicIndexes);
}
private Map<String, ColumnMetaData> getColumns(final Collection<ColumnMetaData> columnMetaDataList) {
......
......@@ -17,13 +17,9 @@
package org.apache.shardingsphere.core.metadata.table;
import com.google.common.base.Optional;
import org.apache.shardingsphere.core.metadata.table.impl.TableMetaData;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
/**
......@@ -102,17 +98,11 @@ public final class TableMetas {
}
/**
* Get logic table name.
* Get all table names.
*
* @param logicIndexName logic index name
* @return logic table name
* @return all table names
*/
public Optional<String> getLogicTableName(final String logicIndexName) {
for (Entry<String, TableMetaData> entry : tables.entrySet()) {
if (entry.getValue().getLogicIndexes().contains(logicIndexName)) {
return Optional.of(entry.getKey());
}
}
return Optional.absent();
public Collection<String> getAllTableNames() {
return tables.keySet();
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.shardingsphere.core.metadata.table.sharding;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
import org.apache.shardingsphere.core.metadata.table.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import java.util.Collection;
import java.util.concurrent.CopyOnWriteArraySet;
/**
* Table meta data for sharding.
*
* @author zhangliang
*/
@Getter
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public final class ShardingTableMetaData extends TableMetaData {
private final Collection<String> logicIndexes;
public ShardingTableMetaData(final Collection<ColumnMetaData> columnMetaDataList, final Collection<String> logicIndexes) {
super(columnMetaDataList);
this.logicIndexes = new CopyOnWriteArraySet<>(logicIndexes);
}
/**
* Judge contains index or not.
*
* @param logicIndexName logic index name
* @return contains index or not
*/
public boolean containsIndex(final String logicIndexName) {
return logicIndexes.contains(logicIndexName);
}
}
......@@ -20,7 +20,7 @@ package org.apache.shardingsphere.core.execute.metadata;
import com.google.common.base.Optional;
import org.apache.shardingsphere.core.execute.ShardingExecuteEngine;
import org.apache.shardingsphere.core.metadata.datasource.DataSourceMetas;
import org.apache.shardingsphere.core.metadata.table.impl.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.apache.shardingsphere.core.rule.TableRule;
import org.apache.shardingsphere.spi.database.DataSourceMetaData;
......
......@@ -25,8 +25,9 @@ import org.apache.shardingsphere.core.execute.ShardingExecuteEngine;
import org.apache.shardingsphere.core.execute.ShardingExecuteGroup;
import org.apache.shardingsphere.core.execute.ShardingGroupExecuteCallback;
import org.apache.shardingsphere.core.metadata.datasource.DataSourceMetas;
import org.apache.shardingsphere.core.metadata.table.impl.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.impl.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.rule.DataNode;
import org.apache.shardingsphere.core.rule.ShardingDataSourceNames;
import org.apache.shardingsphere.core.rule.ShardingRule;
......@@ -133,9 +134,9 @@ public final class TableMetaDataLoader {
private TableMetaData createTableMetaData(final Connection connection, final String catalog, final String actualTableName) throws SQLException {
if (isTableExist(connection, catalog, actualTableName)) {
return new TableMetaData(getColumnMetaDataList(connection, catalog, actualTableName), getLogicIndexes(connection, catalog, actualTableName));
return new ShardingTableMetaData(getColumnMetaDataList(connection, catalog, actualTableName), getLogicIndexes(connection, catalog, actualTableName));
}
return new TableMetaData(Collections.<ColumnMetaData>emptyList(), Collections.<String>emptySet());
return new ShardingTableMetaData(Collections.<ColumnMetaData>emptyList(), Collections.<String>emptySet());
}
private boolean isTableExist(final Connection connection, final String catalog, final String actualTableName) throws SQLException {
......
......@@ -24,9 +24,10 @@ import org.apache.shardingsphere.api.config.sharding.strategy.ComplexShardingStr
import org.apache.shardingsphere.core.execute.sql.execute.result.QueryResult;
import org.apache.shardingsphere.core.merge.fixture.ComplexKeysShardingAlgorithmFixture;
import org.apache.shardingsphere.core.merge.fixture.TestQueryResult;
import org.apache.shardingsphere.core.metadata.table.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.impl.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.impl.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.junit.Before;
import org.junit.Test;
......@@ -63,7 +64,7 @@ public final class ShowCreateTableMergedResultTest {
shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig);
shardingRule = new ShardingRule(shardingRuleConfig, Lists.newArrayList("ds"));
Map<String, TableMetaData> tableMetaDataMap = new HashMap<>(1, 1);
tableMetaDataMap.put("table", new TableMetaData(Collections.<ColumnMetaData>emptyList(), Collections.<String>emptySet()));
tableMetaDataMap.put("table", new ShardingTableMetaData(Collections.<ColumnMetaData>emptyList(), Collections.<String>emptySet()));
tableMetas = new TableMetas(tableMetaDataMap);
resultSet = mock(ResultSet.class);
ResultSetMetaData resultSetMetaData = mock(ResultSetMetaData.class);
......
......@@ -24,9 +24,10 @@ import org.apache.shardingsphere.api.config.sharding.strategy.ComplexShardingStr
import org.apache.shardingsphere.core.execute.sql.execute.result.QueryResult;
import org.apache.shardingsphere.core.merge.fixture.ComplexKeysShardingAlgorithmFixture;
import org.apache.shardingsphere.core.merge.fixture.TestQueryResult;
import org.apache.shardingsphere.core.metadata.table.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.impl.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.impl.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.junit.Before;
import org.junit.Test;
......@@ -63,7 +64,7 @@ public final class ShowTablesMergedResultTest {
shardingRuleConfig.getTableRuleConfigs().add(tableRuleConfig);
shardingRule = new ShardingRule(shardingRuleConfig, Lists.newArrayList("ds"));
Map<String, TableMetaData> tableMetaDataMap = new HashMap<>(1, 1);
tableMetaDataMap.put("table", new TableMetaData(Collections.<ColumnMetaData>emptyList(), Collections.<String>emptySet()));
tableMetaDataMap.put("table", new ShardingTableMetaData(Collections.<ColumnMetaData>emptyList(), Collections.<String>emptySet()));
tableMetas = new TableMetas(tableMetaDataMap);
resultSet = mock(ResultSet.class);
ResultSetMetaData resultSetMetaData = mock(ResultSetMetaData.class);
......
......@@ -20,6 +20,7 @@ package org.apache.shardingsphere.core.optimize.sharding.engnie.ddl;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.optimize.api.segment.Tables;
import org.apache.shardingsphere.core.optimize.sharding.engnie.ShardingOptimizeEngine;
import org.apache.shardingsphere.core.optimize.sharding.statement.ddl.ShardingDropIndexOptimizedStatement;
......@@ -53,10 +54,19 @@ public final class ShardingDropIndexOptimizeEngine implements ShardingOptimizeEn
private Collection<String> getTableNames(final TableMetas tableMetas, final DropIndexStatement sqlStatement) {
Collection<String> result = new LinkedList<>();
for (IndexSegment each : sqlStatement.getIndexes()) {
Optional<String> tableName = tableMetas.getLogicTableName(each.getName());
Optional<String> tableName = findLogicTableName(tableMetas, each.getName());
Preconditions.checkState(tableName.isPresent(), "Cannot find table for index name `%s` from sharding rule.", each.getName());
result.add(tableName.get());
}
return result;
}
private Optional<String> findLogicTableName(final TableMetas tableMetas, final String logicIndexName) {
for (String each : tableMetas.getAllTableNames()) {
if (tableMetas.get(each) instanceof ShardingTableMetaData && ((ShardingTableMetaData) tableMetas.get(each)).containsIndex(logicIndexName)) {
return Optional.of(each);
}
}
return Optional.absent();
}
}
......@@ -17,8 +17,10 @@
package org.apache.shardingsphere.core.optimize.sharding.engnie.ddl;
import com.google.common.base.Optional;
import org.apache.shardingsphere.core.metadata.table.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.optimize.sharding.statement.ddl.ShardingDropIndexOptimizedStatement;
import org.apache.shardingsphere.core.parse.sql.segment.ddl.index.IndexSegment;
import org.apache.shardingsphere.core.parse.sql.segment.generic.TableSegment;
......@@ -27,30 +29,28 @@ import org.apache.shardingsphere.core.parse.sql.statement.ddl.DropIndexStatement
import org.apache.shardingsphere.core.rule.ShardingRule;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public final class ShardingDropIndexOptimizeEngineTest {
private DropIndexStatement dropIndexStatement;
@Mock
private TableMetas tableMetas;
@Before
public void setUp() {
dropIndexStatement = new DropIndexStatement();
dropIndexStatement.getIndexes().add(new IndexSegment(0, 0, "idx"));
when(tableMetas.getLogicTableName("idx")).thenReturn(Optional.of("meta_tbl"));
Map<String, TableMetaData> tables = new HashMap<>(1, 1);
tables.put("meta_tbl", new ShardingTableMetaData(Collections.<ColumnMetaData>emptyList(), Collections.singletonList("idx")));
tableMetas = new TableMetas(tables);
}
@Test
......
......@@ -19,9 +19,10 @@ package org.apache.shardingsphere.core.optimize.sharding.engnie.dml;
import com.google.common.base.Optional;
import com.google.common.collect.Range;
import org.apache.shardingsphere.core.metadata.table.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.impl.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.impl.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.optimize.sharding.segment.condition.ShardingCondition;
import org.apache.shardingsphere.core.optimize.sharding.segment.condition.ShardingConditions;
import org.apache.shardingsphere.core.optimize.sharding.segment.select.item.SelectItems;
......@@ -232,6 +233,6 @@ public final class ShardingSelectOptimizeEngineTest {
private TableMetaData createTableMetaData() {
ColumnMetaData idColumnMetaData = new ColumnMetaData("id", "int", true);
ColumnMetaData nameColumnMetaData = new ColumnMetaData("user_id", "int", false);
return new TableMetaData(Arrays.asList(idColumnMetaData, nameColumnMetaData), Arrays.asList("id", "user_id"));
return new ShardingTableMetaData(Arrays.asList(idColumnMetaData, nameColumnMetaData), Arrays.asList("id", "user_id"));
}
}
......@@ -17,9 +17,10 @@
package org.apache.shardingsphere.core.optimize.sharding.segment.select.item;
import org.apache.shardingsphere.core.metadata.table.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.impl.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.impl.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.parse.core.constant.AggregationType;
import org.apache.shardingsphere.core.parse.sql.segment.generic.TableSegment;
import org.junit.Test;
......@@ -166,7 +167,7 @@ public final class SelectItemsTest {
private TableMetas createTableMetas() {
Map<String, TableMetaData> tables = new HashMap<>(1, 1);
tables.put("table", new TableMetaData(Arrays.asList(new ColumnMetaData("id", "number", true), new ColumnMetaData("name", "varchar", false)), Collections.<String>emptyList()));
tables.put("table", new ShardingTableMetaData(Arrays.asList(new ColumnMetaData("id", "number", true), new ColumnMetaData("name", "varchar", false)), Collections.<String>emptyList()));
return new TableMetas(tables);
}
......
......@@ -25,9 +25,9 @@ import org.apache.shardingsphere.api.config.sharding.strategy.InlineShardingStra
import org.apache.shardingsphere.api.hint.HintManager;
import org.apache.shardingsphere.core.database.DatabaseTypes;
import org.apache.shardingsphere.core.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.core.metadata.table.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.impl.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.impl.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.optimize.sharding.statement.dml.ShardingSelectOptimizedStatement;
import org.apache.shardingsphere.core.parse.SQLParseEngine;
import org.apache.shardingsphere.core.route.fixture.HintShardingAlgorithmFixture;
......@@ -91,7 +91,7 @@ public final class DatabaseTest {
ColumnMetaData idColumnMetaData = new ColumnMetaData("id", "int", true);
ColumnMetaData nameColumnMetaData = new ColumnMetaData("user_id", "int", false);
TableMetas tableMetas = mock(TableMetas.class);
when(tableMetas.get("tesT")).thenReturn(new TableMetaData(Arrays.asList(idColumnMetaData, nameColumnMetaData), Arrays.asList("id", "user_id")));
when(tableMetas.get("tesT")).thenReturn(new ShardingTableMetaData(Arrays.asList(idColumnMetaData, nameColumnMetaData), Arrays.asList("id", "user_id")));
ShardingSphereMetaData result = mock(ShardingSphereMetaData.class);
when(result.getTables()).thenReturn(tableMetas);
return result;
......@@ -115,7 +115,7 @@ public final class DatabaseTest {
ColumnMetaData idColumnMetaData = new ColumnMetaData("id", "int", true);
ColumnMetaData nameColumnMetaData = new ColumnMetaData("user_id", "int", false);
TableMetas tableMetas = mock(TableMetas.class);
when(tableMetas.get("tbl_pagination")).thenReturn(new TableMetaData(Arrays.asList(idColumnMetaData, nameColumnMetaData), Arrays.asList("id", "user_id")));
when(tableMetas.get("tbl_pagination")).thenReturn(new ShardingTableMetaData(Arrays.asList(idColumnMetaData, nameColumnMetaData), Arrays.asList("id", "user_id")));
ShardingSphereMetaData result = mock(ShardingSphereMetaData.class);
when(result.getTables()).thenReturn(tableMetas);
return result;
......
......@@ -24,9 +24,10 @@ import org.apache.shardingsphere.api.config.sharding.strategy.InlineShardingStra
import org.apache.shardingsphere.core.database.DatabaseTypes;
import org.apache.shardingsphere.core.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.core.metadata.datasource.DataSourceMetas;
import org.apache.shardingsphere.core.metadata.table.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.impl.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.impl.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.parse.SQLParseEngine;
import org.apache.shardingsphere.core.route.PreparedStatementRoutingEngine;
import org.apache.shardingsphere.core.route.SQLRouteResult;
......@@ -113,9 +114,9 @@ public abstract class AbstractSQLRouteTest {
private TableMetas buildTableMetas() {
Map<String, TableMetaData> tableMetaDataMap = new HashMap<>(3, 1);
tableMetaDataMap.put("t_order", new TableMetaData(Arrays.asList(new ColumnMetaData("order_id", "int", true), new ColumnMetaData("user_id", "int", false),
tableMetaDataMap.put("t_order", new ShardingTableMetaData(Arrays.asList(new ColumnMetaData("order_id", "int", true), new ColumnMetaData("user_id", "int", false),
new ColumnMetaData("status", "int", false)), Collections.<String>emptySet()));
tableMetaDataMap.put("t_order_item", new TableMetaData(Arrays.asList(new ColumnMetaData("item_id", "int", true), new ColumnMetaData("order_id", "int", false),
tableMetaDataMap.put("t_order_item", new ShardingTableMetaData(Arrays.asList(new ColumnMetaData("item_id", "int", true), new ColumnMetaData("order_id", "int", false),
new ColumnMetaData("user_id", "int", false), new ColumnMetaData("status", "varchar", false),
new ColumnMetaData("c_date", "timestamp", false)), Collections.<String>emptySet()));
return new TableMetas(tableMetaDataMap);
......
......@@ -32,6 +32,9 @@ import org.apache.shardingsphere.core.execute.metadata.TableMetaDataInitializer;
import org.apache.shardingsphere.core.execute.sql.execute.SQLExecuteCallback;
import org.apache.shardingsphere.core.execute.sql.execute.SQLExecuteTemplate;
import org.apache.shardingsphere.core.execute.sql.prepare.SQLExecutePrepareTemplate;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement;
import org.apache.shardingsphere.core.parse.sql.segment.ddl.index.IndexSegment;
import org.apache.shardingsphere.core.parse.sql.statement.ddl.AlterTableStatement;
......@@ -196,19 +199,25 @@ public class AbstractStatementExecutor {
if (null == createIndexStatement.getIndex()) {
return;
}
runtimeContext.getMetaData().getTables().get(optimizedStatement.getTables().getSingleTableName()).getLogicIndexes().add(createIndexStatement.getIndex().getName());
TableMetaData tableMetaData = runtimeContext.getMetaData().getTables().get(optimizedStatement.getTables().getSingleTableName());
if (tableMetaData instanceof ShardingTableMetaData) {
((ShardingTableMetaData) tableMetaData).getLogicIndexes().add(createIndexStatement.getIndex().getName());
}
}
private void refreshTableMetaDataForDropIndex(final ShardingRuntimeContext runtimeContext, final OptimizedStatement optimizedStatement) {
DropIndexStatement dropIndexStatement = (DropIndexStatement) optimizedStatement.getSQLStatement();
Collection<String> indexNames = getIndexNames(dropIndexStatement);
if (!optimizedStatement.getTables().isEmpty()) {
runtimeContext.getMetaData().getTables().get(optimizedStatement.getTables().getSingleTableName()).getLogicIndexes().removeAll(indexNames);
TableMetaData tableMetaData = runtimeContext.getMetaData().getTables().get(optimizedStatement.getTables().getSingleTableName());
if (tableMetaData instanceof ShardingTableMetaData) {
((ShardingTableMetaData) tableMetaData).getLogicIndexes().removeAll(indexNames);
}
}
for (String each : indexNames) {
Optional<String> logicTableName = runtimeContext.getMetaData().getTables().getLogicTableName(each);
Optional<String> logicTableName = findLogicTableName(runtimeContext.getMetaData().getTables(), each);
if (logicTableName.isPresent()) {
runtimeContext.getMetaData().getTables().get(logicTableName.get()).getLogicIndexes().remove(each);
((ShardingTableMetaData) runtimeContext.getMetaData().getTables().get(optimizedStatement.getTables().getSingleTableName())).getLogicIndexes().remove(each);
}
}
}
......@@ -221,6 +230,15 @@ public class AbstractStatementExecutor {
return result;
}
private Optional<String> findLogicTableName(final TableMetas tableMetas, final String logicIndexName) {
for (String each : tableMetas.getAllTableNames()) {
if (tableMetas.get(each) instanceof ShardingTableMetaData && ((ShardingTableMetaData) tableMetas.get(each)).containsIndex(logicIndexName)) {
return Optional.of(each);
}
}
return Optional.absent();
}
private TableMetaDataInitializer getTableMetaDataInitializer() {
ShardingProperties shardingProperties = connection.getRuntimeContext().getProps();
return new TableMetaDataInitializer(connection.getRuntimeContext().getMetaData().getDataSources(),
......
......@@ -19,9 +19,10 @@ package org.apache.shardingsphere.shardingjdbc.jdbc.core.context;
import com.google.common.base.Optional;
import lombok.Getter;
import org.apache.shardingsphere.core.metadata.table.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.impl.ColumnMetaData;
import org.apache.shardingsphere.core.metadata.table.impl.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.rule.EncryptRule;
import org.apache.shardingsphere.spi.database.DatabaseType;
......@@ -58,7 +59,7 @@ public final class EncryptRuntimeContext extends AbstractRuntimeContext<EncryptR
try (Connection connection = dataSource.getConnection()) {
for (String each : encryptRule.getEncryptTableNames()) {
if (isTableExist(connection, each)) {
tables.put(each, new TableMetaData(getColumnMetaDataList(connection, each), getLogicIndexes(connection, each)));
tables.put(each, new ShardingTableMetaData(getColumnMetaDataList(connection, each), getLogicIndexes(connection, each)));
}
}
}
......
......@@ -23,7 +23,9 @@ import lombok.Getter;
import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
import org.apache.shardingsphere.core.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.core.metadata.datasource.DataSourceMetas;
import org.apache.shardingsphere.core.metadata.table.TableMetaData;
import org.apache.shardingsphere.core.metadata.table.TableMetas;
import org.apache.shardingsphere.core.metadata.table.sharding.ShardingTableMetaData;
import org.apache.shardingsphere.core.optimize.api.statement.OptimizedStatement;
import org.apache.shardingsphere.core.parse.sql.segment.ddl.index.IndexSegment;
import org.apache.shardingsphere.core.parse.sql.statement.ddl.AlterTableStatement;
......@@ -149,19 +151,25 @@ public final class ShardingSchema extends LogicSchema {
if (null == createIndexStatement.getIndex()) {
return;
}
getMetaData().getTables().get(optimizedStatement.getTables().getSingleTableName()).getLogicIndexes().add(createIndexStatement.getIndex().getName());
TableMetaData tableMetaData = getMetaData().getTables().get(optimizedStatement.getTables().getSingleTableName());
if (tableMetaData instanceof ShardingTableMetaData) {
((ShardingTableMetaData) tableMetaData).getLogicIndexes().add(createIndexStatement.getIndex().getName());
}
}
private void refreshTableMetaDataForDropIndex(final OptimizedStatement optimizedStatement) {
DropIndexStatement dropIndexStatement = (DropIndexStatement) optimizedStatement.getSQLStatement();
Collection<String> indexNames = getIndexNames(dropIndexStatement);
if (!optimizedStatement.getTables().isEmpty()) {
getMetaData().getTables().get(optimizedStatement.getTables().getSingleTableName()).getLogicIndexes().removeAll(indexNames);
TableMetaData tableMetaData = getMetaData().getTables().get(optimizedStatement.getTables().getSingleTableName());
if (tableMetaData instanceof ShardingTableMetaData) {
((ShardingTableMetaData) tableMetaData).getLogicIndexes().removeAll(indexNames);
}
}
for (String each : indexNames) {
Optional<String> logicTableName = getMetaData().getTables().getLogicTableName(each);
Optional<String> logicTableName = findLogicTableName(getMetaData().getTables(), each);
if (logicTableName.isPresent()) {
getMetaData().getTables().get(logicTableName.get()).getLogicIndexes().remove(each);
((ShardingTableMetaData) getMetaData().getTables().get(optimizedStatement.getTables().getSingleTableName())).getLogicIndexes().remove(each);
}
}
}
......@@ -173,4 +181,13 @@ public final class ShardingSchema extends LogicSchema {
}
return result;
}
private Optional<String> findLogicTableName(final TableMetas tableMetas, final String logicIndexName) {
for (String each : tableMetas.getAllTableNames()) {
if (tableMetas.get(each) instanceof ShardingTableMetaData && ((ShardingTableMetaData) tableMetas.get(each)).containsIndex(logicIndexName)) {
return Optional.of(each);
}
}
return Optional.absent();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册