You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/06/11 03:07:53 UTC

[shardingsphere] branch master updated: refactor: modify sharding-sphere optimizer and unit tests. (#18297)

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

zhangliang 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 eeb42f74fde refactor: modify sharding-sphere optimizer and unit tests. (#18297)
eeb42f74fde is described below

commit eeb42f74fde47b7e0bc38f11b9f6326e7ca2ae6d
Author: boyjoy1127 <10...@users.noreply.github.com>
AuthorDate: Sat Jun 11 11:07:48 2022 +0800

    refactor: modify sharding-sphere optimizer and unit tests. (#18297)
---
 .../optimizer/ShardingSphereOptimizer.java         | 27 +------
 .../optimizer/ShardingSphereOptimizerTest.java     | 90 +++++++++++-----------
 2 files changed, 48 insertions(+), 69 deletions(-)

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 0a2393d5572..4dcb7e2acad 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
@@ -19,29 +19,19 @@ package org.apache.shardingsphere.infra.federation.optimizer;
 
 import lombok.RequiredArgsConstructor;
 import org.apache.calcite.adapter.enumerable.EnumerableConvention;
-import org.apache.calcite.plan.Convention;
 import org.apache.calcite.plan.RelOptPlanner;
 import org.apache.calcite.plan.RelTraitSet;
-import org.apache.calcite.rel.RelCollation;
-import org.apache.calcite.rel.RelCollations;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.RelRoot;
-import org.apache.calcite.rel.core.Sort;
-import org.apache.calcite.rel.type.RelDataType;
-import org.apache.calcite.sql.SqlKind;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql2rel.SqlToRelConverter;
 import org.apache.calcite.tools.Programs;
-import org.apache.calcite.util.ImmutableIntList;
-import org.apache.calcite.util.Pair;
 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;
 
-import java.util.ArrayList;
 import java.util.Collections;
-import java.util.List;
 
 /**
  * ShardingSphere optimizer.
@@ -72,20 +62,7 @@ public final class ShardingSphereOptimizer {
     
     private RelNode optimize(final SqlToRelConverter converter, final RelRoot relRoot) {
         RelOptPlanner planner = converter.getCluster().getPlanner();
-        RelNode optimizedRelNode = planner.changeTraits(relRoot.rel, getDesiredTraitSet(converter.getCluster().traitSet(), EnumerableConvention.INSTANCE));
-        RelRoot optimizedRelRoot = createOptimizedRelRoot(optimizedRelNode, relRoot.validatedRowType);
-        return Programs.standard().run(planner, optimizedRelRoot.rel, optimizedRelRoot.rel.getTraitSet(), Collections.emptyList(), Collections.emptyList());
-    }
-    
-    // TODO replace to related convention
-    private RelTraitSet getDesiredTraitSet(final RelTraitSet relTraitSet, final Convention convention) {
-        return relTraitSet.replace(convention).simplify();
-    }
-    
-    private RelRoot createOptimizedRelRoot(final RelNode relNode, final RelDataType resultType) {
-        RelDataType rowType = relNode.getRowType();
-        List<Pair<Integer, String>> fields = Pair.zip(ImmutableIntList.identity(rowType.getFieldCount()), rowType.getFieldNames());
-        RelCollation collation = relNode instanceof Sort ? ((Sort) relNode).collation : RelCollations.EMPTY;
-        return new RelRoot(relNode, resultType, SqlKind.SELECT, fields, collation, new ArrayList<>());
+        RelTraitSet desiredTraitSet = relRoot.rel.getTraitSet().replace(EnumerableConvention.INSTANCE).simplify();
+        return Programs.standard().run(planner, relRoot.rel, desiredTraitSet, Collections.emptyList(), Collections.emptyList());
     }
 }
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 066311f1a01..b6ea547dc86 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
@@ -134,12 +134,15 @@ public final class ShardingSphereOptimizerTest {
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_JOIN_CONDITION, false);
         String actual = optimizer.optimize(databaseName, schemaName, sqlStatement).explain();
         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]])";
+                "EnumerableCalc(expr#0..4=[{inputs}],proj#0..1=[{exprs}],user_id1=[$t3])"
+                        + "EnumerableInterpreter"
+                        + " BindableJoin(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]])"
+                        + "    EnumerableBindable"
+                        + "        EnumerableCalc(expr#0=[{inputs}],expr#1=[CAST($t0):VARCHAR],proj#0..1=[{exprs}])"
+                        + "            EnumerableInterpreter"
+                        + "                BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[=(CAST($0):INTEGER,13)]],projects=[[0]])";
         assertThat(actual.replaceAll("\\s*", ""), is(expected.replaceAll("\\s*", "")));
     }
     
@@ -171,14 +174,10 @@ public final class ShardingSphereOptimizerTest {
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_WHERE, false);
         String actual = optimizer.optimize(databaseName, schemaName, sqlStatement).explain();
         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]])";
+                "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*", "")));
     }
     
@@ -188,14 +187,16 @@ public final class ShardingSphereOptimizerTest {
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_JOIN, false);
         String actual = optimizer.optimize(databaseName, schemaName, sqlStatement).explain();
         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]])";
+                "EnumerableCalc(expr#0..4=[{inputs}],proj#0..1=[{exprs}],user_id0=[$t3])"
+                        + "EnumerableMergeJoin(condition=[=($2,$4)],joinType=[inner])"
+                        + "     EnumerableSort(sort0=[$2],dir0=[ASC])"
+                        + "         EnumerableInterpreter"
+                        + "             BindableProject(order_id=[$0],user_id=[$1],user_id0=[CAST($1):VARCHAR])"
+                        + "                 BindableTableScan(table=[[federate_jdbc,t_order_federate]],projects=[[0,1]])"
+                        + "     EnumerableSort(sort0=[$1],dir0=[ASC])"
+                        + "         EnumerableInterpreter"
+                        + "             BindableProject(user_id=[$0],user_id0=[CAST($0):VARCHAR])"
+                        + "                 BindableTableScan(table=[[federate_jdbc,t_user_info]],projects=[[0]])";
         assertThat(actual.replaceAll("\\s*", ""), is(expected.replaceAll("\\s*", "")));
     }
     
@@ -205,10 +206,10 @@ public final class ShardingSphereOptimizerTest {
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_WHERE_CONDITION, false);
         String actual = optimizer.optimize(databaseName, schemaName, sqlStatement).explain();
         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)]])";
+                "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*", "")));
     }
     
@@ -229,12 +230,13 @@ public final class ShardingSphereOptimizerTest {
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_EXIST, false);
         String actual = optimizer.optimize(databaseName, schemaName, sqlStatement).explain();
         String expected =
-                "EnumerableCalc(expr#0..3=[{inputs}],expr#4=[ISNOTNULL($t3)],proj#0..1=[{exprs}],$condition=[$t4])"
-                        + "  EnumerableCorrelate(correlation=[$cor0],joinType=[left],requiredColumns=[{1}]) "
-                        + "    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]]) ";
+                "EnumerableInterpreter"
+                        + "BindableProject(order_id=[$0],user_id=[$1])"
+                        + "     BindableJoin(condition=[=($2,$3)],joinType=[semi])"
+                        + "         BindableProject(order_id=[$0],user_id=[$1],user_id0=[CAST($1):VARCHAR])"
+                        + "             BindableTableScan(table=[[federate_jdbc,t_order_federate]],projects=[[0,1]])"
+                        + "         BindableProject(user_id0=[CAST($0):VARCHAR],$f0=[true])"
+                        + "             BindableTableScan(table=[[federate_jdbc,t_user_info]],filters=[[ISNOTNULL(CAST($0):VARCHAR)]],projects=[[0]])";
         assertThat(actual.replaceAll("\\s*", ""), is(expected.replaceAll("\\s*", "")));
     }
     
@@ -245,10 +247,9 @@ public final class ShardingSphereOptimizerTest {
         String actual = optimizer.optimize(databaseName, 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]])";
+                        + " BindableJoin(condition=[=($1,$2)],joinType=[semi])"
+                        + "     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*", "")));
     }
     
@@ -258,15 +259,16 @@ public final class ShardingSphereOptimizerTest {
         SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_BETWEEN, false);
         String actual = optimizer.optimize(databaseName, schemaName, sqlStatement).explain();
         String expected =
-                "EnumerableCalc(expr#0..4=[{inputs}],proj#0..1=[{exprs}])"
-                        + "  EnumerableInterpreterBindableFilter(condition=[AND(>=($1,$3),<=($1,$4))])"
+                "EnumerableCalc(expr#0..3=[{inputs}],proj#0..1=[{exprs}])"
+                        + "EnumerableInterpreter"
+                        + " BindableFilter(condition=[AND(>=($1,$2),<=($1,$3))])"
                         + "    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]])";
+                        + "        BindableJoin(condition=[true],joinType=[left])"
+                        + "            BindableTableScan(table=[[federate_jdbc,t_order_federate]],projects=[[0,1]])"
+                        + "                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*", "")));
     }
 }