You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by su...@apache.org on 2023/02/07 18:11:17 UTC
[shardingsphere] branch master updated: Use SPI to introduce ColumnReviser (#24051)
This is an automated email from the ASF dual-hosted git repository.
sunnianjun 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 b8efe992af3 Use SPI to introduce ColumnReviser (#24051)
b8efe992af3 is described below
commit b8efe992af335973c1b904fa6b31cee8dfbae792
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Wed Feb 8 02:11:05 2023 +0800
Use SPI to introduce ColumnReviser (#24051)
* Use SPI to introduce ColumnReviser
* Use SPI to introduce ColumnReviser
---
.../metadata/EncryptSchemaMetaDataDecorator.java | 16 +++----
.../metadata/reviser/EncryptColumnNameReviser.java | 38 ++++++++--------
...hema.decorator.reviser.column.ColumnNameReviser | 18 ++++++++
.../metadata/ShardingSchemaMetaDataDecorator.java | 22 +++++----
.../reviser/ShardingColumnGeneratedReviser.java | 16 ++++---
...decorator.reviser.column.ColumnGeneratedReviser | 18 ++++++++
...lumnReviser.java => ColumnDataTypeReviser.java} | 22 ++++++---
.../reviser/column/ColumnGeneratedReviser.java | 28 ++++++------
.../reviser/column/ColumnNameReviser.java | 28 +++++++-----
.../reviser/column/ColumnReviseEngine.java | 52 +++++++++++++++-------
.../reviser/constraint/ConstraintReviser.java | 2 +
.../decorator/reviser/index/IndexReviser.java | 2 +
.../reviser/table/TableMetaDataReviseEngine.java | 17 ++++---
.../decorator/reviser/table/TableNameReviser.java | 2 +
.../metadata/SingleSchemaMetaDataDecorator.java | 9 ++--
15 files changed, 182 insertions(+), 108 deletions(-)
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
index 890f59b7691..163c2311640 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/EncryptSchemaMetaDataDecorator.java
@@ -18,18 +18,16 @@
package org.apache.shardingsphere.encrypt.metadata;
import org.apache.shardingsphere.encrypt.constant.EncryptOrder;
-import org.apache.shardingsphere.encrypt.metadata.reviser.EncryptColumnNameReviser;
import org.apache.shardingsphere.encrypt.rule.EncryptRule;
-import org.apache.shardingsphere.encrypt.rule.EncryptTable;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnReviser;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableMetaDataReviseEngine;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.RuleBasedSchemaMetaDataDecorator;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.SchemaMetaData;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
+import javax.sql.DataSource;
import java.util.Collection;
-import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
@@ -46,19 +44,15 @@ public final class EncryptSchemaMetaDataDecorator implements RuleBasedSchemaMeta
for (Entry<String, SchemaMetaData> entry : schemaMetaDataMap.entrySet()) {
Collection<TableMetaData> tables = new LinkedList<>();
for (TableMetaData each : entry.getValue().getTables()) {
- tables.add(decorate(each.getName(), each, rule));
+ tables.add(decorate(each.getName(), each, rule, material.getStorageTypes().get(entry.getKey()), material.getDataSourceMap().get(entry.getKey())));
}
result.put(entry.getKey(), new SchemaMetaData(entry.getKey(), tables));
}
return result;
}
- private TableMetaData decorate(final String tableName, final TableMetaData tableMetaData, final EncryptRule encryptRule) {
- return encryptRule.findEncryptTable(tableName).map(optional -> new TableMetaDataReviseEngine<>(encryptRule).revise(tableMetaData, getColumnRevisers(optional))).orElse(tableMetaData);
- }
-
- private Collection<ColumnReviser> getColumnRevisers(final EncryptTable encryptTable) {
- return Collections.singleton(new EncryptColumnNameReviser(encryptTable));
+ private TableMetaData decorate(final String tableName, final TableMetaData tableMetaData, final EncryptRule encryptRule, final DatabaseType databaseType, final DataSource dataSource) {
+ return encryptRule.findEncryptTable(tableName).map(optional -> new TableMetaDataReviseEngine<>(encryptRule, databaseType, dataSource).revise(tableMetaData)).orElse(tableMetaData);
}
@Override
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptColumnNameReviser.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptColumnNameReviser.java
index 82d6e719075..08f1f5657f0 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptColumnNameReviser.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/metadata/reviser/EncryptColumnNameReviser.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.encrypt.metadata.reviser;
+import org.apache.shardingsphere.encrypt.rule.EncryptRule;
import org.apache.shardingsphere.encrypt.rule.EncryptTable;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser;
@@ -26,34 +27,31 @@ import java.util.Optional;
/**
* Encrypt column name reviser.
*/
-public final class EncryptColumnNameReviser extends ColumnNameReviser {
-
- private final EncryptTable encryptTable;
-
- private final Collection<String> plainColumns;
-
- private final Collection<String> assistedQueryColumns;
-
- private final Collection<String> likeQueryColumns;
-
- public EncryptColumnNameReviser(final EncryptTable encryptTable) {
- this.encryptTable = encryptTable;
- plainColumns = encryptTable.getPlainColumns();
- assistedQueryColumns = encryptTable.getAssistedQueryColumns();
- likeQueryColumns = encryptTable.getLikeQueryColumns();
- }
+public final class EncryptColumnNameReviser implements ColumnNameReviser<EncryptRule> {
@Override
- protected Optional<String> getColumnName(final String originalName) {
+ public Optional<String> revise(final String originalName, final String tableName, final EncryptRule rule) {
+ Optional<EncryptTable> encryptTable = rule.findEncryptTable(tableName);
+ if (!encryptTable.isPresent()) {
+ return Optional.of(originalName);
+ }
+ Collection<String> plainColumns = encryptTable.get().getPlainColumns();
+ Collection<String> assistedQueryColumns = encryptTable.get().getAssistedQueryColumns();
+ Collection<String> likeQueryColumns = encryptTable.get().getLikeQueryColumns();
if (plainColumns.contains(originalName)) {
- return Optional.of(encryptTable.getLogicColumnByPlainColumn(originalName));
+ return Optional.of(encryptTable.get().getLogicColumnByPlainColumn(originalName));
}
- if (encryptTable.isCipherColumn(originalName)) {
- return Optional.of(encryptTable.getLogicColumnByCipherColumn(originalName));
+ if (encryptTable.get().isCipherColumn(originalName)) {
+ return Optional.of(encryptTable.get().getLogicColumnByCipherColumn(originalName));
}
if (!assistedQueryColumns.contains(originalName) && !likeQueryColumns.contains(originalName)) {
return Optional.of(originalName);
}
return Optional.empty();
}
+
+ @Override
+ public String getType() {
+ return EncryptRule.class.getSimpleName();
+ }
}
diff --git a/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser b/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser
new file mode 100644
index 00000000000..3c6af3f2ad5
--- /dev/null
+++ b/features/encrypt/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnNameReviser
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.encrypt.metadata.reviser.EncryptColumnNameReviser
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java
index d19f781aaa6..9853b2e1099 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/ShardingSchemaMetaDataDecorator.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.sharding.metadata;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableMetaDataReviseEngine;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.RuleBasedSchemaMetaDataDecorator;
@@ -26,12 +27,10 @@ import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.Tab
import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.sharding.constant.ShardingOrder;
import org.apache.shardingsphere.sharding.exception.metadata.InconsistentShardingTableMetaDataException;
-import org.apache.shardingsphere.sharding.metadata.reviser.ShardingColumnGeneratedReviser;
import org.apache.shardingsphere.sharding.rule.ShardingRule;
-import org.apache.shardingsphere.sharding.rule.TableRule;
+import javax.sql.DataSource;
import java.util.Collection;
-import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
@@ -49,7 +48,8 @@ public final class ShardingSchemaMetaDataDecorator implements RuleBasedSchemaMet
boolean checkTableMetaDataEnabled = material.getProps().getValue(ConfigurationPropertyKey.CHECK_TABLE_META_DATA_ENABLED);
for (Entry<String, SchemaMetaData> entry : schemaMetaDataMap.entrySet()) {
Collection<TableMetaData> tables = new LinkedList<>();
- for (Entry<String, Collection<TableMetaData>> tableEntry : getLogicTableMetaDataMap(entry.getValue(), rule).entrySet()) {
+ for (Entry<String, Collection<TableMetaData>> tableEntry : getLogicTableMetaDataMap(entry.getValue(), rule,
+ material.getStorageTypes().get(entry.getKey()), material.getDataSourceMap().get(entry.getKey())).entrySet()) {
if (checkTableMetaDataEnabled) {
checkUniformed(tableEntry.getKey(), tableEntry.getValue());
}
@@ -60,19 +60,17 @@ public final class ShardingSchemaMetaDataDecorator implements RuleBasedSchemaMet
return result;
}
- private TableMetaData decorate(final TableMetaData tableMetaData, final ShardingRule rule) {
- return rule.findTableRuleByActualTable(tableMetaData.getName()).map(optional -> createTableMetaData(rule, optional, tableMetaData)).orElse(tableMetaData);
+ private TableMetaData decorate(final TableMetaData tableMetaData, final ShardingRule rule, final DatabaseType databaseType, final DataSource dataSource) {
+ return rule.findTableRuleByActualTable(tableMetaData.getName())
+ .map(optional -> new TableMetaDataReviseEngine<>(rule, databaseType, dataSource).revise(tableMetaData)).orElse(tableMetaData);
}
- private TableMetaData createTableMetaData(final ShardingRule rule, final TableRule tableRule, final TableMetaData tableMetaData) {
- return new TableMetaDataReviseEngine<>(rule).revise(tableMetaData, Collections.singleton(new ShardingColumnGeneratedReviser(tableRule)));
- }
-
- private Map<String, Collection<TableMetaData>> getLogicTableMetaDataMap(final SchemaMetaData schemaMetaData, final ShardingRule rule) {
+ private Map<String, Collection<TableMetaData>> getLogicTableMetaDataMap(final SchemaMetaData schemaMetaData, final ShardingRule rule,
+ final DatabaseType databaseType, final DataSource dataSource) {
Map<String, Collection<TableMetaData>> result = new LinkedHashMap<>();
for (TableMetaData each : schemaMetaData.getTables()) {
String logicTableName = rule.findLogicTableByActualTable(each.getName()).orElse(each.getName());
- result.computeIfAbsent(logicTableName, key -> new LinkedList<>()).add(decorate(each, rule));
+ result.computeIfAbsent(logicTableName, key -> new LinkedList<>()).add(decorate(each, rule, databaseType, dataSource));
}
return result;
}
diff --git a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingColumnGeneratedReviser.java b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingColumnGeneratedReviser.java
index 9528bf1aaf3..a3b50f0f6e5 100644
--- a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingColumnGeneratedReviser.java
+++ b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/metadata/reviser/ShardingColumnGeneratedReviser.java
@@ -17,21 +17,23 @@
package org.apache.shardingsphere.sharding.metadata.reviser;
-import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
-import org.apache.shardingsphere.sharding.rule.TableRule;
+import org.apache.shardingsphere.sharding.rule.ShardingRule;
/**
* Sharding column generated reviser.
*/
-@RequiredArgsConstructor
-public final class ShardingColumnGeneratedReviser extends ColumnGeneratedReviser {
+public final class ShardingColumnGeneratedReviser implements ColumnGeneratedReviser<ShardingRule> {
- private final TableRule tableRule;
+ @Override
+ public boolean revise(final ColumnMetaData originalMetaData, final ShardingRule rule) {
+ return rule.findTableRuleByActualTable(originalMetaData.getName())
+ .map(optional -> originalMetaData.getName().equalsIgnoreCase(optional.getGenerateKeyColumn().orElse(null))).orElseGet(originalMetaData::isGenerated);
+ }
@Override
- protected boolean isGenerated(final ColumnMetaData originalMetaData) {
- return originalMetaData.getName().equalsIgnoreCase(tableRule.getGenerateKeyColumn().orElse(null));
+ public String getType() {
+ return ShardingRule.class.getSimpleName();
}
}
diff --git a/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser
new file mode 100644
index 00000000000..8d31e51bc1a
--- /dev/null
+++ b/features/sharding/core/src/main/resources/META-INF/services/org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnGeneratedReviser
@@ -0,0 +1,18 @@
+#
+# 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.
+#
+
+org.apache.shardingsphere.sharding.metadata.reviser.ShardingColumnGeneratedReviser
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnDataTypeReviser.java
similarity index 58%
rename from infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviser.java
rename to infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnDataTypeReviser.java
index fdde8b4a240..70060c2e0b3 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnDataTypeReviser.java
@@ -17,20 +17,28 @@
package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column;
-import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
+import javax.sql.DataSource;
import java.util.Optional;
/**
- * Column reviser.
+ * Column data type reviser.
+ *
+ * @param <T> type of rule
*/
-public interface ColumnReviser {
+public interface ColumnDataTypeReviser<T extends ShardingSphereRule> extends TypedSPI {
/**
- * Revise column meta data.
+ * Revise column data type.
*
- * @param originalMetaData original column meta data
- * @return revised column meta data
+ * @param originalName original name
+ * @param rule rule
+ * @param databaseType database type
+ * @param dataSource data source
+ * @return revised data type
*/
- Optional<ColumnMetaData> revise(ColumnMetaData originalMetaData);
+ Optional<Integer> revise(String originalName, T rule, DatabaseType databaseType, DataSource dataSource);
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnGeneratedReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnGeneratedReviser.java
index c2f09c1e588..3e013b7cf02 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnGeneratedReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnGeneratedReviser.java
@@ -18,22 +18,24 @@
package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
-
-import java.util.Optional;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
/**
* Column generated reviser.
+ *
+ * @param <T> type of rule
*/
-public abstract class ColumnGeneratedReviser implements ColumnReviser {
-
- @Override
- public final Optional<ColumnMetaData> revise(final ColumnMetaData originalMetaData) {
- return Optional.of(createColumnMetaData(isGenerated(originalMetaData), originalMetaData));
- }
-
- private ColumnMetaData createColumnMetaData(final boolean isGenerated, final ColumnMetaData metaData) {
- return new ColumnMetaData(metaData.getName(), metaData.getDataType(), metaData.isPrimaryKey(), isGenerated, metaData.isCaseSensitive(), metaData.isVisible(), metaData.isUnsigned());
- }
+@SingletonSPI
+public interface ColumnGeneratedReviser<T extends ShardingSphereRule> extends TypedSPI {
- protected abstract boolean isGenerated(ColumnMetaData originalMetaData);
+ /**
+ * Revise generated column.
+ *
+ * @param originalMetaData original column meta data
+ * @param rule rule
+ * @return revised generated column
+ */
+ boolean revise(ColumnMetaData originalMetaData, T rule);
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnNameReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnNameReviser.java
index 8119a930c4c..1108e4ceddc 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnNameReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnNameReviser.java
@@ -17,23 +17,27 @@
package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column;
-import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
import java.util.Optional;
/**
* Column name reviser.
+ *
+ * @param <T> type of rule
*/
-public abstract class ColumnNameReviser implements ColumnReviser {
+@SingletonSPI
+public interface ColumnNameReviser<T extends ShardingSphereRule> extends TypedSPI {
- @Override
- public final Optional<ColumnMetaData> revise(final ColumnMetaData originalMetaData) {
- return getColumnName(originalMetaData.getName()).map(optional -> createColumnMetaData(optional, originalMetaData));
- }
-
- private ColumnMetaData createColumnMetaData(final String name, final ColumnMetaData metaData) {
- return new ColumnMetaData(name, metaData.getDataType(), metaData.isPrimaryKey(), metaData.isGenerated(), metaData.isCaseSensitive(), metaData.isVisible(), metaData.isUnsigned());
- }
-
- protected abstract Optional<String> getColumnName(String originalName);
+ /**
+ * Revise column name.
+ *
+ * @param originalName original name
+ * @param tableName table name
+ * @param rule rule
+ * @return revised column name
+ */
+ Optional<String> revise(String originalName, String tableName, T rule);
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviseEngine.java
index 0f4b7ccbbca..096a736ea0e 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviseEngine.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/column/ColumnReviseEngine.java
@@ -17,38 +17,60 @@
package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ColumnMetaData;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
+import javax.sql.DataSource;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Optional;
-import java.util.stream.Collectors;
/**
* Column revise engine.
+ *
+ * @param <T> type of rule
*/
-public final class ColumnReviseEngine {
+@RequiredArgsConstructor
+public final class ColumnReviseEngine<T extends ShardingSphereRule> {
+
+ private final T rule;
+
+ private final DatabaseType databaseType;
+
+ private final DataSource dataSource;
/**
* Revise column meta data.
*
+ * @param tableName table name
* @param originalMetaDataList original column meta data list
- * @param revisers column revisers
* @return revised column meta data
*/
- public Collection<ColumnMetaData> revise(final Collection<ColumnMetaData> originalMetaDataList, final Collection<ColumnReviser> revisers) {
- return originalMetaDataList.stream().map(each -> revise(each, revisers)).filter(Optional::isPresent).map(Optional::get).collect(Collectors.toCollection(LinkedHashSet::new));
- }
-
- private Optional<ColumnMetaData> revise(final ColumnMetaData originalMetaData, final Collection<ColumnReviser> revisers) {
- ColumnMetaData result = originalMetaData;
- for (ColumnReviser each : revisers) {
- Optional<ColumnMetaData> revisedMetaData = each.revise(result);
- if (!revisedMetaData.isPresent()) {
- return Optional.empty();
+ public Collection<ColumnMetaData> revise(final String tableName, final Collection<ColumnMetaData> originalMetaDataList) {
+ String type = rule.getClass().getSimpleName();
+ @SuppressWarnings("rawtypes")
+ Optional<ColumnNameReviser> nameReviser = TypedSPILoader.findService(ColumnNameReviser.class, type);
+ @SuppressWarnings("rawtypes")
+ Optional<ColumnDataTypeReviser> dataTypeReviser = TypedSPILoader.findService(ColumnDataTypeReviser.class, type);
+ @SuppressWarnings("rawtypes")
+ Optional<ColumnGeneratedReviser> generatedReviser = TypedSPILoader.findService(ColumnGeneratedReviser.class, type);
+ Collection<ColumnMetaData> result = new LinkedHashSet<>();
+ for (ColumnMetaData each : originalMetaDataList) {
+ @SuppressWarnings("unchecked")
+ Optional<String> name = nameReviser.isPresent() ? nameReviser.get().revise(each.getName(), tableName, rule) : Optional.of(each.getName());
+ if (!name.isPresent()) {
+ continue;
}
- result = revisedMetaData.get();
+ @SuppressWarnings("unchecked")
+ Optional<Integer> dataType = dataTypeReviser.isPresent() ? dataTypeReviser.get().revise(each.getName(), rule, databaseType, dataSource) : Optional.empty();
+ @SuppressWarnings("unchecked")
+ Optional<Boolean> generated = generatedReviser.map(optional -> optional.revise(each, rule));
+ result.add(new ColumnMetaData(name.get(),
+ dataType.orElseGet(each::getDataType), each.isPrimaryKey(), generated.orElse(each.isGenerated()), each.isCaseSensitive(), each.isVisible(), each.isUnsigned()));
}
- return Optional.of(result);
+ return result;
}
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviser.java
index d47ff180ddb..0e2ab344360 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/constraint/ConstraintReviser.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.infra.metadata.database.schema.decorator.revis
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.ConstraintMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
import java.util.Optional;
@@ -28,6 +29,7 @@ import java.util.Optional;
*
* @param <T> type of rule
*/
+@SingletonSPI
public interface ConstraintReviser<T extends ShardingSphereRule> extends TypedSPI {
/**
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviser.java
index 4868e3675f6..2852dcadfc6 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/index/IndexReviser.java
@@ -19,6 +19,7 @@ package org.apache.shardingsphere.infra.metadata.database.schema.decorator.revis
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.IndexMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
import java.util.Optional;
@@ -28,6 +29,7 @@ import java.util.Optional;
*
* @param <T> type of rule
*/
+@SingletonSPI
public interface IndexReviser<T extends ShardingSphereRule> extends TypedSPI {
/**
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java
index b9cf1c002e2..7f368da195f 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableMetaDataReviseEngine.java
@@ -18,15 +18,15 @@
package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table;
import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnReviseEngine;
-import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.column.ColumnReviser;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.constraint.ConstraintReviseEngine;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.index.IndexReviseEngine;
import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.TableMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
-import java.util.Collection;
+import javax.sql.DataSource;
/**
* Table meta data revise engine.
@@ -38,19 +38,22 @@ public final class TableMetaDataReviseEngine<T extends ShardingSphereRule> {
private final T rule;
+ private final DatabaseType databaseType;
+
+ private final DataSource dataSource;
+
/**
* Revise table meta data.
*
* @param originalMetaData original table meta data
- * @param columnRevisers column revisers
* @return revised table meta data
*/
@SuppressWarnings("unchecked")
- public TableMetaData revise(final TableMetaData originalMetaData, final Collection<ColumnReviser> columnRevisers) {
+ public TableMetaData revise(final TableMetaData originalMetaData) {
String revisedTableName = TypedSPILoader.findService(TableNameReviser.class, rule.getClass().getSimpleName())
.map(optional -> optional.revise(originalMetaData.getName(), rule)).orElse(originalMetaData.getName());
- return new TableMetaData(revisedTableName, new ColumnReviseEngine().revise(originalMetaData.getColumns(), columnRevisers),
- new IndexReviseEngine<T>().revise(revisedTableName, originalMetaData.getIndexes(), rule),
- new ConstraintReviseEngine<T>().revise(revisedTableName, originalMetaData.getConstrains(), rule));
+ return new TableMetaData(revisedTableName, new ColumnReviseEngine<>(rule, databaseType, dataSource).revise(originalMetaData.getName(), originalMetaData.getColumns()),
+ new IndexReviseEngine<>().revise(revisedTableName, originalMetaData.getIndexes(), rule),
+ new ConstraintReviseEngine<>().revise(revisedTableName, originalMetaData.getConstrains(), rule));
}
}
diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableNameReviser.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableNameReviser.java
index 618075ab8b0..267c88d41d5 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableNameReviser.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/decorator/reviser/table/TableNameReviser.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
/**
@@ -25,6 +26,7 @@ import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPI;
*
* @param <T> type of rule
*/
+@SingletonSPI
public interface TableNameReviser<T extends ShardingSphereRule> extends TypedSPI {
/**
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/SingleSchemaMetaDataDecorator.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/SingleSchemaMetaDataDecorator.java
index 30851d09b35..b4363a1c837 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/SingleSchemaMetaDataDecorator.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/SingleSchemaMetaDataDecorator.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.single.metadata;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.reviser.table.TableMetaDataReviseEngine;
import org.apache.shardingsphere.infra.metadata.database.schema.decorator.spi.RuleBasedSchemaMetaDataDecorator;
@@ -25,8 +26,8 @@ import org.apache.shardingsphere.infra.metadata.database.schema.loader.model.Tab
import org.apache.shardingsphere.single.constant.SingleOrder;
import org.apache.shardingsphere.single.rule.SingleRule;
+import javax.sql.DataSource;
import java.util.Collection;
-import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
@@ -43,15 +44,15 @@ public final class SingleSchemaMetaDataDecorator implements RuleBasedSchemaMetaD
for (Entry<String, SchemaMetaData> entry : schemaMetaDataMap.entrySet()) {
Collection<TableMetaData> tables = new LinkedList<>();
for (TableMetaData each : entry.getValue().getTables()) {
- tables.add(decorate(rule, each));
+ tables.add(decorate(rule, each, material.getStorageTypes().get(entry.getKey()), material.getDataSourceMap().get(entry.getKey())));
}
result.put(entry.getKey(), new SchemaMetaData(entry.getKey(), tables));
}
return result;
}
- private TableMetaData decorate(final SingleRule rule, final TableMetaData tableMetaData) {
- return new TableMetaDataReviseEngine<>(rule).revise(tableMetaData, Collections.emptyList());
+ private TableMetaData decorate(final SingleRule rule, final TableMetaData tableMetaData, final DatabaseType databaseType, final DataSource dataSource) {
+ return new TableMetaDataReviseEngine<>(rule, databaseType, dataSource).revise(tableMetaData);
}
@Override