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

duanzhengqiang 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 5b22782f6a6 19937 remove filterable table (#20426)
5b22782f6a6 is described below

commit 5b22782f6a6f8b7aafcdb6f7bf98274f85b85001
Author: boyjoy1127 <[email protected]>
AuthorDate: Tue Aug 23 15:38:08 2022 +0800

    19937 remove filterable table (#20426)
    
    * refactor: merge translatable federation into AdvancedFederationExecutor.
    
    * fix: unit test and code style.
---
 .../executor/FederationExecutorFactory.java        |   2 +-
 .../advanced/AdvancedFederationExecutor.java       |  25 ++--
 .../advanced/TranslatableFederationExecutor.java   | 150 ---------------------
 .../optimizer/ShardingSphereOptimizer.java         |   9 +-
 .../planner/QueryOptimizePlannerFactory.java       |  47 ++++++-
 .../optimizer/ShardingSphereOptimizerTest.java     |  62 +++++----
 6 files changed, 98 insertions(+), 197 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/FederationExecutorFactory.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/FederationExecutorFactory.java
index 3f9019f2b8e..44c80bc64b9 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/FederationExecutorFactory.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/FederationExecutorFactory.java
@@ -47,7 +47,7 @@ public final class FederationExecutorFactory {
     public static FederationExecutor newInstance(final String databaseName, 
final String schemaName, final OptimizerContext optimizerContext,
                                                  final 
ShardingSphereRuleMetaData globalRuleMetaData, final ConfigurationProperties 
props, final JDBCExecutor jdbcExecutor,
                                                  final EventBusContext 
eventBusContext) {
-        // TODO Consider about AdvancedFederationExecutor and 
TranslatableFederationExecutor
+        // TODO Consider about AdvancedFederationExecutor
         return new OriginalFederationExecutor(databaseName, schemaName, 
optimizerContext, globalRuleMetaData, props, jdbcExecutor, eventBusContext);
     }
 }
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 2db489428b0..12140cb047e 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
@@ -42,13 +42,13 @@ import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecuti
 import org.apache.shardingsphere.infra.federation.executor.FederationContext;
 import org.apache.shardingsphere.infra.federation.executor.FederationExecutor;
 import 
org.apache.shardingsphere.infra.federation.executor.advanced.resultset.FederationResultSet;
+import 
org.apache.shardingsphere.infra.federation.executor.advanced.table.TranslatableTableScanExecutor;
 import 
org.apache.shardingsphere.infra.federation.executor.common.CommonExecuteDataContext;
 import 
org.apache.shardingsphere.infra.federation.executor.common.table.CommonTableScanExecutorContext;
-import 
org.apache.shardingsphere.infra.federation.executor.original.table.FilterableTableScanExecutor;
 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.filter.FilterableSchema;
+import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.translatable.TranslatableSchema;
 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;
@@ -102,10 +102,10 @@ public final class AdvancedFederationExecutor implements 
FederationExecutor {
         SQLStatementContext<?> sqlStatementContext = 
federationContext.getQueryContext().getSqlStatementContext();
         Preconditions.checkArgument(sqlStatementContext instanceof 
SelectStatementContext, "SQL statement context must be select statement 
context.");
         ShardingSphereSchema schema = 
federationContext.getDatabases().get(databaseName.toLowerCase()).getSchema(schemaName);
-        FilterableSchema filterableSchema = 
createFilterableSchema(prepareEngine, schema, callback, federationContext);
+        TranslatableSchema translatableSchema = 
createTranslatableSchema(prepareEngine, schema, callback, federationContext);
         Map<String, Object> parameters = 
createParameters(federationContext.getQueryContext().getParameters());
-        Enumerator<Object[]> enumerator = 
execute(sqlStatementContext.getSqlStatement(), filterableSchema, 
parameters).enumerator();
-        resultSet = new FederationResultSet(enumerator, schema, 
filterableSchema, sqlStatementContext);
+        Enumerator<Object[]> enumerator = 
execute(sqlStatementContext.getSqlStatement(), translatableSchema, 
parameters).enumerator();
+        resultSet = new FederationResultSet(enumerator, schema, 
translatableSchema, sqlStatementContext);
         return resultSet;
     }
     
@@ -118,22 +118,23 @@ public final class AdvancedFederationExecutor implements 
FederationExecutor {
         return result;
     }
     
-    private FilterableSchema createFilterableSchema(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
final ShardingSphereSchema schema,
-                                                    final 
JDBCExecutorCallback<? extends ExecuteResult> callback, final FederationContext 
federationContext) {
+    private TranslatableSchema createTranslatableSchema(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
final ShardingSphereSchema schema,
+                                                        final 
JDBCExecutorCallback<? extends ExecuteResult> callback, final FederationContext 
federationContext) {
         CommonTableScanExecutorContext executorContext = new 
CommonTableScanExecutorContext(databaseName, schemaName, props, 
federationContext);
-        FilterableTableScanExecutor executor = new 
FilterableTableScanExecutor(prepareEngine, jdbcExecutor, callback, 
optimizerContext, globalRuleMetaData, executorContext, eventBusContext);
-        return new FilterableSchema(schemaName, schema, executor);
+        TranslatableTableScanExecutor executor = new 
TranslatableTableScanExecutor(prepareEngine, jdbcExecutor, callback, 
optimizerContext, globalRuleMetaData, executorContext, eventBusContext);
+        return new TranslatableSchema(schemaName, schema, executor);
     }
     
     @SuppressWarnings("unchecked")
-    private Enumerable<Object[]> execute(final SQLStatement sqlStatement, 
final FilterableSchema filterableSchema, final Map<String, Object> parameters) {
+    private Enumerable<Object[]> execute(final SQLStatement sqlStatement, 
final TranslatableSchema translatableSchema, final Map<String, Object> 
parameters) {
         // TODO remove OptimizerPlannerContextFactory call and use setup 
executor to handle this logic
         CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(OptimizerPlannerContextFactory.createConnectionProperties());
         RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
-        CalciteCatalogReader catalogReader = 
OptimizerPlannerContextFactory.createCatalogReader(schemaName, 
filterableSchema, relDataTypeFactory, connectionConfig);
+        CalciteCatalogReader catalogReader = 
OptimizerPlannerContextFactory.createCatalogReader(schemaName, 
translatableSchema, relDataTypeFactory, connectionConfig);
         SqlValidator validator = 
OptimizerPlannerContextFactory.createValidator(catalogReader, 
relDataTypeFactory, connectionConfig);
         SqlToRelConverter converter = 
OptimizerPlannerContextFactory.createConverter(catalogReader, validator, 
relDataTypeFactory);
-        RelNode bestPlan = new ShardingSphereOptimizer(converter, 
QueryOptimizePlannerFactory.createHepPlanner()).optimize(sqlStatement);
+        RelNode bestPlan =
+                new ShardingSphereOptimizer(converter, 
QueryOptimizePlannerFactory.createHepPlannerWithoutCalc(), 
QueryOptimizePlannerFactory.createHepPlannerWithCalc()).optimize(sqlStatement);
         Bindable<Object[]> executablePlan = 
EnumerableInterpretable.toBindable(Collections.emptyMap(), null, 
(EnumerableRel) bestPlan, EnumerableRel.Prefer.ARRAY);
         return executablePlan.bind(new CommonExecuteDataContext(validator, 
converter, parameters));
     }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/TranslatableFederationExecutor.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/TranslatableFederationExecutor.java
deleted file mode 100644
index b729b0d4905..00000000000
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/TranslatableFederationExecutor.java
+++ /dev/null
@@ -1,150 +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.infra.federation.executor.advanced;
-
-import com.google.common.base.Preconditions;
-import org.apache.calcite.adapter.enumerable.EnumerableInterpretable;
-import org.apache.calcite.adapter.enumerable.EnumerableRel;
-import org.apache.calcite.config.CalciteConnectionConfig;
-import org.apache.calcite.config.CalciteConnectionConfigImpl;
-import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
-import org.apache.calcite.linq4j.Enumerable;
-import org.apache.calcite.linq4j.Enumerator;
-import org.apache.calcite.prepare.CalciteCatalogReader;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.type.RelDataTypeFactory;
-import org.apache.calcite.runtime.Bindable;
-import org.apache.calcite.sql.validate.SqlValidator;
-import org.apache.calcite.sql2rel.SqlToRelConverter;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import 
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
-import 
org.apache.shardingsphere.infra.executor.sql.execute.result.ExecuteResult;
-import 
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecutionPrepareEngine;
-import org.apache.shardingsphere.infra.federation.executor.FederationContext;
-import org.apache.shardingsphere.infra.federation.executor.FederationExecutor;
-import 
org.apache.shardingsphere.infra.federation.executor.advanced.resultset.FederationResultSet;
-import 
org.apache.shardingsphere.infra.federation.executor.advanced.table.TranslatableTableScanExecutor;
-import 
org.apache.shardingsphere.infra.federation.executor.common.CommonExecuteDataContext;
-import 
org.apache.shardingsphere.infra.federation.executor.common.table.CommonTableScanExecutorContext;
-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.translatable.TranslatableSchema;
-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.infra.util.eventbus.EventBusContext;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Advanced federation executor.
- */
-public final class TranslatableFederationExecutor implements 
FederationExecutor {
-    
-    private final String databaseName;
-    
-    private final String schemaName;
-    
-    private final OptimizerContext optimizerContext;
-    
-    private final ShardingSphereRuleMetaData globalRuleMetaData;
-    
-    private final ConfigurationProperties props;
-    
-    private final JDBCExecutor jdbcExecutor;
-    
-    private final EventBusContext eventBusContext;
-    
-    private ResultSet resultSet;
-    
-    public TranslatableFederationExecutor(final String databaseName, final 
String schemaName, final OptimizerContext optimizerContext,
-                                          final ShardingSphereRuleMetaData 
globalRuleMetaData, final ConfigurationProperties props, final JDBCExecutor 
jdbcExecutor,
-                                          final EventBusContext 
eventBusContext) {
-        this.databaseName = databaseName;
-        this.schemaName = schemaName;
-        this.optimizerContext = optimizerContext;
-        this.globalRuleMetaData = globalRuleMetaData;
-        this.props = props;
-        this.jdbcExecutor = jdbcExecutor;
-        this.eventBusContext = eventBusContext;
-    }
-    
-    @Override
-    public ResultSet executeQuery(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
-                                  final JDBCExecutorCallback<? extends 
ExecuteResult> callback, final FederationContext federationContext) throws 
SQLException {
-        SQLStatementContext<?> sqlStatementContext = 
federationContext.getQueryContext().getSqlStatementContext();
-        Preconditions.checkArgument(sqlStatementContext instanceof 
SelectStatementContext, "SQL statement context must be select statement 
context.");
-        ShardingSphereSchema schema = 
federationContext.getDatabases().get(databaseName.toLowerCase()).getSchema(schemaName);
-        TranslatableSchema translatableSchema = 
createTranslatableSchema(prepareEngine, schema, callback, federationContext);
-        Map<String, Object> parameters = 
createParameters(federationContext.getQueryContext().getParameters());
-        Enumerator<Object[]> enumerator = 
execute(sqlStatementContext.getSqlStatement(), translatableSchema, 
parameters).enumerator();
-        resultSet = new FederationResultSet(enumerator, schema, 
translatableSchema, sqlStatementContext);
-        return resultSet;
-    }
-    
-    private Map<String, Object> createParameters(final List<Object> 
parameters) {
-        Map<String, Object> result = new HashMap<>(parameters.size(), 1);
-        int index = 0;
-        for (Object each : parameters) {
-            result.put("?" + index++, each);
-        }
-        return result;
-    }
-    
-    private TranslatableSchema createTranslatableSchema(final 
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine, 
final ShardingSphereSchema schema,
-                                                        final 
JDBCExecutorCallback<? extends ExecuteResult> callback, final FederationContext 
federationContext) {
-        CommonTableScanExecutorContext executorContext = new 
CommonTableScanExecutorContext(databaseName, schemaName, props, 
federationContext);
-        TranslatableTableScanExecutor executor = new 
TranslatableTableScanExecutor(prepareEngine, jdbcExecutor, callback, 
optimizerContext, globalRuleMetaData, executorContext, eventBusContext);
-        return new TranslatableSchema(schemaName, schema, executor);
-    }
-    
-    @SuppressWarnings("unchecked")
-    private Enumerable<Object[]> execute(final SQLStatement sqlStatement, 
final TranslatableSchema translatableSchema, final Map<String, Object> 
parameters) {
-        // TODO remove OptimizerPlannerContextFactory call and use setup 
executor to handle this logic
-        CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(OptimizerPlannerContextFactory.createConnectionProperties());
-        RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
-        CalciteCatalogReader catalogReader = 
OptimizerPlannerContextFactory.createCatalogReader(schemaName, 
translatableSchema, relDataTypeFactory, connectionConfig);
-        SqlValidator validator = 
OptimizerPlannerContextFactory.createValidator(catalogReader, 
relDataTypeFactory, connectionConfig);
-        SqlToRelConverter converter = 
OptimizerPlannerContextFactory.createConverter(catalogReader, validator, 
relDataTypeFactory);
-        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 CommonExecuteDataContext(validator, 
converter, parameters));
-    }
-    
-    @Override
-    public ResultSet getResultSet() {
-        return resultSet;
-    }
-    
-    @Override
-    public void close() throws SQLException {
-        resultSet.close();
-    }
-}
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 32eac8cb870..c7bd825aa15 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
@@ -34,7 +34,9 @@ public final class ShardingSphereOptimizer {
     
     private final SqlToRelConverter converter;
     
-    private final RelOptPlanner hepPlanner;
+    private final RelOptPlanner hepPlannerWithoutCalc;
+    
+    private final RelOptPlanner hepPlannerWithCalc;
     
     /**
      * Optimize query execution plan.
@@ -45,8 +47,9 @@ public final class ShardingSphereOptimizer {
     public RelNode optimize(final SQLStatement sqlStatement) {
         SqlNode sqlNode = SQLNodeConverterEngine.convert(sqlStatement);
         RelNode logicPlan = converter.convertQuery(sqlNode, true, true).rel;
-        RelNode bestPlan = optimizeWithRBO(logicPlan, hepPlanner);
-        return optimizeWithCBO(bestPlan, converter);
+        RelNode ruleBasedPlan = optimizeWithRBO(logicPlan, 
hepPlannerWithoutCalc);
+        RelNode costBasedPlan = optimizeWithCBO(ruleBasedPlan, converter);
+        return optimizeWithRBO(costBasedPlan, hepPlannerWithCalc);
     }
     
     private static RelNode optimizeWithRBO(final RelNode logicPlan, final 
RelOptPlanner hepPlanner) {
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/planner/QueryOptimizePlannerFactory.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/planner/QueryOptimizePlannerFactory.java
index 3e5ba4d590e..767abdbf7ed 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/planner/QueryOptimizePlannerFactory.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/planner/QueryOptimizePlannerFactory.java
@@ -31,6 +31,8 @@ import org.apache.calcite.rel.RelCollationTraitDef;
 import org.apache.calcite.rel.rules.AggregateExpandDistinctAggregatesRule;
 import org.apache.calcite.rel.rules.CoreRules;
 import org.apache.calcite.rel.rules.ProjectRemoveRule;
+import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.translatable.TranslatableProjectFilterRule;
+import 
org.apache.shardingsphere.infra.federation.optimizer.metadata.translatable.TranslatableProjectRule;
 
 import java.util.Collection;
 import java.util.LinkedList;
@@ -54,6 +56,32 @@ public final class QueryOptimizePlannerFactory {
         return result;
     }
     
+    /**
+     * Create new instance of hep planner without calc rules.
+     *
+     * @return hep planner instance
+     */
+    public static RelOptPlanner createHepPlannerWithoutCalc() {
+        HepProgramBuilder builder = new HepProgramBuilder();
+        
builder.addGroupBegin().addRuleCollection(getSubQueryRules()).addGroupEnd().addMatchOrder(HepMatchOrder.DEPTH_FIRST);
+        
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+        
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+        builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
+        return new HepPlanner(builder.build());
+    }
+    
+    /**
+     * Create new instance of hep planner with calc rules.
+     *
+     * @return hep planner instance
+     */
+    public static RelOptPlanner createHepPlannerWithCalc() {
+        HepProgramBuilder builder = new HepProgramBuilder();
+        
builder.addGroupBegin().addRuleCollection(getCalcRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+        builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
+        return new HepPlanner(builder.build());
+    }
+    
     /**
      * Create new instance of hep planner.
      *
@@ -64,6 +92,7 @@ public final class QueryOptimizePlannerFactory {
         
builder.addGroupBegin().addRuleCollection(getSubQueryRules()).addGroupEnd().addMatchOrder(HepMatchOrder.DEPTH_FIRST);
         
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
         
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+        
builder.addGroupBegin().addRuleCollection(getCalcRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
         builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
         return new HepPlanner(builder.build());
     }
@@ -77,8 +106,11 @@ public final class QueryOptimizePlannerFactory {
         planner.addRule(EnumerableRules.ENUMERABLE_TABLE_SCAN_RULE);
         planner.addRule(EnumerableRules.ENUMERABLE_AGGREGATE_RULE);
         planner.addRule(EnumerableRules.ENUMERABLE_FILTER_RULE);
+        planner.addRule(EnumerableRules.ENUMERABLE_PROJECT_RULE);
         planner.addRule(EnumerableRules.ENUMERABLE_CORRELATE_RULE);
         planner.addRule(EnumerableRules.ENUMERABLE_UNION_RULE);
+        planner.addRule(EnumerableRules.ENUMERABLE_FILTER_TO_CALC_RULE);
+        planner.addRule(EnumerableRules.ENUMERABLE_PROJECT_TO_CALC_RULE);
     }
     
     private static Collection<RelOptRule> getSubQueryRules() {
@@ -89,14 +121,22 @@ public final class QueryOptimizePlannerFactory {
         return result;
     }
     
-    private static Collection<RelOptRule> getProjectRules() {
+    private static Collection<RelOptRule> getCalcRules() {
         Collection<RelOptRule> result = new LinkedList<>();
         
result.add(AggregateExpandDistinctAggregatesRule.Config.DEFAULT.toRule());
-        // TODO PROJECT_TO_CALC and FILTER_TO_CALC better be removed when 
using TranslatableTableScan.
         result.add(CoreRules.PROJECT_TO_CALC);
         result.add(CoreRules.FILTER_TO_CALC);
         result.add(CoreRules.PROJECT_CALC_MERGE);
         result.add(CoreRules.FILTER_CALC_MERGE);
+        result.add(EnumerableRules.ENUMERABLE_FILTER_TO_CALC_RULE);
+        result.add(EnumerableRules.ENUMERABLE_PROJECT_TO_CALC_RULE);
+        result.add(CoreRules.CALC_MERGE);
+        return result;
+    }
+    
+    private static Collection<RelOptRule> getProjectRules() {
+        Collection<RelOptRule> result = new LinkedList<>();
+        
result.add(AggregateExpandDistinctAggregatesRule.Config.DEFAULT.toRule());
         result.add(CoreRules.PROJECT_CORRELATE_TRANSPOSE);
         result.add(CoreRules.PROJECT_SET_OP_TRANSPOSE);
         result.add(CoreRules.PROJECT_JOIN_TRANSPOSE);
@@ -104,6 +144,7 @@ public final class QueryOptimizePlannerFactory {
         result.add(CoreRules.PROJECT_FILTER_TRANSPOSE);
         result.add(CoreRules.PROJECT_REDUCE_EXPRESSIONS);
         result.add(ProjectRemoveRule.Config.DEFAULT.toRule());
+        result.add(TranslatableProjectRule.INSTANCE);
         return result;
     }
     
@@ -118,6 +159,8 @@ public final class QueryOptimizePlannerFactory {
         result.add(CoreRules.FILTER_REDUCE_EXPRESSIONS);
         result.add(CoreRules.JOIN_PUSH_EXPRESSIONS);
         result.add(CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES);
+        result.add(TranslatableProjectRule.INSTANCE);
+        result.add(TranslatableProjectFilterRule.INSTANCE);
         return result;
     }
 }
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 72ee9863a95..deb87176e98 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
@@ -100,16 +100,7 @@ public final class ShardingSphereOptimizerTest {
         tables.put("t_user_info", createUserInfoTableMetaData());
         ShardingSphereSchema schema = new ShardingSphereSchema(tables);
         SqlToRelConverter converter = createSqlToRelConverter(schema);
-        optimizer = new ShardingSphereOptimizer(converter, 
QueryOptimizePlannerFactory.createHepPlanner());
-    }
-    
-    private static SqlToRelConverter createSqlToRelConverter(final 
ShardingSphereSchema schema) {
-        CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(OptimizerPlannerContextFactory.createConnectionProperties());
-        RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
-        FilterableSchema federationSchema = new FilterableSchema(SCHEMA_NAME, 
schema, null);
-        CalciteCatalogReader catalogReader = 
OptimizerPlannerContextFactory.createCatalogReader(SCHEMA_NAME, 
federationSchema, relDataTypeFactory, connectionConfig);
-        SqlValidator validator = 
OptimizerPlannerContextFactory.createValidator(catalogReader, 
relDataTypeFactory, connectionConfig);
-        return OptimizerPlannerContextFactory.createConverter(catalogReader, 
validator, relDataTypeFactory);
+        optimizer = new ShardingSphereOptimizer(converter, 
QueryOptimizePlannerFactory.createHepPlannerWithoutCalc(), 
QueryOptimizePlannerFactory.createHepPlannerWithCalc());
     }
     
     private ShardingSphereTable createOrderTableMetaData() {
@@ -125,6 +116,15 @@ public final class ShardingSphereOptimizerTest {
         return new ShardingSphereTable("t_user_info", 
Arrays.asList(userIdColumn, informationColumn), Collections.emptyList(), 
Collections.emptyList());
     }
     
+    private static SqlToRelConverter createSqlToRelConverter(final 
ShardingSphereSchema schema) {
+        CalciteConnectionConfig connectionConfig = new 
CalciteConnectionConfigImpl(OptimizerPlannerContextFactory.createConnectionProperties());
+        RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
+        FilterableSchema federationSchema = new FilterableSchema(SCHEMA_NAME, 
schema, null);
+        CalciteCatalogReader catalogReader = 
OptimizerPlannerContextFactory.createCatalogReader(SCHEMA_NAME, 
federationSchema, relDataTypeFactory, connectionConfig);
+        SqlValidator validator = 
OptimizerPlannerContextFactory.createValidator(catalogReader, 
relDataTypeFactory, connectionConfig);
+        return OptimizerPlannerContextFactory.createConverter(catalogReader, 
validator, relDataTypeFactory);
+    }
+    
     @Test
     public void assertSelectCrossJoinCondition() {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
@@ -179,11 +179,11 @@ public final class ShardingSphereOptimizerTest {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_JOIN, 
false);
         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
+        String expected = "EnumerableCalc(expr#0..4=[{inputs}], 
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
+                + "  EnumerableHashJoin(condition=[=($2, $4)], 
joinType=[inner])" + LINE_SEPARATOR
+                + "    EnumerableCalc(expr#0..2=[{inputs}], 
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" + 
LINE_SEPARATOR
                 + "      EnumerableTableScan(table=[[federate_jdbc, 
t_order_federate]])" + LINE_SEPARATOR
-                + "    EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t0):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+                + "    EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
                 + "      EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
     }
@@ -218,12 +218,13 @@ public final class ShardingSphereOptimizerTest {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_EXIST, false);
         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
+        String expected = "EnumerableCalc(expr#0..2=[{inputs}], expr#3=[IS NOT 
NULL($t2)], proj#0..1=[{exprs}], $condition=[$t3])" + LINE_SEPARATOR
+                + "  EnumerableCorrelate(correlation=[$cor1], joinType=[left], 
requiredColumns=[{1}])" + LINE_SEPARATOR
+                + "    EnumerableCalc(expr#0..2=[{inputs}], 
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "      EnumerableTableScan(table=[[federate_jdbc, 
t_order_federate]])" + LINE_SEPARATOR
                 + "    EnumerableAggregate(group=[{}], agg#0=[MIN($0)])" + 
LINE_SEPARATOR
-                + "      EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true], 
expr#3=[$cor0], expr#4=[$t3.user_id],"
-                + " expr#5=[CAST($t4):VARCHAR], expr#6=[CAST($t0):VARCHAR], 
expr#7=[=($t5, $t6)], $f0=[$t2], $condition=[$t7])" + LINE_SEPARATOR
+                + "      EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true], 
expr#3=[$cor1], expr#4=[$t3.user_id], expr#5=[CAST($t4):VARCHAR], 
expr#6=[CAST($t0):VARCHAR], "
+                + "expr#7=[=($t5, $t6)], $f0=[$t2], $condition=[$t7])" + 
LINE_SEPARATOR
                 + "        EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
     }
@@ -233,9 +234,10 @@ public final class ShardingSphereOptimizerTest {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_IN, false);
         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
+        String expected = "EnumerableCalc(expr#0..2=[{inputs}], 
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "  EnumerableHashJoin(condition=[=($1, $2)], 
joinType=[inner])" + LINE_SEPARATOR
+                + "    EnumerableCalc(expr#0..2=[{inputs}], 
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "      EnumerableTableScan(table=[[federate_jdbc, 
t_order_federate]])" + LINE_SEPARATOR
                 + "    EnumerableAggregate(group=[{0}])" + LINE_SEPARATOR
                 + "      EnumerableCalc(expr#0..1=[{inputs}], user_id=[$t0])" 
+ LINE_SEPARATOR
                 + "        EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR;
@@ -247,13 +249,15 @@ public final class ShardingSphereOptimizerTest {
         ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_BETWEEN, false);
         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
-                + "      EnumerableTableScan(table=[[federate_jdbc, 
t_order_federate]])" + LINE_SEPARATOR
-                + "      EnumerableAggregate(group=[{}], 
agg#0=[SINGLE_VALUE($0)])" + LINE_SEPARATOR
-                + "        EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t1):VARCHAR], expr#3=['before':VARCHAR], expr#4=[=($t2, $t3)], 
user_id=[$t0], $condition=[$t4])" + LINE_SEPARATOR
-                + "          EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR
+        String expected = "EnumerableCalc(expr#0..2=[{inputs}], 
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "  EnumerableNestedLoopJoin(condition=[<=($1, $2)], 
joinType=[inner])" + LINE_SEPARATOR
+                + "    EnumerableCalc(expr#0..2=[{inputs}], 
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "      EnumerableNestedLoopJoin(condition=[>=($1, $2)], 
joinType=[inner])" + LINE_SEPARATOR
+                + "        EnumerableCalc(expr#0..2=[{inputs}], 
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "          EnumerableTableScan(table=[[federate_jdbc, 
t_order_federate]])" + LINE_SEPARATOR
+                + "        EnumerableAggregate(group=[{}], 
agg#0=[SINGLE_VALUE($0)])" + LINE_SEPARATOR
+                + "          EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t1):VARCHAR], expr#3=['before':VARCHAR], expr#4=[=($t2, $t3)], 
user_id=[$t0], $condition=[$t4])" + LINE_SEPARATOR
+                + "            EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR
                 + "    EnumerableAggregate(group=[{}], 
agg#0=[SINGLE_VALUE($0)])" + LINE_SEPARATOR
                 + "      EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=[CAST($t1):VARCHAR], expr#3=['after':VARCHAR], expr#4=[=($t2, $t3)], 
user_id=[$t0], $condition=[$t4])" + LINE_SEPARATOR
                 + "        EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR;

Reply via email to