This is an automated email from the ASF dual-hosted git repository. shuwenwei pushed a commit to branch calc_commons in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 10eef615d130cbc275b5850ee642be7923873d8e Author: shuwenwei <[email protected]> AuthorDate: Fri Apr 17 14:11:36 2026 +0800 add ITableTypeProvider --- .../relational/ColumnTransformerBuilder.java | 6 +- .../planner/ITableOperatorGeneratorContext.java | 4 +- .../plan/planner/TableOperatorGenerator.java | 93 +++++++++++----------- .../plan/analyze/ITableTypeProvider.java} | 18 +++-- .../plan/node/CommonPlanNodeDeserializer.java | 8 +- .../planner/plan/node/IPlanNodeDeserializer.java | 4 - ...zer.java => IPlanNodeDeserializerProvider.java} | 18 +---- .../plan/planner/plan/node/PlanNodeType.java | 29 ++++--- .../db/queryengine/plan/analyze/TypeProvider.java | 3 +- .../plan/planner/LocalExecutionPlanContext.java | 6 ++ .../plan/planner/plan/PlanFragment.java | 4 +- .../plan/node/DataNodePlanNodeDeserializer.java | 2 +- .../node/DataNodePlanNodeDeserializerProvider.java | 25 ++++++ ...lanner.plan.node.IPlanNodeDeserializerProvider} | 2 +- 14 files changed, 120 insertions(+), 102 deletions(-) diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/execution/relational/ColumnTransformerBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/execution/relational/ColumnTransformerBuilder.java index 55d115c66c1..8aeb4d80a4e 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/execution/relational/ColumnTransformerBuilder.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/execution/relational/ColumnTransformerBuilder.java @@ -148,6 +148,7 @@ import org.apache.iotdb.db.calc_commons.transformation.dag.column.unary.scalar.f import org.apache.iotdb.db.conf.IoTDBDescriptor; import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.node_commons.common.SessionInfo; +import org.apache.iotdb.db.node_commons.plan.analyze.ITableTypeProvider; import org.apache.iotdb.db.node_commons.plan.planner.plan.parameter.InputLocation; import org.apache.iotdb.db.node_commons.plan.relational.function.arithmetic.AdditionResolver; import org.apache.iotdb.db.node_commons.plan.relational.function.arithmetic.DivisionResolver; @@ -194,7 +195,6 @@ import org.apache.iotdb.db.node_commons.plan.relational.sql.ast.Trim; import org.apache.iotdb.db.node_commons.plan.relational.sql.ast.WhenClause; import org.apache.iotdb.db.node_commons.plan.relational.type.InternalTypeManager; import org.apache.iotdb.db.node_commons.plan.relational.type.TypeNotFoundException; -import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata; import org.apache.iotdb.udf.api.customizer.analysis.ScalarFunctionAnalysis; import org.apache.iotdb.udf.api.customizer.parameter.FunctionArguments; @@ -1940,7 +1940,7 @@ public class ColumnTransformerBuilder private final int originSize; - private final TypeProvider typeProvider; + private final ITableTypeProvider typeProvider; private final Metadata metadata; @@ -1953,7 +1953,7 @@ public class ColumnTransformerBuilder List<ColumnTransformer> commonTransformerList, List<TSDataType> inputDataTypes, int originSize, - TypeProvider typeProvider, + ITableTypeProvider typeProvider, Metadata metadata) { this.sessionInfo = sessionInfo; this.leafList = leafList; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java index 0948e39cb6a..b79be7861b6 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java @@ -19,12 +19,12 @@ package org.apache.iotdb.db.calc_commons.plan.planner; -import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; +import org.apache.iotdb.db.node_commons.plan.analyze.ITableTypeProvider; import java.time.ZoneId; public interface ITableOperatorGeneratorContext { - TypeProvider getTypeProvider(); + ITableTypeProvider getTableTypeProvider(); ZoneId getZoneId(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/TableOperatorGenerator.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/TableOperatorGenerator.java index 59da75bfe1b..eb631cb297a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/TableOperatorGenerator.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/TableOperatorGenerator.java @@ -105,6 +105,7 @@ import org.apache.iotdb.db.calc_commons.transformation.dag.column.ColumnTransfor import org.apache.iotdb.db.calc_commons.transformation.dag.column.leaf.LeafColumnTransformer; import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.node_commons.common.SessionInfo; +import org.apache.iotdb.db.node_commons.plan.analyze.ITableTypeProvider; import org.apache.iotdb.db.node_commons.plan.planner.plan.node.ICoreQueryPlanVisitor; import org.apache.iotdb.db.node_commons.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.node_commons.plan.planner.plan.node.PlanNodeId; @@ -160,7 +161,6 @@ import org.apache.iotdb.db.node_commons.plan.relational.sql.ast.Expression; import org.apache.iotdb.db.node_commons.plan.relational.sql.ast.Literal; import org.apache.iotdb.db.node_commons.plan.relational.sql.ast.SymbolReference; import org.apache.iotdb.db.node_commons.plan.relational.type.InternalTypeManager; -import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; import org.apache.iotdb.db.queryengine.plan.relational.metadata.Metadata; import org.apache.iotdb.db.utils.datastructure.SortKey; import org.apache.iotdb.udf.api.relational.TableFunction; @@ -278,7 +278,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo @Override public Operator visitFilter(FilterNode node, C context) { - TypeProvider typeProvider = context.getTypeProvider(); + ITableTypeProvider typeProvider = context.getTableTypeProvider(); Optional<Expression> predicate = Optional.of(node.getPredicate()); Operator inputOperator = node.getChild().accept(this, context); List<TSDataType> inputDataTypes = getInputColumnTypes(node, typeProvider); @@ -328,7 +328,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo ImmutableList.of(), ImmutableList.of(), 0, - context.getTypeProvider(), + context.getTableTypeProvider(), metadata); return visitor.process(p, filterColumnTransformerContext); @@ -355,7 +355,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo commonTransformerList, filterOutputDataTypes, inputLocations.size(), - context.getTypeProvider(), + context.getTableTypeProvider(), metadata); for (Expression expression : projectExpressions) { @@ -382,7 +382,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo @Override public Operator visitProject(ProjectNode node, C context) { - TypeProvider typeProvider = context.getTypeProvider(); + ITableTypeProvider typeProvider = context.getTableTypeProvider(); Optional<Expression> predicate; Operator inputOperator; List<TSDataType> inputDataTypes; @@ -410,7 +410,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo context); } - private List<TSDataType> getInputColumnTypes(PlanNode node, TypeProvider typeProvider) { + private List<TSDataType> getInputColumnTypes(PlanNode node, ITableTypeProvider typeProvider) { // ignore "time" column return node.getChildren().stream() .map(PlanNode::getOutputSymbols) @@ -423,7 +423,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo public Operator visitGapFill(GapFillNode node, C context) { Operator child = node.getChild().accept(this, context); List<TSDataType> inputDataTypes = - getOutputColumnTypes(node.getChild(), context.getTypeProvider()); + getOutputColumnTypes(node.getChild(), context.getTableTypeProvider()); int timeColumnIndex = getColumnIndex(node.getGapFillColumn(), node.getChild()); if (node.getGapFillGroupingKeys().isEmpty()) { // without group keys if (node.getMonthDuration() == 0) { // without month interval @@ -496,7 +496,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo Operator child = node.getChild().accept(this, context); List<TSDataType> inputDataTypes = - getOutputColumnTypes(node.getChild(), context.getTypeProvider()); + getOutputColumnTypes(node.getChild(), context.getTableTypeProvider()); int inputColumnCount = inputDataTypes.size(); int helperColumnIndex = -1; if (node.getHelperColumn().isPresent()) { @@ -572,7 +572,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo Operator child = node.getChild().accept(this, context); List<TSDataType> inputDataTypes = - getOutputColumnTypes(node.getChild(), context.getTypeProvider()); + getOutputColumnTypes(node.getChild(), context.getTableTypeProvider()); int inputColumnCount = inputDataTypes.size(); int helperColumnIndex = getColumnIndex(node.getHelperColumn(), node.getChild()); ILinearFill[] fillArray = getLinearFill(inputColumnCount, inputDataTypes); @@ -605,7 +605,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo OperatorContext operatorContext = addOperatorContext(context, node.getPlanNodeId(), TableFillOperator.class.getSimpleName()); List<TSDataType> inputDataTypes = - getOutputColumnTypes(node.getChild(), context.getTypeProvider()); + getOutputColumnTypes(node.getChild(), context.getTableTypeProvider()); int inputColumnCount = inputDataTypes.size(); Literal filledValue = node.getFilledValue(); return new TableFillOperator( @@ -745,7 +745,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo for (PlanNode child : node.getChildren()) { children.add(this.process(child, context)); } - List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTypeProvider()); + List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTableTypeProvider()); int sortItemsCount = node.getOrderingScheme().getOrderBy().size(); List<Integer> sortItemIndexList = new ArrayList<>(sortItemsCount); @@ -755,7 +755,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo node.getOrderingScheme(), sortItemIndexList, sortItemDataTypeList, - context.getTypeProvider()); + context.getTableTypeProvider()); return new TableMergeSortOperator( operatorContext, @@ -769,7 +769,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo public Operator visitSort(SortNode node, C context) { OperatorContext operatorContext = addOperatorContext(context, node.getPlanNodeId(), TableSortOperator.class.getSimpleName()); - List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTypeProvider()); + List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTableTypeProvider()); int sortItemsCount = node.getOrderingScheme().getOrderBy().size(); List<Integer> sortItemIndexList = new ArrayList<>(sortItemsCount); @@ -779,7 +779,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo node.getOrderingScheme(), sortItemIndexList, sortItemDataTypeList, - context.getTypeProvider()); + context.getTableTypeProvider()); Operator child = node.getChild().accept(this, context); @@ -805,7 +805,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo for (PlanNode child : node.getChildren()) { children.add(this.process(child, context)); } - List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTypeProvider()); + List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTableTypeProvider()); int sortItemsCount = node.getOrderingScheme().getOrderBy().size(); List<Integer> sortItemIndexList = new ArrayList<>(sortItemsCount); @@ -815,7 +815,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo node.getOrderingScheme(), sortItemIndexList, sortItemDataTypeList, - context.getTypeProvider()); + context.getTableTypeProvider()); return new TableTopKOperator( operatorContext, children, @@ -826,7 +826,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo node.isChildrenDataInOrder()); } - protected List<TSDataType> getOutputColumnTypes(PlanNode node, TypeProvider typeProvider) { + protected List<TSDataType> getOutputColumnTypes(PlanNode node, ITableTypeProvider typeProvider) { return node.getOutputSymbols().stream() .map(s -> getTSDataType(typeProvider.getTableModelType(s))) .collect(Collectors.toList()); @@ -837,7 +837,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo OrderingScheme orderingScheme, List<Integer> sortItemIndexList, List<TSDataType> sortItemDataTypeList, - TypeProvider typeProvider) { + ITableTypeProvider typeProvider) { Map<Symbol, Integer> columnIndex = new HashMap<>(); int index = 0; for (Symbol symbol : outputSymbols) { @@ -863,7 +863,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo OperatorContext operatorContext = addOperatorContext( context, node.getPlanNodeId(), TableStreamSortOperator.class.getSimpleName()); - List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTypeProvider()); + List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTableTypeProvider()); int sortItemsCount = node.getOrderingScheme().getOrderBy().size(); List<Integer> sortItemIndexList = new ArrayList<>(sortItemsCount); @@ -873,7 +873,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo node.getOrderingScheme(), sortItemIndexList, sortItemDataTypeList, - context.getTypeProvider()); + context.getTableTypeProvider()); Operator child = node.getChild().accept(this, context); @@ -915,7 +915,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo @Override public Operator visitJoin(JoinNode node, C context) { - List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTypeProvider()); + List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTableTypeProvider()); Operator leftChild = node.getLeftChild().accept(this, context); Operator rightChild = node.getRightChild().accept(this, context); @@ -986,10 +986,10 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo rightJoinKeyPositions[i] = rightJoinKeyPosition; Type leftJoinKeyType = - context.getTypeProvider().getTableModelType(node.getCriteria().get(i).getLeft()); + context.getTableTypeProvider().getTableModelType(node.getCriteria().get(i).getLeft()); checkIfJoinKeyTypeMatches( leftJoinKeyType, - context.getTypeProvider().getTableModelType(node.getCriteria().get(i).getRight())); + context.getTableTypeProvider().getTableModelType(node.getCriteria().get(i).getRight())); joinKeyTypes.add(leftJoinKeyType); } @@ -1007,10 +1007,11 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo } rightJoinKeyPositions[equiSize] = rightAsofJoinKeyPosition; - if (context.getTypeProvider().getTableModelType(asofJoinClause.getLeft()) != TIMESTAMP) { + if (context.getTableTypeProvider().getTableModelType(asofJoinClause.getLeft()) != TIMESTAMP) { throw new IllegalStateException("Type of left ASOF Join key is not TIMESTAMP"); } - if (context.getTypeProvider().getTableModelType(asofJoinClause.getRight()) != TIMESTAMP) { + if (context.getTableTypeProvider().getTableModelType(asofJoinClause.getRight()) + != TIMESTAMP) { throw new IllegalStateException("Type of right ASOF Join key is not TIMESTAMP"); } @@ -1158,7 +1159,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo @Override public Operator visitSemiJoin(SemiJoinNode node, C context) { - List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTypeProvider()); + List<TSDataType> dataTypes = getOutputColumnTypes(node, context.getTableTypeProvider()); Operator leftChild = node.getLeftChild().accept(this, context); Operator rightChild = node.getRightChild().accept(this, context); @@ -1186,11 +1187,11 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo "FilteringSource of SemiJoinNode doesn't contain filteringSourceJoinSymbol."); Type sourceJoinKeyType = - context.getTypeProvider().getTableModelType(node.getSourceJoinSymbol()); + context.getTableTypeProvider().getTableModelType(node.getSourceJoinSymbol()); checkIfJoinKeyTypeMatches( sourceJoinKeyType, - context.getTypeProvider().getTableModelType(node.getFilteringSourceJoinSymbol())); + context.getTableTypeProvider().getTableModelType(node.getFilteringSourceJoinSymbol())); OperatorContext operatorContext = addOperatorContext( @@ -1242,14 +1243,14 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo Operator child = node.getChild().accept(this, context); if (node.getGroupingKeys().isEmpty()) { - return planGlobalAggregation(node, child, context.getTypeProvider(), context); + return planGlobalAggregation(node, child, context.getTableTypeProvider(), context); } - return planGroupByAggregation(node, child, context.getTypeProvider(), context); + return planGroupByAggregation(node, child, context.getTableTypeProvider(), context); } private Operator planGlobalAggregation( - AggregationNode node, Operator child, TypeProvider typeProvider, C context) { + AggregationNode node, Operator child, ITableTypeProvider typeProvider, C context) { OperatorContext operatorContext = addOperatorContext( context, node.getPlanNodeId(), AggregationOperator.class.getSimpleName()); @@ -1281,7 +1282,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo Symbol symbol, AggregationNode.Aggregation aggregation, AggregationNode.Step step, - TypeProvider typeProvider, + ITableTypeProvider typeProvider, boolean scanAscending, boolean isAggTableScan, String timeColumnName, @@ -1324,7 +1325,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo } protected Operator planGroupByAggregation( - AggregationNode node, Operator child, TypeProvider typeProvider, C context) { + AggregationNode node, Operator child, ITableTypeProvider typeProvider, C context) { Map<Symbol, Integer> childLayout = makeLayoutFromOutputSymbols(node.getChild().getOutputSymbols()); @@ -1464,7 +1465,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo Symbol symbol, AggregationNode.Aggregation aggregation, AggregationNode.Step step, - TypeProvider typeProvider) { + ITableTypeProvider typeProvider) { List<Integer> argumentChannels = new ArrayList<>(); for (Expression argument : aggregation.getArguments()) { Symbol argumentSymbol = Symbol.from(argument); @@ -1507,7 +1508,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo if (node.getChildren().isEmpty()) { List<TSDataType> outputDataTypes = node.getOutputSymbols().stream() - .map(context.getTypeProvider()::getTableModelType) + .map(context.getTableTypeProvider()::getTableModelType) .map(InternalTypeManager::getTSDataType) .collect(Collectors.toList()); OperatorContext operatorContext = @@ -1522,13 +1523,13 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo List<TSDataType> inputDataTypes = node.getChild().getOutputSymbols().stream() - .map(context.getTypeProvider()::getTableModelType) + .map(context.getTableTypeProvider()::getTableModelType) .map(InternalTypeManager::getTSDataType) .collect(Collectors.toList()); List<TSDataType> outputDataTypes = node.getOutputSymbols().stream() - .map(context.getTypeProvider()::getTableModelType) + .map(context.getTableTypeProvider()::getTableModelType) .map(InternalTypeManager::getTSDataType) .collect(Collectors.toList()); @@ -1626,7 +1627,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo // all output column types of the input table List<TSDataType> inputDataTypes = - getOutputColumnTypes(node.getChild(), context.getTypeProvider()); + getOutputColumnTypes(node.getChild(), context.getTableTypeProvider()); // input channels to be passed directly to output, excluding MEASURES columns ImmutableList.Builder<Integer> outputChannels = ImmutableList.builder(); @@ -1716,7 +1717,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo getOnlyElement( getChannelsForSymbols( ImmutableList.of(scalarPointer.getInputSymbol()), childLayout)), - context.getTypeProvider().getTableModelType(scalarPointer.getInputSymbol()), + context.getTableTypeProvider().getTableModelType(scalarPointer.getInputSymbol()), scalarPointer.getLogicalIndexPointer().toLogicalIndexNavigation(mapping))); } else if (pointer instanceof AggregationValuePointer) { AggregationValuePointer aggregationPointer = (AggregationValuePointer) pointer; @@ -1807,7 +1808,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo getOnlyElement( getChannelsForSymbols( ImmutableList.of(scalarPointer.getInputSymbol()), childLayout)), - context.getTypeProvider().getTableModelType(scalarPointer.getInputSymbol()), + context.getTableTypeProvider().getTableModelType(scalarPointer.getInputSymbol()), scalarPointer.getLogicalIndexPointer().toLogicalIndexNavigation(mapping))); } else if (pointer instanceof AggregationValuePointer) { AggregationValuePointer aggregationPointer = (AggregationValuePointer) pointer; @@ -1962,7 +1963,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo addOperatorContext( context, node.getPlanNodeId(), MarkDistinctOperator.class.getSimpleName()); - TypeProvider typeProvider = context.getTypeProvider(); + ITableTypeProvider typeProvider = context.getTableTypeProvider(); Map<Symbol, Integer> childLayout = makeLayoutFromOutputSymbols(node.getChild().getOutputSymbols()); @@ -1978,7 +1979,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo @Override public Operator visitWindowFunction(WindowNode node, C context) { - TypeProvider typeProvider = context.getTypeProvider(); + ITableTypeProvider typeProvider = context.getTableTypeProvider(); Operator child = node.getChild().accept(this, context); OperatorContext operatorContext = addOperatorContext( @@ -2005,7 +2006,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo ImmutableList.Builder<Integer> outputChannels = ImmutableList.builder(); List<TSDataType> outputDataTypes = new ArrayList<>(); List<TSDataType> inputDataTypes = - getOutputColumnTypes(node.getChild(), context.getTypeProvider()); + getOutputColumnTypes(node.getChild(), context.getTableTypeProvider()); for (int i = 0; i < inputDataTypes.size(); i++) { outputChannels.add(i); outputDataTypes.add(inputDataTypes.get(i)); @@ -2120,7 +2121,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo private WindowAggregator buildWindowAggregator( Symbol symbol, WindowNode.Function function, - TypeProvider typeProvider, + ITableTypeProvider typeProvider, List<Integer> argumentChannels) { // Create accumulator first String functionName = function.getResolvedFunction().getSignature().getName(); @@ -2185,7 +2186,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo makeLayoutFromOutputSymbols(node.getChild().getOutputSymbols()); List<Integer> partitionChannels = getChannelsForSymbols(partitionBySymbols, childLayout); List<TSDataType> inputDataTypes = - getOutputColumnTypes(node.getChild(), context.getTypeProvider()); + getOutputColumnTypes(node.getChild(), context.getTableTypeProvider()); ImmutableList.Builder<Integer> outputChannels = ImmutableList.builder(); for (int i = 0; i < inputDataTypes.size(); i++) { @@ -2222,7 +2223,7 @@ public abstract class TableOperatorGenerator<C extends ITableOperatorGeneratorCo makeLayoutFromOutputSymbols(node.getChild().getOutputSymbols()); List<Integer> partitionChannels = getChannelsForSymbols(partitionBySymbols, childLayout); List<TSDataType> inputDataTypes = - getOutputColumnTypes(node.getChild(), context.getTypeProvider()); + getOutputColumnTypes(node.getChild(), context.getTableTypeProvider()); List<TSDataType> partitionTypes = partitionChannels.stream().map(inputDataTypes::get).collect(toImmutableList()); diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/analyze/ITableTypeProvider.java similarity index 66% copy from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java copy to iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/analyze/ITableTypeProvider.java index 0948e39cb6a..b30a3edbebd 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/calc_commons/plan/planner/ITableOperatorGeneratorContext.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/analyze/ITableTypeProvider.java @@ -17,14 +17,20 @@ * under the License. */ -package org.apache.iotdb.db.calc_commons.plan.planner; +package org.apache.iotdb.db.node_commons.plan.analyze; -import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; +import org.apache.iotdb.db.node_commons.plan.relational.planner.Symbol; -import java.time.ZoneId; +import org.apache.tsfile.read.common.type.Type; -public interface ITableOperatorGeneratorContext { - TypeProvider getTypeProvider(); +import java.util.Map; - ZoneId getZoneId(); +public interface ITableTypeProvider { + Type getTableModelType(Symbol symbol); + + boolean isSymbolExist(Symbol symbol); + + void putTableModelType(Symbol symbol, Type type); + + Map<Symbol, Type> allTableModelTypes(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/CommonPlanNodeDeserializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/CommonPlanNodeDeserializer.java index 3b508167851..392001e1989 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/CommonPlanNodeDeserializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/CommonPlanNodeDeserializer.java @@ -37,13 +37,14 @@ import org.apache.iotdb.db.node_commons.plan.relational.planner.node.UnionNode; import org.apache.iotdb.db.node_commons.plan.relational.planner.node.ValueFillNode; import org.apache.iotdb.db.node_commons.plan.relational.planner.node.ValuesNode; import org.apache.iotdb.db.node_commons.plan.relational.planner.node.WindowNode; -import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; import java.io.DataInputStream; import java.io.IOException; import java.nio.ByteBuffer; public class CommonPlanNodeDeserializer implements IPlanNodeDeserializer { + public static final CommonPlanNodeDeserializer INSTANCE = new CommonPlanNodeDeserializer(); + @Override public PlanNode deserializeFromWAL(DataInputStream stream) throws IOException { throw new UnsupportedOperationException("Not supported for CommonPlanNodeDeserializer"); @@ -137,9 +138,4 @@ public class CommonPlanNodeDeserializer implements IPlanNodeDeserializer { throw new IllegalArgumentException("Invalid node type: " + nodeType); } } - - @Override - public PlanNode deserializeWithTemplate(ByteBuffer buffer, TypeProvider typeProvider) { - throw new UnsupportedOperationException("Not supported for CommonPlanNodeDeserializer"); - } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java index 9b90244b496..f918eec671a 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java @@ -14,8 +14,6 @@ package org.apache.iotdb.db.node_commons.plan.planner.plan.node; -import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; - import java.io.DataInputStream; import java.io.IOException; import java.nio.ByteBuffer; @@ -28,6 +26,4 @@ public interface IPlanNodeDeserializer { PlanNode deserialize(ByteBuffer buffer); PlanNode deserialize(ByteBuffer buffer, short nodeType); - - PlanNode deserializeWithTemplate(ByteBuffer buffer, TypeProvider typeProvider); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializerProvider.java similarity index 55% copy from iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java copy to iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializerProvider.java index 9b90244b496..72db2e50019 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/IPlanNodeDeserializerProvider.java @@ -14,20 +14,6 @@ package org.apache.iotdb.db.node_commons.plan.planner.plan.node; -import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; - -import java.io.DataInputStream; -import java.io.IOException; -import java.nio.ByteBuffer; - -public interface IPlanNodeDeserializer { - PlanNode deserializeFromWAL(DataInputStream stream) throws IOException; - - PlanNode deserializeFromWAL(ByteBuffer buffer); - - PlanNode deserialize(ByteBuffer buffer); - - PlanNode deserialize(ByteBuffer buffer, short nodeType); - - PlanNode deserializeWithTemplate(ByteBuffer buffer, TypeProvider typeProvider); +public interface IPlanNodeDeserializerProvider { + IPlanNodeDeserializer getDeserializer(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/PlanNodeType.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/PlanNodeType.java index 02291197f4c..328ed4c42bf 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/PlanNodeType.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/node_commons/plan/planner/plan/node/PlanNodeType.java @@ -19,8 +19,6 @@ package org.apache.iotdb.db.node_commons.plan.planner.plan.node; -import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; - import org.apache.tsfile.utils.ReadWriteIOUtils; import java.io.DataInputStream; @@ -208,14 +206,19 @@ public enum PlanNodeType { OBJECT_FILE_NODE((short) 2004), ; - private static IPlanNodeDeserializer deserializer; + private static final IPlanNodeDeserializer DESERIALIZER; static { - ServiceLoader<IPlanNodeDeserializer> loader = ServiceLoader.load(IPlanNodeDeserializer.class); - for (IPlanNodeDeserializer element : loader) { - deserializer = element; + IPlanNodeDeserializer deserializer = null; + ServiceLoader<IPlanNodeDeserializerProvider> loader = + ServiceLoader.load(IPlanNodeDeserializerProvider.class); + for (IPlanNodeDeserializerProvider provider : loader) { + if (deserializer != null) { + throw new IllegalStateException("Multiple IPlanNodeDeserializerProvider found"); + } + deserializer = provider.getDeserializer(); } - deserializer = deserializer == null ? new CommonPlanNodeDeserializer() : deserializer; + DESERIALIZER = deserializer == null ? CommonPlanNodeDeserializer.INSTANCE : deserializer; } public static final int BYTES = Short.BYTES; @@ -239,22 +242,18 @@ public enum PlanNodeType { } public static PlanNode deserializeFromWAL(DataInputStream stream) throws IOException { - return deserializer.deserializeFromWAL(stream); + return DESERIALIZER.deserializeFromWAL(stream); } public static PlanNode deserializeFromWAL(ByteBuffer buffer) { - return deserializer.deserializeFromWAL(buffer); + return DESERIALIZER.deserializeFromWAL(buffer); } public static PlanNode deserialize(ByteBuffer buffer) { - return deserializer.deserialize(buffer); + return DESERIALIZER.deserialize(buffer); } public static PlanNode deserialize(ByteBuffer buffer, short nodeType) { - return deserializer.deserialize(buffer, nodeType); - } - - public static PlanNode deserializeWithTemplate(ByteBuffer buffer, TypeProvider typeProvider) { - return deserializer.deserializeWithTemplate(buffer, typeProvider); + return DESERIALIZER.deserialize(buffer, nodeType); } } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TypeProvider.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TypeProvider.java index e5a6b8458cc..cd19b38a74d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TypeProvider.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/analyze/TypeProvider.java @@ -19,6 +19,7 @@ package org.apache.iotdb.db.queryengine.plan.analyze; +import org.apache.iotdb.db.node_commons.plan.analyze.ITableTypeProvider; import org.apache.iotdb.db.node_commons.plan.relational.planner.Symbol; import org.apache.iotdb.db.node_commons.plan.relational.utils.TypeUtil; @@ -40,7 +41,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; import static org.apache.iotdb.db.queryengine.plan.expression.leaf.TimestampOperand.TIMESTAMP_EXPRESSION_STRING; -public class TypeProvider { +public class TypeProvider implements ITableTypeProvider { private final Map<String, TSDataType> treeModelTypeMap; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LocalExecutionPlanContext.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LocalExecutionPlanContext.java index a410817decd..9a37072fb20 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LocalExecutionPlanContext.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/LocalExecutionPlanContext.java @@ -21,6 +21,7 @@ package org.apache.iotdb.db.queryengine.plan.planner; import org.apache.iotdb.db.calc_commons.execution.operator.Operator; import org.apache.iotdb.db.calc_commons.plan.planner.ITableOperatorGeneratorContext; import org.apache.iotdb.db.conf.IoTDBDescriptor; +import org.apache.iotdb.db.node_commons.plan.analyze.ITableTypeProvider; import org.apache.iotdb.db.node_commons.plan.planner.plan.node.PlanNode; import org.apache.iotdb.db.node_commons.plan.planner.plan.node.PlanNodeId; import org.apache.iotdb.db.queryengine.common.FragmentInstanceId; @@ -308,6 +309,11 @@ public class LocalExecutionPlanContext implements ITableOperatorGeneratorContext return typeProvider; } + @Override + public ITableTypeProvider getTableTypeProvider() { + return typeProvider; + } + public FragmentInstanceContext getInstanceContext() { return driverContext.getFragmentInstanceContext(); } diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/PlanFragment.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/PlanFragment.java index 48a251050ee..d65524ac61d 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/PlanFragment.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/PlanFragment.java @@ -30,6 +30,7 @@ import org.apache.iotdb.db.queryengine.common.PlanFragmentId; import org.apache.iotdb.db.queryengine.plan.analyze.TypeProvider; import org.apache.iotdb.db.queryengine.plan.planner.SubPlanTypeExtractor; import org.apache.iotdb.db.queryengine.plan.planner.distribution.NodeDistribution; +import org.apache.iotdb.db.queryengine.plan.planner.plan.node.DataNodePlanNodeDeserializer; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.AlignedSeriesAggregationScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.AlignedSeriesScanNode; import org.apache.iotdb.db.queryengine.plan.planner.plan.node.source.VirtualSourceNode; @@ -224,7 +225,8 @@ public class PlanFragment { public static PlanNode deserializeHelper(ByteBuffer byteBuffer, TypeProvider typeProvider) { PlanNode root; if (typeProvider != null && typeProvider.getTemplatedInfo() != null) { - root = PlanNodeType.deserializeWithTemplate(byteBuffer, typeProvider); + root = + DataNodePlanNodeDeserializer.INSTANCE.deserializeWithTemplate(byteBuffer, typeProvider); if (root instanceof AlignedSeriesScanNode || root instanceof AlignedSeriesAggregationScanNode) { return root; diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializer.java index 35be4b56480..ebd8ae8d247 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializer.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializer.java @@ -140,6 +140,7 @@ import java.io.IOException; import java.nio.ByteBuffer; public class DataNodePlanNodeDeserializer extends CommonPlanNodeDeserializer { + public static final DataNodePlanNodeDeserializer INSTANCE = new DataNodePlanNodeDeserializer(); @Override public PlanNode deserializeFromWAL(DataInputStream stream) throws IOException { @@ -474,7 +475,6 @@ public class DataNodePlanNodeDeserializer extends CommonPlanNodeDeserializer { } } - @Override public PlanNode deserializeWithTemplate(ByteBuffer buffer, TypeProvider typeProvider) { short nodeType = buffer.getShort(); switch (nodeType) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializerProvider.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializerProvider.java new file mode 100644 index 00000000000..f712056471f --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/node/DataNodePlanNodeDeserializerProvider.java @@ -0,0 +1,25 @@ +/* + * Licensed 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.iotdb.db.queryengine.plan.planner.plan.node; + +import org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializer; +import org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializerProvider; + +public class DataNodePlanNodeDeserializerProvider implements IPlanNodeDeserializerProvider { + @Override + public IPlanNodeDeserializer getDeserializer() { + return DataNodePlanNodeDeserializer.INSTANCE; + } +} diff --git a/iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializer b/iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializerProvider similarity index 69% rename from iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializer rename to iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializerProvider index 7c010802331..bec380fc801 100644 --- a/iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializer +++ b/iotdb-core/datanode/src/main/resources/META-INF/services/org.apache.iotdb.db.node_commons.plan.planner.plan.node.IPlanNodeDeserializerProvider @@ -1 +1 @@ -org.apache.iotdb.db.queryengine.plan.planner.plan.node.DataNodePlanNodeDeserializer \ No newline at end of file +org.apache.iotdb.db.queryengine.plan.planner.plan.node.DataNodePlanNodeDeserializerProvider
