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]

Reply via email to