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();
     }
 }

Reply via email to