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*", "")));
}
}