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());
+            }
+        }
+    }
 }

Reply via email to