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 5df68e2 feat: add hep planner in sharding sphere optimizer. (#11930)
5df68e2 is described below
commit 5df68e2cbd419aa164814087797a6b9fe5913f1c
Author: coco <[email protected]>
AuthorDate: Thu Sep 23 19:35:58 2021 +0800
feat: add hep planner in sharding sphere optimizer. (#11930)
* feat: add hep planner in sharding sphere optimizer.
* fix: add license header.
* test: modify expected result in simple select test.
* refact: refact optimize method.
* style: modify code style.
* style: modify code style.
* test: fix bugs in test.
* refactor: refactor optimize method.
---
.../sql/federate/FederateJDBCExecutorTest.java | 9 +++--
.../infra/optimize/ShardingSphereOptimizer.java | 41 +++++++++++++++++++---
2 files changed, 40 insertions(+), 10 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 3bbd36b..e63df51 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
@@ -88,11 +88,10 @@ public final class FederateJDBCExecutorTest {
@Test
public void testSimpleSelect() {
RelNode relNode =
optimizer.optimize(SELECT_SQL_BY_ID_ACROSS_SINGLE_AND_SHARDING_TABLES);
- String temp = "EnumerableCalc(expr#0..4=[{inputs}],
proj#0..1=[{exprs}], information=[$t4])"
- + " EnumerableCalc(expr#0..4=[{inputs}],
expr#5=[CAST($t1):VARCHAR], expr#6=[CAST($t3):VARCHAR], expr#7=[=($t5, $t6)],
proj#0..4=[{exprs}], $condition=[$t7])"
- + " EnumerableNestedLoopJoin(condition=[true],
joinType=[inner])"
- + " EnumerableTableScan(table=[[federate_jdbc,
t_order_federate]])"
- + " EnumerableTableScan(table=[[federate_jdbc,
t_user_info]])";
+ String temp =
"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 = temp.replaceAll("\\s*", "");
String actual = relNode.explain().replaceAll("\\s*", "");
assertThat(actual, is(expected));
diff --git
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
index c9a0c5a..bcc5a20 100644
---
a/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
+++
b/shardingsphere-infra/shardingsphere-infra-optimize/src/main/java/org/apache/shardingsphere/infra/optimize/ShardingSphereOptimizer.java
@@ -17,12 +17,24 @@
package org.apache.shardingsphere.infra.optimize;
+import com.google.common.collect.ImmutableList;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.apache.calcite.adapter.enumerable.EnumerableConvention;
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.tools.Program;
+import org.apache.calcite.tools.Programs;
+import org.apache.calcite.util.ImmutableIntList;
+import org.apache.calcite.util.Pair;
import
org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeRegistry;
import org.apache.shardingsphere.infra.exception.ShardingSphereException;
@@ -31,6 +43,8 @@ import
org.apache.shardingsphere.infra.optimize.core.convert.SqlNodeConvertEngin
import org.apache.shardingsphere.infra.parser.ShardingSphereSQLParserEngine;
import org.apache.shardingsphere.sql.parser.exception.SQLParsingException;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Properties;
/**
@@ -57,16 +71,33 @@ public final class ShardingSphereOptimizer {
new ConfigurationProperties(new Properties()));
SqlNode sqlNode =
SqlNodeConvertEngine.convert(sqlParserEngine.parse(sql, true));
SqlNode validNode = context.getValidator().validate(sqlNode);
+ RelDataType resultType =
context.getValidator().getValidatedNodeType(sqlNode);
RelNode logicPlan =
context.getRelConverter().convertQuery(validNode, false, true).rel;
- return optimize(logicPlan);
+ return optimize(logicPlan, resultType);
} catch (final UnsupportedOperationException ex) {
throw new ShardingSphereException(ex);
}
}
-
- private RelNode optimize(final RelNode logicPlan) {
+
+ private RelNode optimize(final RelNode logicPlan, final RelDataType
resultType) {
RelOptPlanner planner =
context.getRelConverter().getCluster().getPlanner();
- planner.setRoot(planner.changeTraits(logicPlan,
context.getRelConverter().getCluster().traitSet().replace(EnumerableConvention.INSTANCE)));
- return planner.findBestExp();
+ RelNode node = planner.changeTraits(logicPlan,
context.getRelConverter().getCluster().traitSet().replace(EnumerableConvention.INSTANCE));
+ RelRoot root = constructRoot(node, resultType);
+ Program program = Programs.standard();
+ return program.run(planner, root.rel, getDesireRootTraitSet(root),
ImmutableList.of(), ImmutableList.of());
+ }
+
+ private RelRoot constructRoot(final RelNode node, final RelDataType
resultType) {
+ RelDataType rowType = node.getRowType();
+ List<Pair<Integer, String>> fields =
Pair.zip(ImmutableIntList.identity(rowType.getFieldCount()),
rowType.getFieldNames());
+ RelCollation collation = node instanceof Sort ? ((Sort)
node).collation : RelCollations.EMPTY;
+ return new RelRoot(node, resultType, SqlKind.SELECT, fields,
collation, new ArrayList<>());
+ }
+
+ private RelTraitSet getDesireRootTraitSet(final RelRoot root) {
+ return root.rel.getTraitSet()
+ .replace(EnumerableConvention.INSTANCE)
+ .replace(root.collation)
+ .simplify();
}
}