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 f662e53  Modify the initialization of the volcano planner (#12835)
f662e53 is described below

commit f662e5340e7d96d71f434d9682e24668a24e28b9
Author: coco <[email protected]>
AuthorDate: Fri Oct 1 11:32:45 2021 +0800

    Modify the initialization of the volcano planner (#12835)
    
    * refactor: modify the initialization of the volcano planneand
     related tests.
    
    * style: mdoify code style.
    
    * feat: add rules to push down filter.
    
    * feat: add rules to push down project.
---
 .../sql/federate/FederateJDBCExecutorTest.java     | 62 +++++++++++++++++++---
 .../planner/QueryOptimizePlannerFactory.java       | 27 ++++++----
 2 files changed, 72 insertions(+), 17 deletions(-)

diff --git 
a/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/federate/FederateJDBCExecutorTest.java
 
b/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/federate/FederateJDBCExecutorTest.java
index 1633f17..a44e98d 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/federate/FederateJDBCExecutorTest.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-executor/src/test/java/org/apache/shardingsphere/infra/executor/sql/federate/FederateJDBCExecutorTest.java
@@ -46,11 +46,22 @@ import static org.mockito.Mockito.when;
 
 public final class FederateJDBCExecutorTest {
     
-    private static final String 
SELECT_SQL_BY_ID_ACROSS_SINGLE_AND_SHARDING_TABLES =
-        "SELECT t_order_federate.order_id, t_order_federate.user_id, 
t_user_info.information "
+    private static final String SELECT_WHERE_ALL_FIELDS =
+        "SELECT user_id, information FROM t_user_info WHERE user_id = 12";
+    
+    private static final String SELECT_WHERE_SINGLE_FIELD =
+        "SELECT user_id FROM t_user_info WHERE user_id = 12";
+    
+    private static final String SELECT_JOIN =
+        "SELECT t_order_federate.order_id, t_order_federate.user_id, 
t_user_info.user_id "
             + "FROM t_order_federate , t_user_info "
             + "WHERE t_order_federate.user_id = t_user_info.user_id";
     
+    private static final String SELECT_JOIN_WHERE =
+        "SELECT t_order_federate.order_id, t_order_federate.user_id, 
t_user_info.user_id "
+            + "FROM t_order_federate ,t_user_info "
+            + "WHERE t_order_federate.user_id = t_user_info.user_id AND 
t_user_info.user_id = 13";
+    
     private final String schemaName = "federate_jdbc";
     
     private ShardingSphereOptimizer optimizer;
@@ -84,15 +95,50 @@ public final class FederateJDBCExecutorTest {
     }
     
     @Test
-    public void assertSimpleSelect() {
+    public void assertSelectWhereAllFields() {
         ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
                 DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
-        SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SQL_BY_ID_ACROSS_SINGLE_AND_SHARDING_TABLES, 
false);
+        SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_WHERE_ALL_FIELDS, false);
+        String actual = optimizer.optimize(schemaName, sqlStatement).explain();
+        String expected = "EnumerableInterpreter"
+            + 
"BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($0):INTEGER,12)]])";
+        assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
+    }
+    
+    @Test
+    public void assertSelectWhereSingleField() {
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
+            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
+        SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_WHERE_SINGLE_FIELD, false);
+        String actual = optimizer.optimize(schemaName, sqlStatement).explain();
+        String expected = "EnumerableInterpreter"
+            + 
"BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($0):INTEGER,12)]],projects=[[0]])";
+        assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
+    }
+    
+    @Test
+    public void assertSelectJoin() {
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
+            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
+        SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_JOIN, false);
+        String actual = optimizer.optimize(schemaName, sqlStatement).explain();
+        String expected = "EnumerableInterpreter"
+            + 
"BindableJoin(condition=[=(CAST($1):VARCHAR,CAST($2):VARCHAR)],joinType=[inner])"
+            + "  
BindableTableScan(table=[[federate_jdbc,t_order_federate]],projects=[[0,1]])"
+            + "  
BindableTableScan(table=[[federate_jdbc,t_user_info]],projects=[[0]])";
+        assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
+    }
+    
+    @Test
+    public void assertSelectJoinWhere() {
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
+            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
+        SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_JOIN_WHERE, 
false);
         String actual = optimizer.optimize(schemaName, sqlStatement).explain();
