This is an automated email from the ASF dual-hosted git repository.
sunnianjun 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 fc59759f450 Add public method for OptimizerContext map to access
(#22149)
fc59759f450 is described below
commit fc59759f45081118c930b6069852271742bd3037
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sun Nov 13 20:41:42 2022 +0800
Add public method for OptimizerContext map to access (#22149)
* Add public method for OptimizerContext map to access
* remove static modifier
---
.../advanced/AdvancedSQLFederationExecutor.java | 7 ++-
.../executor/FilterableTableScanExecutor.java | 4 +-
.../executor/TranslatableTableScanExecutor.java | 4 +-
.../original/OriginalSQLFederationExecutor.java | 2 +-
.../optimizer/context/OptimizerContext.java | 24 +++++++-
.../optimizer/context/OptimizerContextTest.java | 70 ++++++++++++++++++++++
6 files changed, 101 insertions(+), 10 deletions(-)
diff --git
a/kernel/sql-federation/executor/advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedSQLFederationExecutor.java
b/kernel/sql-federation/executor/advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedSQLFederationExecutor.java
index 4af87e56445..baa02b06704 100644
---
a/kernel/sql-federation/executor/advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedSQLFederationExecutor.java
+++
b/kernel/sql-federation/executor/advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedSQLFederationExecutor.java
@@ -25,6 +25,7 @@ import org.apache.calcite.config.CalciteConnectionConfig;
import org.apache.calcite.config.CalciteConnectionConfigImpl;
import org.apache.calcite.jdbc.JavaTypeFactoryImpl;
import org.apache.calcite.linq4j.Enumerator;
+import org.apache.calcite.plan.RelOptPlanner;
import org.apache.calcite.prepare.CalciteCatalogReader;
import org.apache.calcite.runtime.Bindable;
import org.apache.calcite.schema.impl.AbstractSchema;
@@ -140,14 +141,14 @@ public final class AdvancedSQLFederationExecutor
implements SQLFederationExecuto
@SuppressWarnings("unchecked")
private ResultSet execute(final SelectStatementContext
selectStatementContext, final ShardingSphereSchema schema, final AbstractSchema
sqlFederationSchema, final Map<String, Object> params) {
- OptimizerParserContext parserContext =
optimizerContext.getParserContexts().get(databaseName);
+ OptimizerParserContext parserContext =
optimizerContext.getParserContext(databaseName);
CalciteConnectionConfig connectionConfig = new
CalciteConnectionConfigImpl(parserContext.getDialectProps());
CalciteCatalogReader catalogReader =
SQLFederationPlannerUtil.createCatalogReader(schemaName, sqlFederationSchema,
JAVA_TYPE_FACTORY, connectionConfig);
SqlValidator validator =
SQLFederationPlannerUtil.createSqlValidator(catalogReader, JAVA_TYPE_FACTORY,
parserContext.getDatabaseType(), connectionConfig);
SqlToRelConverter converter =
SQLFederationPlannerUtil.createSqlToRelConverter(catalogReader, validator,
SQLFederationPlannerUtil.createRelOptCluster(JAVA_TYPE_FACTORY),
optimizerContext.getSqlParserRule(), parserContext.getDatabaseType(), true);
- SQLOptimizeContext optimizeContext =
- new SQLOptimizeEngine(converter,
SQLFederationPlannerUtil.createHepPlanner()).optimize(selectStatementContext.getSqlStatement());
+ RelOptPlanner hepPlanner =
optimizerContext.getPlannerContext(databaseName).getHepPlanner();
+ SQLOptimizeContext optimizeContext = new SQLOptimizeEngine(converter,
hepPlanner).optimize(selectStatementContext.getSqlStatement());
Bindable<Object> executablePlan =
EnumerableInterpretable.toBindable(Collections.emptyMap(), null,
(EnumerableRel) optimizeContext.getBestPlan(), EnumerableRel.Prefer.ARRAY);
Enumerator<Object> enumerator = executablePlan.bind(new
SQLFederationDataContext(validator, converter, params)).enumerator();
return new SQLFederationResultSet(enumerator, schema,
sqlFederationSchema, selectStatementContext,
optimizeContext.getValidatedNodeType());
diff --git
a/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
b/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
index f981696e37c..4b64293888e 100644
---
a/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
+++
b/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/FilterableTableScanExecutor.java
@@ -121,7 +121,7 @@ public final class FilterableTableScanExecutor implements
TableScanExecutor {
public Enumerable<Object[]> execute(final ShardingSphereTable table, final
ScanNodeExecutorContext scanContext) {
String databaseName = executorContext.getDatabaseName();
String schemaName = executorContext.getSchemaName();
- DatabaseType databaseType =
DatabaseTypeEngine.getTrunkDatabaseType(optimizerContext.getParserContexts().get(databaseName).getDatabaseType().getType());
+ DatabaseType databaseType =
DatabaseTypeEngine.getTrunkDatabaseType(optimizerContext.getParserContext(databaseName).getDatabaseType().getType());
SqlString sqlString = createSQLString(table,
(FilterableScanNodeExecutorContext) scanContext,
SQLDialectFactory.getSQLDialect(databaseType));
SQLFederationExecutorContext federationContext =
executorContext.getFederationContext();
QueryContext queryContext =
createQueryContext(federationContext.getMetaData(), sqlString, databaseType);
@@ -220,7 +220,7 @@ public final class FilterableTableScanExecutor implements
TableScanExecutor {
private RelNode createRelNode(final ShardingSphereTable table, final
FilterableScanNodeExecutorContext scanContext) {
String databaseName = executorContext.getDatabaseName();
String schemaName = executorContext.getSchemaName();
- CalciteConnectionConfig connectionConfig = new
CalciteConnectionConfigImpl(optimizerContext.getParserContexts().get(databaseName).getDialectProps());
+ CalciteConnectionConfig connectionConfig = new
CalciteConnectionConfigImpl(optimizerContext.getParserContext(databaseName).getDialectProps());
ShardingSphereDatabase database =
executorContext.getFederationContext().getMetaData().getDatabase(databaseName);
CalciteCatalogReader catalogReader =
SQLFederationPlannerUtil.createCatalogReader(schemaName,
new FilterableSchema(schemaName,
database.getSchema(schemaName), database.getProtocolType(), JAVA_TYPE_FACTORY,
null), JAVA_TYPE_FACTORY, connectionConfig);
diff --git
a/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
b/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
index 5547725b3be..41b0d17d645 100644
---
a/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
+++
b/kernel/sql-federation/executor/core/src/main/java/org/apache/shardingsphere/sqlfederation/executor/TranslatableTableScanExecutor.java
@@ -124,7 +124,7 @@ public final class TranslatableTableScanExecutor implements
TableScanExecutor {
public Enumerable<Object[]> execute(final ShardingSphereTable table, final
ScanNodeExecutorContext scanContext) {
String databaseName = executorContext.getDatabaseName();
String schemaName = executorContext.getSchemaName();
- DatabaseType databaseType =
DatabaseTypeEngine.getTrunkDatabaseType(optimizerContext.getParserContexts().get(databaseName).getDatabaseType().getType());
+ DatabaseType databaseType =
DatabaseTypeEngine.getTrunkDatabaseType(optimizerContext.getParserContext(databaseName).getDatabaseType().getType());
SqlString sqlString = createSQLString(table,
(TranslatableScanNodeExecutorContext) scanContext,
SQLDialectFactory.getSQLDialect(databaseType));
// TODO replace sql parse with sql convert
SQLFederationExecutorContext federationContext =
executorContext.getFederationContext();
@@ -222,7 +222,7 @@ public final class TranslatableTableScanExecutor implements
TableScanExecutor {
private RelNode createRelNode(final ShardingSphereTable table, final
TranslatableScanNodeExecutorContext scanContext) {
String databaseName = executorContext.getDatabaseName();
String schemaName = executorContext.getSchemaName();
- CalciteConnectionConfig connectionConfig = new
CalciteConnectionConfigImpl(optimizerContext.getParserContexts().get(databaseName).getDialectProps());
+ CalciteConnectionConfig connectionConfig = new
CalciteConnectionConfigImpl(optimizerContext.getParserContext(databaseName).getDialectProps());
ShardingSphereDatabase database =
executorContext.getFederationContext().getMetaData().getDatabase(databaseName);
CalciteCatalogReader catalogReader =
SQLFederationPlannerUtil.createCatalogReader(schemaName,
new FilterableSchema(schemaName,
database.getSchema(schemaName), database.getProtocolType(), JAVA_TYPE_FACTORY,
null), JAVA_TYPE_FACTORY, connectionConfig);
diff --git
a/kernel/sql-federation/executor/original/src/main/java/org/apache/shardingsphere/sqlfederation/original/OriginalSQLFederationExecutor.java
b/kernel/sql-federation/executor/original/src/main/java/org/apache/shardingsphere/sqlfederation/original/OriginalSQLFederationExecutor.java
index 980a8b81dd2..f4592c7dc69 100644
---
a/kernel/sql-federation/executor/original/src/main/java/org/apache/shardingsphere/sqlfederation/original/OriginalSQLFederationExecutor.java
+++
b/kernel/sql-federation/executor/original/src/main/java/org/apache/shardingsphere/sqlfederation/original/OriginalSQLFederationExecutor.java
@@ -113,7 +113,7 @@ public final class OriginalSQLFederationExecutor implements
SQLFederationExecuto
private Connection createConnection(final
DriverExecutionPrepareEngine<JDBCExecutionUnit, Connection> prepareEngine,
final JDBCExecutorCallback<? extends
ExecuteResult> callback, final SQLFederationExecutorContext federationContext)
throws SQLException {
- Connection result = DriverManager.getConnection(CONNECTION_URL,
optimizerContext.getParserContexts().get(databaseName).getDialectProps());
+ Connection result = DriverManager.getConnection(CONNECTION_URL,
optimizerContext.getParserContext(databaseName).getDialectProps());
addSchema(result.unwrap(CalciteConnection.class), prepareEngine,
callback, federationContext);
return result;
}
diff --git
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContext.java
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContext.java
index 07179f8a96f..0e270e35f89 100644
---
a/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContext.java
+++
b/kernel/sql-federation/optimizer/src/main/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContext.java
@@ -19,9 +19,9 @@ package
org.apache.shardingsphere.sqlfederation.optimizer.context;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.parser.rule.SQLParserRule;
import
org.apache.shardingsphere.sqlfederation.optimizer.context.parser.OptimizerParserContext;
import
org.apache.shardingsphere.sqlfederation.optimizer.context.planner.OptimizerPlannerContext;
-import org.apache.shardingsphere.parser.rule.SQLParserRule;
import java.util.Map;
@@ -29,12 +29,32 @@ import java.util.Map;
* Optimizer context.
*/
@RequiredArgsConstructor
-@Getter
public final class OptimizerContext {
+ @Getter
private final SQLParserRule sqlParserRule;
private final Map<String, OptimizerParserContext> parserContexts;
private final Map<String, OptimizerPlannerContext> plannerContexts;
+
+ /**
+ * Get parser context.
+ *
+ * @param databaseName database name
+ * @return parser context
+ */
+ public OptimizerParserContext getParserContext(final String databaseName) {
+ return parserContexts.get(databaseName.toLowerCase());
+ }
+
+ /**
+ * Get planner context.
+ *
+ * @param databaseName database name
+ * @return Planner
+ */
+ public OptimizerPlannerContext getPlannerContext(final String
databaseName) {
+ return plannerContexts.get(databaseName.toLowerCase());
+ }
}
diff --git
a/kernel/sql-federation/optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
b/kernel/sql-federation/optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
new file mode 100644
index 00000000000..70f0977b797
--- /dev/null
+++
b/kernel/sql-federation/optimizer/src/test/java/org/apache/shardingsphere/sqlfederation/optimizer/context/OptimizerContextTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.sqlfederation.optimizer.context;
+
+import org.apache.shardingsphere.infra.database.DefaultDatabase;
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import
org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.parser.config.SQLParserRuleConfiguration;
+import org.apache.shardingsphere.parser.rule.SQLParserRule;
+import org.apache.shardingsphere.sql.parser.api.CacheOption;
+import
org.apache.shardingsphere.sqlfederation.optimizer.context.parser.OptimizerParserContext;
+import
org.apache.shardingsphere.sqlfederation.optimizer.context.planner.OptimizerPlannerContext;
+import org.junit.Test;
+
+import java.util.Collections;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public final class OptimizerContextTest {
+
+ @Test
+ public void assertGetSqlParserRule() {
+ OptimizerContext actual =
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
createShardingSphereDatabase()), createShardingSphereRuleMetaData());
+ assertThat(actual.getSqlParserRule(), instanceOf(SQLParserRule.class));
+ }
+
+ @Test
+ public void assertGetParserContext() {
+ OptimizerContext actual =
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
createShardingSphereDatabase()), createShardingSphereRuleMetaData());
+
assertThat(actual.getParserContext(DefaultDatabase.LOGIC_NAME.toLowerCase()),
instanceOf(OptimizerParserContext.class));
+ }
+
+ @Test
+ public void assertGetPlannerContext() {
+ OptimizerContext actual =
OptimizerContextFactory.create(Collections.singletonMap(DefaultDatabase.LOGIC_NAME,
createShardingSphereDatabase()), createShardingSphereRuleMetaData());
+
assertThat(actual.getPlannerContext(DefaultDatabase.LOGIC_NAME.toLowerCase()),
instanceOf(OptimizerPlannerContext.class));
+ }
+
+ private ShardingSphereDatabase createShardingSphereDatabase() {
+ ShardingSphereDatabase result = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
+ when(result.getProtocolType().getType()).thenReturn("MySQL");
+ return result;
+ }
+
+ private ShardingSphereRuleMetaData createShardingSphereRuleMetaData() {
+ ShardingSphereRuleMetaData result =
mock(ShardingSphereRuleMetaData.class);
+ CacheOption cacheOption = new CacheOption(10, 1000);
+ when(result.getSingleRule(SQLParserRule.class)).thenReturn(new
SQLParserRule(new SQLParserRuleConfiguration(true, cacheOption, cacheOption)));
+ return result;
+ }
+}