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

panjuan 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 d20393a9f45 Add ENUMERABLE_UNION_RULE for converting LogicUnion to 
EnumerableUnion (#20022)
d20393a9f45 is described below

commit d20393a9f457ec5b0146827a7038d4b779f17243
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Tue Aug 9 17:43:47 2022 +0800

    Add ENUMERABLE_UNION_RULE for converting LogicUnion to EnumerableUnion 
(#20022)
---
 .../optimizer/planner/QueryOptimizePlannerFactory.java    |  1 +
 .../federation/optimizer/ShardingSphereOptimizerTest.java | 15 ++++++++++++++-
 2 files changed, 15 insertions(+), 1 deletion(-)

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 ded150bf181..bb82923d4b4 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
@@ -78,6 +78,7 @@ public final class QueryOptimizePlannerFactory {
         planner.addRule(EnumerableRules.ENUMERABLE_AGGREGATE_RULE);
         planner.addRule(EnumerableRules.ENUMERABLE_FILTER_RULE);
         planner.addRule(EnumerableRules.ENUMERABLE_CORRELATE_RULE);
+        planner.addRule(EnumerableRules.ENUMERABLE_UNION_RULE);
     }
     
     private static Collection<RelOptRule> getSubQueryRules() {
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 11621c5981c..72ee9863a95 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
@@ -85,7 +85,7 @@ 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 static final String DATABASE_NAME = "sharding_db";
+    private static final String SELECT_UNION = "SELECT order_id, user_id FROM 
t_order_federate UNION SELECT 1, user_id FROM t_user_info WHERE information = 
'before'";
     
     private static final String SCHEMA_NAME = "federate_jdbc";
     
@@ -259,4 +259,17 @@ public final class ShardingSphereOptimizerTest {
                 + "        EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR;
         assertThat(actual, is(expected));
     }
+    
+    @Test
+    public void assertSelectUnion() {
+        ShardingSphereSQLParserEngine sqlParserEngine = 
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
 H2DatabaseType()));
+        SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_UNION, false);
+        String actual = optimizer.optimize(sqlStatement).explain();
+        String expected = "EnumerableUnion(all=[false])" + LINE_SEPARATOR + "  
EnumerableCalc(expr#0..2=[{inputs}], proj#0..1=[{exprs}])" + LINE_SEPARATOR
+                + "    EnumerableTableScan(table=[[federate_jdbc, 
t_order_federate]])" + LINE_SEPARATOR
+                + "  EnumerableCalc(expr#0..1=[{inputs}], 
expr#2=['1':VARCHAR], expr#3=[CAST($t1):VARCHAR], "
+                + "expr#4=['before':VARCHAR], expr#5=[=($t3, $t4)], 
EXPR$0=[$t2], user_id=[$t0], $condition=[$t5])" + LINE_SEPARATOR
+                + "    EnumerableTableScan(table=[[federate_jdbc, 
t_user_info]])" + LINE_SEPARATOR;
+        assertThat(actual, is(expected));
+    }
 }

Reply via email to