You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by GitBox <gi...@apache.org> on 2022/10/26 01:08:17 UTC

[GitHub] [shardingsphere] strongduanmu commented on a diff in pull request #21172: add plan cache 20220923

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: notifications-unsubscribe@shardingsphere.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org