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 71165b8fb3a Enhance system table option handling by adding isSystemTable method and refactoring related logic (#35283) 71165b8fb3a is described below commit 71165b8fb3a7224d84b7fdac9014908cba8c7cbe Author: Liang Zhang <zhangli...@apache.org> AuthorDate: Mon Apr 28 19:08:03 2025 +0800 Enhance system table option handling by adding isSystemTable method and refactoring related logic (#35283) * Enhance system table option handling by adding isSystemTable method and refactoring related logic * Enhance system table option handling by adding isSystemTable method and refactoring related logic --- .../option/table/DefaultSystemTableOption.java | 7 +++- .../option/table/DialectSystemTableOption.java | 8 +++++ .../option/OpenGaussSystemTableOption.java | 15 ++++---- .../executor/constant/EnumerableConstants.java | 42 ---------------------- .../enumerable/EnumerableScanExecutor.java | 6 ++-- .../executor/utils/StatisticsAssembleUtils.java | 17 ++++++--- 6 files changed, 38 insertions(+), 57 deletions(-) diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/table/DefaultSystemTableOption.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/table/DefaultSystemTableOption.java index 5d87ce1bea1..6f55f31079c 100644 --- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/table/DefaultSystemTableOption.java +++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/table/DefaultSystemTableOption.java @@ -18,7 +18,7 @@ package org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.table; /** - * Dialect system table option. + * Default system table option. */ public final class DefaultSystemTableOption implements DialectSystemTableOption { @@ -31,4 +31,9 @@ public final class DefaultSystemTableOption implements DialectSystemTableOption public boolean isSystemCatalogQueryExpressions(final String projectionExpression) { return false; } + + @Override + public boolean isSystemTable(final String tableName) { + return false; + } } diff --git a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/table/DialectSystemTableOption.java b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/table/DialectSystemTableOption.java index 795d7c7e53b..205d5b4ce83 100644 --- a/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/table/DialectSystemTableOption.java +++ b/infra/database/core/src/main/java/org/apache/shardingsphere/infra/database/core/metadata/database/metadata/option/table/DialectSystemTableOption.java @@ -36,4 +36,12 @@ public interface DialectSystemTableOption { * @return is query expressions or not */ boolean isSystemCatalogQueryExpressions(String projectionExpression); + + /** + * Whether system table. + * + * @param tableName table name + * @return is system table or not + */ + boolean isSystemTable(String tableName); } diff --git a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/option/OpenGaussSystemTableOption.java b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/option/OpenGaussSystemTableOption.java index 5a3094c0bcc..d88c87c15e0 100644 --- a/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/option/OpenGaussSystemTableOption.java +++ b/infra/database/type/opengauss/src/main/java/org/apache/shardingsphere/infra/database/opengauss/metadata/database/option/OpenGaussSystemTableOption.java @@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.database.opengauss.metadata.database.opt import com.cedarsoftware.util.CaseInsensitiveSet; import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.table.DialectSystemTableOption; +import java.util.Arrays; import java.util.Collection; /** @@ -27,13 +28,10 @@ import java.util.Collection; */ public final class OpenGaussSystemTableOption implements DialectSystemTableOption { - private static final Collection<String> SYSTEM_CATALOG_QUERY_EXPRESSIONS = new CaseInsensitiveSet<>(3, 1F); + private static final Collection<String> SYSTEM_CATALOG_QUERY_EXPRESSIONS = new CaseInsensitiveSet<>( + Arrays.asList("version()", "intervaltonum(gs_password_deadline())", "gs_password_notifytime()")); - static { - SYSTEM_CATALOG_QUERY_EXPRESSIONS.add("version()"); - SYSTEM_CATALOG_QUERY_EXPRESSIONS.add("intervaltonum(gs_password_deadline())"); - SYSTEM_CATALOG_QUERY_EXPRESSIONS.add("gs_password_notifytime()"); - } + private static final Collection<String> SYSTEM_CATALOG_TABLES = new CaseInsensitiveSet<>(Arrays.asList("pg_database", "pg_tables", "pg_roles")); @Override public boolean isDriverQuerySystemCatalog() { @@ -44,4 +42,9 @@ public final class OpenGaussSystemTableOption implements DialectSystemTableOptio public boolean isSystemCatalogQueryExpressions(final String projectionExpression) { return SYSTEM_CATALOG_QUERY_EXPRESSIONS.contains(projectionExpression); } + + @Override + public boolean isSystemTable(final String tableName) { + return SYSTEM_CATALOG_TABLES.contains(tableName); + } } diff --git a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/constant/EnumerableConstants.java b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/constant/EnumerableConstants.java deleted file mode 100644 index 9da972e8354..00000000000 --- a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/constant/EnumerableConstants.java +++ /dev/null @@ -1,42 +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.sqlfederation.executor.constant; - -import com.cedarsoftware.util.CaseInsensitiveSet; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; - -import java.util.Arrays; -import java.util.Collection; - -/** - * Enumerable constants. - */ -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public final class EnumerableConstants { - - public static final String DAT_COMPATIBILITY = "PG"; - - public static final String PG_DATABASE = "pg_database"; - - public static final String PG_TABLES = "pg_tables"; - - public static final String PG_ROLES = "pg_roles"; - - public static final Collection<String> SYSTEM_CATALOG_TABLES = new CaseInsensitiveSet<>(Arrays.asList(PG_DATABASE, PG_TABLES, PG_ROLES)); -} diff --git a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java index df623646c1f..542ac90d7a9 100644 --- a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java +++ b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/enumerable/EnumerableScanExecutor.java @@ -25,6 +25,7 @@ import org.apache.calcite.linq4j.Enumerator; import org.apache.shardingsphere.infra.binder.context.statement.SQLStatementContext; import org.apache.shardingsphere.infra.binder.engine.SQLBindEngine; import org.apache.shardingsphere.infra.connection.kernel.KernelProcessor; +import org.apache.shardingsphere.infra.database.core.metadata.database.metadata.option.table.DialectSystemTableOption; import org.apache.shardingsphere.infra.database.core.metadata.database.system.SystemDatabase; import org.apache.shardingsphere.infra.database.core.type.DatabaseType; import org.apache.shardingsphere.infra.database.core.type.DatabaseTypeRegistry; @@ -54,7 +55,6 @@ import org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatist import org.apache.shardingsphere.infra.metadata.statistics.TableStatistics; import org.apache.shardingsphere.infra.session.query.QueryContext; import org.apache.shardingsphere.sql.parser.statement.core.statement.SQLStatement; -import org.apache.shardingsphere.sqlfederation.executor.constant.EnumerableConstants; import org.apache.shardingsphere.sqlfederation.executor.context.SQLFederationContext; import org.apache.shardingsphere.sqlfederation.executor.context.SQLFederationExecutorContext; import org.apache.shardingsphere.sqlfederation.executor.enumerator.JDBCRowEnumerator; @@ -153,8 +153,8 @@ public final class EnumerableScanExecutor implements ScanExecutor { } private Enumerable<Object> createMemoryEnumerable(final String databaseName, final String schemaName, final ShardingSphereTable table, final DatabaseType databaseType) { - if (new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getSystemTableOption().isDriverQuerySystemCatalog() - && EnumerableConstants.SYSTEM_CATALOG_TABLES.contains(table.getName())) { + DialectSystemTableOption systemTableOption = new DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getSystemTableOption(); + if (systemTableOption.isDriverQuerySystemCatalog() && systemTableOption.isSystemTable(table.getName())) { return createMemoryEnumerator(StatisticsAssembleUtils.assembleTableStatistics(table, federationContext.getMetaData()), table, databaseType); } Optional<TableStatistics> tableStatistics = Optional.ofNullable(statistics.getDatabaseStatistics(databaseName)) diff --git a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/utils/StatisticsAssembleUtils.java b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/utils/StatisticsAssembleUtils.java index 1be63f4a0c6..867e9595b04 100644 --- a/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/utils/StatisticsAssembleUtils.java +++ b/kernel/sql-federation/executor/src/main/java/org/apache/shardingsphere/sqlfederation/executor/utils/StatisticsAssembleUtils.java @@ -27,7 +27,6 @@ import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp import org.apache.shardingsphere.infra.metadata.statistics.RowStatistics; import org.apache.shardingsphere.infra.metadata.statistics.TableStatistics; import org.apache.shardingsphere.infra.metadata.user.Grantee; -import org.apache.shardingsphere.sqlfederation.executor.constant.EnumerableConstants; import java.util.Arrays; import java.util.Collection; @@ -38,6 +37,14 @@ import java.util.Collection; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class StatisticsAssembleUtils { + private static final String DAT_COMPATIBILITY = "PG"; + + private static final String PG_DATABASE = "pg_database"; + + private static final String PG_TABLES = "pg_tables"; + + private static final String PG_ROLES = "pg_roles"; + /** * Assemble table statistics. * @@ -47,13 +54,13 @@ public final class StatisticsAssembleUtils { */ public static TableStatistics assembleTableStatistics(final ShardingSphereTable table, final ShardingSphereMetaData metaData) { TableStatistics result = new TableStatistics(table.getName()); - if (EnumerableConstants.PG_DATABASE.equalsIgnoreCase(table.getName())) { + if (PG_DATABASE.equalsIgnoreCase(table.getName())) { assembleOpenGaussDatabaseData(result, metaData.getAllDatabases()); - } else if (EnumerableConstants.PG_TABLES.equalsIgnoreCase(table.getName())) { + } else if (PG_TABLES.equalsIgnoreCase(table.getName())) { for (ShardingSphereDatabase each : metaData.getAllDatabases()) { assembleOpenGaussTableData(result, each.getAllSchemas()); } - } else if (EnumerableConstants.PG_ROLES.equalsIgnoreCase(table.getName())) { + } else if (PG_ROLES.equalsIgnoreCase(table.getName())) { assembleOpenGaussRoleData(result, metaData); } return result; @@ -63,7 +70,7 @@ public final class StatisticsAssembleUtils { for (ShardingSphereDatabase each : databases) { Object[] rows = new Object[15]; rows[0] = each.getName(); - rows[11] = EnumerableConstants.DAT_COMPATIBILITY; + rows[11] = DAT_COMPATIBILITY; tableStatistics.getRows().add(new RowStatistics(Arrays.asList(rows))); } }