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 5b22782f6a6 19937 remove filterable table (#20426)
5b22782f6a6 is described below
commit 5b22782f6a6f8b7aafcdb6f7bf98274f85b85001
Author: boyjoy1127 <[email protected]>
AuthorDate: Tue Aug 23 15:38:08 2022 +0800
19937 remove filterable table (#20426)
* refactor: merge translatable federation into AdvancedFederationExecutor.
* fix: unit test and code style.
---
.../executor/FederationExecutorFactory.java | 2 +-
.../advanced/AdvancedFederationExecutor.java | 25 ++--
.../advanced/TranslatableFederationExecutor.java | 150 ---------------------
.../optimizer/ShardingSphereOptimizer.java | 9 +-
.../planner/QueryOptimizePlannerFactory.java | 47 ++++++-
.../optimizer/ShardingSphereOptimizerTest.java | 62 +++++----
6 files changed, 98 insertions(+), 197 deletions(-)
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/FederationExecutorFactory.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/FederationExecutorFactory.java
index 3f9019f2b8e..44c80bc64b9 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/FederationExecutorFactory.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/FederationExecutorFactory.java
@@ -47,7 +47,7 @@ public final class FederationExecutorFactory {
public static FederationExecutor newInstance(final String databaseName,
final String schemaName, final OptimizerContext optimizerContext,
final
ShardingSphereRuleMetaData globalRuleMetaData, final ConfigurationProperties
props, final JDBCExecutor jdbcExecutor,
final EventBusContext
eventBusContext) {
- // TODO Consider about AdvancedFederationExecutor and
TranslatableFederationExecutor
+ // TODO Consider about AdvancedFederationExecutor
return new OriginalFederationExecutor(databaseName, schemaName,
optimizerContext, globalRuleMetaData, props, jdbcExecutor, eventBusContext);
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
index 2db489428b0..12140cb047e 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/AdvancedFederationExecutor.java
@@ -42,13 +42,13 @@ import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecuti
import org.apache.shardingsphere.infra.federation.executor.FederationContext;
import org.apache.shardingsphere.infra.federation.executor.FederationExecutor;
import
org.apache.shardingsphere.infra.federation.executor.advanced.resultset.FederationResultSet;
+import
org.apache.shardingsphere.infra.federation.executor.advanced.table.TranslatableTableScanExecutor;
import
org.apache.shardingsphere.infra.federation.executor.common.CommonExecuteDataContext;
import
org.apache.shardingsphere.infra.federation.executor.common.table.CommonTableScanExecutorContext;
-import
org.apache.shardingsphere.infra.federation.executor.original.table.FilterableTableScanExecutor;
import
org.apache.shardingsphere.infra.federation.optimizer.ShardingSphereOptimizer;
import
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
import
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
-import
org.apache.shardingsphere.infra.federation.optimizer.metadata.filter.FilterableSchema;
+import
org.apache.shardingsphere.infra.federation.optimizer.metadata.translatable.TranslatableSchema;
import
org.apache.shardingsphere.infra.federation.optimizer.planner.QueryOptimizePlannerFactory;
import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
@@ -102,10 +102,10 @@ public final class AdvancedFederationExecutor implements
FederationExecutor {
SQLStatementContext<?> sqlStatementContext =
federationContext.getQueryContext().getSqlStatementContext();
Preconditions.checkArgument(sqlStatementContext instanceof
SelectStatementContext, "SQL statement context must be select statement
context.");
ShardingSphereSchema schema =
federationContext.getDatabases().get(databaseName.toLowerCase()).getSchema(schemaName);
- FilterableSchema filterableSchema =
createFilterableSchema(prepareEngine, schema, callback, federationContext);
+ TranslatableSchema translatableSchema =
createTranslatableSchema(prepareEngine, schema, callback, federationContext);
Map<String, Object> parameters =
createParameters(federationContext.getQueryContext().getParameters());
- Enumerator<Object[]> enumerator =
execute(sqlStatementContext.getSqlStatement(), filterableSchema,
parameters).enumerator();
- resultSet = new FederationResultSet(enumerator, schema,
filterableSchema, sqlStatementContext);
+ Enumerator<Object[]> enumerator =
execute(sqlStatementContext.getSqlStatement(), translatableSchema,
parameters).enumerator();
+ resultSet = new FederationResultSet(enumerator, schema,
translatableSchema, sqlStatementContext);
return resultSet;
}
@@ -118,22 +118,23 @@ public final class AdvancedFederationExecutor implements
FederationExecutor {
return result;
}
- private FilterableSchema createFilterableSchema(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
final ShardingSphereSchema schema,
- final
JDBCExecutorCallback<? extends ExecuteResult> callback, final FederationContext
federationContext) {
+ private TranslatableSchema createTranslatableSchema(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
final ShardingSphereSchema schema,
+ final
JDBCExecutorCallback<? extends ExecuteResult> callback, final FederationContext
federationContext) {
CommonTableScanExecutorContext executorContext = new
CommonTableScanExecutorContext(databaseName, schemaName, props,
federationContext);
- FilterableTableScanExecutor executor = new
FilterableTableScanExecutor(prepareEngine, jdbcExecutor, callback,
optimizerContext, globalRuleMetaData, executorContext, eventBusContext);
- return new FilterableSchema(schemaName, schema, executor);
+ TranslatableTableScanExecutor executor = new
TranslatableTableScanExecutor(prepareEngine, jdbcExecutor, callback,
optimizerContext, globalRuleMetaData, executorContext, eventBusContext);
+ return new TranslatableSchema(schemaName, schema, executor);
}
@SuppressWarnings("unchecked")
- private Enumerable<Object[]> execute(final SQLStatement sqlStatement,
final FilterableSchema filterableSchema, final Map<String, Object> parameters) {
+ private Enumerable<Object[]> execute(final SQLStatement sqlStatement,
final TranslatableSchema translatableSchema, final Map<String, Object>
parameters) {
// TODO remove OptimizerPlannerContextFactory call and use setup
executor to handle this logic
CalciteConnectionConfig connectionConfig = new
CalciteConnectionConfigImpl(OptimizerPlannerContextFactory.createConnectionProperties());
RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
- CalciteCatalogReader catalogReader =
OptimizerPlannerContextFactory.createCatalogReader(schemaName,
filterableSchema, relDataTypeFactory, connectionConfig);
+ CalciteCatalogReader catalogReader =
OptimizerPlannerContextFactory.createCatalogReader(schemaName,
translatableSchema, relDataTypeFactory, connectionConfig);
SqlValidator validator =
OptimizerPlannerContextFactory.createValidator(catalogReader,
relDataTypeFactory, connectionConfig);
SqlToRelConverter converter =
OptimizerPlannerContextFactory.createConverter(catalogReader, validator,
relDataTypeFactory);
- RelNode bestPlan = new ShardingSphereOptimizer(converter,
QueryOptimizePlannerFactory.createHepPlanner()).optimize(sqlStatement);
+ RelNode bestPlan =
+ new ShardingSphereOptimizer(converter,
QueryOptimizePlannerFactory.createHepPlannerWithoutCalc(),
QueryOptimizePlannerFactory.createHepPlannerWithCalc()).optimize(sqlStatement);
Bindable<Object[]> executablePlan =
EnumerableInterpretable.toBindable(Collections.emptyMap(), null,
(EnumerableRel) bestPlan, EnumerableRel.Prefer.ARRAY);
return executablePlan.bind(new CommonExecuteDataContext(validator,
converter, parameters));
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/TranslatableFederationExecutor.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/TranslatableFederationExecutor.java
deleted file mode 100644
index b729b0d4905..00000000000
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-executor/src/main/java/org/apache/shardingsphere/infra/federation/executor/advanced/TranslatableFederationExecutor.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.shardingsphere.infra.federation.executor.advanced;
-
-import com.google.common.base.Preconditions;
-import org.apache.calcite.adapter.enumerable.EnumerableInterpretable;
-import org.apache.calcite.adapter.enumerable.EnumerableRel;
-import org.apache.calcite.config.CalciteConnectionConfig;
-import org.apache.calcite.config.CalciteConnectionConfigImpl;
-import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
-import org.apache.calcite.linq4j.Enumerable;
-import org.apache.calcite.linq4j.Enumerator;
-import org.apache.calcite.prepare.CalciteCatalogReader;
-import org.apache.calcite.rel.RelNode;
-import org.apache.calcite.rel.type.RelDataTypeFactory;
-import org.apache.calcite.runtime.Bindable;
-import org.apache.calcite.sql.validate.SqlValidator;
-import org.apache.calcite.sql2rel.SqlToRelConverter;
-import org.apache.shardingsphere.infra.binder.statement.SQLStatementContext;
-import
org.apache.shardingsphere.infra.binder.statement.dml.SelectStatementContext;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutionUnit;
-import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor;
-import
org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback;
-import
org.apache.shardingsphere.infra.executor.sql.execute.result.ExecuteResult;
-import
org.apache.shardingsphere.infra.executor.sql.prepare.driver.DriverExecutionPrepareEngine;
-import org.apache.shardingsphere.infra.federation.executor.FederationContext;
-import org.apache.shardingsphere.infra.federation.executor.FederationExecutor;
-import
org.apache.shardingsphere.infra.federation.executor.advanced.resultset.FederationResultSet;
-import
org.apache.shardingsphere.infra.federation.executor.advanced.table.TranslatableTableScanExecutor;
-import
org.apache.shardingsphere.infra.federation.executor.common.CommonExecuteDataContext;
-import
org.apache.shardingsphere.infra.federation.executor.common.table.CommonTableScanExecutorContext;
-import
org.apache.shardingsphere.infra.federation.optimizer.ShardingSphereOptimizer;
-import
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
-import
org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContextFactory;
-import
org.apache.shardingsphere.infra.federation.optimizer.metadata.translatable.TranslatableSchema;
-import
org.apache.shardingsphere.infra.federation.optimizer.planner.QueryOptimizePlannerFactory;
-import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
-import
org.apache.shardingsphere.infra.metadata.database.schema.decorator.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.util.eventbus.EventBusContext;
-import org.apache.shardingsphere.sql.parser.sql.common.statement.SQLStatement;
-
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Advanced federation executor.
- */
-public final class TranslatableFederationExecutor implements
FederationExecutor {
-
- private final String databaseName;
-
- private final String schemaName;
-
- private final OptimizerContext optimizerContext;
-
- private final ShardingSphereRuleMetaData globalRuleMetaData;
-
- private final ConfigurationProperties props;
-
- private final JDBCExecutor jdbcExecutor;
-
- private final EventBusContext eventBusContext;
-
- private ResultSet resultSet;
-
- public TranslatableFederationExecutor(final String databaseName, final
String schemaName, final OptimizerContext optimizerContext,
- final ShardingSphereRuleMetaData
globalRuleMetaData, final ConfigurationProperties props, final JDBCExecutor
jdbcExecutor,
- final EventBusContext
eventBusContext) {
- this.databaseName = databaseName;
- this.schemaName = schemaName;
- this.optimizerContext = optimizerContext;
- this.globalRuleMetaData = globalRuleMetaData;
- this.props = props;
- this.jdbcExecutor = jdbcExecutor;
- this.eventBusContext = eventBusContext;
- }
-
- @Override
- public ResultSet executeQuery(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
- final JDBCExecutorCallback<? extends
ExecuteResult> callback, final FederationContext federationContext) throws
SQLException {
- SQLStatementContext<?> sqlStatementContext =
federationContext.getQueryContext().getSqlStatementContext();
- Preconditions.checkArgument(sqlStatementContext instanceof
SelectStatementContext, "SQL statement context must be select statement
context.");
- ShardingSphereSchema schema =
federationContext.getDatabases().get(databaseName.toLowerCase()).getSchema(schemaName);
- TranslatableSchema translatableSchema =
createTranslatableSchema(prepareEngine, schema, callback, federationContext);
- Map<String, Object> parameters =
createParameters(federationContext.getQueryContext().getParameters());
- Enumerator<Object[]> enumerator =
execute(sqlStatementContext.getSqlStatement(), translatableSchema,
parameters).enumerator();
- resultSet = new FederationResultSet(enumerator, schema,
translatableSchema, sqlStatementContext);
- return resultSet;
- }
-
- private Map<String, Object> createParameters(final List<Object>
parameters) {
- Map<String, Object> result = new HashMap<>(parameters.size(), 1);
- int index = 0;
- for (Object each : parameters) {
- result.put("?" + index++, each);
- }
- return result;
- }
-
- private TranslatableSchema createTranslatableSchema(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
final ShardingSphereSchema schema,
- final
JDBCExecutorCallback<? extends ExecuteResult> callback, final FederationContext
federationContext) {
- CommonTableScanExecutorContext executorContext = new
CommonTableScanExecutorContext(databaseName, schemaName, props,
federationContext);
- TranslatableTableScanExecutor executor = new
TranslatableTableScanExecutor(prepareEngine, jdbcExecutor, callback,
optimizerContext, globalRuleMetaData, executorContext, eventBusContext);
- return new TranslatableSchema(schemaName, schema, executor);
- }
-
- @SuppressWarnings("unchecked")
- private Enumerable<Object[]> execute(final SQLStatement sqlStatement,
final TranslatableSchema translatableSchema, final Map<String, Object>
parameters) {
- // TODO remove OptimizerPlannerContextFactory call and use setup
executor to handle this logic
- CalciteConnectionConfig connectionConfig = new
CalciteConnectionConfigImpl(OptimizerPlannerContextFactory.createConnectionProperties());
- RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
- CalciteCatalogReader catalogReader =
OptimizerPlannerContextFactory.createCatalogReader(schemaName,
translatableSchema, relDataTypeFactory, connectionConfig);
- SqlValidator validator =
OptimizerPlannerContextFactory.createValidator(catalogReader,
relDataTypeFactory, connectionConfig);
- SqlToRelConverter converter =
OptimizerPlannerContextFactory.createConverter(catalogReader, validator,
relDataTypeFactory);
- RelNode bestPlan = new ShardingSphereOptimizer(converter,
QueryOptimizePlannerFactory.createHepPlanner()).optimize(sqlStatement);
- Bindable<Object[]> executablePlan =
EnumerableInterpretable.toBindable(Collections.emptyMap(), null,
(EnumerableRel) bestPlan, EnumerableRel.Prefer.ARRAY);
- return executablePlan.bind(new CommonExecuteDataContext(validator,
converter, parameters));
- }
-
- @Override
- public ResultSet getResultSet() {
- return resultSet;
- }
-
- @Override
- public void close() throws SQLException {
- resultSet.close();
- }
-}
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 32eac8cb870..c7bd825aa15 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
@@ -34,7 +34,9 @@ public final class ShardingSphereOptimizer {
private final SqlToRelConverter converter;
- private final RelOptPlanner hepPlanner;
+ private final RelOptPlanner hepPlannerWithoutCalc;
+
+ private final RelOptPlanner hepPlannerWithCalc;
/**
* Optimize query execution plan.
@@ -45,8 +47,9 @@ public final class ShardingSphereOptimizer {
public RelNode optimize(final SQLStatement sqlStatement) {
SqlNode sqlNode = SQLNodeConverterEngine.convert(sqlStatement);
RelNode logicPlan = converter.convertQuery(sqlNode, true, true).rel;
- RelNode bestPlan = optimizeWithRBO(logicPlan, hepPlanner);
- return optimizeWithCBO(bestPlan, converter);
+ RelNode ruleBasedPlan = optimizeWithRBO(logicPlan,
hepPlannerWithoutCalc);
+ RelNode costBasedPlan = optimizeWithCBO(ruleBasedPlan, converter);
+ return optimizeWithRBO(costBasedPlan, hepPlannerWithCalc);
}
private static RelNode optimizeWithRBO(final RelNode logicPlan, final
RelOptPlanner hepPlanner) {
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 3e5ba4d590e..767abdbf7ed 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
@@ -31,6 +31,8 @@ import org.apache.calcite.rel.RelCollationTraitDef;
import org.apache.calcite.rel.rules.AggregateExpandDistinctAggregatesRule;
import org.apache.calcite.rel.rules.CoreRules;
import org.apache.calcite.rel.rules.ProjectRemoveRule;
+import
org.apache.shardingsphere.infra.federation.optimizer.metadata.translatable.TranslatableProjectFilterRule;
+import
org.apache.shardingsphere.infra.federation.optimizer.metadata.translatable.TranslatableProjectRule;
import java.util.Collection;
import java.util.LinkedList;
@@ -54,6 +56,32 @@ public final class QueryOptimizePlannerFactory {
return result;
}
+ /**
+ * Create new instance of hep planner without calc rules.
+ *
+ * @return hep planner instance
+ */
+ public static RelOptPlanner createHepPlannerWithoutCalc() {
+ HepProgramBuilder builder = new HepProgramBuilder();
+
builder.addGroupBegin().addRuleCollection(getSubQueryRules()).addGroupEnd().addMatchOrder(HepMatchOrder.DEPTH_FIRST);
+
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+ builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
+ return new HepPlanner(builder.build());
+ }
+
+ /**
+ * Create new instance of hep planner with calc rules.
+ *
+ * @return hep planner instance
+ */
+ public static RelOptPlanner createHepPlannerWithCalc() {
+ HepProgramBuilder builder = new HepProgramBuilder();
+
builder.addGroupBegin().addRuleCollection(getCalcRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+ builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
+ return new HepPlanner(builder.build());
+ }
+
/**
* Create new instance of hep planner.
*
@@ -64,6 +92,7 @@ public final class QueryOptimizePlannerFactory {
builder.addGroupBegin().addRuleCollection(getSubQueryRules()).addGroupEnd().addMatchOrder(HepMatchOrder.DEPTH_FIRST);
builder.addGroupBegin().addRuleCollection(getFilterRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
builder.addGroupBegin().addRuleCollection(getProjectRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
+
builder.addGroupBegin().addRuleCollection(getCalcRules()).addGroupEnd().addMatchOrder(HepMatchOrder.BOTTOM_UP);
builder.addMatchLimit(DEFAULT_MATCH_LIMIT);
return new HepPlanner(builder.build());
}
@@ -77,8 +106,11 @@ public final class QueryOptimizePlannerFactory {
planner.addRule(EnumerableRules.ENUMERABLE_TABLE_SCAN_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_AGGREGATE_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_FILTER_RULE);
+ planner.addRule(EnumerableRules.ENUMERABLE_PROJECT_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_CORRELATE_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_UNION_RULE);
+ planner.addRule(EnumerableRules.ENUMERABLE_FILTER_TO_CALC_RULE);
+ planner.addRule(EnumerableRules.ENUMERABLE_PROJECT_TO_CALC_RULE);
}
private static Collection<RelOptRule> getSubQueryRules() {
@@ -89,14 +121,22 @@ public final class QueryOptimizePlannerFactory {
return result;
}
- private static Collection<RelOptRule> getProjectRules() {
+ private static Collection<RelOptRule> getCalcRules() {
Collection<RelOptRule> result = new LinkedList<>();
result.add(AggregateExpandDistinctAggregatesRule.Config.DEFAULT.toRule());
- // TODO PROJECT_TO_CALC and FILTER_TO_CALC better be removed when
using TranslatableTableScan.
result.add(CoreRules.PROJECT_TO_CALC);
result.add(CoreRules.FILTER_TO_CALC);
result.add(CoreRules.PROJECT_CALC_MERGE);
result.add(CoreRules.FILTER_CALC_MERGE);
+ result.add(EnumerableRules.ENUMERABLE_FILTER_TO_CALC_RULE);
+ result.add(EnumerableRules.ENUMERABLE_PROJECT_TO_CALC_RULE);
+ result.add(CoreRules.CALC_MERGE);
+ return result;
+ }
+
+ private static Collection<RelOptRule> getProjectRules() {
+ Collection<RelOptRule> result = new LinkedList<>();
+
result.add(AggregateExpandDistinctAggregatesRule.Config.DEFAULT.toRule());
result.add(CoreRules.PROJECT_CORRELATE_TRANSPOSE);
result.add(CoreRules.PROJECT_SET_OP_TRANSPOSE);
result.add(CoreRules.PROJECT_JOIN_TRANSPOSE);
@@ -104,6 +144,7 @@ public final class QueryOptimizePlannerFactory {
result.add(CoreRules.PROJECT_FILTER_TRANSPOSE);
result.add(CoreRules.PROJECT_REDUCE_EXPRESSIONS);
result.add(ProjectRemoveRule.Config.DEFAULT.toRule());
+ result.add(TranslatableProjectRule.INSTANCE);
return result;
}
@@ -118,6 +159,8 @@ public final class QueryOptimizePlannerFactory {
result.add(CoreRules.FILTER_REDUCE_EXPRESSIONS);
result.add(CoreRules.JOIN_PUSH_EXPRESSIONS);
result.add(CoreRules.JOIN_PUSH_TRANSITIVE_PREDICATES);
+ result.add(TranslatableProjectRule.INSTANCE);
+ result.add(TranslatableProjectFilterRule.INSTANCE);
return result;
}
}
diff --git
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
index 72ee9863a95..deb87176e98 100644
---
a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
+++
b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/test/java/org/apache/shardingsphere/infra/federation/optimizer/ShardingSphereOptimizerTest.java
@@ -100,16 +100,7 @@ public final class ShardingSphereOptimizerTest {
tables.put("t_user_info", createUserInfoTableMetaData());
ShardingSphereSchema schema = new ShardingSphereSchema(tables);
SqlToRelConverter converter = createSqlToRelConverter(schema);
- optimizer = new ShardingSphereOptimizer(converter,
QueryOptimizePlannerFactory.createHepPlanner());
- }
-
- private static SqlToRelConverter createSqlToRelConverter(final
ShardingSphereSchema schema) {
- CalciteConnectionConfig connectionConfig = new
CalciteConnectionConfigImpl(OptimizerPlannerContextFactory.createConnectionProperties());
- RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
- FilterableSchema federationSchema = new FilterableSchema(SCHEMA_NAME,
schema, null);
- CalciteCatalogReader catalogReader =
OptimizerPlannerContextFactory.createCatalogReader(SCHEMA_NAME,
federationSchema, relDataTypeFactory, connectionConfig);
- SqlValidator validator =
OptimizerPlannerContextFactory.createValidator(catalogReader,
relDataTypeFactory, connectionConfig);
- return OptimizerPlannerContextFactory.createConverter(catalogReader,
validator, relDataTypeFactory);
+ optimizer = new ShardingSphereOptimizer(converter,
QueryOptimizePlannerFactory.createHepPlannerWithoutCalc(),
QueryOptimizePlannerFactory.createHepPlannerWithCalc());
}
private ShardingSphereTable createOrderTableMetaData() {
@@ -125,6 +116,15 @@ public final class ShardingSphereOptimizerTest {
return new ShardingSphereTable("t_user_info",
Arrays.asList(userIdColumn, informationColumn), Collections.emptyList(),
Collections.emptyList());
}
+ private static SqlToRelConverter createSqlToRelConverter(final
ShardingSphereSchema schema) {
+ CalciteConnectionConfig connectionConfig = new
CalciteConnectionConfigImpl(OptimizerPlannerContextFactory.createConnectionProperties());
+ RelDataTypeFactory relDataTypeFactory = new JavaTypeFactoryImpl();
+ FilterableSchema federationSchema = new FilterableSchema(SCHEMA_NAME,
schema, null);
+ CalciteCatalogReader catalogReader =
OptimizerPlannerContextFactory.createCatalogReader(SCHEMA_NAME,
federationSchema, relDataTypeFactory, connectionConfig);
+ SqlValidator validator =
OptimizerPlannerContextFactory.createValidator(catalogReader,
relDataTypeFactory, connectionConfig);
+ return OptimizerPlannerContextFactory.createConverter(catalogReader,
validator, relDataTypeFactory);
+ }
+
@Test
public void assertSelectCrossJoinCondition() {
ShardingSphereSQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
H2DatabaseType()));
@@ -179,11 +179,11 @@ public final class ShardingSphereOptimizerTest {
ShardingSphereSQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
H2DatabaseType()));
SQLStatement sqlStatement = sqlParserEngine.parse(SELECT_CROSS_JOIN,
false);
String actual = optimizer.optimize(sqlStatement).explain();
- String expected = "EnumerableCalc(expr#0..6=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t4])" + LINE_SEPARATOR
- + " EnumerableHashJoin(condition=[=($3, $6)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..3=[{exprs}])" + LINE_SEPARATOR
+ String expected = "EnumerableCalc(expr#0..4=[{inputs}],
proj#0..1=[{exprs}], user_id0=[$t3])" + LINE_SEPARATOR
+ + " EnumerableHashJoin(condition=[=($2, $4)],
joinType=[inner])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..2=[{inputs}],
expr#3=[CAST($t1):VARCHAR], proj#0..1=[{exprs}], user_id0=[$t3])" +
LINE_SEPARATOR
+ " EnumerableTableScan(table=[[federate_jdbc,
t_order_federate]])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], proj#0..2=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t0):VARCHAR], user_id=[$t0], user_id0=[$t2])" + LINE_SEPARATOR
+ " EnumerableTableScan(table=[[federate_jdbc,
t_user_info]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
@@ -218,12 +218,13 @@ public final class ShardingSphereOptimizerTest {
ShardingSphereSQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
H2DatabaseType()));
SQLStatement sqlStatement =
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_EXIST, false);
String actual = optimizer.optimize(sqlStatement).explain();
- String expected = "EnumerableCalc(expr#0..3=[{inputs}], expr#4=[IS NOT
NULL($t3)], proj#0..1=[{exprs}], $condition=[$t4])" + LINE_SEPARATOR
- + " EnumerableCorrelate(correlation=[$cor0], joinType=[left],
requiredColumns=[{1}])" + LINE_SEPARATOR
- + " EnumerableTableScan(table=[[federate_jdbc,
t_order_federate]])" + LINE_SEPARATOR
+ String expected = "EnumerableCalc(expr#0..2=[{inputs}], expr#3=[IS NOT
NULL($t2)], proj#0..1=[{exprs}], $condition=[$t3])" + LINE_SEPARATOR
+ + " EnumerableCorrelate(correlation=[$cor1], joinType=[left],
requiredColumns=[{1}])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..2=[{inputs}],
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableTableScan(table=[[federate_jdbc,
t_order_federate]])" + LINE_SEPARATOR
+ " EnumerableAggregate(group=[{}], agg#0=[MIN($0)])" +
LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true],
expr#3=[$cor0], expr#4=[$t3.user_id],"
- + " expr#5=[CAST($t4):VARCHAR], expr#6=[CAST($t0):VARCHAR],
expr#7=[=($t5, $t6)], $f0=[$t2], $condition=[$t7])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..1=[{inputs}], expr#2=[true],
expr#3=[$cor1], expr#4=[$t3.user_id], expr#5=[CAST($t4):VARCHAR],
expr#6=[CAST($t0):VARCHAR], "
+ + "expr#7=[=($t5, $t6)], $f0=[$t2], $condition=[$t7])" +
LINE_SEPARATOR
+ " EnumerableTableScan(table=[[federate_jdbc,
t_user_info]])" + LINE_SEPARATOR;
assertThat(actual, is(expected));
}
@@ -233,9 +234,10 @@ public final class ShardingSphereOptimizerTest {
ShardingSphereSQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
H2DatabaseType()));
SQLStatement sqlStatement =
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_IN, false);
String actual = optimizer.optimize(sqlStatement).explain();
- String expected = "EnumerableCalc(expr#0..3=[{inputs}],
proj#0..1=[{exprs}])" + LINE_SEPARATOR
- + " EnumerableHashJoin(condition=[=($1, $3)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableTableScan(table=[[federate_jdbc,
t_order_federate]])" + LINE_SEPARATOR
+ String expected = "EnumerableCalc(expr#0..2=[{inputs}],
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableHashJoin(condition=[=($1, $2)],
joinType=[inner])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..2=[{inputs}],
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableTableScan(table=[[federate_jdbc,
t_order_federate]])" + LINE_SEPARATOR
+ " EnumerableAggregate(group=[{0}])" + LINE_SEPARATOR
+ " EnumerableCalc(expr#0..1=[{inputs}], user_id=[$t0])"
+ LINE_SEPARATOR
+ " EnumerableTableScan(table=[[federate_jdbc,
t_user_info]])" + LINE_SEPARATOR;
@@ -247,13 +249,15 @@ public final class ShardingSphereOptimizerTest {
ShardingSphereSQLParserEngine sqlParserEngine =
sqlParserRule.getSQLParserEngine(DatabaseTypeEngine.getTrunkDatabaseTypeName(new
H2DatabaseType()));
SQLStatement sqlStatement =
sqlParserEngine.parse(SELECT_SUBQUERY_WHERE_BETWEEN, false);
String actual = optimizer.optimize(sqlStatement).explain();
- String expected = "EnumerableCalc(expr#0..4=[{inputs}],
proj#0..1=[{exprs}])" + LINE_SEPARATOR
- + " EnumerableNestedLoopJoin(condition=[<=($1, $4)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableNestedLoopJoin(condition=[>=($1, $3)],
joinType=[inner])" + LINE_SEPARATOR
- + " EnumerableTableScan(table=[[federate_jdbc,
t_order_federate]])" + LINE_SEPARATOR
- + " EnumerableAggregate(group=[{}],
agg#0=[SINGLE_VALUE($0)])" + LINE_SEPARATOR
- + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t1):VARCHAR], expr#3=['before':VARCHAR], expr#4=[=($t2, $t3)],
user_id=[$t0], $condition=[$t4])" + LINE_SEPARATOR
- + " EnumerableTableScan(table=[[federate_jdbc,
t_user_info]])" + LINE_SEPARATOR
+ String expected = "EnumerableCalc(expr#0..2=[{inputs}],
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableNestedLoopJoin(condition=[<=($1, $2)],
joinType=[inner])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..2=[{inputs}],
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableNestedLoopJoin(condition=[>=($1, $2)],
joinType=[inner])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..2=[{inputs}],
proj#0..1=[{exprs}])" + LINE_SEPARATOR
+ + " EnumerableTableScan(table=[[federate_jdbc,
t_order_federate]])" + LINE_SEPARATOR
+ + " EnumerableAggregate(group=[{}],
agg#0=[SINGLE_VALUE($0)])" + LINE_SEPARATOR
+ + " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t1):VARCHAR], expr#3=['before':VARCHAR], expr#4=[=($t2, $t3)],
user_id=[$t0], $condition=[$t4])" + LINE_SEPARATOR
+ + " EnumerableTableScan(table=[[federate_jdbc,
t_user_info]])" + LINE_SEPARATOR
+ " EnumerableAggregate(group=[{}],
agg#0=[SINGLE_VALUE($0)])" + LINE_SEPARATOR
+ " EnumerableCalc(expr#0..1=[{inputs}],
expr#2=[CAST($t1):VARCHAR], expr#3=['after':VARCHAR], expr#4=[=($t2, $t3)],
user_id=[$t0], $condition=[$t4])" + LINE_SEPARATOR
+ " EnumerableTableScan(table=[[federate_jdbc,
t_user_info]])" + LINE_SEPARATOR;