This is an automated email from the ASF dual-hosted git repository.

menghaoran 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 02d1eb6ffb9 Refactor ShardingSphereOptimizer (#18229)
02d1eb6ffb9 is described below

commit 02d1eb6ffb9d4cfdde083fe26354ab88fcf3bf2e
Author: Liang Zhang <[email protected]>
AuthorDate: Tue Jun 7 23:48:44 2022 +0800

    Refactor ShardingSphereOptimizer (#18229)
---
 .../optimizer/ShardingSphereOptimizer.java         | 33 ++++++++++------------
 .../statement/select/SelectStatementConverter.java |  3 +-
 .../planner/QueryOptimizePlannerFactory.java       |  6 +---
 3 files changed, 17 insertions(+), 25 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 18b2497c09f..fb4af524b84 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
@@ -17,7 +17,6 @@
 
 package org.apache.shardingsphere.infra.federation.optimizer;
 
-import com.google.common.collect.ImmutableList;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.calcite.adapter.enumerable.EnumerableConvention;
@@ -31,7 +30,7 @@ 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.sql2rel.SqlToRelConverter;
 import org.apache.calcite.tools.Programs;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.calcite.util.Pair;
@@ -41,6 +40,7 @@ import 
org.apache.shardingsphere.infra.federation.optimizer.converter.SQLNodeCon
 import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -62,32 +62,29 @@ public final class ShardingSphereOptimizer {
      */
     public RelNode optimize(final String databaseName, final String 
schemaName, final SQLStatement sqlStatement) {
         try {
+            SqlToRelConverter converter = 
context.getPlannerContexts().get(databaseName).getConverters().get(schemaName);
             SqlNode sqlNode = 
SQLNodeConverterEngine.convertToSQLNode(sqlStatement);
-            SqlNode validNode = 
context.getPlannerContexts().get(databaseName).getValidators().get(schemaName).validate(sqlNode);
-            RelDataType resultType = 
context.getPlannerContexts().get(databaseName).getValidators().get(schemaName).getValidatedNodeType(sqlNode);
-            RelNode queryPlan = 
context.getPlannerContexts().get(databaseName).getConverters().get(schemaName).convertQuery(validNode,
 false, true).rel;
-            return optimize(databaseName, schemaName, queryPlan, resultType);
+            RelRoot relRoot = converter.convertQuery(sqlNode, true, true);
+            return optimize(converter, relRoot);
         } catch (final UnsupportedOperationException ex) {
             throw new ShardingSphereException(ex);
         }
     }
     
-    private RelNode optimize(final String databaseName, final String 
schemaName, final RelNode queryPlan, final RelDataType resultType) {
-        RelOptPlanner planner = 
context.getPlannerContexts().get(databaseName).getConverters().get(schemaName).getCluster().getPlanner();
-        RelNode node = planner.changeTraits(queryPlan, 
context.getPlannerContexts().get(databaseName).getConverters().get(schemaName).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 RelNode optimize(final SqlToRelConverter converter, final RelRoot 
relRoot) {
+        RelOptPlanner planner = converter.getCluster().getPlanner();
+        RelRoot optimizedRelRoot = 
createRelRoot(planner.changeTraits(relRoot.rel, 
converter.getCluster().traitSet().replace(EnumerableConvention.INSTANCE)), 
relRoot.validatedRowType);
+        return Programs.standard().run(planner, optimizedRelRoot.rel, 
getDesireRootTraitSet(optimizedRelRoot), Collections.emptyList(), 
Collections.emptyList());
     }
     
-    private RelRoot constructRoot(final RelNode node, final RelDataType 
resultType) {
-        RelDataType rowType = node.getRowType();
+    private RelRoot createRelRoot(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 = node instanceof Sort ? ((Sort) 
node).collation : RelCollations.EMPTY;
-        return new RelRoot(node, resultType, SqlKind.SELECT, fields, 
collation, new ArrayList<>());
+        RelCollation collation = relNode instanceof Sort ? ((Sort) 
relNode).collation : RelCollations.EMPTY;
+        return new RelRoot(relNode, resultType, SqlKind.SELECT, fields, 
collation, new ArrayList<>());
     }
     
-    private RelTraitSet getDesireRootTraitSet(final RelRoot root) {
-        return 
root.rel.getTraitSet().replace(EnumerableConvention.INSTANCE).replace(root.collation).simplify();
+    private RelTraitSet getDesireRootTraitSet(final RelRoot relRoot) {
+        return 
relRoot.rel.getTraitSet().replace(EnumerableConvention.INSTANCE).replace(relRoot.collation).simplify();
     }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/statement/select/SelectStatementConverter.java
 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/statement/select/SelectStatementConverter.java
index 9d7e32dda9d..38333fb8e67 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/statement/select/SelectStatementConverter.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/converter/statement/select/SelectStatementConverter.java
@@ -64,8 +64,7 @@ public final class SelectStatementConverter implements 
SQLStatementConverter<Sel
         SqlNodeList orderBy = selectStatement.getOrderBy().flatMap(optional -> 
new OrderByConverter().convertToSQLNode(optional)).orElse(SqlNodeList.EMPTY);
         Optional<LimitSegment> limit = 
SelectStatementHandler.getLimitSegment(selectStatement);
         ConverterContext context = new ConverterContext();
-        SqlSelect sqlSelect = new SqlSelect(SqlParserPos.ZERO, distinct, 
projection, from,
-                where, groupBy, having, SqlNodeList.EMPTY, null, null, null, 
SqlNodeList.EMPTY);
+        SqlSelect sqlSelect = new SqlSelect(SqlParserPos.ZERO, distinct, 
projection, from, where, groupBy, having, SqlNodeList.EMPTY, null, null, null, 
SqlNodeList.EMPTY);
         if (limit.isPresent()) {
             SqlNode offset = limit.get().getOffset().flatMap(optional -> new 
PaginationValueSQLConverter(context).convertToSQLNode(optional)).orElse(null);
             SqlNode rowCount = limit.get().getRowCount().flatMap(optional -> 
new 
PaginationValueSQLConverter(context).convertToSQLNode(optional)).orElse(null);
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 8b4b80985ab..d6a09aade16 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
@@ -37,15 +37,11 @@ public final class QueryOptimizePlannerFactory {
      * @return created instance
      */
     public static RelOptPlanner newInstance() {
-        RelOptPlanner result = createPlanner();
+        RelOptPlanner result = new VolcanoPlanner();
         setUpRules(result);
         return result;
     }
     
-    private static RelOptPlanner createPlanner() {
-        return new VolcanoPlanner();
-    }
-    
     private static void setUpRules(final RelOptPlanner planner) {
         planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
         planner.addRelTraitDef(RelCollationTraitDef.INSTANCE);

Reply via email to