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 <[email protected]>
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>