This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 797abbd7ce0 Optimize ShardingSphereStatisticsFactory (#34426)
797abbd7ce0 is described below
commit 797abbd7ce00e38d4056de88716a977d1899d295
Author: jiangML <[email protected]>
AuthorDate: Wed Jan 22 14:05:35 2025 +0800
Optimize ShardingSphereStatisticsFactory (#34426)
---
.../builder/ShardingSphereStatisticsFactory.java | 40 +++++++++++++++++++++-
1 file changed, 39 insertions(+), 1 deletion(-)
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
index 2fb514517ca..2af23738353 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/statistics/builder/ShardingSphereStatisticsFactory.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.infra.metadata.statistics.builder;
+import com.cedarsoftware.util.CaseInsensitiveSet;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.infra.database.core.metadata.database.DialectDatabaseMetaData;
@@ -26,10 +27,13 @@ import
org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereDatabaseData;
+import
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereSchemaData;
import
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
+import
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereTableData;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import java.util.Collection;
+import java.util.Map.Entry;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -54,13 +58,14 @@ public final class ShardingSphereStatisticsFactory {
Optional<DialectStatisticsAppender> dialectStatisticsAppender =
DatabaseTypedSPILoader.findService(DialectStatisticsAppender.class,
getDatabaseType(metaData));
Collection<ShardingSphereDatabase> unloadedDatabases =
metaData.getAllDatabases().stream().filter(each ->
!loadedStatistics.containsDatabase(each.getName())).collect(Collectors.toList());
for (ShardingSphereDatabase each : unloadedDatabases) {
- ShardingSphereDatabaseData databaseData = new
ShardingSphereDefaultStatisticsBuilder().build(each);
+ ShardingSphereDatabaseData databaseData = new
ShardingSphereDatabaseData();
dialectStatisticsAppender.ifPresent(optional ->
optional.append(databaseData, each));
if (!databaseData.getSchemaData().isEmpty()) {
result.putDatabase(each.getName(), databaseData);
}
}
loadedStatistics.getDatabaseData().forEach(result::putDatabase);
+ fillDefaultShardingSphereStatistics(metaData, result);
return result;
}
@@ -70,4 +75,37 @@ public final class ShardingSphereStatisticsFactory {
// TODO can `protocolType instanceof SchemaSupportedDatabaseType ?
"PostgreSQL" : protocolType.getType()` replace to trunk database type?
return dialectDatabaseMetaData.getDefaultSchema().isPresent() ?
TypedSPILoader.getService(DatabaseType.class, "PostgreSQL") : protocolType;
}
+
+ private static void fillDefaultShardingSphereStatistics(final
ShardingSphereMetaData metaData, final ShardingSphereStatistics statistics) {
+ for (ShardingSphereDatabase database : metaData.getAllDatabases()) {
+ ShardingSphereDatabaseData defaultDatabaseData = new
ShardingSphereDefaultStatisticsBuilder().build(database);
+ Collection<String> defaultSchemaNames = new
CaseInsensitiveSet<>(defaultDatabaseData.getSchemaData().keySet());
+ if (database.getAllSchemas().stream().noneMatch(optional ->
defaultSchemaNames.contains(optional.getName()))) {
+ continue;
+ }
+ if (!statistics.containsDatabase(database.getName())) {
+ statistics.putDatabase(database.getName(),
defaultDatabaseData);
+ continue;
+ }
+ fillDefaultShardingSphereStatistics(defaultDatabaseData,
statistics.getDatabase(database.getName()));
+ }
+ }
+
+ private static void fillDefaultShardingSphereStatistics(final
ShardingSphereDatabaseData defaultDatabaseData, final
ShardingSphereDatabaseData existedDatabaseData) {
+ for (Entry<String, ShardingSphereSchemaData> entry :
defaultDatabaseData.getSchemaData().entrySet()) {
+ if (!existedDatabaseData.containsSchema(entry.getKey())) {
+ existedDatabaseData.putSchema(entry.getKey(),
entry.getValue());
+ continue;
+ }
+ fillDefaultShardingSphereStatistics(entry.getValue(),
existedDatabaseData.getSchema(entry.getKey()));
+ }
+ }
+
+ private static void fillDefaultShardingSphereStatistics(final
ShardingSphereSchemaData defaultSchemaData, final ShardingSphereSchemaData
existedSchemaData) {
+ for (Entry<String, ShardingSphereTableData> entry :
defaultSchemaData.getTableData().entrySet()) {
+ if (!existedSchemaData.containsTable(entry.getKey())) {
+ existedSchemaData.putTable(entry.getKey(), entry.getValue());
+ }
+ }
+ }
}