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 1beb261  feat: change rules and add sub-query test. (#12972)
1beb261 is described below

commit 1beb26125aff7ea315ec9e23f8aee5d9f2878052
Author: coco <[email protected]>
AuthorDate: Mon Oct 11 10:49:11 2021 +0800

    feat: change rules and add sub-query test. (#12972)
---
 .../sql/federate/FederateJDBCExecutorTest.java     | 110 ++++++++++++++++-----
 .../planner/QueryOptimizePlannerFactory.java       |  29 +-----
 2 files changed, 87 insertions(+), 52 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 9b25f78..217ed13 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
@@ -80,6 +80,15 @@ public final class FederateJDBCExecutorTest {
         "SELECT t_order_federate.order_id, t_order_federate.user_id FROM 
t_order_federate "
             + "WHERE EXISTS (SELECT * FROM t_user_info WHERE 
t_order_federate.user_id = t_user_info.user_id)";
     
+    private static final String SELECT_SUBQUERY_WHERE_IN =
+        "SELECT t_order_federate.order_id, t_order_federate.user_id FROM 
t_order_federate "
+            + "WHERE t_order_federate.user_id IN (SELECT t_user_info.user_id 
FROM t_user_info)";
+    
+    private static final String SELECT_SUBQUERY_WHERE_BETWEEN =
+        "SELECT t_order_federate.order_id, t_order_federate.user_id FROM 
t_order_federate "
+            + "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 schemaName = "federate_jdbc";
     
     private ShardingSphereOptimizer optimizer;
@@ -118,12 +127,13 @@ public final class FederateJDBCExecutorTest {
             DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_CROSS_JOIN_CONDITION, false);
         String actual = optimizer.optimize(schemaName, sqlStatement).explain();
-        String expected = 
"EnumerableCalc(expr#0..4=[{inputs}],proj#0..1=[{exprs}],user_id0=[$t3])"
-            + "  
EnumerableInterpreterBindableJoin(condition=[=($2,$4)],joinType=[inner])"
-            + "    
BindableProject(order_id=[$0],user_id=[$1],user_id0=[CAST($1):VARCHAR])"
-            + "      
BindableTableScan(table=[[federate_jdbc,t_order_federate]],projects=[[0,1]])"
-            + "    BindableProject(user_id=[$0],user_id0=[CAST($0):VARCHAR])"
-            + "      
BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($0):INTEGER,13)]],projects=[[0]])";
+        String expected = 
+              
"EnumerableCalc(expr#0..6=[{inputs}],order_id=[$t3],user_id=[$t4],user_id0=[$t0])"
+            + "  EnumerableHashJoin(condition=[=($2,$6)],joinType=[inner])"
+            + "    
EnumerableCalc(expr#0..1=[{inputs}],expr#2=[CAST($t0):VARCHAR],proj#0..2=[{exprs}])"
+            + "      
EnumerableInterpreterBindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($0):INTEGER,13)]])"
+            + "    
EnumerableCalc(expr#0..2=[{inputs}],expr#3=[CAST($t1):VARCHAR],proj#0..3=[{exprs}])"
+            + "      
EnumerableTableScan(table=[[federate_jdbc,t_order_federate]])";
         assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
     }
     
@@ -133,8 +143,9 @@ public final class FederateJDBCExecutorTest {
                 DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
         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)]])";
+        String expected =
+              "EnumerableInterpreter"
+            + "  
BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($0):INTEGER,12)]])";
         assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
     }
     
@@ -144,8 +155,9 @@ public final class FederateJDBCExecutorTest {
             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]])";
+        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*", "")));
     }
     