-        String expected = 
"EnumerableCalc(expr#0..4=[{inputs}],expr#5=[CAST($t1):VARCHAR],expr#6=[CAST($t3):VARCHAR],expr#7=[=($t5,$t6)],proj#0..1=[{exprs}],information=[$t4],$condition=[$t7])"
-                + "  
EnumerableNestedLoopJoin(condition=[true],joinType=[inner])"
-                + "    
EnumerableTableScan(table=[[federate_jdbc,t_order_federate]])"
-                + "    
EnumerableTableScan(table=[[federate_jdbc,t_user_info]])";
+        String expected = "EnumerableInterpreter"
+            + 
"BindableJoin(condition=[=(CAST($1):VARCHAR,CAST($2):VARCHAR)],joinType=[inner])"
+            + "  
BindableTableScan(table=[[federate_jdbc,t_order_federate]],projects=[[0,1]])"
+            + "  
BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($0):INTEGER,13)]],projects=[[0]])";
         assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/planner/QueryOptimizePlannerFactory.java
 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/planner/QueryOptimizePlannerFactory.java
index 971f04c..b234474 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/planner/QueryOptimizePlannerFactory.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/planner/QueryOptimizePlannerFactory.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.infra.optimize.planner;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import org.apache.calcite.adapter.enumerable.EnumerableRules;
+import org.apache.calcite.interpreter.Bindables;
 import org.apache.calcite.plan.ConventionTraitDef;
 import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.volcano.VolcanoPlanner;
@@ -33,7 +34,7 @@ public final class QueryOptimizePlannerFactory {
     
     /**
      * Create new instance of query optimize planner.
-     * 
+     *
      * @return new instance of query optimize planner
      */
     public static RelOptPlanner newInstance() {
@@ -43,18 +44,26 @@ public final class QueryOptimizePlannerFactory {
     }
     
     private static RelOptPlanner createPlanner() {
-        // TODO consider about HepPlanner
         return new VolcanoPlanner();
     }
     
     private static void setUpRules(final RelOptPlanner planner) {
-        planner.addRule(CoreRules.PROJECT_TO_CALC);
-        planner.addRule(CoreRules.FILTER_TO_CALC);
-        planner.addRule(EnumerableRules.ENUMERABLE_LIMIT_RULE);
-        planner.addRule(EnumerableRules.ENUMERABLE_JOIN_RULE);
-        planner.addRule(EnumerableRules.ENUMERABLE_SORT_RULE);
-        planner.addRule(EnumerableRules.ENUMERABLE_TABLE_SCAN_RULE);
-        planner.addRule(EnumerableRules.ENUMERABLE_CALC_RULE);
         planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
+        planner.addRule(EnumerableRules.TO_INTERPRETER);
+        planner.addRule(Bindables.FROM_NONE_RULE);
+        planner.addRule(Bindables.BINDABLE_TABLE_SCAN_RULE);
+        planner.addRule(Bindables.BINDABLE_FILTER_RULE);
+        planner.addRule(Bindables.BINDABLE_PROJECT_RULE);
+        planner.addRule(Bindables.BINDABLE_SORT_RULE);
+        planner.addRule(Bindables.BINDABLE_JOIN_RULE);
+        planner.addRule(Bindables.BINDABLE_SET_OP_RULE);
+        planner.addRule(Bindables.BINDABLE_VALUES_RULE);
+        planner.addRule(Bindables.BINDABLE_AGGREGATE_RULE);
+        planner.addRule(Bindables.BINDABLE_MATCH_RULE);
+        planner.addRule(CoreRules.FILTER_SCAN);
+        planner.addRule(CoreRules.PROJECT_FILTER_TRANSPOSE);
+        planner.addRule(CoreRules.FILTER_INTO_JOIN);
+        planner.addRule(CoreRules.PROJECT_TABLE_SCAN);
+        planner.addRule(CoreRules.PROJECT_JOIN_TRANSPOSE);
     }
 }

Reply via email to