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