@@ -155,10 +167,15 @@ public final class FederateJDBCExecutorTest {
             DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_WHERE, 
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]])";
+        String expected =
+              
"EnumerableCalc(expr#0..6=[{inputs}],order_id=[$t3],user_id=[$t4],user_id0=[$t0])"
+            + "  EnumerableMergeJoin(condition=[=($2,$6)],joinType=[inner])"
+            + "    EnumerableSort(sort0=[$2],dir0=[ASC])"
+            + "      
EnumerableCalc(expr#0..1=[{inputs}],expr#2=[CAST($t0):VARCHAR],proj#0..2=[{exprs}])"
+            + "        
EnumerableTableScan(table=[[federate_jdbc,t_user_info]])"
+            + "    EnumerableSort(sort0=[$3],dir0=[ASC])"
+            + "      
EnumerableCalc(expr#0..2=[{inputs}],expr#3=[CAST($t1):VARCHAR],proj#0..3=[{exprs}])"
+            + "        
EnumerableTableScan(table=[[federate_jdbc,t_order_federate]])";
         assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
     }
     
@@ -168,12 +185,15 @@ public final class FederateJDBCExecutorTest {
             DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_JOIN, 
false);
         String actual = optimizer.optimize(schemaName, sqlStatement).explain();
-        String expected = 
"EnumerableCalc(expr#0..4=[{inputs}],proj#0..1=[{exprs}],user_id0=[$t3])"
-            + 
"EnumerableInterpreterBindableJoin(condition=[=($2,$4)],joinType=[inner])"
-            + "    
BindableProject(order_id=[$0],user_id=[$1],user_id0=[CAST($1):VARCHAR])"
-            + "      
BindableTableScan(table=[[federate_jdbc,t_order_federate]],projects=[[0,1]])"
-            + "    BindableProject(user_id=[$0],user_id0=[CAST($0):VARCHAR])"
-            + "      
BindableTableScan(table=[[federate_jdbc,t_user_info]],projects=[[0]])";
+        String expected = 
+              
"EnumerableCalc(expr#0..6=[{inputs}],proj#0..1=[{exprs}],user_id0=[$t4])"
+            + "  EnumerableMergeJoin(condition=[=($3,$6)],joinType=[inner])"
+            + "    EnumerableSort(sort0=[$3],dir0=[ASC])"
+            + "      
EnumerableCalc(expr#0..2=[{inputs}],expr#3=[CAST($t1):VARCHAR],proj#0..3=[{exprs}])"
+            + "        
EnumerableTableScan(table=[[federate_jdbc,t_order_federate]])"
+            + "    EnumerableSort(sort0=[$2],dir0=[ASC])"
+            + "      
EnumerableCalc(expr#0..1=[{inputs}],expr#2=[CAST($t0):VARCHAR],proj#0..2=[{exprs}])"
+            + "        
EnumerableTableScan(table=[[federate_jdbc,t_user_info]])";
         assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
     }
     
@@ -183,10 +203,11 @@ public final class FederateJDBCExecutorTest {
             DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_CROSS_WHERE_CONDITION, 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]],filters=[[=(CAST($0):INTEGER,13)]],projects=[[0]])";
+        String expected =
+              
"EnumerableCalc(expr#0..4=[{inputs}],proj#0..1=[{exprs}],user_id0=[$t3])"
+            + "  
EnumerableInterpreterBindableJoin(condition=[=(CAST($1):VARCHAR,CAST($3):VARCHAR)],joinType=[inner])"
+            + "    BindableTableScan(table=[[federate_jdbc,t_order_federate]])"
+            + "    
BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($0):INTEGER,13)]])";
         assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
     }
     
@@ -196,8 +217,9 @@ public final class FederateJDBCExecutorTest {
             DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
         SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_FROM, false);
         String actual = optimizer.optimize(schemaName, sqlStatement).explain();
-        String expected = "EnumerableInterpreter"
-            + 
"BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[>(CAST($0):INTEGER,1)]])";
+        String expected =
+              "EnumerableInterpreter"
+            + "  
BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[>(CAST($0):INTEGER,1)]])";
         assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
     }
     
@@ -210,10 +232,44 @@ public final class FederateJDBCExecutorTest {
         String expected = 
               
"EnumerableCalc(expr#0..3=[{inputs}],expr#4=[ISNOTNULL($t3)],proj#0..1=[{exprs}],$condition=[$t4])"
             + "  
EnumerableCorrelate(correlation=[$cor0],joinType=[left],requiredColumns=[{1}]) "
-            + "    
EnumerableInterpreterBindableTableScan(table=[[federate_jdbc,t_order_federate]])
 "
+            + "    
EnumerableTableScan(table=[[federate_jdbc,t_order_federate]]) "
             + "    
EnumerableInterpreterBindableAggregate(group=[{}],agg#0=[MIN($0)]) "
             + "      BindableProject($f0=[true]) "
             + "        
BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($cor0.user_id):VARCHAR,CAST($0):VARCHAR)]],projects=[[0]])
 ";
         assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
     }
