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

chengzhang 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 92f908d0c5b Add indexes to repository table and refactor index 
metadata loading in Oracle. (#35394)
92f908d0c5b is described below

commit 92f908d0c5b926a43996cce3945c281256c332bf
Author: Cong Hu <iamhuc...@gmail.com>
AuthorDate: Wed May 14 15:14:20 2025 +0800

    Add indexes to repository table and refactor index metadata loading in 
Oracle. (#35394)
---
 .../core/metadata/data/model/IndexMetaData.java    |  7 ++--
 .../metadata/data/loader/OracleMetaDataLoader.java | 38 +++++++++++++++-------
 .../provider/jdbc/src/main/resources/sql/H2.xml    |  2 +-
 3 files changed, 31 insertions(+), 16 deletions(-)

diff --git 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/model/IndexMetaData.java
 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/model/IndexMetaData.java
index 139e35b5c07..e8b7acf18f7 100644
--- 
a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/model/IndexMetaData.java
+++ 
b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/data/model/IndexMetaData.java
@@ -36,11 +36,12 @@ public final class IndexMetaData {
     
     private final String name;
     
-    private final Collection<String> columns;
+    private Collection<String> columns = new LinkedList<>();
     
     private boolean unique;
     
-    public IndexMetaData(final String name) {
-        this(name, new LinkedList<>());
+    public IndexMetaData(final String name, final Collection<String> columns) {
+        this.name = name;
+        this.columns = columns;
     }
 }
diff --git 
a/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoader.java
 
b/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoader.java
index 84001e34fc6..9c9ca461830 100644
--- 
a/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoader.java
+++ 
b/infra/database/type/oracle/src/main/java/org/apache/shardingsphere/infra/database/oracle/metadata/data/loader/OracleMetaDataLoader.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.infra.database.oracle.metadata.data.loader;
 
+import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.loader.DialectMetaDataLoader;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.loader.MetaDataLoaderConnection;
@@ -26,6 +27,7 @@ import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.IndexMe
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.SchemaMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.data.model.TableMetaData;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.datatype.DataTypeRegistry;
+import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.QuoteCharacter;
 import 
org.apache.shardingsphere.infra.database.core.metadata.database.enums.TableType;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
@@ -44,6 +46,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 /**
@@ -69,7 +72,7 @@ public final class OracleMetaDataLoader implements 
DialectMetaDataLoader {
     
     private static final String PRIMARY_KEY_META_DATA_SQL_IN_TABLES = 
PRIMARY_KEY_META_DATA_SQL + " AND A.TABLE_NAME IN (%s)";
     
-    private static final String INDEX_COLUMN_META_DATA_SQL = "SELECT 
COLUMN_NAME FROM ALL_IND_COLUMNS WHERE INDEX_OWNER = ? AND TABLE_NAME = ? AND 
INDEX_NAME = ?";
+    private static final String INDEX_COLUMN_META_DATA_SQL = "SELECT 
INDEX_NAME, COLUMN_NAME FROM ALL_IND_COLUMNS WHERE INDEX_OWNER = ? AND 
INDEX_NAME IN (%s)";
     
     private static final int COLLATION_START_MAJOR_VERSION = 12;
     
@@ -195,26 +198,37 @@ public final class OracleMetaDataLoader implements 
DialectMetaDataLoader {
                     if (!result.containsKey(tableName)) {
                         result.put(tableName, new LinkedList<>());
                     }
-                    IndexMetaData indexMetaData = new IndexMetaData(indexName, 
loadIndexColumnNames(connection, tableName, indexName));
+                    IndexMetaData indexMetaData = new IndexMetaData(indexName);
                     indexMetaData.setUnique(isUnique);
                     result.get(tableName).add(indexMetaData);
                 }
             }
         }
+        loadIndexColumnNames(connection, result);
         return result;
     }
     
-    private List<String> loadIndexColumnNames(final Connection connection, 
final String tableName, final String indexName) throws SQLException {
-        try (PreparedStatement preparedStatement = 
connection.prepareStatement(INDEX_COLUMN_META_DATA_SQL)) {
-            preparedStatement.setString(1, connection.getSchema());
-            preparedStatement.setString(2, tableName);
-            preparedStatement.setString(3, indexName);
-            List<String> result = new LinkedList<>();
-            ResultSet resultSet = preparedStatement.executeQuery();
-            while (resultSet.next()) {
-                result.add(resultSet.getString("COLUMN_NAME"));
+    private void loadIndexColumnNames(final Connection connection, final 
Map<String, Collection<IndexMetaData>> tableIndexMetaDataMap) throws 
SQLException {
+        List<String> quotedIndexNames =
+                
tableIndexMetaDataMap.values().stream().flatMap(Collection::stream).map(IndexMetaData::getName).map(QuoteCharacter.SINGLE_QUOTE::wrap).collect(Collectors.toList());
+        if (!quotedIndexNames.isEmpty()) {
+            return;
+        }
+        Map<String, Collection<String>> indexColumnsMap = new HashMap<>();
+        for (List<String> each : Lists.partition(quotedIndexNames, 1000)) {
+            try (PreparedStatement preparedStatement = 
connection.prepareStatement(String.format(INDEX_COLUMN_META_DATA_SQL, 
Joiner.on(",").join(each)))) {
+                preparedStatement.setString(1, connection.getSchema());
+                ResultSet resultSet = preparedStatement.executeQuery();
+                while (resultSet.next()) {
+                    Collection<String> columns = 
indexColumnsMap.computeIfAbsent(resultSet.getString("INDEX_NAME"), key -> new 
LinkedList<>());
+                    columns.add(resultSet.getString("COLUMN_NAME"));
+                }
+            }
+        }
+        for (Entry<String, Collection<IndexMetaData>> entry : 
tableIndexMetaDataMap.entrySet()) {
+            for (IndexMetaData each : entry.getValue()) {
+                
Optional.ofNullable(indexColumnsMap.get(each.getName())).ifPresent(each::setColumns);
             }
-            return result;
         }
     }
     
diff --git 
a/mode/type/standalone/repository/provider/jdbc/src/main/resources/sql/H2.xml 
b/mode/type/standalone/repository/provider/jdbc/src/main/resources/sql/H2.xml
index 5676283c9b4..8aed3a18008 100644
--- 
a/mode/type/standalone/repository/provider/jdbc/src/main/resources/sql/H2.xml
+++ 
b/mode/type/standalone/repository/provider/jdbc/src/main/resources/sql/H2.xml
@@ -17,7 +17,7 @@
   -->
 
 <sql type="H2" driver-class-name="org.h2.Driver" default="true">
-    <create-table>CREATE TABLE IF NOT EXISTS `repository`(id varchar(36) 
PRIMARY KEY, `key` TEXT, `value` TEXT, parent TEXT)</create-table>
+    <create-table>CREATE TABLE IF NOT EXISTS `repository`(id varchar(36) 
PRIMARY KEY, `key` TEXT, `value` TEXT, parent TEXT, INDEX idx_key(`key`), INDEX 
idx_value(`value`))</create-table>
     <select-by-key>SELECT `value` FROM `repository` WHERE `key` = 
?</select-by-key>
     <select-by-parent>SELECT DISTINCT(`key`) FROM `repository` WHERE parent = 
?</select-by-parent>
     <insert>INSERT INTO `repository` VALUES(?, ?, ?, ?)</insert>

Reply via email to