strongduanmu commented on code in PR #21172:
URL: https://github.com/apache/shardingsphere/pull/21172#discussion_r1005112443
##########
kernel/sql-federation/executor/advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedSQLFederationExecutor.java:
##########
@@ -136,17 +141,23 @@ private AbstractSchema createSQLFederationSchema(final
DriverExecutionPrepareEng
@SuppressWarnings("unchecked")
private ResultSet execute(final SelectStatementContext
selectStatementContext, final ShardingSphereSchema schema, final AbstractSchema
sqlFederationSchema, final Map<String, Object> parameters) {
+ initializePlanManagement(sqlFederationSchema);
Review Comment:
Can we skip sql node convert with plan cache?
##########
kernel/sql-federation/executor/advanced/src/main/java/org/apache/shardingsphere/sqlfederation/advanced/AdvancedSQLFederationExecutor.java:
##########
@@ -136,17 +141,23 @@ private AbstractSchema createSQLFederationSchema(final
DriverExecutionPrepareEng
@SuppressWarnings("unchecked")
private ResultSet execute(final SelectStatementContext
selectStatementContext, final ShardingSphereSchema schema, final AbstractSchema
sqlFederationSchema, final Map<String, Object> parameters) {
+ initializePlanManagement(sqlFederationSchema);
+ SqlNode sqlNode =
SQLNodeConverterEngine.convert(selectStatementContext.getSqlStatement());
+ SQLOptimizeContext optimizeContext = planManagement.get(sqlNode,
parameters);
+ Bindable<Object> executablePlan =
EnumerableInterpretable.toBindable(Collections.emptyMap(), null,
(EnumerableRel) optimizeContext.getBestPlan(), EnumerableRel.Prefer.ARRAY);
+ Enumerator<Object> enumerator = executablePlan.bind(new
SQLFederationDataContext(planManagement.getValidator(),
planManagement.getConverter(), parameters)).enumerator();
+ return new SQLFederationResultSet(enumerator, schema,
sqlFederationSchema, selectStatementContext,
optimizeContext.getValidatedNodeType());
+ }
+
+ private void initializePlanManagement(final AbstractSchema
sqlFederationSchema) {
OptimizerParserContext parserContext =
optimizerContext.getParserContexts().get(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());
- Bindable<Object> executablePlan =
EnumerableInterpretable.toBindable(Collections.emptyMap(), null,
(EnumerableRel) optimizeContext.getBestPlan(), EnumerableRel.Prefer.ARRAY);
- Enumerator<Object> enumerator = executablePlan.bind(new
SQLFederationDataContext(validator, converter, parameters)).enumerator();
- return new SQLFederationResultSet(enumerator, schema,
sqlFederationSchema, selectStatementContext,
optimizeContext.getValidatedNodeType());
+ SQLOptimizeEngine optimizer = new SQLOptimizeEngine(converter,
SQLFederationPlannerUtil.createHepPlanner());
+ planManagement = new OptimizedPlanManagement(optimizer, validator,
converter);
Review Comment:
Can we design OptimizedPlanManagement like SQLParserEngine? We can decide
whether to use cache according to different scenarios.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]