This is an automated email from the ASF dual-hosted git repository.

zhaojinchao 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 fbbc52c149e Remove FederationSchemaMetaData usage in 
AdvancedFederationExecutor and OriginalFederationExecutor (#19779)
fbbc52c149e is described below

commit fbbc52c149e1f146803fb829670188c195cb3b20
Author: Zhengqiang Duan <duanzhengqi...@apache.org>
AuthorDate: Tue Aug 2 15:03:56 2022 +0800

    Remove FederationSchemaMetaData usage in AdvancedFederationExecutor and 
OriginalFederationExecutor (#19779)
    
    * Remove FederationSchemaMetaData usage in AdvancedFederationExecutor and 
OriginalFederationExecutor
    
    * Remove RelProtoDataType
    
    * modify java doc
---
 .../advanced/AdvancedFederationExecutor.java       |  7 ++--
 .../original/OriginalFederationExecutor.java       |  2 +-
 .../original/database/FilterableDatabase.java      | 19 +++++------
 .../executor/original/schema/FilterableSchema.java | 16 +++++-----
 .../executor/original/table/FilterableTable.java   | 25 ++++++++++++---
 .../table/FilterableTableScanExecutor.java         | 37 ++++++++++++++--------
 .../optimizer/ShardingSphereOptimizer.java         | 11 +++----
 .../optimizer/ShardingSphereOptimizerTest.java     | 35 ++++++++++----------
 8 files changed, 90 insertions(+), 62 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
index 8512655a30c..d3a0c89e6f7 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
@@ -49,7 +49,7 @@ import 
org.apache.shardingsphere.infra.federation.executor.original.table.Filter
 import 
org.apache.shardingsphere.infra.federation.optimizer.ShardingSphereOptimizer;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
-import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationSchemaMetaData;
+import 
org.apache.shardingsphere.infra.federation.optimizer.planner.QueryOptimizePlannerFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
@@ -108,8 +108,7 @@ public final class AdvancedFederationExecutor implements 
FederationExecutor {
                                                     final 
JDBCExecutorCallback<? extends ExecuteResult> callback, final FederationContext 
federationContext) {
         FilterableTableScanExecutorContext executorContext = new 
FilterableTableScanExecutorContext(databaseName, schemaName, props, 
federationContext);
         FilterableTableScanExecutor executor = new 
FilterableTableScanExecutor(prepareEngine, jdbcExecutor, callback, 
optimizerContext, globalRuleMetaData, executorContext, eventBusContext);
-        FederationSchemaMetaData schemaMetaData = new 
FederationSchemaMetaData(schemaName, schema.getTables());
-        return new FilterableSchema(schemaMetaData, executor);
+        return new FilterableSchema(schemaName, schema, executor);
     }
     
     @SuppressWarnings("unchecked")
@@ -120,7 +119,7 @@ public final class AdvancedFederationExecutor implements 
FederationExecutor {
         CalciteCatalogReader catalogReader = 
OptimizerPlannerContextFactory.createCatalogReader(schemaName, 
filterableSchema, relDataTypeFactory, connectionConfig);
         SqlValidator validator = 
OptimizerPlannerContextFactory.createValidator(catalogReader, 
relDataTypeFactory, connectionConfig);
         SqlToRelConverter converter = 
OptimizerPlannerContextFactory.createConverter(catalogReader, validator, 
relDataTypeFactory);
-        RelNode bestPlan = new ShardingSphereOptimizer(optimizerContext, 
converter).optimize(databaseName, schemaName, sqlStatement);
+        RelNode bestPlan = new ShardingSphereOptimizer(converter, 
QueryOptimizePlannerFactory.createHepPlanner()).optimize(sqlStatement);
         Bindable<Object[]> executablePlan = 
EnumerableInterpretable.toBindable(Collections.emptyMap(), null, 
(EnumerableRel) bestPlan, EnumerableRel.Prefer.ARRAY);
         return executablePlan.bind(new AdvancedExecuteDataContext(validator, 
converter));
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/OriginalFederationExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/OriginalFederationExecutor.java
index cb65c3ef85e..8dc4901bc34 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/OriginalFederationExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/OriginalFederationExecutor.java
@@ -98,7 +98,7 @@ public final class OriginalFederationExecutor implements 
FederationExecutor {
                            final JDBCExecutorCallback<? extends ExecuteResult> 
callback, final FederationContext federationContext) throws SQLException {
         FilterableTableScanExecutorContext executorContext = new 
FilterableTableScanExecutorContext(databaseName, schemaName, props, 
federationContext);
         FilterableTableScanExecutor executor = new 
FilterableTableScanExecutor(prepareEngine, jdbcExecutor, callback, 
optimizerContext, globalRuleMetaData, executorContext, eventBusContext);
-        FilterableDatabase database = new 
FilterableDatabase(optimizerContext.getFederationMetaData().getDatabase(databaseName),
 executor);
+        FilterableDatabase database = new 
FilterableDatabase(federationContext.getDatabases().get(databaseName.toLowerCase()),
 executor);
         // TODO support database.schema.table query when switch to 
CustomizedFilterableExecutor, calcite jdbc just support schema.table query now
         connection.getRootSchema().add(schemaName, 
database.getSubSchema(schemaName));
         connection.setSchema(schemaName);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/database/FilterableDatabase.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/database/FilterableDatabase.java
index 5d51705a881..d8101491f26 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/database/FilterableDatabase.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/database/FilterableDatabase.java
@@ -22,11 +22,12 @@ import org.apache.calcite.schema.Schema;
 import org.apache.calcite.schema.impl.AbstractSchema;
 import 
org.apache.shardingsphere.infra.federation.executor.original.schema.FilterableSchema;
 import 
org.apache.shardingsphere.infra.federation.executor.original.table.FilterableTableScanExecutor;
-import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
-import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationSchemaMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.Map.Entry;
 
 /**
  * Filterable database.
@@ -38,15 +39,15 @@ public final class FilterableDatabase extends 
AbstractSchema {
     
     private final Map<String, Schema> subSchemaMap;
     
-    public FilterableDatabase(final FederationDatabaseMetaData 
databaseMetaData, final FilterableTableScanExecutor executor) {
-        name = databaseMetaData.getName();
-        subSchemaMap = createSubSchemaMap(databaseMetaData, executor);
+    public FilterableDatabase(final ShardingSphereDatabase database, final 
FilterableTableScanExecutor executor) {
+        name = database.getName();
+        subSchemaMap = createSubSchemaMap(database, executor);
     }
     
-    private Map<String, Schema> createSubSchemaMap(final 
FederationDatabaseMetaData databaseMetaData, final FilterableTableScanExecutor 
executor) {
-        Map<String, Schema> result = new 
LinkedHashMap<>(databaseMetaData.getSchemas().size(), 1);
-        for (FederationSchemaMetaData each : 
databaseMetaData.getSchemas().values()) {
-            result.put(each.getName(), new FilterableSchema(each, executor));
+    private Map<String, Schema> createSubSchemaMap(final 
ShardingSphereDatabase database, final FilterableTableScanExecutor executor) {
+        Map<String, Schema> result = new 
LinkedHashMap<>(database.getSchemas().size(), 1);
+        for (Entry<String, ShardingSphereSchema> entry : 
database.getSchemas().entrySet()) {
+            result.put(entry.getKey(), new FilterableSchema(entry.getKey(), 
entry.getValue(), executor));
         }
         return result;
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/schema/FilterableSchema.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/schema/FilterableSchema.java
index ca851972870..c8770be3aac 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/schema/FilterableSchema.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/schema/FilterableSchema.java
@@ -23,8 +23,8 @@ import org.apache.calcite.schema.impl.AbstractSchema;
 import 
org.apache.shardingsphere.infra.federation.executor.original.table.FederationTableStatistic;
 import 
org.apache.shardingsphere.infra.federation.executor.original.table.FilterableTable;
 import 
org.apache.shardingsphere.infra.federation.executor.original.table.FilterableTableScanExecutor;
-import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationSchemaMetaData;
-import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationTableMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
 
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -39,14 +39,14 @@ public final class FilterableSchema extends AbstractSchema {
     
     private final Map<String, Table> tableMap;
     
-    public FilterableSchema(final FederationSchemaMetaData schemaMetaData, 
final FilterableTableScanExecutor executor) {
-        name = schemaMetaData.getName();
-        tableMap = createTableMap(schemaMetaData, executor);
+    public FilterableSchema(final String schemaName, final 
ShardingSphereSchema schema, final FilterableTableScanExecutor executor) {
+        name = schemaName;
+        tableMap = createTableMap(schema, executor);
     }
     
-    private Map<String, Table> createTableMap(final FederationSchemaMetaData 
schemaMetaData, final FilterableTableScanExecutor executor) {
-        Map<String, Table> result = new 
LinkedHashMap<>(schemaMetaData.getTables().size(), 1);
-        for (FederationTableMetaData each : 
schemaMetaData.getTables().values()) {
+    private Map<String, Table> createTableMap(final ShardingSphereSchema 
schema, final FilterableTableScanExecutor executor) {
+        Map<String, Table> result = new 
LinkedHashMap<>(schema.getTables().size(), 1);
+        for (ShardingSphereTable each : schema.getTables().values()) {
             // TODO implement table statistic logic after using custom 
operators
             result.put(each.getName(), new FilterableTable(each, executor, new 
FederationTableStatistic()));
         }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTable.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTable.java
index aa0fb7b0048..10c7908d812 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTable.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTable.java
@@ -19,14 +19,17 @@ package 
org.apache.shardingsphere.infra.federation.executor.original.table;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.calcite.DataContext;
+import org.apache.calcite.avatica.SqlType;
 import org.apache.calcite.linq4j.Enumerable;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rel.type.RelDataTypeFactory.Builder;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.schema.ProjectableFilterableTable;
 import org.apache.calcite.schema.Statistic;
 import org.apache.calcite.schema.impl.AbstractTable;
-import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationTableMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereColumn;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
 
 import java.util.List;
 
@@ -36,7 +39,7 @@ import java.util.List;
 @RequiredArgsConstructor
 public final class FilterableTable extends AbstractTable implements 
ProjectableFilterableTable {
     
-    private final FederationTableMetaData metaData;
+    private final ShardingSphereTable table;
     
     private final FilterableTableScanExecutor executor;
     
@@ -44,16 +47,30 @@ public final class FilterableTable extends AbstractTable 
implements ProjectableF
     
     @Override
     public RelDataType getRowType(final RelDataTypeFactory typeFactory) {
-        return metaData.getRelProtoDataType().apply(typeFactory);
+        return createRelDataType(table, typeFactory);
     }
     
     @Override
     public Enumerable<Object[]> scan(final DataContext root, final 
List<RexNode> filters, final int[] projects) {
-        return executor.execute(metaData, new FilterableTableScanContext(root, 
filters, projects));
+        return executor.execute(table, new FilterableTableScanContext(root, 
filters, projects));
     }
     
     @Override
     public Statistic getStatistic() {
         return statistic;
     }
+    
+    private RelDataType createRelDataType(final ShardingSphereTable table, 
final RelDataTypeFactory typeFactory) {
+        Builder fieldInfoBuilder = typeFactory.builder();
+        for (ShardingSphereColumn each : table.getColumns().values()) {
+            fieldInfoBuilder.add(each.getName(), getRelDataType(each, 
typeFactory));
+        }
+        return fieldInfoBuilder.build();
+    }
+    
+    private RelDataType getRelDataType(final ShardingSphereColumn column, 
final RelDataTypeFactory typeFactory) {
+        Class<?> sqlTypeClass = SqlType.valueOf(column.getDataType()).clazz;
+        RelDataType javaType = typeFactory.createJavaType(sqlTypeClass);
+        return typeFactory.createTypeWithNullability(javaType, true);
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
index dfba55c9652..81a31241847 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/original/table/FilterableTableScanExecutor.java
@@ -19,14 +19,18 @@ package 
org.apache.shardingsphere.infra.federation.executor.original.table;
 
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
+import org.apache.calcite.config.CalciteConnectionConfig;
+import org.apache.calcite.config.CalciteConnectionConfigImpl;
+import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
 import org.apache.calcite.linq4j.AbstractEnumerable;
 import org.apache.calcite.linq4j.Enumerable;
 import org.apache.calcite.linq4j.Enumerator;
 import org.apache.calcite.plan.RelOptCluster;
-import org.apache.calcite.plan.RelOptSchema;
+import org.apache.calcite.prepare.CalciteCatalogReader;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.core.RelFactories;
 import org.apache.calcite.rel.rel2sql.RelToSqlConverter;
+import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.sql.SqlDialect;
 import org.apache.calcite.sql.util.SqlString;
@@ -37,7 +41,6 @@ import 
org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
 import org.apache.shardingsphere.infra.context.kernel.KernelProcessor;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
-import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroup;
 import 
org.apache.shardingsphere.infra.executor.kernel.model.ExecutionGroupContext;
@@ -56,13 +59,18 @@ import 
org.apache.shardingsphere.infra.federation.executor.FederationContext;
 import 
org.apache.shardingsphere.infra.federation.executor.original.SQLDialectFactory;
 import 
org.apache.shardingsphere.infra.federation.executor.original.row.EmptyRowEnumerator;
 import 
org.apache.shardingsphere.infra.federation.executor.original.row.FilterableRowEnumerator;
+import 
org.apache.shardingsphere.infra.federation.executor.original.schema.FilterableSchema;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
-import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationTableMetaData;
+import 
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
+import 
org.apache.shardingsphere.infra.federation.optimizer.planner.QueryOptimizePlannerFactory;
 import org.apache.shardingsphere.infra.merge.MergeEngine;
 import org.apache.shardingsphere.infra.merge.result.MergedResult;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereTable;
 import org.apache.shardingsphere.infra.parser.sql.SQLStatementParserEngine;
+import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.sql.Connection;
@@ -100,15 +108,15 @@ public final class FilterableTableScanExecutor {
     /**
      * Execute.
      *
-     * @param tableMetaData federation table meta data
+     * @param table table meta data
      * @param scanContext filterable table scan context
      * @return query results
      */
-    public Enumerable<Object[]> execute(final FederationTableMetaData 
tableMetaData, final FilterableTableScanContext scanContext) {
+    public Enumerable<Object[]> execute(final ShardingSphereTable table, final 
FilterableTableScanContext scanContext) {
         String databaseName = executorContext.getDatabaseName();
         String schemaName = executorContext.getSchemaName();
         DatabaseType databaseType = 
DatabaseTypeEngine.getTrunkDatabaseType(optimizerContext.getParserContexts().get(databaseName).getDatabaseType().getType());
-        SqlString sqlString = createSQLString(tableMetaData, scanContext, 
SQLDialectFactory.getSQLDialect(databaseType));
+        SqlString sqlString = createSQLString(table, scanContext, 
SQLDialectFactory.getSQLDialect(databaseType));
         // TODO replace sql parse with sql convert
         FederationContext federationContext = 
executorContext.getFederationContext();
         LogicSQL logicSQL = createLogicSQL(federationContext.getDatabases(), 
sqlString, databaseType);
@@ -161,8 +169,8 @@ public final class FilterableTableScanExecutor {
         return result;
     }
     
-    private SqlString createSQLString(final FederationTableMetaData 
tableMetaData, final FilterableTableScanContext scanContext, final SqlDialect 
sqlDialect) {
-        return new 
RelToSqlConverter(sqlDialect).visitRoot(createRelNode(tableMetaData, 
scanContext)).asStatement().toSqlString(sqlDialect);
+    private SqlString createSQLString(final ShardingSphereTable table, final 
FilterableTableScanContext scanContext, final SqlDialect sqlDialect) {
+        return new 
RelToSqlConverter(sqlDialect).visitRoot(createRelNode(table, 
scanContext)).asStatement().toSqlString(sqlDialect);
     }
     
     private void setParameters(final 
Collection<ExecutionGroup<JDBCExecutionUnit>> inputGroups) {
@@ -184,14 +192,17 @@ public final class FilterableTableScanExecutor {
         }
     }
     
-    private RelNode createRelNode(final FederationTableMetaData tableMetaData, 
final FilterableTableScanContext scanContext) {
+    private RelNode createRelNode(final ShardingSphereTable table, final 
FilterableTableScanContext scanContext) {
         String databaseName = executorContext.getDatabaseName();
         String schemaName = executorContext.getSchemaName();
-        RelOptCluster relOptCluster = 
optimizerContext.getPlannerContexts().get(databaseName).getConverters().get(schemaName).getCluster();
-        RelOptSchema relOptSchema = (RelOptSchema) 
optimizerContext.getPlannerContexts().get(databaseName).getValidators().get(schemaName).getCatalogReader();
-        RelBuilder builder = 
RelFactories.LOGICAL_BUILDER.create(relOptCluster, 
relOptSchema).scan(tableMetaData.getName()).filter(scanContext.getFilters());
+        CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(OptimizerPlannerContextFactory.createConnectionProperties());
+        ShardingSphereSchema schema = 
executorContext.getFederationContext().getDatabases().get(databaseName).getSchema(schemaName);
+        CalciteCatalogReader catalogReader = 
OptimizerPlannerContextFactory.createCatalogReader(schemaName,
+                new FilterableSchema(schemaName, schema, null), new 
JavaTypeFactoryImpl(), connectionConfig);
+        RelOptCluster relOptCluster = 
RelOptCluster.create(QueryOptimizePlannerFactory.createVolcanoPlanner(), new 
RexBuilder(new JavaTypeFactoryImpl()));
+        RelBuilder builder = 
RelFactories.LOGICAL_BUILDER.create(relOptCluster, 
catalogReader).scan(table.getName()).filter(scanContext.getFilters());
         if (null != scanContext.getProjects()) {
-            builder.project(createProjections(scanContext.getProjects(), 
builder, tableMetaData.getColumnNames()));
+            builder.project(createProjections(scanContext.getProjects(), 
builder, table.getColumnNames()));
         }
         return builder.build();
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizer.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizer.java
index 27eac3e72b9..ae1b595981e 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizer.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizer.java
@@ -24,7 +24,6 @@ import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql2rel.SqlToRelConverter;
 import org.apache.shardingsphere.infra.exception.ShardingSphereException;
-import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.converter.SQLNodeConverterEngine;
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
@@ -34,23 +33,21 @@ import 
org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 @RequiredArgsConstructor
 public final class ShardingSphereOptimizer {
     
-    private final OptimizerContext context;
-    
     private final SqlToRelConverter converter;
     
+    private final RelOptPlanner hepPlanner;
+    
     /**
      * Optimize query execution plan.
      * 
-     * @param databaseName database name
-     * @param schemaName schema name
      * @param sqlStatement SQL statement
      * @return optimized relational node
      */
-    public RelNode optimize(final String databaseName, final String 
schemaName, final SQLStatement sqlStatement) {
+    public RelNode optimize(final SQLStatement sqlStatement) {
         try {
             SqlNode sqlNode = 
SQLNodeConverterEngine.convertToSQLNode(sqlStatement);
             RelNode logicPlan = converter.convertQuery(sqlNode, true, 
true).rel;
-            RelNode bestPlan = optimizeWithRBO(logicPlan, 
context.getPlannerContexts().get(databaseName).getHepPlanners().get(schemaName));
+            RelNode bestPlan = optimizeWithRBO(logicPlan, hepPlanner);
             return optimizeWithCBO(bestPlan, converter);
         } catch (final UnsupportedOperationException ex) {
             throw new ShardingSphereException(ex);
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
index 63f09b94dc9..a36e9667cfe 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
@@ -17,10 +17,12 @@
 
 package org.apache.shardingsphere.infra.federation.optimizer;
 
+import org.apache.calcite.sql2rel.SqlToRelConverter;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
 import 
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContextFactory;
+import 
org.apache.shardingsphere.infra.federation.optimizer.planner.QueryOptimizePlannerFactory;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
@@ -87,9 +89,9 @@ public final class ShardingSphereOptimizerTest {
             + "WHERE user_id BETWEEN (SELECT user_id FROM t_user_info WHERE 
information = 'before') "
             + "AND (SELECT user_id FROM t_user_info WHERE information = 
'after')";
     
-    private final String databaseName = "sharding_db";
+    private static final String DATABASE_NAME = "sharding_db";
     
-    private final String schemaName = "federate_jdbc";
+    private static final String SCHEMA_NAME = "federate_jdbc";
     
     private final SQLParserRule sqlParserRule = new SQLParserRule(new 
DefaultSQLParserRuleConfigurationBuilder().build());
     
@@ -100,10 +102,11 @@ public final class ShardingSphereOptimizerTest {
         Map<String, ShardingSphereTable> tables = new HashMap<>(2, 1);
         tables.put("t_order_federate", createOrderTableMetaData());
         tables.put("t_user_info", createUserInfoTableMetaData());
-        ShardingSphereDatabase database = new 
ShardingSphereDatabase(databaseName,
-                new H2DatabaseType(), mockResource(), null, 
Collections.singletonMap(schemaName, new ShardingSphereSchema(tables)));
-        OptimizerContext optimizerContext = 
OptimizerContextFactory.create(Collections.singletonMap(databaseName, 
database), createGlobalRuleMetaData());
-        optimizer = new ShardingSphereOptimizer(optimizerContext, 
optimizerContext.getPlannerContexts().get(databaseName).getConverters().get(schemaName));
+        ShardingSphereDatabase database = new 
ShardingSphereDatabase(DATABASE_NAME,
+                new H2DatabaseType(), mockResource(), null, 
Collections.singletonMap(SCHEMA_NAME, new ShardingSphereSchema(tables)));
+        OptimizerContext optimizerContext = 
OptimizerContextFactory.create(Collections.singletonMap(DATABASE_NAME, 
database), createGlobalRuleMetaData());
+        SqlToRelConverter sqlToRelConverter = 
optimizerContext.getPlannerContexts().get(DATABASE_NAME).getConverters().get(SCHEMA_NAME);
+        optimizer = new ShardingSphereOptimizer(sqlToRelConverter, 
QueryOptimizePlannerFactory.createHepPlanner());
     }
     
     private ShardingSphereRuleMetaData createGlobalRuleMetaData() {
@@ -136,7 +139,7 @@ public final class ShardingSphereOptimizerTest {
     public void assertSelectCrossJoinCondition() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_CROSS_JOIN_CONDITION, false);
-        String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
+        String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..6=[{inputs}], 
proj#0..1=[{exprs}], user_id0=[$t4])" + LINE_SEPARATOR
                 + "  EnumerableHashJoin(condition=[=($3, $6)], 
joinType=[inner])" + LINE_SEPARATOR
                 + "    EnumerableCalc(expr#0..2=[{inputs}], 
expr#3=[CAST($t1):VARCHAR], proj#0..3=[{exprs}])" + LINE_SEPARATOR
@@ -151,7 +154,7 @@ public final class ShardingSphereOptimizerTest {
     public void assertSelectWhereAllFields() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_WHERE_ALL_FIELDS, false);
-        String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
+        String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t0):INTEGER], expr#3=[12], expr#4=[=($t2, $t3)], 
proj#0..1=[{exprs}], $condition=[$t4])" + LINE_SEPARATOR
                 + "  EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
@@ -161,7 +164,7 @@ public final class ShardingSphereOptimizerTest {
     public void assertSelectWhereSingleField() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_WHERE_SINGLE_FIELD, false);
-        String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
+        String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t0):INTEGER], expr#3=[12], expr#4=[=($t2, $t3)], user_id=[$t0], 
$condition=[$t4])" + LINE_SEPARATOR
                 + "  EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
@@ -171,7 +174,7 @@ public final class ShardingSphereOptimizerTest {
     public void assertSelectCrossWhere() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_WHERE, 
false);
-        String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
+        String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..6=[{inputs}], 
proj#0..1=[{exprs}], user_id0=[$t4])" + LINE_SEPARATOR
                 + "  EnumerableHashJoin(condition=[=($3, $6)], 
joinType=[inner])" + LINE_SEPARATOR
                 + "    EnumerableCalc(expr#0..2=[{inputs}], 
expr#3=[CAST($t1):VARCHAR], proj#0..3=[{exprs}])" + LINE_SEPARATOR
@@ -185,7 +188,7 @@ public final class ShardingSphereOptimizerTest {
     public void assertSelectCrossJoin() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_JOIN, 
false);
-        String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
+        String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..6=[{inputs}], 
proj#0..1=[{exprs}], user_id0=[$t4])" + LINE_SEPARATOR
                 + "  EnumerableHashJoin(condition=[=($3, $6)], 
joinType=[inner])" + LINE_SEPARATOR
                 + "    EnumerableCalc(expr#0..2=[{inputs}], 
expr#3=[CAST($t1):VARCHAR], proj#0..3=[{exprs}])" + LINE_SEPARATOR
@@ -199,7 +202,7 @@ public final class ShardingSphereOptimizerTest {
     public void assertSelectJoinWhere() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_CROSS_WHERE_CONDITION, false);
-        String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
+        String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..6=[{inputs}], 
proj#0..1=[{exprs}], user_id0=[$t4])" + LINE_SEPARATOR
                 + "  EnumerableHashJoin(condition=[=($3, $6)], 
joinType=[inner])" + LINE_SEPARATOR
                 + "    EnumerableCalc(expr#0..2=[{inputs}], 
expr#3=[CAST($t1):VARCHAR], proj#0..3=[{exprs}])" + LINE_SEPARATOR
@@ -214,7 +217,7 @@ public final class ShardingSphereOptimizerTest {
     public void assertSelectSubQueryFrom() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_FROM, false);
-        String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
+        String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t0):INTEGER], expr#3=[1], expr#4=[>($t2, $t3)], 
proj#0..1=[{exprs}], $condition=[$t4])" + LINE_SEPARATOR
                 + "  EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
@@ -224,7 +227,7 @@ public final class ShardingSphereOptimizerTest {
     public void assertSelectSubQueryWhereExist() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_EXIST, false);
-        String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
+        String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..3=[{inputs}], expr#4=[IS NOT 
NULL($t3)], proj#0..1=[{exprs}], $condition=[$t4])" + LINE_SEPARATOR
                 + "  EnumerableCorrelate(correlation=[$cor0], joinType=[left], 
requiredColumns=[{1}])" + LINE_SEPARATOR
                 + "    EnumerableTableScan(table=[[federate_jdbc, 
