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() {