This is an automated email from the ASF dual-hosted git repository.

zhaojinchao 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 1d5bd6c6331 Support postgres/openGauss \d (#22053)
1d5bd6c6331 is described below

commit 1d5bd6c633144e6e6113e6d8e97fa972d341be95
Author: Chuxin Chen <[email protected]>
AuthorDate: Thu Nov 10 14:55:18 2022 +0800

    Support postgres/openGauss \d (#22053)
---
 .../PostgreSQLShardingSphereDataBuilder.java       | 41 +++++++++---
 .../PostgreSQLShardingSphereDataBuilderTest.java   | 78 ++++++++++++++++++++++
 2 files changed, 110 insertions(+), 9 deletions(-)

diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/builder/dialect/PostgreSQLShardingSphereDataBuilder.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/builder/dialect/PostgreSQLShardingSphereDataBuilder.java
index f680c1d8d27..40aa766d4bf 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/builder/dialect/PostgreSQLShardingSphereDataBuilder.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/data/builder/dialect/PostgreSQLShardingSphereDataBuilder.java
@@ -26,10 +26,15 @@ import 
org.apache.shardingsphere.infra.metadata.data.ShardingSphereTableData;
 import 
org.apache.shardingsphere.infra.metadata.data.builder.ShardingSphereDataBuilder;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Optional;
 
 /**
  * Postgre SQL ShardingSphere data Builder.
@@ -37,7 +42,12 @@ import java.util.Optional;
 
 public final class PostgreSQLShardingSphereDataBuilder implements 
ShardingSphereDataBuilder {
     
-    private static final String SHARDING_SPHERE = "shardingsphere";
+    private static final Map<String, Collection<String>> 
COLLECTED_SCHEMA_TABLES = new LinkedHashMap<>();
+    
+    static {
+        COLLECTED_SCHEMA_TABLES.put("shardingsphere", 
Collections.singletonList("sharding_table_statistics"));
+        COLLECTED_SCHEMA_TABLES.put("pg_catalog", Arrays.asList("pg_class", 
"pg_namespace"));
+    }
     
     @Override
     public ShardingSphereData build(final ShardingSphereMetaData metaData) {
@@ -47,18 +57,31 @@ public final class PostgreSQLShardingSphereDataBuilder 
implements ShardingSphere
                 continue;
             }
             ShardingSphereDatabaseData databaseData = new 
ShardingSphereDatabaseData();
-            Optional<ShardingSphereSchema> shardingSphereSchema = 
Optional.ofNullable(entry.getValue()).map(database -> 
database.getSchema(SHARDING_SPHERE));
-            if (shardingSphereSchema.isPresent()) {
-                ShardingSphereSchemaData schemaData = new 
ShardingSphereSchemaData();
-                shardingSphereSchema.get().getTables().forEach((key, value) -> 
schemaData.getTableData().put(key, new ShardingSphereTableData(value.getName(),
-                        new ArrayList<>(value.getColumns().values()))));
-                databaseData.getSchemaData().put(SHARDING_SPHERE, schemaData);
-            }
+            appendSchemaData(entry.getValue(), databaseData);
             result.getDatabaseData().put(entry.getKey(), databaseData);
         }
         return result;
     }
     
+    private void appendSchemaData(final ShardingSphereDatabase 
shardingSphereDatabase, final ShardingSphereDatabaseData databaseData) {
+        for (Entry<String, ShardingSphereSchema> entry : 
shardingSphereDatabase.getSchemas().entrySet()) {
+            if (COLLECTED_SCHEMA_TABLES.containsKey(entry.getKey())) {
+                ShardingSphereSchemaData schemaData = new 
ShardingSphereSchemaData();
+                appendTableData(entry, schemaData);
+                databaseData.getSchemaData().put(entry.getKey(), schemaData);
+            }
+        }
+    }
+    
+    private void appendTableData(final Entry<String, ShardingSphereSchema> 
schemaEntry, final ShardingSphereSchemaData schemaData) {
+        for (Entry<String, ShardingSphereTable> entry : 
schemaEntry.getValue().getTables().entrySet()) {
+            if 
(COLLECTED_SCHEMA_TABLES.get(schemaEntry.getKey()).contains(entry.getKey())) {
+                schemaData.getTableData().put(entry.getKey(), new 
ShardingSphereTableData(entry.getValue().getName(),
+                        new 
ArrayList<>(entry.getValue().getColumns().values())));
+            }
+        }
+    }
+    
     @Override
     public String getType() {
         return "PostgreSQL";
diff --git 
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/data/builder/PostgreSQLShardingSphereDataBuilderTest.java
 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/data/builder/PostgreSQLShardingSphereDataBuilderTest.java
new file mode 100644
index 00000000000..71dedfbe23d
--- /dev/null
+++ 
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/data/builder/PostgreSQLShardingSphereDataBuilderTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.metadata.data.builder;
+
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import org.apache.shardingsphere.infra.metadata.data.ShardingSphereData;
+import 
org.apache.shardingsphere.infra.metadata.data.builder.dialect.PostgreSQLShardingSphereDataBuilder;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
+import org.junit.Test;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public final class PostgreSQLShardingSphereDataBuilderTest {
+    
+    @Test
+    public void assertBuild() {
+        ShardingSphereMetaData metaData = mockMetaData();
+        ShardingSphereData shardingSphereData = new 
PostgreSQLShardingSphereDataBuilder().build(metaData);
+        
assertTrue(shardingSphereData.getDatabaseData().containsKey("logic_db"));
+        
assertTrue(shardingSphereData.getDatabaseData().get("logic_db").getSchemaData().containsKey("pg_catalog"));
+        
assertTrue(shardingSphereData.getDatabaseData().get("logic_db").getSchemaData().get("pg_catalog").getTableData().containsKey("pg_class"));
+    }
+    
+    private ShardingSphereMetaData mockMetaData() {
+        ShardingSphereMetaData result = mock(ShardingSphereMetaData.class);
+        Map<String, ShardingSphereDatabase> databaseMap = mockDatabaseMap();
+        when(result.getDatabases()).thenReturn(databaseMap);
+        return result;
+    }
+    
+    private Map<String, ShardingSphereDatabase> mockDatabaseMap() {
+        Map<String, ShardingSphereDatabase> result = new LinkedHashMap<>(1);
+        ShardingSphereDatabase database = mock(ShardingSphereDatabase.class);
+        Map<String, ShardingSphereSchema> schemaMap = mockSchemaMap();
+        when(database.getSchemas()).thenReturn(schemaMap);
+        result.put("logic_db", database);
+        return result;
+    }
+    
+    private Map<String, ShardingSphereSchema> mockSchemaMap() {
+        Map<String, ShardingSphereSchema> result = new LinkedHashMap<>(1);
+        ShardingSphereSchema schema = mock(ShardingSphereSchema.class);
+        Map<String, ShardingSphereTable> tableMap = mockTableMap();
+        when(schema.getTables()).thenReturn(tableMap);
+        result.put("pg_catalog", schema);
+        return result;
+    }
+    
+    private Map<String, ShardingSphereTable> mockTableMap() {
+        Map<String, ShardingSphereTable> result = new LinkedHashMap<>(1);
+        ShardingSphereTable table = mock(ShardingSphereTable.class);
+        when(table.getName()).thenReturn("pg_class");
+        result.put("pg_class", table);
+        return result;
+    }
+}

Reply via email to