You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2025/01/22 06:05:41 UTC

(shardingsphere) branch master updated: Optimize ShardingSphereStatisticsFactory (#34426)

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 <10...@qq.com>
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());
+            }
+        }
+    }
 }