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 f87305498a3 Refactor sql federation operator tables init logic (#36141)
f87305498a3 is described below

commit f87305498a394324f3b9408db5c6e58ab83ca4ce
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Fri Aug 1 09:42:10 2025 +0800

    Refactor sql federation operator tables init logic (#36141)
---
 .../compiler/context/CompilerContext.java          |  5 ++++
 .../compiler/context/CompilerContextFactory.java   | 28 +++++++++++++++----
 .../rel/converter/SQLFederationRelConverter.java   | 31 +++++++---------------
 .../compiler/it/SQLStatementCompilerIT.java        | 17 ++++++++++--
 4 files changed, 52 insertions(+), 29 deletions(-)

diff --git 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/CompilerContext.java
 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/CompilerContext.java
index 03c14a17490..d01cc76b2db 100644
--- 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/CompilerContext.java
+++ 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/CompilerContext.java
@@ -21,8 +21,11 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.calcite.config.CalciteConnectionConfig;
 import org.apache.calcite.jdbc.CalciteSchema;
+import org.apache.calcite.sql.SqlOperatorTable;
 import org.apache.shardingsphere.parser.rule.SQLParserRule;
 
+import java.util.Collection;
+
 /**
  * Compiler context.
  */
@@ -35,4 +38,6 @@ public final class CompilerContext {
     private final CalciteSchema calciteSchema;
     
     private final CalciteConnectionConfig connectionConfig;
+    
+    private final Collection<SqlOperatorTable> operatorTables;
 }
diff --git 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/CompilerContextFactory.java
 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/CompilerContextFactory.java
index f635a6a1590..7d37af6655c 100644
--- 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/CompilerContextFactory.java
+++ 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/context/CompilerContextFactory.java
@@ -17,10 +17,14 @@
 
 package org.apache.shardingsphere.sqlfederation.compiler.context;
 
+import com.cedarsoftware.util.CaseInsensitiveMap;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.calcite.config.CalciteConnectionConfig;
 import org.apache.calcite.jdbc.CalciteSchema;
+import org.apache.calcite.sql.SqlOperatorTable;
+import org.apache.calcite.sql.fun.SqlLibrary;
+import org.apache.calcite.sql.fun.SqlLibraryOperatorTableFactory;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
@@ -30,8 +34,11 @@ import 
org.apache.shardingsphere.parser.rule.builder.DefaultSQLParserRuleConfigu
 import org.apache.shardingsphere.parser.rule.builder.SQLParserRuleBuilder;
 import 
org.apache.shardingsphere.sqlfederation.compiler.context.connection.config.ConnectionConfigBuilderFactory;
 import 
org.apache.shardingsphere.sqlfederation.compiler.context.schema.CalciteSchemaBuilder;
+import 
org.apache.shardingsphere.sqlfederation.compiler.sql.function.mysql.MySQLOperatorTable;
 
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Map;
 import java.util.Properties;
 
 /**
@@ -40,6 +47,15 @@ import java.util.Properties;
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
 public final class CompilerContextFactory {
     
+    private static final Map<String, SqlLibrary> DATABASE_TYPE_SQL_LIBRARIES = 
new CaseInsensitiveMap<>();
+    
+    static {
+        DATABASE_TYPE_SQL_LIBRARIES.put("MySQL", SqlLibrary.MYSQL);
+        DATABASE_TYPE_SQL_LIBRARIES.put("PostgreSQL", SqlLibrary.POSTGRESQL);
+        DATABASE_TYPE_SQL_LIBRARIES.put("openGauss", SqlLibrary.POSTGRESQL);
+        DATABASE_TYPE_SQL_LIBRARIES.put("Oracle", SqlLibrary.ORACLE);
+    }
+    
     /**
      * Create compiler context.
      *
@@ -49,13 +65,15 @@ public final class CompilerContextFactory {
     public static CompilerContext create(final 
Collection<ShardingSphereDatabase> databases) {
         // TODO consider to use sqlParserRule in global rule
         SQLParserRule sqlParserRule = new SQLParserRuleBuilder().build(new 
DefaultSQLParserRuleConfigurationBuilder().build(), databases, new 
ConfigurationProperties(new Properties()));
-        CalciteConnectionConfig connectionConfig = 
buildConnectionConfig(databases);
+        DatabaseType databaseType = databases.isEmpty() ? 
DatabaseTypeEngine.getDefaultStorageType() : 
databases.iterator().next().getProtocolType();
+        CalciteConnectionConfig connectionConfig = new 
ConnectionConfigBuilderFactory(databaseType).build();
         CalciteSchema calciteSchema = CalciteSchemaBuilder.build(databases);
-        return new CompilerContext(sqlParserRule, calciteSchema, 
connectionConfig);
+        return new CompilerContext(sqlParserRule, calciteSchema, 
connectionConfig, getOperatorTables(databaseType));
     }
     
-    private static CalciteConnectionConfig buildConnectionConfig(final 
Collection<ShardingSphereDatabase> databases) {
-        DatabaseType databaseType = databases.isEmpty() ? 
DatabaseTypeEngine.getDefaultStorageType() : 
databases.iterator().next().getProtocolType();
-        return new ConnectionConfigBuilderFactory(databaseType).build();
+    private static Collection<SqlOperatorTable> getOperatorTables(final 
DatabaseType databaseType) {
+        SqlOperatorTable operatorTable = 
SqlLibraryOperatorTableFactory.INSTANCE.getOperatorTable(
+                Arrays.asList(SqlLibrary.STANDARD, 
DATABASE_TYPE_SQL_LIBRARIES.getOrDefault(databaseType.getType(), 
SqlLibrary.MYSQL)));
+        return Arrays.asList(new MySQLOperatorTable(), operatorTable);
     }
 }
diff --git 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/rel/converter/SQLFederationRelConverter.java
 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/rel/converter/SQLFederationRelConverter.java
index 8aa4a6dd999..69b1feff387 100644
--- 
a/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/rel/converter/SQLFederationRelConverter.java
+++ 
b/kernel/sql-federation/compiler/src/main/java/org/apache/shardingsphere/sqlfederation/compiler/rel/converter/SQLFederationRelConverter.java
@@ -30,8 +30,6 @@ import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.schema.SchemaPlus;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlOperatorTable;
-import org.apache.calcite.sql.fun.SqlLibrary;
-import org.apache.calcite.sql.fun.SqlLibraryOperatorTableFactory;
 import org.apache.calcite.sql.util.SqlOperatorTables;
 import org.apache.calcite.sql.validate.SqlValidator;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
@@ -44,13 +42,11 @@ import 
org.apache.shardingsphere.sqlfederation.compiler.context.CompilerContext;
 import 
org.apache.shardingsphere.sqlfederation.compiler.metadata.catalog.SQLFederationCatalogReader;
 import 
org.apache.shardingsphere.sqlfederation.compiler.metadata.view.ShardingSphereViewExpander;
 import 
org.apache.shardingsphere.sqlfederation.compiler.planner.builder.SQLFederationPlannerBuilder;
-import 
org.apache.shardingsphere.sqlfederation.compiler.sql.function.mysql.MySQLOperatorTable;
 import 
org.apache.shardingsphere.sqlfederation.compiler.sql.type.SQLFederationDataTypeFactory;
 
-import java.util.Arrays;
-import java.util.HashMap;
+import java.util.Collection;
+import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 import java.util.Objects;
 
 /**
@@ -58,38 +54,29 @@ import java.util.Objects;
  */
 public final class SQLFederationRelConverter {
     
-    private static final Map<String, SqlLibrary> DATABASE_TYPE_SQL_LIBRARIES = 
new HashMap<>();
-    
-    static {
-        DATABASE_TYPE_SQL_LIBRARIES.put("MySQL", SqlLibrary.MYSQL);
-        DATABASE_TYPE_SQL_LIBRARIES.put("PostgreSQL", SqlLibrary.POSTGRESQL);
-        DATABASE_TYPE_SQL_LIBRARIES.put("openGauss", SqlLibrary.POSTGRESQL);
-        DATABASE_TYPE_SQL_LIBRARIES.put("Oracle", SqlLibrary.ORACLE);
-    }
-    
     private final SqlToRelConverter sqlToRelConverter;
     
     public SQLFederationRelConverter(final CompilerContext compilerContext, 
final List<String> schemaPath, final DatabaseType databaseType, final 
Convention convention) {
         RelDataTypeFactory typeFactory = 
SQLFederationDataTypeFactory.getInstance();
         CalciteConnectionConfig connectionConfig = 
compilerContext.getConnectionConfig();
         CalciteCatalogReader catalogReader = new 
SQLFederationCatalogReader(compilerContext.getCalciteSchema(), schemaPath, 
typeFactory, connectionConfig);
-        SqlValidator validator = createSqlValidator(catalogReader, 
typeFactory, databaseType, connectionConfig);
+        SqlValidator validator = createSqlValidator(catalogReader, 
typeFactory, databaseType, connectionConfig, 
compilerContext.getOperatorTables());
         RelOptCluster relOptCluster = createRelOptCluster(typeFactory, 
convention);
         sqlToRelConverter = createSqlToRelConverter(catalogReader, validator, 
relOptCluster, compilerContext.getSqlParserRule(), databaseType, true);
     }
     
     private SqlValidator createSqlValidator(final CalciteCatalogReader 
catalogReader, final RelDataTypeFactory typeFactory, final DatabaseType 
databaseType,
-                                            final CalciteConnectionConfig 
connectionConfig) {
+                                            final CalciteConnectionConfig 
connectionConfig, final Collection<SqlOperatorTable> operatorTables) {
         SqlValidator.Config validatorConfig = 
SqlValidator.Config.DEFAULT.withLenientOperatorLookup(connectionConfig.lenientOperatorLookup()).withConformance(connectionConfig.conformance())
                 
.withDefaultNullCollation(connectionConfig.defaultNullCollation()).withIdentifierExpansion(true);
-        SqlOperatorTable sqlOperatorTable = getSQLOperatorTable(catalogReader, 
databaseType.getTrunkDatabaseType().orElse(databaseType));
+        SqlOperatorTable sqlOperatorTable = 
getSQLOperatorTable(operatorTables, catalogReader);
         return SqlValidatorUtil.newValidator(sqlOperatorTable, catalogReader, 
typeFactory, validatorConfig);
     }
     
-    private static SqlOperatorTable getSQLOperatorTable(final 
CalciteCatalogReader catalogReader, final DatabaseType databaseType) {
-        SqlOperatorTable operatorTable =
-                
SqlLibraryOperatorTableFactory.INSTANCE.getOperatorTable(Arrays.asList(SqlLibrary.STANDARD,
 DATABASE_TYPE_SQL_LIBRARIES.getOrDefault(databaseType.getType(), 
SqlLibrary.MYSQL)));
-        return SqlOperatorTables.chain(Arrays.asList(new MySQLOperatorTable(), 
operatorTable, catalogReader));
+    private static SqlOperatorTable getSQLOperatorTable(final 
Collection<SqlOperatorTable> operatorTables, final CalciteCatalogReader 
catalogReader) {
+        Collection<SqlOperatorTable> allOperatorTables = new 
LinkedList<>(operatorTables);
+        allOperatorTables.add(catalogReader);
+        return SqlOperatorTables.chain(allOperatorTables);
     }
     
     private SqlToRelConverter createSqlToRelConverter(final 
CalciteCatalogReader catalogReader, final SqlValidator validator, final 
RelOptCluster cluster, final SQLParserRule sqlParserRule,
diff --git 
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/compiler/it/SQLStatementCompilerIT.java
 
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/compiler/it/SQLStatementCompilerIT.java
index 5c8b688d88c..77b27440c64 100644
--- 
a/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/compiler/it/SQLStatementCompilerIT.java
+++ 
b/kernel/sql-federation/compiler/src/test/java/org/apache/shardingsphere/sqlfederation/compiler/compiler/it/SQLStatementCompilerIT.java
@@ -21,6 +21,9 @@ import lombok.SneakyThrows;
 import org.apache.calcite.adapter.enumerable.EnumerableConvention;
 import org.apache.calcite.config.CalciteConnectionConfigImpl;
 import org.apache.calcite.jdbc.CalciteSchema;
+import org.apache.calcite.sql.SqlOperatorTable;
+import org.apache.calcite.sql.fun.SqlLibrary;
+import org.apache.calcite.sql.fun.SqlLibraryOperatorTableFactory;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereColumn;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
@@ -33,6 +36,7 @@ import 
org.apache.shardingsphere.sqlfederation.compiler.compiler.SQLStatementCom
 import 
org.apache.shardingsphere.sqlfederation.compiler.context.CompilerContext;
 import 
org.apache.shardingsphere.sqlfederation.compiler.metadata.schema.SQLFederationSchema;
 import 
org.apache.shardingsphere.sqlfederation.compiler.rel.converter.SQLFederationRelConverter;
+import 
org.apache.shardingsphere.sqlfederation.compiler.sql.function.mysql.MySQLOperatorTable;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -42,6 +46,7 @@ import org.junit.jupiter.params.provider.ArgumentsSource;
 
 import java.io.IOException;
 import java.sql.Types;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -79,8 +84,16 @@ class SQLStatementCompilerIT {
         CalciteSchema calciteSchema = CalciteSchema.createRootSchema(true);
         DatabaseType databaseType = 
TypedSPILoader.getService(DatabaseType.class, "H2");
         calciteSchema.add(SCHEMA_NAME, new SQLFederationSchema(SCHEMA_NAME, 
new ShardingSphereSchema("foo_db", tables, Collections.emptyList()), 
databaseType));
-        sqlStatementCompiler = new SQLStatementCompiler(new 
SQLFederationRelConverter(new CompilerContext(mock(SQLParserRule.class), 
calciteSchema, new CalciteConnectionConfigImpl(new Properties())),
-                Collections.singletonList("federate_jdbc"), databaseType, 
EnumerableConvention.INSTANCE), EnumerableConvention.INSTANCE);
+        sqlStatementCompiler = new SQLStatementCompiler(
+                new SQLFederationRelConverter(new 
CompilerContext(mock(SQLParserRule.class), calciteSchema, new 
CalciteConnectionConfigImpl(new Properties()), getOperatorTables()),
+                        Collections.singletonList("federate_jdbc"), 
databaseType, EnumerableConvention.INSTANCE),
+                EnumerableConvention.INSTANCE);
+    }
+    
+    private Collection<SqlOperatorTable> getOperatorTables() {
+        SqlOperatorTable operatorTable =
+                
SqlLibraryOperatorTableFactory.INSTANCE.getOperatorTable(Arrays.asList(SqlLibrary.STANDARD,
 SqlLibrary.MYSQL));
+        return new ArrayList<>(Arrays.asList(new MySQLOperatorTable(), 
operatorTable));
     }
     
     private ShardingSphereTable createOrderFederationTableMetaData() {

Reply via email to