+    
+    @Test
+    public void assertSelectSubQueryWhereIn() {
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
+            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
+        SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_IN, false);
+        String actual = optimizer.optimize(schemaName, sqlStatement).explain();
+        String expected = 
+                  "EnumerableInterpreter"
+                + "  BindableProject(order_id=[$0],user_id=[$1])"
+                + "    BindableJoin(condition=[=($1,$3)],joinType=[semi])"
+                + "      
BindableTableScan(table=[[federate_jdbc,t_order_federate]])"
+                + "      
BindableTableScan(table=[[federate_jdbc,t_user_info]],projects=[[0]])";
+        assertThat(actual.replaceAll("\\s*", ""), 
is(expected.replaceAll("\\s*", "")));
+    }
+    
+    @Test
+    public void assertSelectSubQueryWhereBetween() {
+        ShardingSphereSQLParserEngine sqlParserEngine = new 
ShardingSphereSQLParserEngine(
+            DatabaseTypeRegistry.getTrunkDatabaseTypeName(new 
H2DatabaseType()), new ConfigurationProperties(new Properties()));
+        SQLStatement sqlStatement = 
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_BETWEEN, false);
+        String actual = optimizer.optimize(schemaName, sqlStatement).explain();
+        String expected = 
+              "EnumerableCalc(expr#0..4=[{inputs}],proj#0..1=[{exprs}])"
+            + "  
EnumerableInterpreterBindableFilter(condition=[AND(>=($1,$3),<=($1,$4))])"
+            + "    BindableJoin(condition=[true],joinType=[left])"
+            + "      BindableJoin(condition=[true],joinType=[left])"
+            + "        
BindableTableScan(table=[[federate_jdbc,t_order_federate]])"
+            + "        BindableAggregate(group=[{}],agg#0=[SINGLE_VALUE($0)])"
+            + "          
BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($1):VARCHAR,'before')]],projects=[[0]])"
+            + "        BindableAggregate(group=[{}],agg#0=[SINGLE_VALUE($0)])"
+            + "          
BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($1):VARCHAR,'after')]],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 ee68d02..d7285e0 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
@@ -19,12 +19,11 @@ 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.RelOptUtil;
 import org.apache.calcite.plan.volcano.VolcanoPlanner;
-import org.apache.calcite.rel.rules.CoreRules;
+import org.apache.calcite.rel.RelCollationTraitDef;
 
 /**
  * Query optimize planner factory.
@@ -49,27 +48,7 @@ public final class QueryOptimizePlannerFactory {
     
     private static void setUpRules(final RelOptPlanner planner) {
         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.PROJECT_FILTER_TRANSPOSE);
-        planner.addRule(CoreRules.PROJECT_JOIN_TRANSPOSE);
-        planner.addRule(CoreRules.PROJECT_MERGE);
-        planner.addRule(CoreRules.PROJECT_TABLE_SCAN);
-        planner.addRule(CoreRules.FILTER_INTO_JOIN);
-        planner.addRule(CoreRules.FILTER_PROJECT_TRANSPOSE);
-        planner.addRule(CoreRules.FILTER_SCAN);
-        planner.addRule(EnumerableRules.ENUMERABLE_CORRELATE_RULE);
-        planner.addRule(EnumerableRules.ENUMERABLE_PROJECT_RULE);
-        planner.addRule(EnumerableRules.ENUMERABLE_FILTER_RULE);
-        planner.addRule(EnumerableRules.ENUMERABLE_MATCH_RULE);
+        planner.addRelTraitDef(RelCollationTraitDef.INSTANCE);
+        RelOptUtil.registerDefaultRules(planner, false, true);
     }
 }

Reply via email to