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 f662e53 Modify the initialization of the volcano planner (#12835)
f662e53 is described below
commit f662e5340e7d96d71f434d9682e24668a24e28b9
Author: coco <[email protected]>
AuthorDate: Fri Oct 1 11:32:45 2021 +0800
Modify the initialization of the volcano planner (#12835)
* refactor: modify the initialization of the volcano planneand
related tests.
* style: mdoify code style.
* feat: add rules to push down filter.
* feat: add rules to push down project.
---
.../sql/federate/FederateJDBCExecutorTest.java | 62 +++++++++++++++++++---
.../planner/QueryOptimizePlannerFactory.java | 27 ++++++----
2 files changed, 72 insertions(+), 17 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 1633f17..a44e98d 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
@@ -46,11 +46,22 @@ import static org.mockito.Mockito.when;
public final class FederateJDBCExecutorTest {
- private static final String
SELECT_SQL_BY_ID_ACROSS_SINGLE_AND_SHARDING_TABLES =
- "SELECT t_order_federate.order_id, t_order_federate.user_id,
t_user_info.information "
+ private static final String SELECT_WHERE_ALL_FIELDS =
+ "SELECT user_id, information FROM t_user_info WHERE user_id = 12";
+
+ private static final String SELECT_WHERE_SINGLE_FIELD =
+ "SELECT user_id FROM t_user_info WHERE user_id = 12";
+
+ private static final String SELECT_JOIN =
+ "SELECT t_order_federate.order_id, t_order_federate.user_id,
t_user_info.user_id "
+ "FROM t_order_federate , t_user_info "
+ "WHERE t_order_federate.user_id = t_user_info.user_id";
+ private static final String SELECT_JOIN_WHERE =
+ "SELECT t_order_federate.order_id, t_order_federate.user_id,
t_user_info.user_id "
+ + "FROM t_order_federate ,t_user_info "
+ + "WHERE t_order_federate.user_id = t_user_info.user_id AND
t_user_info.user_id = 13";
+
private final String schemaName = "federate_jdbc";
private ShardingSphereOptimizer optimizer;
@@ -84,15 +95,50 @@ public final class FederateJDBCExecutorTest {
}
@Test
- public void assertSimpleSelect() {
+ public void assertSelectWhereAllFields() {
ShardingSphereSQLParserEngine sqlParserEngine = new
ShardingSphereSQLParserEngine(
DatabaseTypeRegistry.getTrunkDatabaseTypeName(new
H2DatabaseType()), new ConfigurationProperties(new Properties()));
- SQLStatement sqlStatement =
sqlParserEngine.parse(SELECT_SQL_BY_ID_ACROSS_SINGLE_AND_SHARDING_TABLES,
false);
+ 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)]])";
+ assertThat(actual.replaceAll("\\s*", ""),
is(expected.replaceAll("\\s*", "")));
+ }
+
+ @Test
+ public void assertSelectWhereSingleField() {
+ ShardingSphereSQLParserEngine sqlParserEngine = new
ShardingSphereSQLParserEngine(
+ 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]])";
+ assertThat(actual.replaceAll("\\s*", ""),
is(expected.replaceAll("\\s*", "")));
+ }
+
+ @Test
+ public void assertSelectJoin() {
+ ShardingSphereSQLParserEngine sqlParserEngine = new
ShardingSphereSQLParserEngine(
+ DatabaseTypeRegistry.getTrunkDatabaseTypeName(new
H2DatabaseType()), new ConfigurationProperties(new Properties()));
+ SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_JOIN, 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]])";
+ assertThat(actual.replaceAll("\\s*", ""),
is(expected.replaceAll("\\s*", "")));
+ }
+
+ @Test
+ public void assertSelectJoinWhere() {
+ ShardingSphereSQLParserEngine sqlParserEngine = new
ShardingSphereSQLParserEngine(
+ DatabaseTypeRegistry.getTrunkDatabaseTypeName(new
H2DatabaseType()), new ConfigurationProperties(new Properties()));
+ SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_JOIN_WHERE,
false);
String actual = optimizer.optimize(schemaName, sqlStatement).explain();
- String expected =
"EnumerableCalc(expr#0..4=[{inputs}],expr#5=[CAST($t1):VARCHAR],expr#6=[CAST($t3):VARCHAR],expr#7=[=($t5,$t6)],proj#0..1=[{exprs}],information=[$t4],$condition=[$t7])"
- + "
EnumerableNestedLoopJoin(condition=[true],joinType=[inner])"
- + "
EnumerableTableScan(table=[[federate_jdbc,t_order_federate]])"
- + "
EnumerableTableScan(table=[[federate_jdbc,t_user_info]])";
+ 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]])";
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 971f04c..b234474 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
@@ -20,6 +20,7 @@ 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.volcano.VolcanoPlanner;
@@ -33,7 +34,7 @@ public final class QueryOptimizePlannerFactory {
/**
* Create new instance of query optimize planner.
- *
+ *
* @return new instance of query optimize planner
*/
public static RelOptPlanner newInstance() {
@@ -43,18 +44,26 @@ public final class QueryOptimizePlannerFactory {
}
private static RelOptPlanner createPlanner() {
- // TODO consider about HepPlanner
return new VolcanoPlanner();
}
private static void setUpRules(final RelOptPlanner planner) {
- planner.addRule(CoreRules.PROJECT_TO_CALC);
- planner.addRule(CoreRules.FILTER_TO_CALC);
- planner.addRule(EnumerableRules.ENUMERABLE_LIMIT_RULE);
- planner.addRule(EnumerableRules.ENUMERABLE_JOIN_RULE);
- planner.addRule(EnumerableRules.ENUMERABLE_SORT_RULE);
- planner.addRule(EnumerableRules.ENUMERABLE_TABLE_SCAN_RULE);
- planner.addRule(EnumerableRules.ENUMERABLE_CALC_RULE);
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.FILTER_SCAN);
+ planner.addRule(CoreRules.PROJECT_FILTER_TRANSPOSE);
+ planner.addRule(CoreRules.FILTER_INTO_JOIN);
+ planner.addRule(CoreRules.PROJECT_TABLE_SCAN);
+ planner.addRule(CoreRules.PROJECT_JOIN_TRANSPOSE);
}
}