strongduanmu commented on code in PR #20616:
URL: https://github.com/apache/shardingsphere/pull/20616#discussion_r957931030


##########
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java:
##########
@@ -45,48 +46,81 @@
  * Schema meta data loader for PostgreSQL.
  */
 public final class PostgreSQLSchemaMetaDataLoader implements 
DialectSchemaMetaDataLoader {
-    
+
     private static final String BASIC_TABLE_META_DATA_SQL = "SELECT 
table_name, column_name, ordinal_position, data_type, udt_name, column_default, 
table_schema"
             + " FROM information_schema.columns WHERE table_schema IN (%s)";
-    

Review Comment:
   Please keep the same indent with previous line.



##########
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java:
##########
@@ -45,48 +46,81 @@
  * Schema meta data loader for PostgreSQL.
  */
 public final class PostgreSQLSchemaMetaDataLoader implements 
DialectSchemaMetaDataLoader {
-    
+
     private static final String BASIC_TABLE_META_DATA_SQL = "SELECT 
table_name, column_name, ordinal_position, data_type, udt_name, column_default, 
table_schema"
             + " FROM information_schema.columns WHERE table_schema IN (%s)";
-    
+
     private static final String TABLE_META_DATA_SQL_WITHOUT_TABLES = 
BASIC_TABLE_META_DATA_SQL + " ORDER BY ordinal_position";
-    
+
     private static final String TABLE_META_DATA_SQL_WITH_TABLES = 
BASIC_TABLE_META_DATA_SQL + " AND table_name IN (%s) ORDER BY ordinal_position";
-    
+
+    private static final String FOREIGN_KEY_META_DATA_SQL = "SELECT 
tc.table_schema,tc.table_name,tc.constraint_name,pgo.relname refer_table_name 
FROM information_schema.table_constraints tc "
+            + "JOIN pg_constraint pgc ON tc.constraint_name = pgc.conname AND 
contype='f' "
+            + "JOIN pg_class pgo ON pgc.confrelid = pgo.oid "
+            + "WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema IN 
(%s)";
+
     private static final String PRIMARY_KEY_META_DATA_SQL = "SELECT 
tc.table_name, kc.column_name, kc.table_schema FROM 
information_schema.table_constraints tc"
             + " JOIN information_schema.key_column_usage kc ON kc.table_schema 
= tc.table_schema AND kc.table_name = tc.table_name AND kc.constraint_name = 
tc.constraint_name"
             + " WHERE tc.constraint_type = 'PRIMARY KEY' AND 
kc.ordinal_position IS NOT NULL AND kc.table_schema IN (%s)";
-    
+
     private static final String BASIC_INDEX_META_DATA_SQL = "SELECT tablename, 
indexname, schemaname FROM pg_indexes WHERE schemaname IN (%s)";
-    
+
     private static final String LOAD_ALL_ROLE_TABLE_GRANTS_SQL = "SELECT 
table_name FROM information_schema.role_table_grants";
-    
+
     private static final String LOAD_FILTED_ROLE_TABLE_GRANTS_SQL = 
LOAD_ALL_ROLE_TABLE_GRANTS_SQL + " WHERE table_name IN (%s)";
-    
+
     @Override
     public Collection<SchemaMetaData> load(final DataSource dataSource, final 
Collection<String> tables, final String defaultSchemaName) throws SQLException {
         Collection<String> schemaNames = loadSchemaNames(dataSource, 
DatabaseTypeFactory.getInstance(getType()));
         Map<String, Multimap<String, IndexMetaData>> schemaIndexMetaDataMap = 
loadIndexMetaDataMap(dataSource, schemaNames);
         Map<String, Multimap<String, ColumnMetaData>> schemaColumnMetaDataMap 
= loadColumnMetaDataMap(dataSource, tables, schemaNames);
+        Map<String, Multimap<String, ConstraintMetaData>> 
schemaConstraintMetaDataMap = loadConstraintMetaDataMap(dataSource, 
schemaNames);
         Collection<SchemaMetaData> result = new LinkedList<>();
-        for (String each : schemaNames) {
-            Multimap<String, IndexMetaData> tableIndexMetaDataMap = 
schemaIndexMetaDataMap.getOrDefault(each, LinkedHashMultimap.create());
-            Multimap<String, ColumnMetaData> tableColumnMetaDataMap = 
schemaColumnMetaDataMap.getOrDefault(each, LinkedHashMultimap.create());
-            result.add(new SchemaMetaData(each, 
createTableMetaDataList(tableIndexMetaDataMap, tableColumnMetaDataMap)));
+        for (String schemaName : schemaNames) {

Review Comment:
   Please rename schemaName to each.



##########
shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/database/schema/loader/dialect/PostgreSQLSchemaMetaDataLoader.java:
##########
@@ -45,48 +46,81 @@
  * Schema meta data loader for PostgreSQL.
  */
 public final class PostgreSQLSchemaMetaDataLoader implements 
DialectSchemaMetaDataLoader {
-    
+
     private static final String BASIC_TABLE_META_DATA_SQL = "SELECT 
table_name, column_name, ordinal_position, data_type, udt_name, column_default, 
table_schema"
             + " FROM information_schema.columns WHERE table_schema IN (%s)";
-    
+
     private static final String TABLE_META_DATA_SQL_WITHOUT_TABLES = 
BASIC_TABLE_META_DATA_SQL + " ORDER BY ordinal_position";
-    
+
     private static final String TABLE_META_DATA_SQL_WITH_TABLES = 
BASIC_TABLE_META_DATA_SQL + " AND table_name IN (%s) ORDER BY ordinal_position";
-    
+
+    private static final String FOREIGN_KEY_META_DATA_SQL = "SELECT 
tc.table_schema,tc.table_name,tc.constraint_name,pgo.relname refer_table_name 
FROM information_schema.table_constraints tc "
+            + "JOIN pg_constraint pgc ON tc.constraint_name = pgc.conname AND 
contype='f' "
+            + "JOIN pg_class pgo ON pgc.confrelid = pgo.oid "
+            + "WHERE tc.constraint_type = 'FOREIGN KEY' AND tc.table_schema IN 
(%s)";
+
     private static final String PRIMARY_KEY_META_DATA_SQL = "SELECT 
tc.table_name, kc.column_name, kc.table_schema FROM 
information_schema.table_constraints tc"
             + " JOIN information_schema.key_column_usage kc ON kc.table_schema 
= tc.table_schema AND kc.table_name = tc.table_name AND kc.constraint_name = 
tc.constraint_name"
             + " WHERE tc.constraint_type = 'PRIMARY KEY' AND 
kc.ordinal_position IS NOT NULL AND kc.table_schema IN (%s)";
-    
+
     private static final String BASIC_INDEX_META_DATA_SQL = "SELECT tablename, 
indexname, schemaname FROM pg_indexes WHERE schemaname IN (%s)";
-    
+
     private static final String LOAD_ALL_ROLE_TABLE_GRANTS_SQL = "SELECT 
table_name FROM information_schema.role_table_grants";
-    
+
     private static final String LOAD_FILTED_ROLE_TABLE_GRANTS_SQL = 
LOAD_ALL_ROLE_TABLE_GRANTS_SQL + " WHERE table_name IN (%s)";
-    
+
     @Override
     public Collection<SchemaMetaData> load(final DataSource dataSource, final 
Collection<String> tables, final String defaultSchemaName) throws SQLException {
         Collection<String> schemaNames = loadSchemaNames(dataSource, 
DatabaseTypeFactory.getInstance(getType()));
         Map<String, Multimap<String, IndexMetaData>> schemaIndexMetaDataMap = 
loadIndexMetaDataMap(dataSource, schemaNames);
         Map<String, Multimap<String, ColumnMetaData>> schemaColumnMetaDataMap 
= loadColumnMetaDataMap(dataSource, tables, schemaNames);
+        Map<String, Multimap<String, ConstraintMetaData>> 
schemaConstraintMetaDataMap = loadConstraintMetaDataMap(dataSource, 
schemaNames);
         Collection<SchemaMetaData> result = new LinkedList<>();
-        for (String each : schemaNames) {
-            Multimap<String, IndexMetaData> tableIndexMetaDataMap = 
schemaIndexMetaDataMap.getOrDefault(each, LinkedHashMultimap.create());
-            Multimap<String, ColumnMetaData> tableColumnMetaDataMap = 
schemaColumnMetaDataMap.getOrDefault(each, LinkedHashMultimap.create());
-            result.add(new SchemaMetaData(each, 
createTableMetaDataList(tableIndexMetaDataMap, tableColumnMetaDataMap)));
+        for (String schemaName : schemaNames) {
+            Multimap<String, IndexMetaData> tableIndexMetaDataMap = 
schemaIndexMetaDataMap.getOrDefault(schemaName, LinkedHashMultimap.create());
+            Multimap<String, ColumnMetaData> tableColumnMetaDataMap = 
schemaColumnMetaDataMap.getOrDefault(schemaName, LinkedHashMultimap.create());
+            Multimap<String, ConstraintMetaData> tableConstraintMetaDataMap = 
schemaConstraintMetaDataMap.getOrDefault(schemaName, 
LinkedHashMultimap.create());
+            result.add(new SchemaMetaData(schemaName, 
createTableMetaDataList(tableIndexMetaDataMap, tableColumnMetaDataMap, 
tableConstraintMetaDataMap)));
         }
         return result;
     }
-    
-    private Collection<TableMetaData> createTableMetaDataList(final 
Multimap<String, IndexMetaData> tableIndexMetaDataMap, final Multimap<String, 
ColumnMetaData> tableColumnMetaDataMap) {
+
+    private Collection<TableMetaData> createTableMetaDataList(final 
Multimap<String, IndexMetaData> tableIndexMetaDataMap,
+                                                                final 
Multimap<String, ColumnMetaData> tableColumnMetaDataMap,
+                                                                final 
Multimap<String, ConstraintMetaData> tableConstraintMetaDataMap) {
         Collection<TableMetaData> result = new LinkedList<>();
-        for (String each : tableColumnMetaDataMap.keySet()) {
-            Collection<ColumnMetaData> columnMetaDataList = 
tableColumnMetaDataMap.get(each);
-            Collection<IndexMetaData> indexMetaDataList = 
tableIndexMetaDataMap.get(each);
-            result.add(new TableMetaData(each, columnMetaDataList, 
indexMetaDataList, Collections.emptyList()));
+        for (String columnName : tableColumnMetaDataMap.keySet()) {
+            Collection<ColumnMetaData> columnMetaDataList = 
tableColumnMetaDataMap.get(columnName);
+            Collection<IndexMetaData> indexMetaDataList = 
tableIndexMetaDataMap.get(columnName);
+            Collection<ConstraintMetaData> constraintMetaDataList = 
tableConstraintMetaDataMap.get(columnName);
+            result.add(new TableMetaData(columnName, columnMetaDataList, 
indexMetaDataList, constraintMetaDataList));
         }
         return result;
     }
-    
+
+    private Map<String, Multimap<String, ConstraintMetaData>> 
loadConstraintMetaDataMap(final DataSource dataSource,
+                                                                               
 final Collection<String> schemaNames) throws SQLException {
+        Map<String, Multimap<String, ConstraintMetaData>> result = new 
LinkedHashMap<>();
+        try (Connection connection = dataSource.getConnection(); 
PreparedStatement preparedStatement = 
connection.prepareStatement(getConstraintKeyMetaDataSQL(schemaNames))) {
+            try (ResultSet resultSet = preparedStatement.executeQuery()) {
+                while (resultSet.next()) {
+                    String schemaName = resultSet.getString("table_schema");
+                    Multimap<String, ConstraintMetaData> constraintMetaData = 
result.computeIfAbsent(schemaName, key -> LinkedHashMultimap.create());
+

Review Comment:
   Please remove this useless blank line.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to