You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ro...@apache.org on 2022/05/08 11:02:37 UTC

[iotdb] branch transform-filter-planner updated (1bb41f39e9 -> 35e02aedb6)

This is an automated email from the ASF dual-hosted git repository.

rong pushed a change to branch transform-filter-planner
in repository https://gitbox.apache.org/repos/asf/iotdb.git


    from 1bb41f39e9 transform node
     add 83590e9f08 [IOTDB-3034] Partial insert in new cluster (#5763)
     add de84a863a7 [IOTDB-2845] Implementation of DeviceMergeOperator (#5791)
     add 241c36a50b [IOTDB-3096] [Auth] fix default config of user folder and role folder (#5797)
     add 06b9e14ea6 [IOTDB-3080] Implementation of AlignedSeriesScanOperator (#5792)
     add 41a33ffcad Return Option<TsBlock> instead of TsBlock to let caller clearly be aware of that the method will return null (#5777)
     add c98719fb4a [IOTDB-3057]Auto create schema (#5770)
     add f9fcfa1fd5 [IOTDB-3084] Support schema fetch across sg (#5795)
     add a67a260d23 implement visitSeriesAggregate in localExecutionPlanner (#5801)
     add f9b3b0f8d2 [IOTDB-3104] Add Consensus Module StateMachine Event API (#5806)
     add 38473d1a00 Fix the issue that sometimes the FragmentInstance may stuck in FLUSHING states (#5808)
     add a01199d22c [IOTDB-2987] Optimize ConfigNodeGroup startup process (#5802)
     add 602b4f408d Optimize the logger recording of MPP  (#5815)
     add bb4ccb3d89 [IOTDB-3103] Implementation of NonOverlappedMultiColumnMerger (#5805)
     add 27390d65f8 push down limit to rawdatasetwithValueFilter (#5813)
     add 2031319c2d [IOTDB-3016] do flush when graceful stop IoTDB (#5800)
     add e76b727f98 add compaction speed log (#5826)
     add be385cd2db [IOTDB-3047] Path does not exist when delete storage group (#5738)
     add 104da23532 [IOTDB-2962] [IOTDB-3079] Refactor SQL parser and implememtation of complete Analyzer (#5819)
     new b080dff453 Merge branch 'master' of github.com:apache/iotdb into transform-filter-planner
     new 35e02aedb6 TransformNode & FilterNode

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   |  67 +-
 .../resources/conf/iotdb-confignode.properties     | 179 +++--
 confignode/src/assembly/resources/conf/logback.xml |   2 +-
 ...lientPool.java => AsyncDataNodeClientPool.java} |  11 +-
 .../client/SyncConfigNodeClientPool.java           | 107 +++
 .../iotdb/confignode/conf/ConfigNodeConf.java      | 126 +--
 .../iotdb/confignode/conf/ConfigNodeConfCheck.java | 155 ----
 .../iotdb/confignode/conf/ConfigNodeConstant.java  |   6 +-
 .../confignode/conf/ConfigNodeDescriptor.java      |  62 +-
 .../confignode/conf/ConfigNodeStartupCheck.java    | 356 +++++++++
 .../consensus/request/ConfigRequest.java           |  38 +-
 .../consensus/request/ConfigRequestType.java       |  37 +-
 .../consensus/request/auth/AuthorReq.java          |  68 +-
 .../request/read/GetDataPartitionReq.java          |   9 +-
 .../request/read/GetSchemaPartitionReq.java        |   5 +-
 ...torageGroupReq.java => ApplyConfigNodeReq.java} |  32 +-
 .../request/write/CreateDataPartitionReq.java      |  13 +-
 .../consensus/request/write/CreateRegionsReq.java  |   4 +-
 .../request/write/CreateSchemaPartitionReq.java    |   8 +-
 .../consensus/request/write/DeleteRegionsReq.java  |   4 +-
 .../request/write/RegisterDataNodeReq.java         |   4 +-
 .../request/write/SetStorageGroupReq.java          |   4 +-
 .../response/DataNodeConfigurationResp.java        |  11 +-
 .../statemachine/PartitionRegionStateMachine.java  |   4 +-
 .../confignode/manager/ClusterSchemaManager.java   |  12 +-
 .../iotdb/confignode/manager/ConfigManager.java    |  83 +-
 .../iotdb/confignode/manager/ConsensusManager.java |  67 +-
 .../apache/iotdb/confignode/manager/Manager.java   |  28 +-
 .../{DataNodeManager.java => NodeManager.java}     |  74 +-
 .../iotdb/confignode/persistence/AuthorInfo.java   |  22 +-
 .../confignode/persistence/ClusterSchemaInfo.java  |   2 +
 .../{DataNodeInfo.java => NodeInfo.java}           | 126 ++-
 .../executor/ConfigRequestExecutor.java            |  49 +-
 .../iotdb/confignode/service/ConfigNode.java       |  30 +-
 .../confignode/service/ConfigNodeCommandLine.java  |  24 +-
 .../thrift/ConfigNodeRPCServiceProcessor.java      |  37 +-
 .../consensus/request/ConfigRequestSerDeTest.java  |  62 +-
 .../thrift/ConfigNodeRPCServiceProcessorTest.java  |  16 +-
 .../org/apache/iotdb/consensus/IStateMachine.java  |  40 +-
 .../org/apache/iotdb/consensus/common/Peer.java    |   5 +
 .../ratis/ApplicationStateMachineProxy.java        |  36 +-
 .../iotdb/consensus/ratis/RatisConsensus.java      |  53 +-
 .../org/apache/iotdb/consensus/ratis/Utils.java    |  47 +-
 .../apache/iotdb/consensus/EmptyStateMachine.java  |   2 +-
 .../iotdb/consensus/ratis/RatisConsensusTest.java  |  13 +-
 .../apache/iotdb/consensus/ratis/SnapshotTest.java |   2 +-
 .../apache/iotdb/consensus/ratis/TestUtils.java    |  37 +-
 .../apache/iotdb/consensus/ratis/UtilsTest.java    |   4 +-
 .../standalone/StandAloneConsensusTest.java        |   2 +-
 .../IoTDBSyntaxConventionStringLiteralIT.java      |   8 +-
 .../IoTDBDeletionVersionAdaptionIT.java            |   2 +
 .../IoTDBQueryVersionAdaptionIT.java               |   2 +
 .../iotdb/commons/consensus/ConsensusGroupId.java  |   4 +
 .../org/apache/iotdb/commons/path/PartialPath.java |   2 +
 .../apache/iotdb/commons/utils/CommonUtils.java    |  59 --
 .../apache/iotdb/commons/utils/NodeUrlUtils.java   | 188 +++++
 .../commons/utils/ThriftCommonsSerDeUtils.java     |  27 +-
 .../commons/utils/ThriftConfigNodeSerDeUtils.java  |  24 +-
 .../iotdb/commons/utils/NodeUrlUtilsTest.java      |  62 ++
 .../commons/utils/ThriftCommonsSerDeUtilsTest.java |  28 +-
 .../utils/ThriftConfigNodeSerDeUtilsTest.java      |  18 +-
 server/src/assembly/resources/sbin/stop-server.sh  |  47 +-
 .../apache/iotdb/db/client/ConfigNodeClient.java   |   5 +-
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |   8 +
 .../consensus/statemachine/BaseStateMachine.java   |   2 +-
 .../statemachine/SchemaRegionStateMachine.java     |   5 +-
 .../compaction/cross/CrossSpaceCompactionTask.java |  19 +-
 .../compaction/inner/InnerSpaceCompactionTask.java |   7 +-
 .../iotdb/db/engine/memtable/AbstractMemTable.java |  28 +-
 .../iotdb/db/engine/storagegroup/DataRegion.java   |  14 +
 .../iotdb/db/metadata/LocalSchemaProcessor.java    |   5 +-
 .../db/metadata/cache/DataNodeSchemaCache.java     | 151 +---
 .../iotdb/db/metadata/cache/SchemaCacheEntity.java | 114 ---
 .../iotdb/db/metadata/cache/SchemaCacheEntry.java  |  58 ++
 .../iotdb/db/metadata/mtree/MTreeAboveSG.java      |   4 +-
 .../iotdb/db/metadata/path/MeasurementPath.java    |   4 +
 .../iotdb/db/mpp/common/header/ColumnHeader.java   |  81 +-
 .../iotdb/db/mpp/common/header/DatasetHeader.java  |   2 +-
 .../db/mpp/common/schematree/DeviceSchemaInfo.java |  76 +-
 .../db/mpp/common/schematree/PathPatternTree.java  |  35 +-
 .../iotdb/db/mpp/common/schematree/SchemaTree.java |  74 +-
 .../common/schematree/node/SchemaInternalNode.java |   7 +-
 .../execution/datatransfer/DataBlockManager.java   |  41 +-
 .../db/mpp/execution/datatransfer/SinkHandle.java  |  71 +-
 .../mpp/execution/datatransfer/SourceHandle.java   |  78 +-
 .../operator/process/DeviceMergeOperator.java      | 274 +++++++
 .../operator/process/DeviceViewOperator.java       |   8 +-
 .../execution/operator/process/FilterOperator.java |  12 +-
 .../operator/process/TimeJoinOperator.java         |  36 +-
 .../operator/process/TransformOperator.java        |  24 +-
 .../operator/process/merge/AscTimeComparator.java  |   4 +-
 .../operator/process/merge/ColumnMerger.java       |   4 +-
 .../operator/process/merge/DescTimeComparator.java |   4 +-
 .../operator/process/merge/MultiColumnMerger.java  |   4 +-
 .../merge/NonOverlappedMultiColumnMerger.java      |  87 +++
 .../operator/process/merge/SingleColumnMerger.java |  28 +-
 .../operator/process/merge/TimeComparator.java     |   4 +-
 .../operator/schema/DevicesSchemaScanOperator.java |   2 +-
 ...Operator.java => SchemaFetchMergeOperator.java} |   8 +-
 ...hOperator.java => SchemaFetchScanOperator.java} |   6 +-
 ...Operator.java => SchemaQueryMergeOperator.java} |   4 +-
 ...nOperator.java => SchemaQueryScanOperator.java} |   4 +-
 .../schema/TimeSeriesSchemaScanOperator.java       |   2 +-
 .../operator/source/AlignedSeriesScanOperator.java | 149 ++++
 .../operator/source/AlignedSeriesScanUtil.java     |  10 +-
 .../execution/operator/source/SeriesScanUtil.java  |  20 +-
 .../apache/iotdb/db/mpp/plan/analyze/Analysis.java | 138 +++-
 .../apache/iotdb/db/mpp/plan/analyze/Analyzer.java | 656 ++++++++++++++--
 .../db/mpp/plan/analyze/ClusterSchemaFetcher.java  | 276 ++++++-
 .../plan/analyze/ColumnPaginationController.java   |  73 ++
 .../db/mpp/plan/analyze/ConcatPathRewriter.java    | 135 ++++
 .../db/mpp/plan/analyze/ExpressionAnalyzer.java    | 854 +++++++++++++++++++++
 .../iotdb/db/mpp/plan/analyze/ExpressionUtils.java | 242 ++++++
 .../mpp/plan/analyze/GroupByLevelController.java   | 144 ++++
 .../iotdb/db/mpp/plan/analyze/SchemaValidator.java |   2 +-
 .../iotdb/db/mpp/plan/analyze/TypeProvider.java    |  23 +-
 .../db/mpp/plan/execution/IQueryExecution.java     |   4 +-
 .../db/mpp/plan/execution/QueryExecution.java      |  50 +-
 .../mpp/plan/execution/config/ConfigExecution.java |  15 +-
 .../iotdb/db/mpp/plan/parser/ASTVisitor.java       | 686 +++--------------
 .../db/mpp/plan/parser/StatementGenerator.java     |  21 +-
 .../db/mpp/plan/planner/DistributionPlanner.java   |  82 +-
 .../db/mpp/plan/planner/LocalExecutionPlanner.java | 205 ++++-
 .../db/mpp/plan/planner/LogicalPlanBuilder.java    |  53 +-
 .../iotdb/db/mpp/plan/planner/LogicalPlanner.java  |  60 +-
 .../planner/SimpleFragmentParallelPlanner.java     |   6 +-
 .../plan/planner/WriteFragmentParallelPlanner.java |   6 +-
 .../db/mpp/plan/planner/plan/FragmentInstance.java |  15 +-
 .../mpp/plan/planner/plan/node/PlanNodeType.java   |  22 +-
 .../db/mpp/plan/planner/plan/node/PlanVisitor.java |  17 +-
 .../plan/node/metedata/read/DevicesCountNode.java  |   2 +-
 .../node/metedata/read/DevicesSchemaScanNode.java  |   2 +-
 .../metedata/read/LevelTimeSeriesCountNode.java    |   2 +-
 ...emaFetchNode.java => SchemaFetchMergeNode.java} |  45 +-
 ...hemaFetchNode.java => SchemaFetchScanNode.java} |  55 +-
 ...emaMergeNode.java => SchemaQueryMergeNode.java} |  20 +-
 ...chemaScanNode.java => SchemaQueryScanNode.java} |  12 +-
 .../node/metedata/read/TimeSeriesCountNode.java    |   2 +-
 .../metedata/read/TimeSeriesSchemaScanNode.java    |   2 +-
 .../plan/planner/plan/node/process/FillNode.java   |  33 +-
 .../plan/planner/plan/node/process/FilterNode.java |  86 +--
 .../planner/plan/node/process/TransformNode.java   | 125 ++-
 .../source/AlignedSeriesAggregationScanNode.java   |   5 +-
 .../plan/node/source/AlignedSeriesScanNode.java    |   4 +-
 .../node/source/SeriesAggregationScanNode.java     |   5 +-
 .../planner/plan/node/source/SeriesScanNode.java   |   4 +-
 .../plan/node/write/InsertMultiTabletsNode.java    |  11 +-
 .../plan/planner/plan/node/write/InsertNode.java   | 176 +++--
 .../planner/plan/node/write/InsertRowNode.java     | 378 +++++----
 .../planner/plan/node/write/InsertRowsNode.java    |  11 +-
 .../plan/node/write/InsertRowsOfOneDeviceNode.java |  11 +-
 .../planner/plan/node/write/InsertTabletNode.java  | 482 ++++++------
 .../planner/plan/parameter/FillDescriptor.java     |  30 +-
 .../plan/parameter/FilterNullParameter.java        |  14 +-
 .../plan/parameter/GroupByTimeParameter.java       |  11 +
 .../plan/planner/plan/parameter/OutputColumn.java  |   2 +-
 .../plan/rewriter/ColumnPaginationController.java  | 145 ----
 .../db/mpp/plan/rewriter/ConcatPathRewriter.java   | 190 -----
 .../db/mpp/plan/rewriter/WildcardsRemover.java     | 375 ---------
 .../db/mpp/plan/scheduler/ClusterScheduler.java    |  14 +-
 .../scheduler/SimpleFragInstanceDispatcher.java    |   1 -
 .../mpp/plan/scheduler/SimpleQueryTerminator.java  |  28 +-
 .../db/mpp/plan/statement/StatementVisitor.java    |  35 -
 .../plan/statement/component/FillComponent.java    |  25 +-
 .../statement/component/GroupByLevelComponent.java |  20 -
 .../component/GroupByLevelController.java          | 247 ------
 .../mpp/plan/statement/component/ResultColumn.java | 113 +--
 .../plan/statement/component/SelectComponent.java  | 105 +--
 .../plan/statement/component/WhereCondition.java   |  16 +-
 .../statement/crud/AggregationQueryStatement.java  | 129 ----
 .../plan/statement/crud/FillQueryStatement.java    |  79 --
 .../statement/crud/GroupByFillQueryStatement.java  |  49 --
 .../plan/statement/crud/GroupByQueryStatement.java |  61 --
 .../plan/statement/crud/LastQueryStatement.java    |  74 --
 .../db/mpp/plan/statement/crud/QueryStatement.java | 213 ++---
 .../plan/statement/crud/UDAFQueryStatement.java    |  97 ---
 .../plan/statement/crud/UDTFQueryStatement.java    |  34 -
 .../literal/BooleanLiteral.java}                   |  44 +-
 .../mpp/plan/statement/literal/DoubleLiteral.java  |  42 +-
 .../db/mpp/plan/statement/literal/Literal.java     |  59 ++
 .../db/mpp/plan/statement/literal/LongLiteral.java |  42 +-
 .../db/mpp/plan/statement/literal/NullLiteral.java |  34 +-
 .../mpp/plan/statement/literal/StringLiteral.java  |  38 +-
 .../iotdb/db/qp/constant/FilterConstant.java       |  11 +
 .../iotdb/db/qp/logical/crud/InOperator.java       |   4 +
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    | 451 +++++------
 .../dataset/RawQueryDataSetWithValueFilter.java    |   6 +-
 .../iotdb/db/query/expression/Expression.java      |  16 +-
 .../iotdb/db/query/expression/ResultColumn.java    |  12 +-
 .../query/expression/binary/BinaryExpression.java  |  42 +-
 .../db/query/expression/leaf/ConstantOperand.java  |  20 +-
 .../query/expression/leaf/TimeSeriesOperand.java   |  23 -
 .../db/query/expression/leaf/TimestampOperand.java |  17 -
 .../query/expression/multi/FunctionExpression.java |  35 -
 .../db/query/expression/unary/InExpression.java    |   8 +
 .../db/query/expression/unary/LikeExpression.java  |   8 +
 .../query/expression/unary/RegularExpression.java  |   8 +
 .../db/query/expression/unary/UnaryExpression.java |  26 -
 .../db/query/udf/core/executor/UDTFContext.java    |   7 +
 .../apache/iotdb/db/service/IoTDBShutdownHook.java |   7 +
 .../service/thrift/impl/InternalServiceImpl.java   |  16 +-
 .../db/sync/receiver/collector/Collector.java      |   1 +
 .../iotdb/db/sync/receiver/load/SchemaLoader.java  |  37 +-
 .../db/sync/sender/manager/SchemaSyncManager.java  |   4 +-
 .../java/org/apache/iotdb/db/utils/MemUtils.java   |   6 +-
 .../apache/iotdb/db/utils/QueryDataSetUtils.java   |   6 +-
 .../apache/iotdb/db/wal/utils/WALWriteUtils.java   |  17 +
 .../db/metadata/cache/DataNodeSchemaCacheTest.java | 105 ++-
 .../db/mpp/common/schematree/SchemaTreeTest.java   |   3 +-
 .../db/mpp/execution/ConfigExecutionTest.java      |  23 +-
 .../mpp/execution/datatransfer/SinkHandleTest.java |   3 +-
 .../execution/datatransfer/SourceHandleTest.java   |   1 +
 .../operator/AlignedSeriesScanOperatorTest.java    | 748 ++++++++++++++++++
 .../execution/operator/AlignedSeriesTestUtil.java  | 260 +++++++
 .../operator/DeviceMergeOperatorTest.java          | 547 +++++++++++++
 .../execution/operator/DeviceViewOperatorTest.java |   8 +-
 .../NonOverlappedMultiColumnMergerTest.java        | 230 ++++++
 .../execution/operator/TimeJoinOperatorTest.java   |   2 +-
 ...rTest.java => SchemaFetchScanOperatorTest.java} |  12 +-
 ...rTest.java => SchemaQueryScanOperatorTest.java} |   6 +-
 .../{AnalyzerTest.java => AnalyzeFailTest.java}    |   7 +-
 .../{AnalyzerTest.java => AnalyzeTest.java}        |  37 +-
 .../db/mpp/plan/plan/DistributionPlannerTest.java  |   4 +-
 .../iotdb/db/mpp/plan/plan/LogicalPlannerTest.java |   6 +-
 .../db/mpp/plan/plan/QueryLogicalPlanUtil.java     |  85 +-
 .../read/DeviceSchemaScanNodeSerdeTest.java        |   5 +-
 .../metadata/read/SchemaFetchScanNodeTest.java     |  51 ++
 .../read/TimeSeriesSchemaScanNodeSerdeTest.java    |   5 +-
 .../plan/plan/node/process/FillNodeSerdeTest.java  |   8 +-
 .../plan/node/process/FilterNodeSerdeTest.java     |   7 +-
 .../write/InsertMultiTabletsNodeSerdeTest.java     |  10 +-
 .../plan/node/write/InsertRowNodeSerdeTest.java    |  17 +-
 .../plan/node/write/InsertRowsNodeSerdeTest.java   |   2 +-
 .../write/InsertRowsOfOneDeviceNodeSerdeTest.java  |   2 +-
 .../plan/node/write/InsertTabletNodeSerdeTest.java |  16 +-
 .../org/apache/iotdb/db/wal/io/WALFileTest.java    | 114 +++
 .../java/org/apache/iotdb/rpc/TSStatusCode.java    |   5 +-
 .../java/org/apache/iotdb/session/Session.java     |  19 +-
 .../src/main/thrift/confignode.thrift              |  48 +-
 thrift/src/main/thrift/mpp.thrift                  |   1 +
 .../iotdb/tsfile/read/common/block/TsBlock.java    | 100 ++-
 .../java/org/apache/iotdb/tsfile/utils/BitMap.java |  23 +
 .../java/org/apache/iotdb/tsfile/utils/Pair.java   |   8 +
 .../tsfile/write/record/datapoint/DataPoint.java   |  10 +-
 244 files changed, 9722 insertions(+), 5467 deletions(-)
 rename confignode/src/main/java/org/apache/iotdb/confignode/client/{AsyncClientPool.java => AsyncDataNodeClientPool.java} (90%)
 create mode 100644 confignode/src/main/java/org/apache/iotdb/confignode/client/SyncConfigNodeClientPool.java
 delete mode 100644 confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeConfCheck.java
 create mode 100644 confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeStartupCheck.java
 copy confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/{SetStorageGroupReq.java => ApplyConfigNodeReq.java} (64%)
 rename confignode/src/main/java/org/apache/iotdb/confignode/manager/{DataNodeManager.java => NodeManager.java} (66%)
 rename confignode/src/main/java/org/apache/iotdb/confignode/persistence/{DataNodeInfo.java => NodeInfo.java} (54%)
 rename confignode/src/main/java/org/apache/iotdb/confignode/{service => persistence}/executor/ConfigRequestExecutor.java (85%)
 delete mode 100644 node-commons/src/main/java/org/apache/iotdb/commons/utils/CommonUtils.java
 create mode 100644 node-commons/src/main/java/org/apache/iotdb/commons/utils/NodeUrlUtils.java
 create mode 100644 node-commons/src/test/java/org/apache/iotdb/commons/utils/NodeUrlUtilsTest.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/metadata/cache/SchemaCacheEntity.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/metadata/cache/SchemaCacheEntry.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/DeviceMergeOperator.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/merge/NonOverlappedMultiColumnMerger.java
 copy server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/{SchemaMergeOperator.java => SchemaFetchMergeOperator.java} (95%)
 rename server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/{SchemaFetchOperator.java => SchemaFetchScanOperator.java} (96%)
 rename server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/{SchemaMergeOperator.java => SchemaQueryMergeOperator.java} (96%)
 rename server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/schema/{SchemaScanOperator.java => SchemaQueryScanOperator.java} (96%)
 create mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/source/AlignedSeriesScanOperator.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ColumnPaginationController.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ConcatPathRewriter.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionAnalyzer.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ExpressionUtils.java
 create mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/GroupByLevelController.java
 copy server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/{SchemaFetchNode.java => SchemaFetchMergeNode.java} (56%)
 rename server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/{SchemaFetchNode.java => SchemaFetchScanNode.java} (54%)
 rename server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/{SeriesSchemaMergeNode.java => SchemaQueryMergeNode.java} (72%)
 rename server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/metedata/read/{SchemaScanNode.java => SchemaQueryScanNode.java} (91%)
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/rewriter/ColumnPaginationController.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/rewriter/ConcatPathRewriter.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/rewriter/WildcardsRemover.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/component/GroupByLevelController.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/AggregationQueryStatement.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/FillQueryStatement.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/GroupByFillQueryStatement.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/GroupByQueryStatement.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/LastQueryStatement.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/UDAFQueryStatement.java
 delete mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/UDTFQueryStatement.java
 copy server/src/main/java/org/apache/iotdb/db/mpp/plan/{planner/plan/parameter/FillDescriptor.java => statement/literal/BooleanLiteral.java} (53%)
 copy consensus/src/main/java/org/apache/iotdb/consensus/common/Peer.java => server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/literal/DoubleLiteral.java (53%)
 create mode 100644 server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/literal/Literal.java
 copy consensus/src/main/java/org/apache/iotdb/consensus/common/Peer.java => server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/literal/LongLiteral.java (54%)
 copy consensus/src/main/java/org/apache/iotdb/consensus/common/Peer.java => server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/literal/NullLiteral.java (57%)
 copy consensus/src/main/java/org/apache/iotdb/consensus/common/Peer.java => server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/literal/StringLiteral.java (57%)
 create mode 100644 server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/AlignedSeriesScanOperatorTest.java
 create mode 100644 server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/AlignedSeriesTestUtil.java
 create mode 100644 server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/DeviceMergeOperatorTest.java
 create mode 100644 server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/NonOverlappedMultiColumnMergerTest.java
 rename server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/{SchemaFetchOperatorTest.java => SchemaFetchScanOperatorTest.java} (94%)
 rename server/src/test/java/org/apache/iotdb/db/mpp/execution/operator/schema/{SchemaScanOperatorTest.java => SchemaQueryScanOperatorTest.java} (98%)
 copy server/src/test/java/org/apache/iotdb/db/mpp/plan/analyze/{AnalyzerTest.java => AnalyzeFailTest.java} (93%)
 rename server/src/test/java/org/apache/iotdb/db/mpp/plan/analyze/{AnalyzerTest.java => AnalyzeTest.java} (52%)
 create mode 100644 server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/metadata/read/SchemaFetchScanNodeTest.java


[iotdb] 01/02: Merge branch 'master' of github.com:apache/iotdb into transform-filter-planner

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch transform-filter-planner
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit b080dff453c5932c6ebef911de33e736d773b6bd
Merge: 1bb41f39e9 104da23532
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Sun May 8 15:14:16 2022 +0800

    Merge branch 'master' of github.com:apache/iotdb into transform-filter-planner

 .../org/apache/iotdb/db/qp/sql/IoTDBSqlParser.g4   |  67 +-
 .../resources/conf/iotdb-confignode.properties     | 179 +++--
 confignode/src/assembly/resources/conf/logback.xml |   2 +-
 ...lientPool.java => AsyncDataNodeClientPool.java} |  11 +-
 .../client/SyncConfigNodeClientPool.java           | 107 +++
 .../iotdb/confignode/conf/ConfigNodeConf.java      | 126 +--
 .../iotdb/confignode/conf/ConfigNodeConfCheck.java | 155 ----
 .../iotdb/confignode/conf/ConfigNodeConstant.java  |   6 +-
 .../confignode/conf/ConfigNodeDescriptor.java      |  62 +-
 .../confignode/conf/ConfigNodeStartupCheck.java    | 356 +++++++++
 .../consensus/request/ConfigRequest.java           |  38 +-
 .../consensus/request/ConfigRequestType.java       |  37 +-
 .../consensus/request/auth/AuthorReq.java          |  68 +-
 .../request/read/GetDataPartitionReq.java          |   9 +-
 .../request/read/GetSchemaPartitionReq.java        |   5 +-
 ...torageGroupReq.java => ApplyConfigNodeReq.java} |  32 +-
 .../request/write/CreateDataPartitionReq.java      |  13 +-
 .../consensus/request/write/CreateRegionsReq.java  |   4 +-
 .../request/write/CreateSchemaPartitionReq.java    |   8 +-
 .../consensus/request/write/DeleteRegionsReq.java  |   4 +-
 .../request/write/RegisterDataNodeReq.java         |   4 +-
 .../request/write/SetStorageGroupReq.java          |   4 +-
 .../response/DataNodeConfigurationResp.java        |  11 +-
 .../statemachine/PartitionRegionStateMachine.java  |   4 +-
 .../confignode/manager/ClusterSchemaManager.java   |  12 +-
 .../iotdb/confignode/manager/ConfigManager.java    |  83 +-
 .../iotdb/confignode/manager/ConsensusManager.java |  67 +-
 .../apache/iotdb/confignode/manager/Manager.java   |  28 +-
 .../{DataNodeManager.java => NodeManager.java}     |  74 +-
 .../iotdb/confignode/persistence/AuthorInfo.java   |  22 +-
 .../confignode/persistence/ClusterSchemaInfo.java  |   2 +
 .../{DataNodeInfo.java => NodeInfo.java}           | 126 ++-
 .../executor/ConfigRequestExecutor.java            |  49 +-
 .../iotdb/confignode/service/ConfigNode.java       |  30 +-
 .../confignode/service/ConfigNodeCommandLine.java  |  24 +-
 .../thrift/ConfigNodeRPCServiceProcessor.java      |  37 +-
 .../consensus/request/ConfigRequestSerDeTest.java  |  62 +-
 .../thrift/ConfigNodeRPCServiceProcessorTest.java  |  16 +-
 .../org/apache/iotdb/consensus/IStateMachine.java  |  40 +-
 .../org/apache/iotdb/consensus/common/Peer.java    |   5 +
 .../ratis/ApplicationStateMachineProxy.java        |  36 +-
 .../iotdb/consensus/ratis/RatisConsensus.java      |  53 +-
 .../org/apache/iotdb/consensus/ratis/Utils.java    |  47 +-
 .../apache/iotdb/consensus/EmptyStateMachine.java  |   2 +-
 .../iotdb/consensus/ratis/RatisConsensusTest.java  |  13 +-
 .../apache/iotdb/consensus/ratis/SnapshotTest.java |   2 +-
 .../apache/iotdb/consensus/ratis/TestUtils.java    |  37 +-
 .../apache/iotdb/consensus/ratis/UtilsTest.java    |   4 +-
 .../standalone/StandAloneConsensusTest.java        |   2 +-
 .../IoTDBSyntaxConventionStringLiteralIT.java      |   8 +-
 .../IoTDBDeletionVersionAdaptionIT.java            |   2 +
 .../IoTDBQueryVersionAdaptionIT.java               |   2 +
 .../iotdb/commons/consensus/ConsensusGroupId.java  |   4 +
 .../org/apache/iotdb/commons/path/PartialPath.java |   2 +
 .../apache/iotdb/commons/utils/CommonUtils.java    |  59 --
 .../apache/iotdb/commons/utils/NodeUrlUtils.java   | 188 +++++
 .../commons/utils/ThriftCommonsSerDeUtils.java     |  27 +-
 .../commons/utils/ThriftConfigNodeSerDeUtils.java  |  24 +-
 .../iotdb/commons/utils/NodeUrlUtilsTest.java      |  62 ++
 .../commons/utils/ThriftCommonsSerDeUtilsTest.java |  28 +-
 .../utils/ThriftConfigNodeSerDeUtilsTest.java      |  18 +-
 server/src/assembly/resources/sbin/stop-server.sh  |  47 +-
 .../apache/iotdb/db/client/ConfigNodeClient.java   |   5 +-
 .../org/apache/iotdb/db/conf/IoTDBDescriptor.java  |   8 +
 .../consensus/statemachine/BaseStateMachine.java   |   2 +-
 .../statemachine/SchemaRegionStateMachine.java     |   5 +-
 .../compaction/cross/CrossSpaceCompactionTask.java |  19 +-
 .../compaction/inner/InnerSpaceCompactionTask.java |   7 +-
 .../iotdb/db/engine/memtable/AbstractMemTable.java |  28 +-
 .../iotdb/db/engine/storagegroup/DataRegion.java   |  14 +
 .../iotdb/db/metadata/LocalSchemaProcessor.java    |   5 +-
 .../db/metadata/cache/DataNodeSchemaCache.java     | 151 +---
 .../iotdb/db/metadata/cache/SchemaCacheEntity.java | 114 ---
 .../iotdb/db/metadata/cache/SchemaCacheEntry.java  |  58 ++
 .../iotdb/db/metadata/mtree/MTreeAboveSG.java      |   4 +-
 .../iotdb/db/metadata/path/MeasurementPath.java    |   4 +
 .../iotdb/db/mpp/common/header/ColumnHeader.java   |  81 +-
 .../iotdb/db/mpp/common/header/DatasetHeader.java  |   2 +-
 .../db/mpp/common/schematree/DeviceSchemaInfo.java |  76 +-
 .../db/mpp/common/schematree/PathPatternTree.java  |  35 +-
 .../iotdb/db/mpp/common/schematree/SchemaTree.java |  74 +-
 .../common/schematree/node/SchemaInternalNode.java |   7 +-
 .../execution/datatransfer/DataBlockManager.java   |  41 +-
 .../db/mpp/execution/datatransfer/SinkHandle.java  |  71 +-
 .../mpp/execution/datatransfer/SourceHandle.java   |  78 +-
 .../operator/process/DeviceMergeOperator.java      | 274 +++++++
 .../operator/process/DeviceViewOperator.java       |   8 +-
 .../operator/process/TimeJoinOperator.java         |  36 +-
 .../operator/process/merge/AscTimeComparator.java  |   4 +-
 .../operator/process/merge/ColumnMerger.java       |   4 +-
 .../operator/process/merge/DescTimeComparator.java |   4 +-
 .../operator/process/merge/MultiColumnMerger.java  |   4 +-
 .../merge/NonOverlappedMultiColumnMerger.java      |  87 +++
 .../operator/process/merge/SingleColumnMerger.java |  28 +-
 .../operator/process/merge/TimeComparator.java     |   4 +-
 .../operator/schema/DevicesSchemaScanOperator.java |   2 +-
 ...Operator.java => SchemaFetchMergeOperator.java} |   8 +-
 ...hOperator.java => SchemaFetchScanOperator.java} |   6 +-
 ...Operator.java => SchemaQueryMergeOperator.java} |   4 +-
 ...nOperator.java => SchemaQueryScanOperator.java} |   4 +-
 .../schema/TimeSeriesSchemaScanOperator.java       |   2 +-
 .../operator/source/AlignedSeriesScanOperator.java | 149 ++++
 .../operator/source/AlignedSeriesScanUtil.java     |  10 +-
 .../execution/operator/source/SeriesScanUtil.java  |  20 +-
 .../apache/iotdb/db/mpp/plan/analyze/Analysis.java | 138 +++-
 .../apache/iotdb/db/mpp/plan/analyze/Analyzer.java | 656 ++++++++++++++--
 .../db/mpp/plan/analyze/ClusterSchemaFetcher.java  | 276 ++++++-
 .../plan/analyze/ColumnPaginationController.java   |  73 ++
 .../db/mpp/plan/analyze/ConcatPathRewriter.java    | 135 ++++
 .../db/mpp/plan/analyze/ExpressionAnalyzer.java    | 854 +++++++++++++++++++++
 .../iotdb/db/mpp/plan/analyze/ExpressionUtils.java | 242 ++++++
 .../mpp/plan/analyze/GroupByLevelController.java   | 144 ++++
 .../iotdb/db/mpp/plan/analyze/SchemaValidator.java |   2 +-
 .../iotdb/db/mpp/plan/analyze/TypeProvider.java    |  23 +-
 .../db/mpp/plan/execution/IQueryExecution.java     |   4 +-
 .../db/mpp/plan/execution/QueryExecution.java      |  50 +-
 .../mpp/plan/execution/config/ConfigExecution.java |  15 +-
 .../iotdb/db/mpp/plan/parser/ASTVisitor.java       | 686 +++--------------
 .../db/mpp/plan/parser/StatementGenerator.java     |  21 +-
 .../db/mpp/plan/planner/DistributionPlanner.java   |  82 +-
 .../db/mpp/plan/planner/LocalExecutionPlanner.java | 149 +++-
 .../db/mpp/plan/planner/LogicalPlanBuilder.java    |  53 +-
 .../iotdb/db/mpp/plan/planner/LogicalPlanner.java  |  60 +-
 .../planner/SimpleFragmentParallelPlanner.java     |   6 +-
 .../plan/planner/WriteFragmentParallelPlanner.java |   6 +-
 .../db/mpp/plan/planner/plan/FragmentInstance.java |  15 +-
 .../mpp/plan/planner/plan/node/PlanNodeType.java   |  18 +-
 .../db/mpp/plan/planner/plan/node/PlanVisitor.java |  17 +-
 .../plan/node/metedata/read/DevicesCountNode.java  |   2 +-
 .../node/metedata/read/DevicesSchemaScanNode.java  |   2 +-
 .../metedata/read/LevelTimeSeriesCountNode.java    |   2 +-
 ...emaFetchNode.java => SchemaFetchMergeNode.java} |  45 +-
 ...hemaFetchNode.java => SchemaFetchScanNode.java} |  55 +-
 ...emaMergeNode.java => SchemaQueryMergeNode.java} |  20 +-
 ...chemaScanNode.java => SchemaQueryScanNode.java} |  12 +-
 .../node/metedata/read/TimeSeriesCountNode.java    |   2 +-
 .../metedata/read/TimeSeriesSchemaScanNode.java    |   2 +-
 .../plan/planner/plan/node/process/FillNode.java   |  33 +-
 .../source/AlignedSeriesAggregationScanNode.java   |   5 +-
 .../plan/node/source/AlignedSeriesScanNode.java    |   4 +-
 .../node/source/SeriesAggregationScanNode.java     |   5 +-
 .../planner/plan/node/source/SeriesScanNode.java   |   4 +-
 .../plan/node/write/InsertMultiTabletsNode.java    |  11 +-
 .../plan/planner/plan/node/write/InsertNode.java   | 176 +++--
 .../planner/plan/node/write/InsertRowNode.java     | 378 +++++----
 .../planner/plan/node/write/InsertRowsNode.java    |  11 +-
 .../plan/node/write/InsertRowsOfOneDeviceNode.java |  11 +-
 .../planner/plan/node/write/InsertTabletNode.java  | 482 ++++++------
 .../planner/plan/parameter/FillDescriptor.java     |  30 +-
 .../plan/parameter/FilterNullParameter.java        |  14 +-
 .../plan/parameter/GroupByTimeParameter.java       |  11 +
 .../plan/planner/plan/parameter/OutputColumn.java  |   2 +-
 .../plan/rewriter/ColumnPaginationController.java  | 145 ----
 .../db/mpp/plan/rewriter/ConcatPathRewriter.java   | 190 -----
 .../db/mpp/plan/rewriter/WildcardsRemover.java     | 375 ---------
 .../db/mpp/plan/scheduler/ClusterScheduler.java    |  14 +-
 .../scheduler/SimpleFragInstanceDispatcher.java    |   1 -
 .../mpp/plan/scheduler/SimpleQueryTerminator.java  |  28 +-
 .../db/mpp/plan/statement/StatementVisitor.java    |  35 -
 .../plan/statement/component/FillComponent.java    |  25 +-
 .../statement/component/GroupByLevelComponent.java |  20 -
 .../component/GroupByLevelController.java          | 247 ------
 .../mpp/plan/statement/component/ResultColumn.java | 113 +--
 .../plan/statement/component/SelectComponent.java  | 105 +--
 .../plan/statement/component/WhereCondition.java   |  16 +-
 .../statement/crud/AggregationQueryStatement.java  | 129 ----
 .../plan/statement/crud/FillQueryStatement.java    |  79 --
 .../statement/crud/GroupByFillQueryStatement.java  |  49 --
 .../plan/statement/crud/GroupByQueryStatement.java |  61 --
 .../plan/statement/crud/LastQueryStatement.java    |  74 --
 .../db/mpp/plan/statement/crud/QueryStatement.java | 213 ++---
 .../plan/statement/crud/UDAFQueryStatement.java    |  97 ---
 .../plan/statement/crud/UDTFQueryStatement.java    |  34 -
 .../literal/BooleanLiteral.java}                   |  44 +-
 .../mpp/plan/statement/literal/DoubleLiteral.java  |  42 +-
 .../db/mpp/plan/statement/literal/Literal.java     |  59 ++
 .../db/mpp/plan/statement/literal/LongLiteral.java |  42 +-
 .../db/mpp/plan/statement/literal/NullLiteral.java |  34 +-
 .../mpp/plan/statement/literal/StringLiteral.java  |  38 +-
 .../iotdb/db/qp/constant/FilterConstant.java       |  11 +
 .../iotdb/db/qp/logical/crud/InOperator.java       |   4 +
 .../apache/iotdb/db/qp/sql/IoTDBSqlVisitor.java    | 451 +++++------
 .../dataset/RawQueryDataSetWithValueFilter.java    |   6 +-
 .../iotdb/db/query/expression/Expression.java      |  16 +-
 .../iotdb/db/query/expression/ResultColumn.java    |  12 +-
 .../query/expression/binary/BinaryExpression.java  |  42 +-
 .../db/query/expression/leaf/ConstantOperand.java  |  20 +-
 .../query/expression/leaf/TimeSeriesOperand.java   |  23 -
 .../db/query/expression/leaf/TimestampOperand.java |  17 -
 .../query/expression/multi/FunctionExpression.java |  35 -
 .../db/query/expression/unary/InExpression.java    |   8 +
 .../db/query/expression/unary/LikeExpression.java  |   8 +
 .../query/expression/unary/RegularExpression.java  |   8 +
 .../db/query/expression/unary/UnaryExpression.java |  26 -
 .../apache/iotdb/db/service/IoTDBShutdownHook.java |   7 +
 .../service/thrift/impl/InternalServiceImpl.java   |  16 +-
 .../db/sync/receiver/collector/Collector.java      |   1 +
 .../iotdb/db/sync/receiver/load/SchemaLoader.java  |  37 +-
 .../db/sync/sender/manager/SchemaSyncManager.java  |   4 +-
 .../java/org/apache/iotdb/db/utils/MemUtils.java   |   6 +-
 .../apache/iotdb/db/utils/QueryDataSetUtils.java   |   6 +-
 .../apache/iotdb/db/wal/utils/WALWriteUtils.java   |  17 +
 .../db/metadata/cache/DataNodeSchemaCacheTest.java | 105 ++-
 .../db/mpp/common/schematree/SchemaTreeTest.java   |   3 +-
 .../db/mpp/execution/ConfigExecutionTest.java      |  23 +-
 .../mpp/execution/datatransfer/SinkHandleTest.java |   3 +-
 .../execution/datatransfer/SourceHandleTest.java   |   1 +
 .../operator/AlignedSeriesScanOperatorTest.java    | 748 ++++++++++++++++++
 .../execution/operator/AlignedSeriesTestUtil.java  | 260 +++++++
 .../operator/DeviceMergeOperatorTest.java          | 547 +++++++++++++
 .../execution/operator/DeviceViewOperatorTest.java |   8 +-
 .../NonOverlappedMultiColumnMergerTest.java        | 230 ++++++
 .../execution/operator/TimeJoinOperatorTest.java   |   2 +-
 ...rTest.java => SchemaFetchScanOperatorTest.java} |  12 +-
 ...rTest.java => SchemaQueryScanOperatorTest.java} |   6 +-
 .../{AnalyzerTest.java => AnalyzeFailTest.java}    |   7 +-
 .../{AnalyzerTest.java => AnalyzeTest.java}        |  37 +-
 .../db/mpp/plan/plan/DistributionPlannerTest.java  |   4 +-
 .../iotdb/db/mpp/plan/plan/LogicalPlannerTest.java |   6 +-
 .../read/DeviceSchemaScanNodeSerdeTest.java        |   5 +-
 .../metadata/read/SchemaFetchScanNodeTest.java     |  51 ++
 .../read/TimeSeriesSchemaScanNodeSerdeTest.java    |   5 +-
 .../plan/plan/node/process/FillNodeSerdeTest.java  |   8 +-
 .../write/InsertMultiTabletsNodeSerdeTest.java     |  10 +-
 .../plan/node/write/InsertRowNodeSerdeTest.java    |  17 +-
 .../plan/node/write/InsertRowsNodeSerdeTest.java   |   2 +-
 .../write/InsertRowsOfOneDeviceNodeSerdeTest.java  |   2 +-
 .../plan/node/write/InsertTabletNodeSerdeTest.java |  16 +-
 .../org/apache/iotdb/db/wal/io/WALFileTest.java    | 114 +++
 .../java/org/apache/iotdb/rpc/TSStatusCode.java    |   5 +-
 .../java/org/apache/iotdb/session/Session.java     |  19 +-
 .../src/main/thrift/confignode.thrift              |  48 +-
 thrift/src/main/thrift/mpp.thrift                  |   1 +
 .../iotdb/tsfile/read/common/block/TsBlock.java    | 100 ++-
 .../java/org/apache/iotdb/tsfile/utils/BitMap.java |  23 +
 .../java/org/apache/iotdb/tsfile/utils/Pair.java   |   8 +
 .../tsfile/write/record/datapoint/DataPoint.java   |  10 +-
 237 files changed, 9395 insertions(+), 5388 deletions(-)