t_order_federate]])" + LINE_SEPARATOR
@@ -239,7 +242,7 @@ public final class ShardingSphereOptimizerTest {
     public void assertSelectSubQueryWhereIn() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_IN, false);
-        String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
+        String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..3=[{inputs}], 
proj#0..1=[{exprs}])" + LINE_SEPARATOR
                 + "  EnumerableHashJoin(condition=[=($1, $3)], 
joinType=[inner])" + LINE_SEPARATOR
                 + "    EnumerableTableScan(table=[[federate_jdbc, 
t_order_federate]])" + LINE_SEPARATOR
@@ -253,7 +256,7 @@ public final class ShardingSphereOptimizerTest {
     public void assertSelectSubQueryWhereBetween() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_BETWEEN, false);
-        String actual = optimizer.optimize(databaseName, schemaName, 
sqlStatement).explain();
+        String actual = optimizer.optimize(sqlStatement).explain();
         String expected = "EnumerableCalc(expr#0..4=[{inputs}], 
proj#0..1=[{exprs}])" + LINE_SEPARATOR
                 + "  EnumerableNestedLoopJoin(condition=[<=($1, $4)], 
joinType=[inner])" + LINE_SEPARATOR
                 + "    EnumerableNestedLoopJoin(condition=[>=($1, $3)], 
joinType=[inner])" + LINE_SEPARATOR

Reply via email to