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 0ce169ac97e feat: remove useless rules for push down filter and
project. remove useless subquery rules temporarily, and subquery optimization
will be considered carefully in the next step. (#20721)
0ce169ac97e is described below
commit 0ce169ac97e780b92d12211e17a52c7110b5f61a
Author: boyjoy1127 <[email protected]>
AuthorDate: Fri Sep 2 13:57:30 2022 +0800
feat: remove useless rules for push down filter and project. remove useless
subquery rules temporarily, and subquery optimization will be considered
carefully in the next step. (#20721)
---
.../planner/QueryOptimizePlannerFactory.java | 9 +++----
.../optimizer/ShardingSphereOptimizerTest.java | 30 +++++++++++-----------
2 files changed, 19 insertions(+), 20 deletions(-)
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 2d45847133a..d6b7c15f3c7 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
@@ -64,9 +64,9 @@ public final class QueryOptimizePlannerFactory {
*/
public static RelOptPlanner createHepPlannerWithoutCalc() {
HepProgramBuilder builder = new HepProgramBuilder();
-
builder.addGroupBegin().addRuleCollection(getSubQueryRules()).addGroupEnd().addMatchOrder(HepMatchOrder.DEPTH_FIRST);
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+
builder.addGroupBegin().addRuleInstance(CoreRules.PROJECT_MERGE).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
return new HepPlanner(builder.build());
}
@@ -91,8 +91,8 @@ public final class QueryOptimizePlannerFactory {
public static RelOptPlanner createHepPlanner() {
HepProgramBuilder builder = new HepProgramBuilder();
builder.addGroupBegin().addRuleCollection(getSubQueryRules()).addGroupEnd().addMatchOrder(HepMatchOrder.DEPTH_FIRST);
-
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
builder.addGroupBegin().addRuleCollection(getCalcRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
return new HepPlanner(builder.build());
@@ -137,12 +137,10 @@ public final class QueryOptimizePlannerFactory {
private static Collection<RelOptRule> getProjectRules() {
Collection<RelOptRule> result = new LinkedList<>();
-
result.add(AggregateExpandDistinctAggregatesRule.Config.DEFAULT.toRule());
+ result.add(CoreRules.PROJECT_MERGE);
result.add(CoreRules.PROJECT_CORRELATE_TRANSPOSE);
result.add(CoreRules.PROJECT_SET_OP_TRANSPOSE);
result.add(CoreRules.PROJECT_JOIN_TRANSPOSE);
- result.add(CoreRules.PROJECT_WINDOW_TRANSPOSE);
- result.add(CoreRules.PROJECT_FILTER_TRANSPOSE);
result.add(CoreRules.PROJECT_REDUCE_EXPRESSIONS);
result.add(ProjectRemoveRule.Config.DEFAULT.toRule());
result.add(TranslatableProjectRule.INSTANCE);
@@ -158,6 +156,7 @@ public final class QueryOptimizePlannerFactory {
result.add(CoreRules.FILTER_PROJECT_TRANSPOSE);
result.add(CoreRules.FILTER_SET_OP_TRANSPOSE);
result.add(CoreRules.FILTER_REDUCE_EXPRESSIONS);
+ result.add(CoreRules.FILTER_MERGE);
result.add(CoreRules.JOIN_PUSH_EXPRESSIONS);
result.add(CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES);
result.add(TranslatableFilterRule.INSTANCE);
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 930b0c15d1e..f5f5e31e421 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
@@ -130,11 +130,11 @@ public final class ShardingSphereOptimizerTest {
ShardingSphereSQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
H2DatabaseType()));
SQLStatement sqlStatement =
sqlParserEngine.parse(SELECT_CROSS_JOIN_CONDITION, false);
String actual = optimizer.optimize(sqlStatement).explain();
- String expected = "EnumerableCalc(expr#0..6=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t4])" + LINE_SEPARATOR
- + " EnumerableHashJoin(condition=[=($3, $6)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..3=[{exprs}])" + LINE_SEPARATOR
+ String expected = "EnumerableCalc(expr#0..4=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
+ + " EnumerableHashJoin(condition=[=($2, $4)],
joinType=[inner])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" +
LINE_SEPARATOR
+ " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
+ " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0, 1]], filters=[[13, null]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
@@ -162,11 +162,11 @@ public final class ShardingSphereOptimizerTest {
ShardingSphereSQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
H2DatabaseType()));
SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_WHERE,
false);
String actual = optimizer.optimize(sqlStatement).explain();
- String expected = "EnumerableCalc(expr#0..6=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t4])" + LINE_SEPARATOR
- + " EnumerableHashJoin(condition=[=($3, $6)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..3=[{exprs}])" + LINE_SEPARATOR
+ String expected = "EnumerableCalc(expr#0..4=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
+ + " EnumerableHashJoin(condition=[=($2, $4)],
joinType=[inner])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" +
LINE_SEPARATOR
+ " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
+ " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0, 1]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
@@ -190,11 +190,11 @@ public final class ShardingSphereOptimizerTest {
ShardingSphereSQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
H2DatabaseType()));
SQLStatement sqlStatement =
sqlParserEngine.parse(SELECT_CROSS_WHERE_CONDITION, false);
String actual = optimizer.optimize(sqlStatement).explain();
- String expected = "EnumerableCalc(expr#0..6=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t4])" + LINE_SEPARATOR
- + " EnumerableHashJoin(condition=[=($3, $6)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..3=[{exprs}])" + LINE_SEPARATOR
+ String expected = "EnumerableCalc(expr#0..4=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
+ + " EnumerableHashJoin(condition=[=($2, $4)],
joinType=[inner])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" +
LINE_SEPARATOR
+ " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
+ " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0, 1]], filters=[[13, null]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
@@ -213,9 +213,9 @@ public final class ShardingSphereOptimizerTest {
ShardingSphereSQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
H2DatabaseType()));
SQLStatement sqlStatement =
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_EXIST, false);
String actual = optimizer.optimize(sqlStatement).explain();
- String expected = "EnumerableCalc(expr#0..2=[{inputs}], expr#3=[IS NOT
NULL($t2)], proj#0..1=[{exprs}], $condition=[$t3])" + LINE_SEPARATOR
- + " EnumerableCorrelate(correlation=[$cor1], joinType=[left],
requiredColumns=[{1}])" + LINE_SEPARATOR
- + " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1]])" + LINE_SEPARATOR
+ String expected = "EnumerableCalc(expr#0..3=[{inputs}], expr#4=[IS NOT
NULL($t3)], proj#0..1=[{exprs}], $condition=[$t4])" + LINE_SEPARATOR
+ + " EnumerableCorrelate(correlation=[$cor0], joinType=[left],
requiredColumns=[{1}])" + LINE_SEPARATOR
+ + " TranslatableTableScan(table=[[federate_jdbc,
t_order_federate]], fields=[[0, 1, 2]])" + LINE_SEPARATOR
+ " EnumerableAggregate(group=[{}], agg#0=[MIN($0)])" +
LINE_SEPARATOR
+ " EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true],
$f0=[$t2])" + LINE_SEPARATOR
+ " TranslatableTableScan(table=[[federate_jdbc,
t_user_info]], fields=[[0, 1]], filters=[[null, null]])" + LINE_SEPARATOR;