This is an automated email from the ASF dual-hosted git repository.
wuweijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 56fe429 Create FederateRefresher (#10675)
56fe429 is described below
commit 56fe429fa9f03e46d3285b1a78ae027069d55381
Author: Juan Pan(Trista) <[email protected]>
AuthorDate: Sun Jun 6 19:04:52 2021 +0800
Create FederateRefresher (#10675)
---
.../schema/builder/TableMetaDataBuilder.java | 10 ++-
.../sql/federate/schema/FederateLogicSchema.java | 4 +-
.../schema/table/AbstractFederateTable.java | 2 +-
.../schema/table/FederateFilterableTable.java | 2 +-
.../optimize/context/OptimizeContextFactory.java | 2 +-
.../FederateSchemaMetadata.java | 29 ++++++++-
.../FederateSchemaMetadatas.java | 2 +-
.../FederateTableMetadata.java | 12 +++-
.../core/metadata/refresher/FederateRefresher.java | 45 +++++++++++++
.../CreateTableStatementFederateRefresher.java | 76 ++++++++++++++++++++++
10 files changed, 173 insertions(+), 11 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilder.java
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilder.java
index 4720b41..b3062fb 100644
---
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilder.java
+++
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/schema/builder/TableMetaDataBuilder.java
@@ -55,8 +55,16 @@ public final class TableMetaDataBuilder {
return tableMetaData.map(optional -> decorate(tableName, optional,
materials.getRules()));
}
+ /**
+ * Load physical table metadata.
+ *
+ * @param tableName table name
+ * @param materials schema builder materials
+ * @return table meta data
+ * @throws SQLException SQL exception
+ */
@SuppressWarnings({"unchecked", "rawtypes"})
- private static Optional<TableMetaData> load(final String tableName, final
SchemaBuilderMaterials materials) throws SQLException {
+ public static Optional<TableMetaData> load(final String tableName, final
SchemaBuilderMaterials materials) throws SQLException {
DataNodes dataNodes = new DataNodes(materials.getRules());
for (Entry<ShardingSphereRule, RuleBasedTableMetaDataBuilder> entry :
OrderedSPIRegistry.getRegisteredServices(materials.getRules(),
RuleBasedTableMetaDataBuilder.class).entrySet()) {
if (entry.getKey() instanceof TableContainedRule) {
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/FederateLogicSchema.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/FederateLogicSchema.java
index 3a7b6c9..d70f54d 100644
---
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/FederateLogicSchema.java
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/FederateLogicSchema.java
@@ -23,8 +23,8 @@ import org.apache.calcite.schema.impl.AbstractSchema;
import org.apache.commons.collections4.map.LinkedMap;
import
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.FederateRowExecutor;
import
org.apache.shardingsphere.infra.executor.sql.federate.schema.table.FederateFilterableTable;
-import
org.apache.shardingsphere.infra.optimize.core.schema.FederateSchemaMetadata;
-import
org.apache.shardingsphere.infra.optimize.core.schema.FederateTableMetadata;
+import
org.apache.shardingsphere.infra.optimize.core.metadata.FederateSchemaMetadata;
+import
org.apache.shardingsphere.infra.optimize.core.metadata.FederateTableMetadata;
import java.util.Map;
import java.util.Map.Entry;
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederateTable.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederateTable.java
index e55f9a8..c72a16f 100644
---
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederateTable.java
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/AbstractFederateTable.java
@@ -24,7 +24,7 @@ import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
import org.apache.calcite.schema.impl.AbstractTable;
import
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.FederateRowExecutor;
-import
org.apache.shardingsphere.infra.optimize.core.schema.FederateTableMetadata;
+import
org.apache.shardingsphere.infra.optimize.core.metadata.FederateTableMetadata;
/**
* Abstract Federate table.
diff --git
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederateFilterableTable.java
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederateFilterableTable.java
index 4afb97f..4ef40e6 100644
---
a/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederateFilterableTable.java
+++
b/shardingsphere-infra/shardingsphere-infra-executor/src/main/java/org/apache/shardingsphere/infra/executor/sql/federate/schema/table/FederateFilterableTable.java
@@ -25,7 +25,7 @@ import org.apache.calcite.rex.RexNode;
import org.apache.calcite.schema.ProjectableFilterableTable;
import
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.FederateRowEnumerator;
import
org.apache.shardingsphere.infra.executor.sql.federate.schema.row.FederateRowExecutor;
-import
org.apache.shardingsphere.infra.optimize.core.schema.FederateTableMetadata;
+import
org.apache.shardingsphere.infra.optimize.core.metadata.FederateTableMetadata;
import java.util.List;
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
index 9137c51..90c5946 100644
---
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/context/OptimizeContextFactory.java
@@ -52,7 +52,7 @@ import
org.apache.shardingsphere.infra.database.type.dialect.SQLServerDatabaseTy
import org.apache.shardingsphere.infra.exception.ShardingSphereException;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.optimize.core.plan.PlannerInitializer;
-import
org.apache.shardingsphere.infra.optimize.core.schema.FederateSchemaMetadatas;
+import
org.apache.shardingsphere.infra.optimize.core.metadata.FederateSchemaMetadatas;
import java.util.Collections;
import java.util.Map;
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/schema/FederateSchemaMetadata.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateSchemaMetadata.java
similarity index 80%
rename from
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/schema/FederateSchemaMetadata.java
rename to
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateSchemaMetadata.java
index 7ab5103..987286e 100644
---
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/schema/FederateSchemaMetadata.java
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateSchemaMetadata.java
@@ -15,12 +15,13 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.optimize.core.schema;
+package org.apache.shardingsphere.infra.optimize.core.metadata;
import lombok.Getter;
-import org.apache.commons.collections4.map.LinkedMap;
+import lombok.Synchronized;
import org.apache.shardingsphere.infra.datanode.DataNode;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.type.DataNodeContainedRule;
import org.apache.shardingsphere.infra.rule.type.DataSourceContainedRule;
@@ -42,13 +43,25 @@ public final class FederateSchemaMetadata {
private final String name;
- private final Map<String, FederateTableMetadata> tables = new
LinkedMap<>();
+ private final Map<String, FederateTableMetadata> tables = new
LinkedHashMap<>();
+ /**
+ * Please fix me.
+ * @deprecated Remove this constructor.
+ */
+ @Deprecated
public FederateSchemaMetadata(final String name, final
ShardingSphereMetaData metaData) throws SQLException {
this.name = name;
initTables(metaData);
}
+ public FederateSchemaMetadata(final String name, final Map<String,
TableMetaData> metaData) {
+ this.name = name;
+ for (Entry<String, TableMetaData> entry : metaData.entrySet()) {
+ tables.put(entry.getKey(), new
FederateTableMetadata(entry.getKey(), entry.getValue()));
+ }
+ }
+
private void initTables(final ShardingSphereMetaData metaData) throws
SQLException {
Collection<DataNodeContainedRule> dataNodeRules =
getDataNodeContainedRules(metaData);
Map<String, Collection<DataNode>> tableDataNodes =
getTableDataNodes(dataNodeRules);
@@ -86,4 +99,14 @@ public final class FederateSchemaMetadata {
}
return result;
}
+
+ /**
+ * Renew.
+ * @param tableName table name
+ * @param metaData meta data
+ */
+ @Synchronized
+ public void renew(final String tableName, final TableMetaData metaData) {
+ tables.put(tableName, new FederateTableMetadata(tableName, metaData));
+ }
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/schema/FederateSchemaMetadatas.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateSchemaMetadatas.java
similarity index 96%
rename from
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/schema/FederateSchemaMetadatas.java
rename to
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateSchemaMetadatas.java
index 0ce623e..10dc6e5 100644
---
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/schema/FederateSchemaMetadatas.java
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateSchemaMetadatas.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.optimize.core.schema;
+package org.apache.shardingsphere.infra.optimize.core.metadata;
import lombok.Getter;
import org.apache.commons.collections4.map.LinkedMap;
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/schema/FederateTableMetadata.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateTableMetadata.java
similarity index 92%
rename from
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/schema/FederateTableMetadata.java
rename to
shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateTableMetadata.java
index 111082e..4452ac6 100644
---
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/schema/FederateTableMetadata.java
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/FederateTableMetadata.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.optimize.core.schema;
+package org.apache.shardingsphere.infra.optimize.core.metadata;
import lombok.Getter;
import org.apache.calcite.rel.type.RelDataTypeFactory;
@@ -46,6 +46,16 @@ public final class FederateTableMetadata {
private final RelProtoDataType relProtoDataType;
+ public FederateTableMetadata(final String name, final TableMetaData
tableMetaData) {
+ this.name = name;
+ relProtoDataType = createRelDataType(tableMetaData);
+ }
+
+ /**
+ * Please fix me.
+ * @deprecated Remove this constructor.
+ */
+ @Deprecated
public FederateTableMetadata(final String name, final Map<String,
DataSource> dataSources, final Map<String, Collection<String>> dataSourceRules,
final Collection<DataNode> tableDataNodes,
final DatabaseType databaseType) throws SQLException {
this.name = name;
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/FederateRefresher.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/FederateRefresher.java
new file mode 100644
index 0000000..e580ade
--- /dev/null
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/FederateRefresher.java
@@ -0,0 +1,45 @@
+/*
+ * 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.infra.optimize.core.metadata.refresher;
+
+import org.apache.shardingsphere.infra.metadata.engine.MetadataRefresher;
+import
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
+import
org.apache.shardingsphere.infra.optimize.core.metadata.FederateSchemaMetadata;
+import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
+
+import java.sql.SQLException;
+import java.util.Collection;
+
+/**
+ * ShardingSphere federate refresher.
+ *
+ * @param <T> type of SQL statement
+ */
+public interface FederateRefresher<T extends SQLStatement> extends
MetadataRefresher {
+
+ /**
+ * Refresh federate schema.
+ *
+ * @param schema Federate schema to be refreshed
+ * @param routeDataSourceNames route dataSource names
+ * @param sqlStatement SQL statement
+ * @param materials schema builder materials
+ * @throws SQLException SQL exception
+ */
+ void refresh(FederateSchemaMetadata schema, Collection<String>
routeDataSourceNames, T sqlStatement, SchemaBuilderMaterials materials) throws
SQLException;
+}
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java
new file mode 100644
index 0000000..3e10dc6
--- /dev/null
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/core/metadata/refresher/type/CreateTableStatementFederateRefresher.java
@@ -0,0 +1,76 @@
+/*
+ * 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.infra.optimize.core.metadata.refresher.type;
+
+import
org.apache.shardingsphere.infra.metadata.schema.builder.SchemaBuilderMaterials;
+import
org.apache.shardingsphere.infra.metadata.schema.builder.TableMetaDataBuilder;
+import
org.apache.shardingsphere.infra.metadata.schema.builder.loader.TableMetaDataLoader;
+import org.apache.shardingsphere.infra.metadata.schema.model.TableMetaData;
+import
org.apache.shardingsphere.infra.optimize.core.metadata.FederateSchemaMetadata;
+import
org.apache.shardingsphere.infra.optimize.core.metadata.refresher.FederateRefresher;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.rule.type.TableContainedRule;
+import
org.apache.shardingsphere.sql.parser.sql.common.statement.ddl.CreateTableStatement;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * ShardingSphere federate refresher for create table statement.
+ */
+public final class CreateTableStatementFederateRefresher implements
FederateRefresher<CreateTableStatement> {
+
+ @Override
+ public void refresh(final FederateSchemaMetadata schema, final
Collection<String> routeDataSourceNames,
+ final CreateTableStatement sqlStatement, final
SchemaBuilderMaterials materials) throws SQLException {
+ String tableName =
sqlStatement.getTable().getTableName().getIdentifier().getValue();
+ TableMetaData tableMetaData;
+ if (containsInTableContainedRule(tableName, materials)) {
+ tableMetaData = TableMetaDataBuilder.load(tableName,
materials).orElse(new TableMetaData());
+ } else {
+ tableMetaData = loadTableMetaData(tableName, routeDataSourceNames,
materials);
+ }
+ schema.renew(tableName, tableMetaData);
+ }
+
+ private boolean containsInTableContainedRule(final String tableName, final
SchemaBuilderMaterials materials) {
+ for (ShardingSphereRule each : materials.getRules()) {
+ if (each instanceof TableContainedRule && ((TableContainedRule)
each).getTables().contains(tableName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private TableMetaData loadTableMetaData(final String tableName, final
Collection<String> routeDataSourceNames,
+ final SchemaBuilderMaterials
materials) throws SQLException {
+ for (String routeDataSourceName : routeDataSourceNames) {
+ DataSource dataSource =
materials.getDataSourceMap().get(routeDataSourceName);
+ Optional<TableMetaData> tableMetaDataOptional =
Objects.isNull(dataSource) ? Optional.empty()
+ : TableMetaDataLoader.load(dataSource, tableName,
materials.getDatabaseType());
+ if (!tableMetaDataOptional.isPresent()) {
+ continue;
+ }
+ return tableMetaDataOptional.get();
+ }
+ return new TableMetaData();
+ }
+}