This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 eae3618a0a4 Add DialectDatabaseAssertionMetaDataSQLProvider (#36443)
eae3618a0a4 is described below
commit eae3618a0a4ea0baa414aad0fb042a2d6cce3a13
Author: Liang Zhang <[email protected]>
AuthorDate: Mon Sep 1 09:30:28 2025 +0800
Add DialectDatabaseAssertionMetaDataSQLProvider (#36443)
* Add DialectDatabaseAssertionMetaDataSQLProvider
* Add DialectDatabaseAssertionMetaDataSQLProvider
* Add DialectDatabaseAssertionMetaDataSQLProvider
* Add DialectDatabaseAssertionMetaDataSQLProvider
---
.../database/DatabaseAssertionMetaDataFactory.java | 48 --------------
.../PostgreSQLDatabaseAssertionMetaData.java | 47 --------------
.../DialectDatabaseAssertionMetaDataFactory.java | 73 ++++++++++++++++++++++
...alectDatabaseAssertionMetaDataSQLProvider.java} | 17 ++---
...reSQLDatabaseAssertionMetaDataSQLProvider.java} | 23 +++----
.../test/e2e/it/sql/dml/BaseDMLE2EIT.java | 12 ++--
6 files changed, 92 insertions(+), 128 deletions(-)
diff --git
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/DatabaseAssertionMetaDataFactory.java
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/DatabaseAssertionMetaDataFactory.java
deleted file mode 100644
index 0837045b878..00000000000
---
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/DatabaseAssertionMetaDataFactory.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.test.e2e.framework.database;
-
-import lombok.AccessLevel;
-import lombok.NoArgsConstructor;
-import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
-import
org.apache.shardingsphere.test.e2e.framework.database.dialect.PostgreSQLDatabaseAssertionMetaData;
-
-import java.util.Optional;
-
-/**
- * Database assertion meta data factory.
- */
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class DatabaseAssertionMetaDataFactory {
-
- /**
- * Create new instance of database assertion meta data.
- *
- * @param databaseType database type
- * @return created instance
- */
- public static Optional<DatabaseAssertionMetaData> newInstance(final
DatabaseType databaseType) {
- switch (databaseType.getType()) {
- case "PostgreSQL":
- case "openGauss":
- return Optional.of(new PostgreSQLDatabaseAssertionMetaData());
- default:
- return Optional.empty();
- }
- }
-}
diff --git
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/dialect/PostgreSQLDatabaseAssertionMetaData.java
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/dialect/PostgreSQLDatabaseAssertionMetaData.java
deleted file mode 100644
index a85968d08ee..00000000000
---
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/dialect/PostgreSQLDatabaseAssertionMetaData.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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.test.e2e.framework.database.dialect;
-
-import
org.apache.shardingsphere.test.e2e.framework.database.DatabaseAssertionMetaData;
-
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Statement;
-
-/**
- * Assertion meta data for PostgreSQL.
- */
-public final class PostgreSQLDatabaseAssertionMetaData implements
DatabaseAssertionMetaData {
-
- @Override
- public String getPrimaryKeyColumnName(final DataSource dataSource, final
String tableName) throws SQLException {
- String sql = String.format("SELECT a.attname, format_type(a.atttypid,
a.atttypmod) AS data_type "
- + "FROM pg_index i JOIN pg_attribute a ON a.attrelid =
i.indrelid AND a.attnum = ANY(i.indkey) WHERE i.indrelid = '%s'::regclass AND
i.indisprimary", tableName);
- try (
- Connection connection = dataSource.getConnection();
- Statement statement = connection.createStatement();
- ResultSet resultSet = statement.executeQuery(sql)) {
- if (resultSet.next()) {
- return resultSet.getString("attname");
- }
- throw new SQLException(String.format("Can not get primary key of
`%s`", tableName));
- }
- }
-}
diff --git
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/metadata/DialectDatabaseAssertionMetaDataFactory.java
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/metadata/DialectDatabaseAssertionMetaDataFactory.java
new file mode 100644
index 00000000000..2c655b55ea3
--- /dev/null
+++
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/metadata/DialectDatabaseAssertionMetaDataFactory.java
@@ -0,0 +1,73 @@
+/*
+ * 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.test.e2e.framework.metadata;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
+import
org.apache.shardingsphere.test.e2e.framework.metadata.dialect.PostgreSQLDatabaseAssertionMetaDataSQLProvider;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Optional;
+
+/**
+ * Dialect database assertion meta data factory.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class DialectDatabaseAssertionMetaDataFactory {
+
+ /**
+ * Get primary key column name.
+ *
+ * @param databaseType database type
+ * @param dataSource dataSource data source
+ * @param tableName table name
+ * @return created instance
+ * @throws SQLException SQL exception
+ */
+ public static Optional<String> getPrimaryKeyColumnName(final DatabaseType
databaseType, final DataSource dataSource, final String tableName) throws
SQLException {
+ Optional<DialectDatabaseAssertionMetaDataSQLProvider> sqlProvider =
findDialectDatabaseAssertionMetaDataSQLProvider(databaseType);
+ return sqlProvider.isPresent() ?
Optional.of(getPrimaryKeyColumnName(dataSource, tableName,
sqlProvider.get().getFetchPrimaryKeyColumnNameSQL(tableName))) :
Optional.empty();
+ }
+
+ private static String getPrimaryKeyColumnName(final DataSource dataSource,
final String tableName, final String sql) throws SQLException {
+ try (
+ Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery(sql)) {
+ if (resultSet.next()) {
+ return resultSet.getString("attname");
+ }
+ throw new SQLException(String.format("Can not get primary key of
`%s`", tableName));
+ }
+ }
+
+ private static Optional<DialectDatabaseAssertionMetaDataSQLProvider>
findDialectDatabaseAssertionMetaDataSQLProvider(final DatabaseType
databaseType) {
+ switch (databaseType.getType()) {
+ case "PostgreSQL":
+ case "openGauss":
+ return Optional.of(new
PostgreSQLDatabaseAssertionMetaDataSQLProvider());
+ default:
+ return Optional.empty();
+ }
+ }
+}
diff --git
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/DatabaseAssertionMetaData.java
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/metadata/DialectDatabaseAssertionMetaDataSQLProvider.java
similarity index 65%
copy from
test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/DatabaseAssertionMetaData.java
copy to
test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/metadata/DialectDatabaseAssertionMetaDataSQLProvider.java
index 81b0cca010e..e01c0fdce2b 100644
---
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/DatabaseAssertionMetaData.java
+++
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/metadata/DialectDatabaseAssertionMetaDataSQLProvider.java
@@ -15,23 +15,18 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.test.e2e.framework.database;
-
-import javax.sql.DataSource;
-import java.sql.SQLException;
+package org.apache.shardingsphere.test.e2e.framework.metadata;
/**
- * Database assertion meta data.
+ * Dialect database assertion meta data SQL provider.
*/
-public interface DatabaseAssertionMetaData {
+public interface DialectDatabaseAssertionMetaDataSQLProvider {
/**
- * Get primary key column name.
+ * Get fetch primary key column name SQL.
*
- * @param dataSource data source
* @param tableName table name
- * @return primary key column name
- * @throws SQLException SQL exception
+ * @return fetch primary key column name SQL
*/
- String getPrimaryKeyColumnName(DataSource dataSource, String tableName)
throws SQLException;
+ String getFetchPrimaryKeyColumnNameSQL(String tableName);
}
diff --git
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/DatabaseAssertionMetaData.java
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/metadata/dialect/PostgreSQLDatabaseAssertionMetaDataSQLProvider.java
similarity index 52%
rename from
test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/DatabaseAssertionMetaData.java
rename to
test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/metadata/dialect/PostgreSQLDatabaseAssertionMetaDataSQLProvider.java
index 81b0cca010e..a03f81ba316 100644
---
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/database/DatabaseAssertionMetaData.java
+++
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/framework/metadata/dialect/PostgreSQLDatabaseAssertionMetaDataSQLProvider.java
@@ -15,23 +15,18 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.test.e2e.framework.database;
+package org.apache.shardingsphere.test.e2e.framework.metadata.dialect;
-import javax.sql.DataSource;
-import java.sql.SQLException;
+import
org.apache.shardingsphere.test.e2e.framework.metadata.DialectDatabaseAssertionMetaDataSQLProvider;
/**
- * Database assertion meta data.
+ * PostgreSQL database assertion meta data SQL provider.
*/
-public interface DatabaseAssertionMetaData {
+public final class PostgreSQLDatabaseAssertionMetaDataSQLProvider implements
DialectDatabaseAssertionMetaDataSQLProvider {
- /**
- * Get primary key column name.
- *
- * @param dataSource data source
- * @param tableName table name
- * @return primary key column name
- * @throws SQLException SQL exception
- */
- String getPrimaryKeyColumnName(DataSource dataSource, String tableName)
throws SQLException;
+ @Override
+ public String getFetchPrimaryKeyColumnNameSQL(final String tableName) {
+ return String.format("SELECT a.attname, format_type(a.atttypid,
a.atttypmod) AS data_type "
+ + "FROM pg_index i JOIN pg_attribute a ON a.attrelid =
i.indrelid AND a.attnum = ANY(i.indkey) WHERE i.indrelid = '%s'::regclass AND
i.indisprimary", tableName);
+ }
}
diff --git
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/it/sql/dml/BaseDMLE2EIT.java
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/it/sql/dml/BaseDMLE2EIT.java
index 37948304932..f1758881c6b 100644
---
a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/it/sql/dml/BaseDMLE2EIT.java
+++
b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/it/sql/dml/BaseDMLE2EIT.java
@@ -37,8 +37,7 @@ import
org.apache.shardingsphere.test.e2e.env.SQLE2EEnvironmentEngine;
import
org.apache.shardingsphere.test.e2e.env.runtime.scenario.database.DatabaseEnvironmentManager;
import
org.apache.shardingsphere.test.e2e.env.runtime.scenario.path.ScenarioDataPath;
import
org.apache.shardingsphere.test.e2e.env.runtime.scenario.path.ScenarioDataPath.Type;
-import
org.apache.shardingsphere.test.e2e.framework.database.DatabaseAssertionMetaData;
-import
org.apache.shardingsphere.test.e2e.framework.database.DatabaseAssertionMetaDataFactory;
+import
org.apache.shardingsphere.test.e2e.framework.metadata.DialectDatabaseAssertionMetaDataFactory;
import
org.apache.shardingsphere.test.e2e.framework.param.model.AssertionTestParameter;
import
org.apache.shardingsphere.test.e2e.framework.param.model.CaseTestParameter;
import
org.apache.shardingsphere.test.e2e.framework.param.model.E2ETestParameter;
@@ -233,12 +232,9 @@ public abstract class BaseDMLE2EIT implements SQLE2EIT {
}
private String generateFetchActualDataSQL(final Map<String, DataSource>
actualDataSourceMap, final DataNode dataNode, final DatabaseType databaseType)
throws SQLException {
- Optional<DatabaseAssertionMetaData> databaseAssertionMetaData =
DatabaseAssertionMetaDataFactory.newInstance(databaseType);
- if (databaseAssertionMetaData.isPresent()) {
- String primaryKeyColumnName =
databaseAssertionMetaData.get().getPrimaryKeyColumnName(actualDataSourceMap.get(dataNode.getDataSourceName()),
dataNode.getTableName());
- return String.format("SELECT * FROM %s ORDER BY %s ASC",
dataNode.getTableName(), primaryKeyColumnName);
- }
- return String.format("SELECT * FROM %s", dataNode.getTableName());
+ String tableName = dataNode.getTableName();
+ Optional<String> primaryKeyColumnName =
DialectDatabaseAssertionMetaDataFactory.getPrimaryKeyColumnName(databaseType,
actualDataSourceMap.get(dataNode.getDataSourceName()), tableName);
+ return primaryKeyColumnName.isPresent() ? String.format("SELECT * FROM
%s ORDER BY %s ASC", tableName, primaryKeyColumnName) : String.format("SELECT *
FROM %s", tableName);
}
private void assertMetaData(final ResultSetMetaData actual, final
Collection<DataSetColumn> expected) throws SQLException {