This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch ty/object_type in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit d5c37ef6a0c68c6ff61f846e98564a3b87339006 Author: Zhenyu Luo <[email protected]> AuthorDate: Fri Dec 5 12:38:27 2025 +0800 perf: Optimize TypeManager allocation in StatementAnalyzer (#16870) (cherry picked from commit 1b2b32bc2a3113a93a8855162b9759ffd547cf0a) --- .../apache/iotdb/db/queryengine/plan/Coordinator.java | 17 ++++++++++------- .../plan/execution/config/TableConfigTaskVisitor.java | 9 +++++++-- .../plan/relational/analyzer/StatementAnalyzer.java | 9 +++++---- .../relational/analyzer/StatementAnalyzerFactory.java | 17 ++++++++++++----- .../plan/relational/planner/TableModelPlanner.java | 9 +++++++-- .../plan/relational/analyzer/AnalyzerTest.java | 7 +++++-- .../queryengine/plan/relational/analyzer/AuthTest.java | 10 +++++++--- .../relational/analyzer/RowPatternRecognitionTest.java | 4 +++- .../queryengine/plan/relational/planner/PlanTester.java | 4 +++- 9 files changed, 59 insertions(+), 27 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java index 3a900b4bc12..f10600cbda9 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/Coordinator.java @@ -122,6 +122,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser; import org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite.StatementRewrite; import org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite.StatementRewriteFactory; import org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager; +import org.apache.iotdb.db.queryengine.plan.relational.type.TypeManager; import org.apache.iotdb.db.queryengine.plan.statement.IConfigStatement; import org.apache.iotdb.db.queryengine.plan.statement.Statement; import org.apache.iotdb.db.utils.SetThreadName; @@ -189,9 +190,11 @@ public class Coordinator { private final List<PlanOptimizer> logicalPlanOptimizers; private final List<PlanOptimizer> distributionPlanOptimizers; private final DataNodeLocationSupplierFactory.DataNodeLocationSupplier dataNodeLocationSupplier; + private final TypeManager typeManager; private Coordinator() { this.queryExecutionMap = new ConcurrentHashMap<>(); + this.typeManager = new InternalTypeManager(); this.executor = getQueryExecutor(); this.writeOperationExecutor = getWriteExecutor(); this.scheduledExecutor = getScheduledExecutor(); @@ -205,13 +208,11 @@ public class Coordinator { this.statementRewrite = new StatementRewriteFactory().getStatementRewrite(); this.logicalPlanOptimizers = new LogicalOptimizeFactory( - new PlannerContext( - LocalExecutionPlanner.getInstance().metadata, new InternalTypeManager())) + new PlannerContext(LocalExecutionPlanner.getInstance().metadata, typeManager)) .getPlanOptimizers(); this.distributionPlanOptimizers = new DistributedOptimizeFactory( - new PlannerContext( - LocalExecutionPlanner.getInstance().metadata, new InternalTypeManager())) + new PlannerContext(LocalExecutionPlanner.getInstance().metadata, typeManager)) .getPlanOptimizers(); this.dataNodeLocationSupplier = DataNodeLocationSupplierFactory.getSupplier(); } @@ -399,7 +400,8 @@ public class Coordinator { logicalPlanOptimizers, distributionPlanOptimizers, AuthorityChecker.getAccessControl(), - dataNodeLocationSupplier); + dataNodeLocationSupplier, + typeManager); return new QueryExecution(tableModelPlanner, queryContext, executor); } @@ -480,7 +482,7 @@ public class Coordinator { executor, statement.accept( new TableConfigTaskVisitor( - clientSession, metadata, AuthorityChecker.getAccessControl()), + clientSession, metadata, AuthorityChecker.getAccessControl(), typeManager), queryContext)); } if (statement instanceof WrappedInsertStatement) { @@ -498,7 +500,8 @@ public class Coordinator { logicalPlanOptimizers, distributionPlanOptimizers, AuthorityChecker.getAccessControl(), - dataNodeLocationSupplier); + dataNodeLocationSupplier, + typeManager); return new QueryExecution(tableModelPlanner, queryContext, executor); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java index b7fe3f7eb68..424a5306bf2 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/TableConfigTaskVisitor.java @@ -219,6 +219,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Use; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.ViewFieldDefinition; import org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite.StatementRewrite; import org.apache.iotdb.db.queryengine.plan.relational.type.AuthorRType; +import org.apache.iotdb.db.queryengine.plan.relational.type.TypeManager; import org.apache.iotdb.db.queryengine.plan.relational.type.TypeNotFoundException; import org.apache.iotdb.db.queryengine.plan.statement.metadata.DatabaseSchemaStatement; import org.apache.iotdb.db.queryengine.plan.statement.metadata.RemoveAINodeStatement; @@ -281,13 +282,17 @@ public class TableConfigTaskVisitor extends AstVisitor<IConfigTask, MPPQueryCont private final AccessControl accessControl; + private final TypeManager typeManager; + public TableConfigTaskVisitor( final IClientSession clientSession, final Metadata metadata, - final AccessControl accessControl) { + final AccessControl accessControl, + final TypeManager typeManager) { this.clientSession = clientSession; this.metadata = metadata; this.accessControl = accessControl; + this.typeManager = typeManager; } @Override @@ -868,7 +873,7 @@ public class TableConfigTaskVisitor extends AstVisitor<IConfigTask, MPPQueryCont new Analyzer( context, context.getSession(), - new StatementAnalyzerFactory(metadata, null, accessControl), + new StatementAnalyzerFactory(metadata, null, accessControl, typeManager), Collections.emptyList(), Collections.emptyMap(), StatementRewrite.NOOP, diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java index 8a3fc89c936..5acf353e32e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzer.java @@ -192,7 +192,6 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.With; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.WithQuery; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.WrappedInsertStatement; import org.apache.iotdb.db.queryengine.plan.relational.type.CompatibleResolver; -import org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager; import org.apache.iotdb.db.queryengine.plan.relational.type.TypeManager; import org.apache.iotdb.db.queryengine.plan.statement.component.FillPolicy; import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertBaseStatement; @@ -307,12 +306,12 @@ public class StatementAnalyzer { private final SessionInfo sessionContext; - private final TypeManager typeManager = new InternalTypeManager(); - private final Metadata metadata; private final CorrelationSupport correlationSupport; + private final TypeManager typeManager; + public StatementAnalyzer( StatementAnalyzerFactory statementAnalyzerFactory, Analysis analysis, @@ -321,7 +320,8 @@ public class StatementAnalyzer { WarningCollector warningCollector, SessionInfo sessionContext, Metadata metadata, - CorrelationSupport correlationSupport) { + CorrelationSupport correlationSupport, + TypeManager typeManager) { this.statementAnalyzerFactory = statementAnalyzerFactory; this.analysis = analysis; this.queryContext = queryContext; @@ -330,6 +330,7 @@ public class StatementAnalyzer { this.sessionContext = sessionContext; this.metadata = metadata; this.correlationSupport = correlationSupport; + this.typeManager = typeManager; } public Scope analyze(Node node) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzerFactory.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzerFactory.java index ba63eb40990..53c300f3ce3 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzerFactory.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/StatementAnalyzerFactory.java @@ -25,6 +25,7 @@ import org.apache.iotdb.db.queryengine.execution.warnings.WarningCollector; import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata; import org.apache.iotdb.db.queryengine.plan.relational.security.AccessControl; import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser; +import org.apache.iotdb.db.queryengine.plan.relational.type.TypeManager; import static java.util.Objects.requireNonNull; @@ -33,16 +34,21 @@ public class StatementAnalyzerFactory { private final Metadata metadata; private final SqlParser sqlParser; private final AccessControl accessControl; + private final TypeManager typeManager; public StatementAnalyzerFactory( - final Metadata metadata, final SqlParser sqlParser, final AccessControl accessControl) { + final Metadata metadata, + final SqlParser sqlParser, + final AccessControl accessControl, + final TypeManager typeManager) { this.metadata = requireNonNull(metadata, "plannerContext is null"); this.sqlParser = sqlParser; this.accessControl = requireNonNull(accessControl, "accessControl is null"); + this.typeManager = requireNonNull(typeManager, "typeManager is null"); } public StatementAnalyzerFactory withSpecializedAccessControl(AccessControl accessControl) { - return new StatementAnalyzerFactory(metadata, sqlParser, accessControl); + return new StatementAnalyzerFactory(metadata, sqlParser, accessControl, typeManager); } public StatementAnalyzer createStatementAnalyzer( @@ -59,12 +65,13 @@ public class StatementAnalyzerFactory { warningCollector, session, metadata, - correlationSupport); + correlationSupport, + typeManager); } public static StatementAnalyzerFactory createTestingStatementAnalyzerFactory( - Metadata metadata, AccessControl accessControl) { - return new StatementAnalyzerFactory(metadata, new SqlParser(), accessControl); + Metadata metadata, AccessControl accessControl, TypeManager typeManager) { + return new StatementAnalyzerFactory(metadata, new SqlParser(), accessControl, typeManager); } public AccessControl getAccessControl() { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java index 8d7ce3cebbb..fddff825f0d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/TableModelPlanner.java @@ -47,6 +47,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement; import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.WrappedInsertStatement; import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser; import org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite.StatementRewrite; +import org.apache.iotdb.db.queryengine.plan.relational.type.TypeManager; import org.apache.iotdb.db.queryengine.plan.scheduler.ClusterScheduler; import org.apache.iotdb.db.queryengine.plan.scheduler.IScheduler; import org.apache.iotdb.db.queryengine.plan.scheduler.load.LoadTsFileScheduler; @@ -87,6 +88,8 @@ public class TableModelPlanner implements IPlanner { private final DataNodeLocationSupplierFactory.DataNodeLocationSupplier dataNodeLocationSupplier; + private final TypeManager typeManager; + public TableModelPlanner( final Statement statement, final SqlParser sqlParser, @@ -100,7 +103,8 @@ public class TableModelPlanner implements IPlanner { final List<PlanOptimizer> logicalPlanOptimizers, final List<PlanOptimizer> distributionPlanOptimizers, final AccessControl accessControl, - final DataNodeLocationSupplierFactory.DataNodeLocationSupplier dataNodeLocationSupplier) { + final DataNodeLocationSupplierFactory.DataNodeLocationSupplier dataNodeLocationSupplier, + final TypeManager typeManager) { this.statement = statement; this.sqlParser = sqlParser; this.metadata = metadata; @@ -112,6 +116,7 @@ public class TableModelPlanner implements IPlanner { this.distributionPlanOptimizers = distributionPlanOptimizers; this.accessControl = accessControl; this.dataNodeLocationSupplier = dataNodeLocationSupplier; + this.typeManager = typeManager; } @Override @@ -119,7 +124,7 @@ public class TableModelPlanner implements IPlanner { return new Analyzer( context, context.getSession(), - new StatementAnalyzerFactory(metadata, sqlParser, accessControl), + new StatementAnalyzerFactory(metadata, sqlParser, accessControl, typeManager), Collections.emptyList(), Collections.emptyMap(), statementRewrite, diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java index de38c52a0c5..b50c7cbd33b 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AnalyzerTest.java @@ -72,6 +72,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.LogicalExpression import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement; import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser; import org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite.StatementRewriteFactory; +import org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager; import org.apache.iotdb.db.queryengine.plan.statement.StatementTestUtils; import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowStatement; import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertTabletStatement; @@ -1261,7 +1262,8 @@ public class AnalyzerTest { final SessionInfo session) { try { final StatementAnalyzerFactory statementAnalyzerFactory = - new StatementAnalyzerFactory(metadata, sqlParser, nopAccessControl); + new StatementAnalyzerFactory( + metadata, sqlParser, nopAccessControl, new InternalTypeManager()); Analyzer analyzer = new Analyzer( @@ -1285,7 +1287,8 @@ public class AnalyzerTest { final SqlParser sqlParser, final SessionInfo session) { final StatementAnalyzerFactory statementAnalyzerFactory = - new StatementAnalyzerFactory(metadata, sqlParser, nopAccessControl); + new StatementAnalyzerFactory( + metadata, sqlParser, nopAccessControl, new InternalTypeManager()); Analyzer analyzer = new Analyzer( context, diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AuthTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AuthTest.java index 7a2174769a0..631640d5dda 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AuthTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/AuthTest.java @@ -32,6 +32,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.security.TreeAccessCheckV import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement; import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser; import org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite.StatementRewrite; +import org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager; import org.junit.Test; import org.mockito.Mockito; @@ -224,7 +225,8 @@ public class AuthTest { new StatementAnalyzerFactory( TEST_MATADATA, sqlParser, - new AccessControlImpl(authChecker, new TreeAccessCheckVisitor())); + new AccessControlImpl(authChecker, new TreeAccessCheckVisitor()), + new InternalTypeManager()); MPPQueryContext context = new MPPQueryContext(sql, QUERY_ID, 0, session, null, null); Analyzer analyzer = new Analyzer( @@ -251,7 +253,8 @@ public class AuthTest { new TableConfigTaskVisitor( Mockito.mock(IClientSession.class), TEST_MATADATA, - new AccessControlImpl(authChecker, new TreeAccessCheckVisitor())), + new AccessControlImpl(authChecker, new TreeAccessCheckVisitor()), + new InternalTypeManager()), context); } @@ -266,7 +269,8 @@ public class AuthTest { new TableConfigTaskVisitor( clientSession, TEST_MATADATA, - new AccessControlImpl(authChecker, new TreeAccessCheckVisitor())), + new AccessControlImpl(authChecker, new TreeAccessCheckVisitor()), + new InternalTypeManager()), context); } } diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/RowPatternRecognitionTest.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/RowPatternRecognitionTest.java index c96747ff720..ecb8c6fb266 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/RowPatternRecognitionTest.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/analyzer/RowPatternRecognitionTest.java @@ -23,6 +23,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.security.AllowAllAccessCo import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement; import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser; import org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite.StatementRewriteFactory; +import org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager; import org.junit.Assert; import org.junit.Test; @@ -475,7 +476,8 @@ public class RowPatternRecognitionTest { final SqlParser sqlParser, final SessionInfo session) { final StatementAnalyzerFactory statementAnalyzerFactory = - new StatementAnalyzerFactory(metadata, sqlParser, nopAccessControl); + new StatementAnalyzerFactory( + metadata, sqlParser, nopAccessControl, new InternalTypeManager()); Analyzer analyzer = new Analyzer( diff --git a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java index 1d388876b29..a4cef177d81 100644 --- a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java +++ b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/plan/relational/planner/PlanTester.java @@ -43,6 +43,7 @@ import org.apache.iotdb.db.queryengine.plan.relational.security.AllowAllAccessCo import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Statement; import org.apache.iotdb.db.queryengine.plan.relational.sql.parser.SqlParser; import org.apache.iotdb.db.queryengine.plan.relational.sql.rewrite.StatementRewriteFactory; +import org.apache.iotdb.db.queryengine.plan.relational.type.InternalTypeManager; import com.google.common.collect.ImmutableList; import org.mockito.Mockito; @@ -170,7 +171,8 @@ public class PlanTester { SessionInfo session) { try { StatementAnalyzerFactory statementAnalyzerFactory = - new StatementAnalyzerFactory(metadata, sqlParser, new AllowAllAccessControl()); + new StatementAnalyzerFactory( + metadata, sqlParser, new AllowAllAccessControl(), new InternalTypeManager()); Analyzer analyzer = new Analyzer(