diff --cc server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java
index 031cbdad61,27a84b4838..9fe53fb9e1
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java
@@@ -76,8 -87,8 +87,9 @@@ import org.apache.iotdb.db.mpp.plan.pla
  import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.OffsetNode;
  import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.SortNode;
  import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TimeJoinNode;
 +import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TransformNode;
  import org.apache.iotdb.db.mpp.plan.planner.plan.node.sink.FragmentSinkNode;
+ import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.AlignedSeriesScanNode;
  import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.SeriesAggregationScanNode;
  import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.SeriesScanNode;
  import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.InputLocation;


[iotdb] 02/02: TransformNode & FilterNode

Posted by ro...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

rong pushed a commit to branch transform-filter-planner
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 35e02aedb6b6713a7a2ce0e172b6cf2a2726f413
Author: Steve Yurong Su <ro...@apache.org>
AuthorDate: Sun May 8 19:02:23 2022 +0800

    TransformNode & FilterNode
---
 .../execution/operator/process/FilterOperator.java |  12 +-
 .../operator/process/TransformOperator.java        |  24 +++-
 .../db/mpp/plan/planner/LocalExecutionPlanner.java |  56 ++++++++-
 .../mpp/plan/planner/plan/node/PlanNodeType.java   |   6 +-
 .../plan/planner/plan/node/process/FilterNode.java |  86 +++++++-------
 .../planner/plan/node/process/TransformNode.java   | 125 +++++++++++++++++++--
 .../db/query/udf/core/executor/UDTFContext.java    |   7 ++
 .../db/mpp/plan/plan/QueryLogicalPlanUtil.java     |  85 +++++++++++---
 .../plan/node/process/FilterNodeSerdeTest.java     |   7 +-
 9 files changed, 328 insertions(+), 80 deletions(-)

diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/FilterOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/FilterOperator.java
index f7a37068f2..79e5e2fd2f 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/FilterOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/FilterOperator.java
@@ -22,8 +22,8 @@ package org.apache.iotdb.db.mpp.execution.operator.process;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.execution.operator.Operator;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
+import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.query.expression.Expression;
-import org.apache.iotdb.db.query.udf.core.executor.UDTFContext;
 import org.apache.iotdb.db.query.udf.core.reader.LayerPointReader;
 import org.apache.iotdb.tsfile.exception.write.UnSupportedDataTypeException;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
@@ -33,6 +33,7 @@ import org.apache.iotdb.tsfile.read.common.block.column.ColumnBuilder;
 import org.apache.iotdb.tsfile.read.common.block.column.TimeColumnBuilder;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -46,15 +47,18 @@ public class FilterOperator extends TransformOperator {
       List<TSDataType> inputDataTypes,
       Expression filterExpression,
       Expression[] outputExpressions,
-      UDTFContext udtfContext)
+      boolean keepNull,
+      ZoneId zoneId,
+      TypeProvider typeProvider)
       throws QueryProcessException, IOException {
     super(
         operatorContext,
         inputOperator,
         inputDataTypes,
         bindExpressions(filterExpression, outputExpressions),
-        udtfContext,
-        false);
+        keepNull,
+        zoneId,
+        typeProvider);
   }
 
   private static Expression[] bindExpressions(
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java
index 76d1a4a0fb..7d47611f6d 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/execution/operator/process/TransformOperator.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.db.conf.IoTDBDescriptor;
 import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.mpp.execution.operator.Operator;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
+import org.apache.iotdb.db.mpp.plan.analyze.TypeProvider;
 import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.udf.core.executor.UDTFContext;
 import org.apache.iotdb.db.query.udf.core.layer.EvaluationDAGBuilder;
@@ -42,11 +43,13 @@ import org.apache.iotdb.tsfile.read.common.block.column.TimeColumnBuilder;
 import com.google.common.util.concurrent.ListenableFuture;
 
 import java.io.IOException;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.List;
 
 public class TransformOperator implements ProcessOperator {
 
+  // TODO: make it configurable
   protected static final int FETCH_SIZE = 10000;
 
   protected final float udfReaderMemoryBudgetInMB =
@@ -60,10 +63,10 @@ public class TransformOperator implements ProcessOperator {
   protected final Operator inputOperator;
   protected final List<TSDataType> inputDataTypes;
   protected final Expression[] outputExpressions;
-  protected final UDTFContext udtfContext;
   protected final boolean keepNull;
 
   protected RawQueryInputLayer inputLayer;
+  protected UDTFContext udtfContext;
   protected LayerPointReader[] transformers;
   protected TimeSelector timeHeap;
   protected List<TSDataType> outputDataTypes;
@@ -73,19 +76,21 @@ public class TransformOperator implements ProcessOperator {
       Operator inputOperator,
       List<TSDataType> inputDataTypes,
       Expression[] outputExpressions,
-      UDTFContext udtfContext,
-      boolean keepNull)
+      boolean keepNull,
+      ZoneId zoneId,
+      TypeProvider typeProvider)
       throws QueryProcessException, IOException {
     this.operatorContext = operatorContext;
     this.inputOperator = inputOperator;
     this.inputDataTypes = inputDataTypes;
     this.outputExpressions = outputExpressions;
-    this.udtfContext = udtfContext;
     this.keepNull = keepNull;
 
     initInputLayer(inputDataTypes);
+    initUdtfContext(zoneId);
     initTransformers();
     readyForFirstIteration();
+    updateTypeProvider(typeProvider);
   }
 
   private void initInputLayer(List<TSDataType> inputDataTypes) throws QueryProcessException {
@@ -96,6 +101,11 @@ public class TransformOperator implements ProcessOperator {
             new TsBlockInputDataSet(inputOperator, inputDataTypes));
   }
 
+  private void initUdtfContext(ZoneId zoneId) {
+    udtfContext = new UDTFContext(zoneId);
+    udtfContext.constructUdfExecutors(outputExpressions);
+  }
+
   protected void initTransformers() throws QueryProcessException, IOException {
     UDFRegistrationService.getInstance().acquireRegistrationLock();
     try {
@@ -139,6 +149,12 @@ public class TransformOperator implements ProcessOperator {
     }
   }
 
+  private void updateTypeProvider(TypeProvider typeProvider) {
+    for (int i = 0; i < transformers.length; ++i) {
+      typeProvider.setType(outputExpressions[i].toString(), transformers[i].getDataType());
+    }
+  }
+
   @Override
   public boolean hasNext() {
     return !timeHeap.isEmpty();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java
index 9fe53fb9e1..3a8919af44 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/LocalExecutionPlanner.java
@@ -20,6 +20,7 @@ package org.apache.iotdb.db.mpp.plan.planner;
 
 import org.apache.iotdb.commons.path.PartialPath;
 import org.apache.iotdb.db.engine.storagegroup.DataRegion;
+import org.apache.iotdb.db.exception.query.QueryProcessException;
 import org.apache.iotdb.db.metadata.path.AlignedPath;
 import org.apache.iotdb.db.metadata.schemaregion.ISchemaRegion;
 import org.apache.iotdb.db.mpp.aggregation.AccumulatorFactory;
@@ -38,9 +39,11 @@ import org.apache.iotdb.db.mpp.execution.operator.Operator;
 import org.apache.iotdb.db.mpp.execution.operator.OperatorContext;
 import org.apache.iotdb.db.mpp.execution.operator.process.DeviceMergeOperator;
 import org.apache.iotdb.db.mpp.execution.operator.process.DeviceViewOperator;
+import org.apache.iotdb.db.mpp.execution.operator.process.FilterOperator;
 import org.apache.iotdb.db.mpp.execution.operator.process.LimitOperator;
 import org.apache.iotdb.db.mpp.execution.operator.process.OffsetOperator;
 import org.apache.iotdb.db.mpp.execution.operator.process.TimeJoinOperator;
+import org.apache.iotdb.db.mpp.execution.operator.process.TransformOperator;
 import org.apache.iotdb.db.mpp.execution.operator.process.merge.AscTimeComparator;
 import org.apache.iotdb.db.mpp.execution.operator.process.merge.ColumnMerger;
 import org.apache.iotdb.db.mpp.execution.operator.process.merge.DescTimeComparator;
@@ -99,6 +102,9 @@ import org.apache.iotdb.db.utils.datastructure.TimeSelector;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 
+import org.apache.commons.lang3.Validate;
+
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -433,12 +439,49 @@ public class LocalExecutionPlanner {
 
     @Override
     public Operator visitTransform(TransformNode node, LocalExecutionPlanContext context) {
-      return super.visitTransform(node, context);
+      final OperatorContext operatorContext =
+          context.instanceContext.addOperatorContext(
+              context.getNextOperatorId(),
+              node.getPlanNodeId(),
+              TransformNode.class.getSimpleName());
+      final Operator inputOperator = generateOnlyChildOperator(node, context);
+      final List<TSDataType> inputDataTypes = getOutputColumnTypes(node, context.getTypeProvider());
+
+      try {
+        return new TransformOperator(
+            operatorContext,
+            inputOperator,
+            inputDataTypes,
+            node.getOutputExpressions(),
+            node.isKeepNull(),
+            node.getZoneId(),
+            context.getTypeProvider());
+      } catch (QueryProcessException | IOException e) {
+        throw new RuntimeException(e);
+      }
     }
 
     @Override
     public Operator visitFilter(FilterNode node, LocalExecutionPlanContext context) {
-      return super.visitFilter(node, context);
+      final OperatorContext operatorContext =
+          context.instanceContext.addOperatorContext(
+              context.getNextOperatorId(), node.getPlanNodeId(), FilterNode.class.getSimpleName());
+      final Operator inputOperator = generateOnlyChildOperator(node, context);
+      final List<TSDataType> inputDataTypes = getOutputColumnTypes(node, context.getTypeProvider());
+
+      try {
+        return new FilterOperator(
+            operatorContext,
+            inputOperator,
+            inputDataTypes,
+            node.getPredicate(),
+            node.getOutputExpressions(),
+            node.isKeepNull(),
+            node.getZoneId(),
+            context.getTypeProvider());
+      } catch (QueryProcessException | IOException e) {
+        throw new RuntimeException(e);
+      }
     }
 
     @Override
@@ -629,6 +672,15 @@ public class LocalExecutionPlanner {
           .map(typeProvider::getType)
           .collect(Collectors.toList());
     }
+
+    private Operator generateOnlyChildOperator(PlanNode node, LocalExecutionPlanContext context) {
+      List<Operator> children =
+          node.getChildren().stream()
+              .map(child -> child.accept(this, context))
+              .collect(Collectors.toList());
+      Validate.isTrue(children.size() == 1);
+      return children.get(0);
+    }
   }
 
   private static class InstanceHolder {
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
index 4d3df73e2f..5662d0ca54 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/PlanNodeType.java
@@ -44,6 +44,7 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.OffsetNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.ProjectNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.SortNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TimeJoinNode;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TransformNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.sink.FragmentSinkNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.AlignedSeriesAggregationScanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.source.AlignedSeriesScanNode;
@@ -96,7 +97,8 @@ public enum PlanNodeType {
   ALIGNED_SERIES_SCAN((short) 33),
   ALIGNED_SERIES_AGGREGATE_SCAN((short) 34),
   DEVICE_MERGE((short) 35),
-  SCHEMA_FETCH_MERGE((short) 36);
+  SCHEMA_FETCH_MERGE((short) 36),
+  TRANSFORM((short) 37);
 
   private final short nodeType;
 
@@ -194,6 +196,8 @@ public enum PlanNodeType {
         return AlignedSeriesAggregationScanNode.deserialize(buffer);
       case 36:
         return SchemaFetchMergeNode.deserialize(buffer);
+      case 37:
+        return TransformNode.deserialize(buffer);
       default:
         throw new IllegalArgumentException("Invalid node type: " + nodeType);
     }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/FilterNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/FilterNode.java
index dfc10e0cba..338a519123 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/FilterNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/FilterNode.java
@@ -23,74 +23,74 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
 import org.apache.iotdb.db.query.expression.Expression;
-
-import com.google.common.collect.ImmutableList;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
 
 import java.nio.ByteBuffer;
-import java.util.List;
+import java.time.ZoneId;
 import java.util.Objects;
 
-/** The FilterNode is responsible to filter the RowRecord from TsBlock. */
-public class FilterNode extends ProcessNode {
-
-  private PlanNode child;
+public class FilterNode extends TransformNode {
 
   private final Expression predicate;
 
-  public FilterNode(PlanNodeId id, Expression predicate) {
-    super(id);
+  public FilterNode(
+      PlanNodeId id,
+      PlanNode childPlanNode,
+      Expression[] outputExpressions,
+      Expression predicate,
+      boolean keepNull,
+      ZoneId zoneId) {
+    super(id, childPlanNode, outputExpressions, keepNull, zoneId);
     this.predicate = predicate;
   }
 
-  public FilterNode(PlanNodeId id, PlanNode child, Expression predicate) {
-    this(id, predicate);
-    this.child = child;
-  }
-
-  public Expression getPredicate() {
-    return predicate;
-  }
-
-  @Override
-  public List<PlanNode> getChildren() {
-    return ImmutableList.of(child);
-  }
-
-  @Override
-  public void addChild(PlanNode child) {
-    this.child = child;
+  public FilterNode(
+      PlanNodeId id,
+      Expression[] outputExpressions,
+      Expression predicate,
+      boolean keepNull,
+      ZoneId zoneId) {
+    super(id, outputExpressions, keepNull, zoneId);
+    this.predicate = predicate;
   }
 
   @Override
-  public int allowedChildCount() {
-    return ONE_CHILD;
+  public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+    return visitor.visitFilter(this, context);
   }
 
   @Override
   public PlanNode clone() {
-    return new FilterNode(getPlanNodeId(), predicate);
-  }
-
-  @Override
-  public List<String> getOutputColumnNames() {
-    return child.getOutputColumnNames();
-  }
-
-  @Override
-  public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
-    return visitor.visitFilter(this, context);
+    return new FilterNode(getPlanNodeId(), outputExpressions, predicate, keepNull, zoneId);
   }
 
   @Override
   protected void serializeAttributes(ByteBuffer byteBuffer) {
     PlanNodeType.FILTER.serialize(byteBuffer);
+    ReadWriteIOUtils.write(outputExpressions.length, byteBuffer);
+    for (Expression expression : outputExpressions) {
+      Expression.serialize(expression, byteBuffer);
+    }
     Expression.serialize(predicate, byteBuffer);
+    ReadWriteIOUtils.write(keepNull, byteBuffer);
+    ReadWriteIOUtils.write(zoneId.getId(), byteBuffer);
   }
 
   public static FilterNode deserialize(ByteBuffer byteBuffer) {
+    int outputExpressionsLength = ReadWriteIOUtils.readInt(byteBuffer);
+    Expression[] outputExpressions = new Expression[outputExpressionsLength];
+    for (int i = 0; i < outputExpressionsLength; ++i) {
+      outputExpressions[i] = Expression.deserialize(byteBuffer);
+    }
     Expression predicate = Expression.deserialize(byteBuffer);
+    boolean keepNull = ReadWriteIOUtils.readBool(byteBuffer);
+    ZoneId zoneId = ZoneId.of(Objects.requireNonNull(ReadWriteIOUtils.readString(byteBuffer)));
     PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
-    return new FilterNode(planNodeId, predicate);
+    return new FilterNode(planNodeId, outputExpressions, predicate, keepNull, zoneId);
+  }
+
+  public Expression getPredicate() {
+    return predicate;
   }
 
   @Override
@@ -98,18 +98,18 @@ public class FilterNode extends ProcessNode {
     if (this == o) {
       return true;
     }
-    if (o == null || getClass() != o.getClass()) {
+    if (!(o instanceof FilterNode)) {
       return false;
     }
     if (!super.equals(o)) {
       return false;
     }
     FilterNode that = (FilterNode) o;
-    return child.equals(that.child) && predicate.equals(that.predicate);
+    return predicate.equals(that.predicate);
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), child, predicate);
+    return Objects.hash(super.hashCode(), predicate);
   }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/TransformNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/TransformNode.java
index 3fedaf99eb..75dd967780 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/TransformNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/process/TransformNode.java
@@ -21,39 +21,144 @@ package org.apache.iotdb.db.mpp.plan.planner.plan.node.process;
 
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeType;
+import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanVisitor;
+import org.apache.iotdb.db.query.expression.Expression;
+import org.apache.iotdb.tsfile.utils.ReadWriteIOUtils;
+
+import com.google.common.collect.ImmutableList;
 
 import java.nio.ByteBuffer;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 public class TransformNode extends ProcessNode {
 
-  public TransformNode(PlanNodeId id) {
+  protected PlanNode childPlanNode;
+
+  protected final Expression[] outputExpressions;
+  protected final boolean keepNull;
+  protected final ZoneId zoneId;
+
+  private List<String> outputColumnNames;
+
+  public TransformNode(
+      PlanNodeId id,
+      PlanNode childPlanNode,
+      Expression[] outputExpressions,
+      boolean keepNull,
+      ZoneId zoneId) {
+    super(id);
+    this.childPlanNode = childPlanNode;
+    this.outputExpressions = outputExpressions;
+    this.keepNull = keepNull;
+    this.zoneId = zoneId;
+  }
+
+  public TransformNode(
+      PlanNodeId id, Expression[] outputExpressions, boolean keepNull, ZoneId zoneId) {
     super(id);
+    this.outputExpressions = outputExpressions;
+    this.keepNull = keepNull;
+    this.zoneId = zoneId;
+  }
+
+  @Override
+  public final List<PlanNode> getChildren() {
+    return ImmutableList.of(childPlanNode);
+  }
+
+  @Override
+  public final void addChild(PlanNode childPlanNode) {
+    this.childPlanNode = childPlanNode;
   }
 
   @Override
-  public List<PlanNode> getChildren() {
-    return null;
+  public final int allowedChildCount() {
+    return ONE_CHILD;
   }
 
   @Override
-  public void addChild(PlanNode child) {}
+  public final List<String> getOutputColumnNames() {
+    if (outputColumnNames == null) {
+      outputColumnNames = new ArrayList<>();
+      for (Expression expression : outputExpressions) {
+        outputColumnNames.add(expression.toString());
+      }
+    }
+    return outputColumnNames;
+  }
+
+  @Override
+  public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
+    return visitor.visitTransform(this, context);
+  }
 
   @Override
   public PlanNode clone() {
-    return null;
+    return new TransformNode(getPlanNodeId(), outputExpressions, keepNull, zoneId);
   }
 
   @Override
-  public int allowedChildCount() {
-    return 0;
+  protected void serializeAttributes(ByteBuffer byteBuffer) {
+    PlanNodeType.TRANSFORM.serialize(byteBuffer);
+    ReadWriteIOUtils.write(outputExpressions.length, byteBuffer);
+    for (Expression expression : outputExpressions) {
+      Expression.serialize(expression, byteBuffer);
+    }
+    ReadWriteIOUtils.write(keepNull, byteBuffer);
+    ReadWriteIOUtils.write(zoneId.getId(), byteBuffer);
+  }
+
+  public static TransformNode deserialize(ByteBuffer byteBuffer) {
+    int outputExpressionsLength = ReadWriteIOUtils.readInt(byteBuffer);
+    Expression[] outputExpressions = new Expression[outputExpressionsLength];
+    for (int i = 0; i < outputExpressionsLength; ++i) {
+      outputExpressions[i] = Expression.deserialize(byteBuffer);
+    }
+    boolean keepNull = ReadWriteIOUtils.readBool(byteBuffer);
+    ZoneId zoneId = ZoneId.of(Objects.requireNonNull(ReadWriteIOUtils.readString(byteBuffer)));
+    PlanNodeId planNodeId = PlanNodeId.deserialize(byteBuffer);
+    return new TransformNode(planNodeId, outputExpressions, keepNull, zoneId);
+  }
+
+  public final Expression[] getOutputExpressions() {
+    return outputExpressions;
+  }
+
+  public final boolean isKeepNull() {
+    return keepNull;
+  }
+
+  public final ZoneId getZoneId() {
+    return zoneId;
   }
 
   @Override
-  public List<String> getOutputColumnNames() {
-    return null;
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof TransformNode)) {
+      return false;
+    }
+    if (!super.equals(o)) {
+      return false;
+    }
+    TransformNode that = (TransformNode) o;
+    return keepNull == that.keepNull
+        && childPlanNode.equals(that.childPlanNode)
+        && Arrays.equals(outputExpressions, that.outputExpressions)
+        && zoneId.equals(that.zoneId);
   }
 
   @Override
-  protected void serializeAttributes(ByteBuffer byteBuffer) {}
+  public int hashCode() {
+    int result = Objects.hash(super.hashCode(), childPlanNode, keepNull, zoneId);
+    result = 31 * result + Arrays.hashCode(outputExpressions);
+    return result;
+  }
 }
diff --git a/server/src/main/java/org/apache/iotdb/db/query/udf/core/executor/UDTFContext.java b/server/src/main/java/org/apache/iotdb/db/query/udf/core/executor/UDTFContext.java
index 2c2e19abd2..9350376708 100644
--- a/server/src/main/java/org/apache/iotdb/db/query/udf/core/executor/UDTFContext.java
+++ b/server/src/main/java/org/apache/iotdb/db/query/udf/core/executor/UDTFContext.java
@@ -19,6 +19,7 @@
 
 package org.apache.iotdb.db.query.udf.core.executor;
 
+import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.ResultColumn;
 import org.apache.iotdb.db.query.expression.multi.FunctionExpression;
 import org.apache.iotdb.db.query.udf.service.UDFClassLoaderManager;
@@ -44,6 +45,12 @@ public class UDTFContext {
     }
   }
 
+  public void constructUdfExecutors(Expression[] outputExpressions) {
+    for (Expression expression : outputExpressions) {
+      expression.constructUdfExecutors(expressionName2Executor, zoneId);
+    }
+  }
+
   public void finalizeUDFExecutors(long queryId) {
     try {
       for (UDTFExecutor executor : expressionName2Executor.values()) {
diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
index 055104c12b..c500cd278e 100644
--- a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
+++ b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/QueryLogicalPlanUtil.java
@@ -38,18 +38,20 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.AggregationDescriptor
 import org.apache.iotdb.db.mpp.plan.planner.plan.parameter.AggregationStep;
 import org.apache.iotdb.db.mpp.plan.statement.component.FilterNullPolicy;
 import org.apache.iotdb.db.mpp.plan.statement.component.OrderBy;
-import org.apache.iotdb.db.qp.constant.SQLConstant;
 import org.apache.iotdb.db.query.aggregation.AggregationType;
+import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.binary.GreaterThanExpression;
 import org.apache.iotdb.db.query.expression.binary.LogicAndExpression;
 import org.apache.iotdb.db.query.expression.leaf.ConstantOperand;
 import org.apache.iotdb.db.query.expression.leaf.TimeSeriesOperand;
+import org.apache.iotdb.db.query.expression.leaf.TimestampOperand;
 import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.apache.iotdb.tsfile.read.filter.TimeFilter;
 import org.apache.iotdb.tsfile.read.filter.basic.Filter;
 
 import org.apache.commons.compress.utils.Sets;
 
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -136,8 +138,7 @@ public class QueryLogicalPlanUtil {
 
     GreaterThanExpression timeFilter =
         new GreaterThanExpression(
-            new TimeSeriesOperand(SQLConstant.TIME_PATH),
-            new ConstantOperand(TSDataType.INT64, "100"));
+            new TimestampOperand(), new ConstantOperand(TSDataType.INT64, "100"));
     GreaterThanExpression valueFilter1 =
         new GreaterThanExpression(
             new TimeSeriesOperand(schemaMap.get("root.sg.d1.s2")),
@@ -152,7 +153,17 @@ public class QueryLogicalPlanUtil {
             new LogicAndExpression(timeFilter, valueFilter2));
 
     FilterNode filterNode =
-        new FilterNode(new PlanNodeId("test_query_4"), timeJoinNode, expression);
+        new FilterNode(
+            new PlanNodeId("test_query_4"),
+            timeJoinNode,
+            new Expression[] {
+              new TimeSeriesOperand(schemaMap.get("root.sg.d1.s2")),
+              new TimeSeriesOperand(schemaMap.get("root.sg.d2.s1")),
+              new TimeSeriesOperand(schemaMap.get("root.sg.d2.s2")),
+            },
+            expression,
+            false,
+            ZoneId.systemDefault());
 
     ProjectNode projectNode =
         new ProjectNode(
@@ -212,8 +223,7 @@ public class QueryLogicalPlanUtil {
 
     GreaterThanExpression timeFilter =
         new GreaterThanExpression(
-            new TimeSeriesOperand(SQLConstant.TIME_PATH),
-            new ConstantOperand(TSDataType.INT64, "100"));
+            new TimestampOperand(), new ConstantOperand(TSDataType.INT64, "100"));
     GreaterThanExpression valueFilter1 =
         new GreaterThanExpression(
             new TimeSeriesOperand(schemaMap.get("root.sg.d1.s2")),
@@ -228,9 +238,27 @@ public class QueryLogicalPlanUtil {
             new LogicAndExpression(timeFilter, valueFilter2));
 
     FilterNode filterNode1 =
-        new FilterNode(new PlanNodeId("test_query_6"), timeJoinNode1, expression);
+        new FilterNode(
+            new PlanNodeId("test_query_6"),
+            timeJoinNode1,
+            new Expression[] {
+              new TimeSeriesOperand(schemaMap.get("root.sg.d1.s1")),
+              new TimeSeriesOperand(schemaMap.get("root.sg.d1.s2")),
+            },
+            expression,
+            false,
+            ZoneId.systemDefault());
     FilterNode filterNode2 =
-        new FilterNode(new PlanNodeId("test_query_7"), timeJoinNode2, expression);
+        new FilterNode(
+            new PlanNodeId("test_query_7"),
+            timeJoinNode2,
+            new Expression[] {
+              new TimeSeriesOperand(schemaMap.get("root.sg.d2.s1")),
+              new TimeSeriesOperand(schemaMap.get("root.sg.d2.s2")),
+            },
+            expression,
+            false,
+            ZoneId.systemDefault());
 
     DeviceViewNode deviceViewNode =
         new DeviceViewNode(
@@ -496,8 +524,7 @@ public class QueryLogicalPlanUtil {
 
     GreaterThanExpression timeFilter =
         new GreaterThanExpression(
-            new TimeSeriesOperand(SQLConstant.TIME_PATH),
-            new ConstantOperand(TSDataType.INT64, "100"));
+            new TimestampOperand(), new ConstantOperand(TSDataType.INT64, "100"));
     GreaterThanExpression valueFilter1 =
         new GreaterThanExpression(
             new TimeSeriesOperand(schemaMap.get("root.sg.d1.s2")),
@@ -511,7 +538,18 @@ public class QueryLogicalPlanUtil {
             new LogicAndExpression(timeFilter, valueFilter1),
             new LogicAndExpression(timeFilter, valueFilter2));
     FilterNode filterNode =
-        new FilterNode(new PlanNodeId("test_query_5"), timeJoinNode, expression);
+        new FilterNode(
+            new PlanNodeId("test_query_5"),
+            timeJoinNode,
+            new Expression[] {
+              new TimeSeriesOperand(schemaMap.get("root.sg.d1.s1")),
+              new TimeSeriesOperand(schemaMap.get("root.sg.d1.s2")),
+              new TimeSeriesOperand(schemaMap.get("root.sg.d2.s1")),
+              new TimeSeriesOperand(schemaMap.get("root.sg.d2.s2")),
+            },
+            expression,
+            false,
+            ZoneId.systemDefault());
 
     AggregationNode aggregationNode =
         new AggregationNode(
@@ -629,8 +667,7 @@ public class QueryLogicalPlanUtil {
 
     GreaterThanExpression timeFilter =
         new GreaterThanExpression(
-            new TimeSeriesOperand(SQLConstant.TIME_PATH),
-            new ConstantOperand(TSDataType.INT64, "100"));
+            new TimestampOperand(), new ConstantOperand(TSDataType.INT64, "100"));
     GreaterThanExpression valueFilter1 =
         new GreaterThanExpression(
             new TimeSeriesOperand(schemaMap.get("root.sg.d1.s2")),
@@ -645,9 +682,27 @@ public class QueryLogicalPlanUtil {
             new LogicAndExpression(timeFilter, valueFilter2));
 
     FilterNode filterNode1 =
-        new FilterNode(new PlanNodeId("test_query_6"), timeJoinNode1, expression);
+        new FilterNode(
+            new PlanNodeId("test_query_6"),
+            timeJoinNode1,
+            new Expression[] {
+              new TimeSeriesOperand(schemaMap.get("root.sg.d1.s1")),
+              new TimeSeriesOperand(schemaMap.get("root.sg.d1.s2")),
+            },
+            expression,
+            false,
+            ZoneId.systemDefault());
     FilterNode filterNode2 =
-        new FilterNode(new PlanNodeId("test_query_7"), timeJoinNode2, expression);
+        new FilterNode(
+            new PlanNodeId("test_query_7"),
+            timeJoinNode2,
+            new Expression[] {
+              new TimeSeriesOperand(schemaMap.get("root.sg.d2.s1")),
+              new TimeSeriesOperand(schemaMap.get("root.sg.d2.s2")),
+            },
+            expression,
+            false,
+            ZoneId.systemDefault());
 
     AggregationNode aggregationNode1 =
         new AggregationNode(
diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/process/FilterNodeSerdeTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/process/FilterNodeSerdeTest.java
index a68782a73e..35346f29d8 100644
--- a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/process/FilterNodeSerdeTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/process/FilterNodeSerdeTest.java
@@ -25,6 +25,7 @@ import org.apache.iotdb.db.mpp.plan.planner.plan.node.PlanNodeId;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.FilterNode;
 import org.apache.iotdb.db.mpp.plan.planner.plan.node.process.TimeJoinNode;
 import org.apache.iotdb.db.mpp.plan.statement.component.OrderBy;
+import org.apache.iotdb.db.query.expression.Expression;
 import org.apache.iotdb.db.query.expression.binary.GreaterThanExpression;
 import org.apache.iotdb.db.query.expression.leaf.ConstantOperand;
 import org.apache.iotdb.db.query.expression.leaf.TimeSeriesOperand;
@@ -33,6 +34,7 @@ import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
 import org.junit.Test;
 
 import java.nio.ByteBuffer;
+import java.time.ZoneId;
 
 import static org.junit.Assert.assertEquals;
 
@@ -46,9 +48,12 @@ public class FilterNodeSerdeTest {
         new FilterNode(
             new PlanNodeId("TestFilterNode"),
             timeJoinNode,
+            new Expression[] {new TimeSeriesOperand(new PartialPath("root.sg.d1.s1"))},
             new GreaterThanExpression(
                 new TimeSeriesOperand(new PartialPath("root.sg.d1.s1")),
-                new ConstantOperand(TSDataType.INT64, "100")));
+                new ConstantOperand(TSDataType.INT64, "100")),
+            false,
+            ZoneId.systemDefault());
 
     ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
     filterNode.serialize(byteBuffer);