You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by sh...@apache.org on 2026/04/21 03:30:11 UTC
(iotdb) branch calc_commons updated: rename package
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
The following commit(s) were added to refs/heads/calc_commons by this push:
new 127e6fa7021 rename package
127e6fa7021 is described below
commit 127e6fa70215fb9dc065babd4717255266e75074
Author: shuwenwei <we...@timecho.com>
AuthorDate: Tue Apr 21 11:29:43 2026 +0800
rename package
---
.../org/apache/iotdb/mqtt/MPPPublishHandler.java | 4 +-
.../table/v1/handler/ExceptionHandler.java | 4 +-
.../table/v1/handler/ExecuteStatementHandler.java | 4 +-
.../table/v1/handler/QueryDataSetHandler.java | 4 +-
.../v1/handler/StatementConstructionHandler.java | 2 +-
.../protocol/table/v1/impl/RestApiServiceImpl.java | 4 +-
.../rest/protocol/v1/handler/ExceptionHandler.java | 2 +-
.../v1/handler/StatementConstructionHandler.java | 2 +-
.../rest/protocol/v2/handler/ExceptionHandler.java | 2 +-
.../v2/handler/StatementConstructionHandler.java | 2 +-
.../rest/protocol/v2/impl/RestApiServiceImpl.java | 2 +-
integration-test/pom.xml | 5 +
.../org/apache/iotdb/it/env/cluster/EnvUtils.java | 2 +-
.../constant/BuiltinAggregationFunctionEnum.java | 9 +-
.../it/partition/IoTDBTimePartitionIT.java | 2 +-
.../confignode/it/procedure/IoTDBProcedureIT.java | 2 +-
.../db/it/IoTDBMultiTAGsWithAttributesTableIT.java | 8 +-
.../it/db/it/udf/IoTDBSQLFunctionManagementIT.java | 2 +-
.../scalar/IoTDBCastFunctionTableIT.java | 2 +-
.../scalar/IoTDBFormatFunctionTableIT.java | 2 +-
.../it/query/old/query/IoTDBArithmeticTableIT.java | 2 +-
.../view/old/query/IoTDBArithmeticTableViewIT.java | 2 +-
.../apache/iotdb/tool/data/AbstractDataTool.java | 4 +-
.../ArithmeticBinaryColumnTransformer.ftl | 22 +-
.../templates/ArithmeticColumnTransformerApi.ftl | 26 +-
.../templates/ArithmeticUnaryColumnTransformer.ftl | 6 +-
.../src/main/codegen/templates/ModeAccumulator.ftl | 4 +-
.../src/main/codegen/templates/constantFill.ftl | 6 +-
.../src/main/codegen/templates/linearFill.ftl | 4 +-
.../src/main/codegen/templates/previousFill.ftl | 6 +-
.../templates/previousFillWithTimeDuration.ftl | 8 +-
.../calc/exception/MemoryNotEnoughException.java | 31 +
.../calc/exception/QueryProcessException.java | 45 +
.../calc/execution/aggregation/Accumulator.java | 97 +
.../execution/aggregation/VarianceAccumulator.java | 282 +++
.../calc/execution/operator/AbstractOperator.java | 110 +
.../execution/operator/CommonOperatorContext.java | 149 ++
.../execution/operator/GroupedTopNBuilder.java | 32 +
.../operator/GroupedTopNRowNumberAccumulator.java | 483 +++++
.../operator/GroupedTopNRowNumberBuilder.java | 192 ++
.../iotdb/calc/execution/operator/IdRegistry.java | 76 +
.../iotdb/calc/execution/operator/Operator.java | 134 ++
.../operator/RowIdComparisonStrategy.java | 24 +
.../calc/execution/operator/RowIdHashStrategy.java | 27 +
.../calc/execution/operator/RowReference.java | 45 +
.../operator/RowReferenceTsBlockManager.java | 386 ++++
.../SimpleTsBlockWithPositionComparator.java | 52 +
.../operator/TsBlockWithPositionComparator.java | 26 +
.../process/AbstractConsumeAllOperator.java | 192 ++
.../operator/process/AbstractFillOperator.java | 128 ++
.../process/AbstractLinearFillOperator.java | 275 +++
.../operator/process/AbstractSortOperator.java | 369 ++++
.../process/AggregationMergeSortOperator.java | 304 +++
.../operator/process/AssignUniqueIdOperator.java | 141 ++
.../operator/process/CollectOperator.java | 140 ++
.../operator/process/EnforceSingleRowOperator.java | 123 ++
.../operator/process/FilterAndProjectOperator.java | 443 ++++
.../execution/operator/process/LimitOperator.java | 116 +
.../operator/process/MappingCollectOperator.java | 81 +
.../operator/process/MergeSortOperator.java | 272 +++
.../execution/operator/process/OffsetOperator.java | 117 +
.../process/PatternRecognitionOperator.java | 460 ++++
.../process/PreviousFillWithGroupOperator.java | 213 ++
.../operator/process/ProcessOperator.java | 24 +
.../execution/operator/process/SortOperator.java | 87 +
.../operator/process/TableFillOperator.java | 56 +
.../operator/process/TableLinearFillOperator.java | 72 +
.../process/TableLinearFillWithGroupOperator.java | 171 ++
.../operator/process/TableMergeSortOperator.java | 56 +
.../operator/process/TableSortOperator.java | 63 +
.../operator/process/TableStreamSortOperator.java | 220 ++
.../operator/process/TableTopKOperator.java | 58 +
.../execution/operator/process/TopKOperator.java | 427 ++++
.../execution/operator/process/ValuesOperator.java | 120 ++
.../execution/operator/process/fill/IFill.java | 29 +
.../operator/process/fill/IFillFilter.java | 30 +
.../operator/process/fill/ILinearFill.java | 65 +
.../filter/AbstractMonthIntervalFillFilter.java | 41 +
.../fill/filter/FixedIntervalFillFilter.java | 39 +
.../fill/filter/MonthIntervalMSFillFilter.java | 45 +
.../fill/filter/MonthIntervalNSFillFilter.java | 51 +
.../fill/filter/MonthIntervalUSFillFilter.java | 52 +
.../process/fill/identity/IdentityFill.java | 37 +
.../process/fill/identity/IdentityLinearFill.java | 50 +
.../operator/process/fill/linear/LinearFill.java | 257 +++
.../process/function/PartitionRecognizer.java | 207 ++
.../function/TableFunctionLeafOperator.java | 140 ++
.../process/function/TableFunctionOperator.java | 297 +++
.../process/function/partition/PartitionCache.java | 122 ++
.../process/function/partition/PartitionState.java | 62 +
.../operator/process/function/partition/Slice.java | 256 +++
.../process/gapfill/AbstractGapFillOperator.java | 241 +++
.../gapfill/AbstractGapFillWGroupOperator.java | 62 +
.../gapfill/AbstractGapFillWoGroupOperator.java | 52 +
.../process/gapfill/GapFillWGroupWMoOperator.java | 71 +
.../process/gapfill/GapFillWGroupWoMoOperator.java | 68 +
.../process/gapfill/GapFillWoGroupWMoOperator.java | 57 +
.../gapfill/GapFillWoGroupWoMoOperator.java | 53 +
.../join/SimpleNestedLoopCrossJoinOperator.java | 254 +++
.../process/join/merge/MergeSortComparator.java | 122 ++
.../process/join/merge/SortKeyComparator.java | 55 +
.../comparator/AscBinaryTypeJoinKeyComparator.java | 97 +
.../AscBooleanTypeJoinKeyComparator.java | 95 +
.../comparator/AscDoubleTypeJoinKeyComparator.java | 92 +
.../comparator/AscFloatTypeJoinKeyComparator.java | 91 +
.../comparator/AscIntTypeJoinKeyComparator.java | 91 +
.../AscLongTypeIgnoreEqualJoinKeyComparator.java | 95 +
.../comparator/AscLongTypeJoinKeyComparator.java | 91 +
.../DescBinaryTypeJoinKeyComparator.java | 97 +
.../DescBooleanTypeJoinKeyComparator.java | 94 +
.../DescDoubleTypeJoinKeyComparator.java | 92 +
.../comparator/DescFloatTypeJoinKeyComparator.java | 92 +
.../comparator/DescIntTypeJoinKeyComparator.java | 91 +
.../DescLongTypeIgnoreEqualJoinKeyComparator.java | 95 +
.../comparator/DescLongTypeJoinKeyComparator.java | 91 +
.../join/merge/comparator/JoinKeyComparator.java | 63 +
.../merge/comparator/JoinKeyComparatorFactory.java | 94 +
.../process/rowpattern/LogicalIndexNavigation.java | 203 ++
.../rowpattern/PatternAggregationTracker.java | 156 ++
.../process/rowpattern/PatternAggregator.java | 178 ++
.../process/rowpattern/PatternAggregators.java | 74 +
.../rowpattern/PatternPartitionExecutor.java | 427 ++++
.../rowpattern/PatternVariableRecognizer.java | 151 ++
.../rowpattern/PhysicalAggregationPointer.java | 32 +
.../process/rowpattern/PhysicalValueAccessor.java | 22 +
.../process/rowpattern/PhysicalValuePointer.java | 53 +
.../rowpattern/expression/ArithmeticOperator.java | 82 +
.../rowpattern/expression/BinaryComputation.java | 41 +
.../rowpattern/expression/BinaryOperator.java | 31 +
.../rowpattern/expression/CastComputation.java | 82 +
.../rowpattern/expression/ComparisonOperator.java | 167 ++
.../process/rowpattern/expression/Computation.java | 222 ++
.../rowpattern/expression/ConstantComputation.java | 35 +
.../rowpattern/expression/LogicalOperator.java | 55 +
.../rowpattern/expression/NaryComputation.java | 42 +
.../rowpattern/expression/NaryOperator.java | 32 +
.../expression/PatternExpressionComputation.java | 173 ++
.../expression/ReferenceComputation.java | 39 +
.../process/rowpattern/matcher/ArrayView.java | 55 +
.../operator/process/rowpattern/matcher/Done.java | 45 +
.../process/rowpattern/matcher/Instruction.java | 62 +
.../process/rowpattern/matcher/IntList.java | 82 +
.../process/rowpattern/matcher/IntMultimap.java | 112 +
.../process/rowpattern/matcher/IntStack.java | 60 +
.../matcher/IrRowPatternToProgramRewriter.java | 264 +++
.../operator/process/rowpattern/matcher/Jump.java | 60 +
.../process/rowpattern/matcher/MatchEnd.java | 45 +
.../process/rowpattern/matcher/MatchLabel.java | 60 +
.../process/rowpattern/matcher/MatchResult.java | 49 +
.../process/rowpattern/matcher/MatchStart.java | 45 +
.../process/rowpattern/matcher/Matcher.java | 267 +++
.../rowpattern/matcher/PatternCaptures.java | 66 +
.../process/rowpattern/matcher/Program.java | 83 +
.../operator/process/rowpattern/matcher/Save.java | 45 +
.../operator/process/rowpattern/matcher/Split.java | 69 +
.../operator/process/window/RowNumberOperator.java | 214 ++
.../process/window/TableWindowOperator.java | 315 +++
.../process/window/TopKRankingOperator.java | 278 +++
.../process/window/function/WindowFunction.java | 45 +
.../window/function/WindowFunctionFactory.java | 67 +
.../aggregate/AggregationWindowFunction.java | 113 +
.../function/aggregate/WindowAggregator.java | 132 ++
.../window/function/rank/CumeDistFunction.java | 52 +
.../window/function/rank/DenseRankFunction.java | 52 +
.../window/function/rank/NTileFunction.java | 67 +
.../window/function/rank/PercentRankFunction.java | 63 +
.../process/window/function/rank/RankFunction.java | 57 +
.../window/function/rank/RankWindowFunction.java | 66 +
.../window/function/rank/RowNumberFunction.java | 41 +
.../window/function/value/FirstValueFunction.java | 64 +
.../process/window/function/value/LagFunction.java | 121 ++
.../window/function/value/LastValueFunction.java | 64 +
.../window/function/value/LeadFunction.java | 122 ++
.../window/function/value/NthValueFunction.java | 84 +
.../window/function/value/ValueWindowFunction.java | 52 +
.../process/window/partition/Partition.java | 237 ++
.../window/partition/PartitionExecutor.java | 219 ++
.../process/window/partition/frame/Frame.java | 26 +
.../process/window/partition/frame/FrameInfo.java | 203 ++
.../window/partition/frame/GroupsFrame.java | 238 ++
.../process/window/partition/frame/RangeFrame.java | 630 ++++++
.../process/window/partition/frame/RowsFrame.java | 104 +
.../operator/process/window/utils/ColumnList.java | 141 ++
.../operator/process/window/utils/Range.java | 38 +
.../process/window/utils/RowComparator.java | 266 +++
.../AbstractAsofMergeSortJoinOperator.java | 198 ++
.../relational/AbstractMergeSortJoinOperator.java | 606 ++++++
.../relational/AsofMergeSortInnerJoinOperator.java | 127 ++
.../relational/AsofMergeSortLeftJoinOperator.java | 140 ++
.../source/relational/MarkDistinctOperator.java | 166 ++
.../relational/MergeSortFullOuterJoinOperator.java | 255 +++
.../relational/MergeSortInnerJoinOperator.java | 168 ++
.../relational/MergeSortLeftJoinOperator.java | 163 ++
.../relational/MergeSortSemiJoinOperator.java | 228 ++
.../AbstractApproxMostFrequentAccumulator.java | 57 +
.../AbstractApproxPercentileAccumulator.java | 169 ++
.../relational/aggregation/AccumulatorFactory.java | 683 ++++++
.../relational/aggregation/AggregationMask.java | 204 ++
.../aggregation/AggregationOperator.java | 155 ++
.../ApproxCountDistinctAccumulator.java | 269 +++
.../aggregation/ApproxPercentileAccumulator.java | 119 +
.../ApproxPercentileWithWeightAccumulator.java | 175 ++
.../relational/aggregation/AvgAccumulator.java | 338 +++
.../BinaryApproxMostFrequentAccumulator.java | 130 ++
.../BlobApproxMostFrequentAccumulator.java | 39 +
.../BooleanApproxMostFrequentAccumulator.java | 129 ++
.../relational/aggregation/CountAccumulator.java | 126 ++
.../aggregation/CountAllAccumulator.java | 97 +
.../relational/aggregation/CountIfAccumulator.java | 113 +
.../DoubleApproxMostFrequentAccumulator.java | 129 ++
.../relational/aggregation/ExtremeAccumulator.java | 363 ++++
.../relational/aggregation/FirstAccumulator.java | 564 +++++
.../relational/aggregation/FirstByAccumulator.java | 625 ++++++
.../aggregation/FirstByDescAccumulator.java | 191 ++
.../aggregation/FirstDescAccumulator.java | 172 ++
.../FloatApproxMostFrequentAccumulator.java | 129 ++
.../IntApproxMostFrequentAccumulator.java | 129 ++
.../relational/aggregation/LastAccumulator.java | 538 +++++
.../relational/aggregation/LastByAccumulator.java | 608 ++++++
.../aggregation/LastByDescAccumulator.java | 244 +++
.../aggregation/LastDescAccumulator.java | 197 ++
.../LongApproxMostFrequentAccumulator.java | 128 ++
.../aggregation/MaskedRecordIterator.java | 40 +
.../relational/aggregation/MaxAccumulator.java | 420 ++++
.../relational/aggregation/MinAccumulator.java | 420 ++++
.../relational/aggregation/RecordIterator.java | 201 ++
.../relational/aggregation/SumAccumulator.java | 301 +++
.../relational/aggregation/TableAccumulator.java | 64 +
.../relational/aggregation/TableAggregator.java | 147 ++
.../aggregation/TableMaxByAccumulator.java | 73 +
.../aggregation/TableMaxMinByBaseAccumulator.java | 532 +++++
.../aggregation/TableMinByAccumulator.java | 73 +
.../aggregation/TableModeAccumulator.java | 751 +++++++
.../aggregation/TableVarianceAccumulator.java | 410 ++++
.../UserDefinedAggregateFunctionAccumulator.java | 153 ++
.../source/relational/aggregation/Utils.java | 137 ++
.../ApproxMostFrequentBucketDeserializer.java | 21 +
.../ApproxMostFrequentBucketSerializer.java | 21 +
.../aggregation/approximate/Counter.java | 71 +
.../aggregation/approximate/DoublyLinkedList.java | 173 ++
.../approximate/ExternalizableUtil.java | 31 +
.../aggregation/approximate/HyperLogLog.java | 247 +++
.../approximate/HyperLogLogStateFactory.java | 88 +
.../relational/aggregation/approximate/ITopK.java | 43 +
.../aggregation/approximate/ListNode2.java | 42 +
.../relational/aggregation/approximate/Pair.java | 56 +
.../aggregation/approximate/SpaceSaving.java | 147 ++
.../approximate/SpaceSavingByteCalculator.java | 21 +
.../approximate/SpaceSavingStateFactory.java | 90 +
.../aggregation/approximate/StreamSummary.java | 294 +++
.../aggregation/approximate/TDigest.java | 915 ++++++++
...stractGroupedApproxMostFrequentAccumulator.java | 67 +
...AbstractGroupedApproxPercentileAccumulator.java | 154 ++
...BinaryGroupedApproxMostFrequentAccumulator.java | 105 +
.../BlobGroupedApproxMostFrequentAccumulator.java | 40 +
...ooleanGroupedApproxMostFrequentAccumulator.java | 104 +
...DoubleGroupedApproxMostFrequentAccumulator.java | 104 +
.../FloatGroupedApproxMostFrequentAccumulator.java | 104 +
.../aggregation/grouped/GroupedAccumulator.java | 52 +
.../aggregation/grouped/GroupedAggregator.java | 114 +
.../GroupedApproxCountDistinctAccumulator.java | 315 +++
.../GroupedApproxPercentileAccumulator.java | 144 ++
...oupedApproxPercentileWithWeightAccumulator.java | 198 ++
.../aggregation/grouped/GroupedAvgAccumulator.java | 248 +++
.../grouped/GroupedCountAccumulator.java | 92 +
.../grouped/GroupedCountAllAccumulator.java | 87 +
.../grouped/GroupedCountIfAccumulator.java | 93 +
.../grouped/GroupedExtremeAccumulator.java | 412 ++++
.../grouped/GroupedFirstAccumulator.java | 654 ++++++
.../grouped/GroupedFirstByAccumulator.java | 731 +++++++
.../grouped/GroupedLastAccumulator.java | 654 ++++++
.../grouped/GroupedLastByAccumulator.java | 729 +++++++
.../aggregation/grouped/GroupedMaxAccumulator.java | 505 +++++
.../grouped/GroupedMaxByAccumulator.java | 60 +
.../grouped/GroupedMaxMinByBaseAccumulator.java | 866 ++++++++
.../aggregation/grouped/GroupedMinAccumulator.java | 505 +++++
.../grouped/GroupedMinByAccumulator.java | 60 +
.../grouped/GroupedModeAccumulator.java | 600 ++++++
.../aggregation/grouped/GroupedSumAccumulator.java | 213 ++
.../GroupedUserDefinedAggregateAccumulator.java | 161 ++
.../grouped/GroupedVarianceAccumulator.java | 325 +++
.../grouped/HashAggregationOperator.java | 225 ++
.../IntGroupedApproxMostFrequentAccumulator.java | 104 +
.../LongGroupedApproxMostFrequentAccumulator.java | 104 +
.../grouped/StreamingAggregationOperator.java | 288 +++
.../grouped/StreamingHashAggregationOperator.java | 354 +++
.../aggregation/grouped/array/BigArrays.java | 62 +
.../aggregation/grouped/array/BinaryBigArray.java | 82 +
.../aggregation/grouped/array/BooleanBigArray.java | 166 ++
.../aggregation/grouped/array/ByteBigArray.java | 162 ++
.../aggregation/grouped/array/DoubleBigArray.java | 175 ++
.../aggregation/grouped/array/FloatBigArray.java | 175 ++
.../grouped/array/HyperLogLogBigArray.java | 84 +
.../grouped/array/IntArrayFIFOQueue.java | 201 ++
.../aggregation/grouped/array/IntBigArray.java | 192 ++
.../aggregation/grouped/array/IntBigArrays.java | 194 ++
.../aggregation/grouped/array/IntComparator.java | 33 +
.../aggregation/grouped/array/LongBigArray.java | 196 ++
.../grouped/array/LongBigArrayFIFOQueue.java | 197 ++
.../aggregation/grouped/array/MapBigArray.java | 94 +
.../aggregation/grouped/array/ObjectBigArray.java | 189 ++
.../aggregation/grouped/array/ShortBigArray.java | 186 ++
.../grouped/array/SpaceSavingBigArray.java | 93 +
.../aggregation/grouped/array/TDigestBigArray.java | 75 +
.../grouped/builder/HashAggregationBuilder.java | 41 +
.../builder/InMemoryHashAggregationBuilder.java | 275 +++
.../relational/ColumnTransformerBuilder.java | 1974 +++++++++++++++++
.../iotdb/calc/metric/QueryExecutionMetricSet.java | 224 ++
.../calc/plan/planner/CommonOperatorUtils.java | 184 ++
.../planner/ITableOperatorGeneratorContext.java | 30 +
.../calc/plan/planner/TableOperatorGenerator.java | 2280 ++++++++++++++++++++
.../planner/memory/MemoryReservationManager.java | 75 +
.../relational/metadata/CommonMetadataUtils.java | 185 ++
.../plan/relational/metadata/ITypeMetadata.java | 29 +
.../planner/CastToBlobLiteralVisitor.java | 90 +
.../planner/CastToBooleanLiteralVisitor.java | 88 +
.../planner/CastToDateLiteralVisitor.java | 90 +
.../planner/CastToDoubleLiteralVisitor.java | 88 +
.../planner/CastToFloatLiteralVisitor.java | 88 +
.../planner/CastToInt32LiteralVisitor.java | 88 +
.../planner/CastToInt64LiteralVisitor.java | 88 +
.../planner/CastToStringLiteralVisitor.java | 95 +
.../planner/CastToTimestampLiteralVisitor.java | 97 +
.../ir/GlobalTimePredicateExtractVisitor.java | 308 +++
.../plan/relational/utils/matching/Capture.java | 43 +
.../plan/relational/utils/matching/Captures.java | 86 +
.../relational/utils/matching/DefaultPrinter.java | 77 +
.../calc/plan/relational/utils/matching/Match.java | 66 +
.../plan/relational/utils/matching/Pattern.java | 120 ++
.../relational/utils/matching/PatternVisitor.java | 46 +
.../plan/relational/utils/matching/Property.java | 89 +
.../relational/utils/matching/PropertyPattern.java | 51 +
.../utils/matching/pattern/CapturePattern.java | 53 +
.../utils/matching/pattern/EqualsPattern.java | 53 +
.../utils/matching/pattern/FilterPattern.java | 55 +
.../utils/matching/pattern/TypeOfPattern.java | 59 +
.../utils/matching/pattern/WithPattern.java | 65 +
.../AbstractTemporaryQueryDataFileService.java | 149 ++
.../ITemporaryQueryDataFileServiceProvider.java | 25 +
.../dag/adapter/PointCollectorAdaptor.java | 97 +
.../AbstractCaseWhenThenColumnTransformer.java | 233 ++
.../transformation/dag/column/ColumnCache.java | 62 +
.../dag/column/ColumnTransformer.java | 118 +
.../dag/column/FailFunctionColumnTransformer.java | 62 +
.../column/TableCaseWhenThenColumnTransformer.java | 43 +
.../column/TreeCaseWhenThenColumnTransformer.java | 64 +
.../ArithmeticAdditionColumnTransformer.java | 36 +
.../binary/ArithmeticBinaryColumnTransformer.java | 78 +
.../ArithmeticDivisionColumnTransformer.java | 36 +
.../binary/ArithmeticModuloColumnTransformer.java | 36 +
.../ArithmeticMultiplicationColumnTransformer.java | 37 +
.../ArithmeticSubtractionColumnTransformer.java | 36 +
.../dag/column/binary/BinaryColumnTransformer.java | 98 +
.../binary/CompareBinaryColumnTransformer.java | 127 ++
.../binary/CompareEqualToColumnTransformer.java | 48 +
.../CompareGreaterEqualColumnTransformer.java | 36 +
.../CompareGreaterThanColumnTransformer.java | 36 +
.../binary/CompareLessEqualColumnTransformer.java | 36 +
.../binary/CompareLessThanColumnTransformer.java | 36 +
.../binary/CompareNonEqualColumnTransformer.java | 48 +
.../dag/column/binary/HmacColumnTransformer.java | 108 +
.../dag/column/binary/Like2ColumnTransformer.java | 92 +
.../column/binary/LogicAndColumnTransformer.java | 125 ++
.../binary/LogicBinaryColumnTransformer.java | 42 +
.../column/binary/LogicOrColumnTransformer.java | 126 ++
.../binary/factory/HmacStrategiesFactory.java | 93 +
.../dag/column/binary/strategies/HmacStrategy.java | 25 +
.../dag/column/leaf/ConstantColumnTransformer.java | 54 +
.../dag/column/leaf/IdentityColumnTransformer.java | 58 +
.../dag/column/leaf/LeafColumnTransformer.java | 42 +
.../dag/column/leaf/NullColumnTransformer.java | 41 +
.../dag/column/leaf/TimeColumnTransformer.java | 51 +
.../AbstractGreatestLeastColumnTransformer.java | 109 +
.../multi/BinaryGreatestColumnTransformer.java | 53 +
.../column/multi/BinaryLeastColumnTransformer.java | 53 +
.../multi/BooleanGreatestColumnTransformer.java | 52 +
.../multi/BooleanLeastColumnTransformer.java | 49 +
.../column/multi/CoalesceColumnTransformer.java | 74 +
.../multi/DoubleGreatestColumnTransformer.java | 52 +
.../column/multi/DoubleLeastColumnTransformer.java | 52 +
.../multi/FloatGreatestColumnTransformer.java | 52 +
.../column/multi/FloatLeastColumnTransformer.java | 52 +
.../multi/InBinaryMultiColumnTransformer.java | 59 +
.../multi/InBooleanMultiColumnTransformer.java | 58 +
.../multi/InDoubleMultiColumnTransformer.java | 58 +
.../multi/InFloatMultiColumnTransformer.java | 58 +
.../multi/InInt32MultiColumnTransformer.java | 58 +
.../multi/InInt64MultiColumnTransformer.java | 58 +
.../dag/column/multi/InMultiColumnTransformer.java | 66 +
.../multi/Int32GreatestColumnTransformer.java | 52 +
.../column/multi/Int32LeastColumnTransformer.java | 52 +
.../multi/Int64GreatestColumnTransformer.java | 52 +
.../column/multi/Int64LeastColumnTransformer.java | 52 +
.../multi/LogicalAndMultiColumnTransformer.java | 122 ++
.../multi/LogicalMultiColumnTransformer.java | 44 +
.../multi/LogicalOrMultiColumnTransformer.java | 122 ++
.../column/multi/MappableUDFColumnTransformer.java | 99 +
.../dag/column/multi/MultiColumnTransformer.java | 99 +
.../column/ternary/BetweenColumnTransformer.java | 123 ++
.../ternary/CompareTernaryColumnTransformer.java | 39 +
.../dag/column/ternary/Like3ColumnTransformer.java | 105 +
.../dag/column/ternary/LpadColumnTransformer.java | 92 +
.../dag/column/ternary/RpadColumnTransformer.java | 92 +
.../column/ternary/TernaryColumnTransformer.java | 113 +
.../dag/column/ternary/utils/BytePaddingUtils.java | 87 +
.../udf/UserDefineScalarFunctionTransformer.java | 108 +
.../unary/ArithmeticNegationColumnTransformer.java | 65 +
.../dag/column/unary/InColumnTransformer.java | 269 +++
.../dag/column/unary/IsNullColumnTransformer.java | 55 +
.../dag/column/unary/LikeColumnTransformer.java | 74 +
.../column/unary/LogicNotColumnTransformer.java | 65 +
.../dag/column/unary/RegularColumnTransformer.java | 87 +
.../dag/column/unary/UnaryColumnTransformer.java | 75 +
.../column/unary/scalar/AbsColumnTransformer.java | 71 +
.../scalar/AbstractBitwise2ColumnTransformer.java | 71 +
.../scalar/AbstractBitwiseColumnTransformer.java | 62 +
.../AbstractCastFunctionColumnTransformer.java | 406 ++++
.../scalar/AbstractLengthColumnTransformer.java | 60 +
.../column/unary/scalar/AcosColumnTransformer.java | 68 +
.../column/unary/scalar/AsinColumnTransformer.java | 68 +
.../column/unary/scalar/AtanColumnTransformer.java | 68 +
.../unary/scalar/BitCount2ColumnTransformer.java | 76 +
.../unary/scalar/BitCountColumnTransformer.java | 68 +
.../unary/scalar/BitwiseAnd2ColumnTransformer.java | 44 +
.../unary/scalar/BitwiseAndColumnTransformer.java | 42 +
.../scalar/BitwiseLeftShift2ColumnTransformer.java | 60 +
.../scalar/BitwiseLeftShiftColumnTransformer.java | 47 +
.../unary/scalar/BitwiseNotColumnTransformer.java | 63 +
.../unary/scalar/BitwiseOr2ColumnTransformer.java | 44 +
.../unary/scalar/BitwiseOrColumnTransformer.java | 42 +
.../BitwiseRightShift2ColumnTransformer.java | 60 +
...wiseRightShiftArithmetic2ColumnTransformer.java | 65 +
...twiseRightShiftArithmeticColumnTransformer.java | 49 +
.../scalar/BitwiseRightShiftColumnTransformer.java | 47 +
.../unary/scalar/BitwiseXor2ColumnTransformer.java | 44 +
.../unary/scalar/BitwiseXorColumnTransformer.java | 42 +
.../unary/scalar/BlobLengthColumnTransformer.java | 37 +
.../scalar/BytesToDoubleColumnTransformer.java | 78 +
.../scalar/BytesToFloatColumnTransformer.java | 79 +
.../unary/scalar/BytesToIntColumnTransformer.java | 81 +
.../unary/scalar/BytesToLongColumnTransformer.java | 80 +
.../dag/column/unary/scalar/CRC32Transformer.java | 61 +
.../scalar/CastFunctionColumnTransformer.java | 79 +
.../column/unary/scalar/CeilColumnTransformer.java | 68 +
.../unary/scalar/Concat2ColumnTransformer.java | 81 +
.../unary/scalar/ConcatColumnTransformer.java | 81 +
.../unary/scalar/ConcatMultiColumnTransformer.java | 90 +
.../column/unary/scalar/CosColumnTransformer.java | 68 +
.../column/unary/scalar/CoshColumnTransformer.java | 68 +
.../scalar/DateBinFunctionColumnTransformer.java | 231 ++
.../unary/scalar/DegreesColumnTransformer.java | 68 +
.../column/unary/scalar/DiffColumnTransformer.java | 86 +
.../scalar/DiffFunctionColumnTransformer.java | 92 +
.../scalar/DoubleToBytesColumnTransformer.java | 61 +
.../unary/scalar/EndsWith2ColumnTransformer.java | 75 +
.../unary/scalar/EndsWithColumnTransformer.java | 65 +
.../column/unary/scalar/ExpColumnTransformer.java | 68 +
.../column/unary/scalar/ExtractTransformer.java | 106 +
.../scalar/FloatToBytesColumnTransformer.java | 61 +
.../unary/scalar/FloorColumnTransformer.java | 68 +
.../unary/scalar/FormatColumnTransformer.java | 117 +
.../scalar/GenericCodecColumnTransformer.java | 92 +
.../scalar/HmacConstantKeyColumnTransformer.java | 68 +
.../unary/scalar/IntToBytesColumnTransformer.java | 62 +
.../unary/scalar/LTrim2ColumnTransformer.java | 74 +
.../unary/scalar/LTrimColumnTransformer.java | 82 +
.../unary/scalar/LengthColumnTransformer.java | 37 +
.../column/unary/scalar/LnColumnTransformer.java | 68 +
.../unary/scalar/Log10ColumnTransformer.java | 68 +
.../unary/scalar/LongToBytesColumnTransformer.java | 60 +
.../unary/scalar/LowerColumnTransformer.java | 59 +
.../scalar/ObjectLengthColumnTransformer.java | 37 +
.../unary/scalar/RTrim2ColumnTransformer.java | 74 +
.../unary/scalar/RTrimColumnTransformer.java | 82 +
.../unary/scalar/RadiansColumnTransformer.java | 68 +
.../unary/scalar/RegexpLike2ColumnTransformer.java | 72 +
.../unary/scalar/RegexpLikeColumnTransformer.java | 64 +
.../unary/scalar/Replace2ColumnTransformer.java | 94 +
.../unary/scalar/Replace3ColumnTransformer.java | 110 +
.../scalar/ReplaceFunctionColumnTransformer.java | 77 +
.../unary/scalar/RoundColumnTransformer.java | 105 +
.../scalar/RoundFunctionColumnTransformer.java | 94 +
.../column/unary/scalar/SignColumnTransformer.java | 68 +
.../column/unary/scalar/SinColumnTransformer.java | 68 +
.../column/unary/scalar/SinhColumnTransformer.java | 68 +
.../column/unary/scalar/SqrtColumnTransformer.java | 68 +
.../unary/scalar/StartsWith2ColumnTransformer.java | 73 +
.../unary/scalar/StartsWithColumnTransformer.java | 73 +
.../unary/scalar/Strcmp2ColumnTransformer.java | 72 +
.../unary/scalar/StrcmpColumnTransformer.java | 62 +
.../unary/scalar/Strpos2ColumnTransformer.java | 72 +
.../unary/scalar/StrposColumnTransformer.java | 62 +
.../unary/scalar/SubString2ColumnTransformer.java | 86 +
.../unary/scalar/SubString3ColumnTransformer.java | 129 ++
.../unary/scalar/SubStringColumnTransformer.java | 92 +
.../column/unary/scalar/TanColumnTransformer.java | 68 +
.../column/unary/scalar/TanhColumnTransformer.java | 68 +
.../unary/scalar/Trim2ColumnTransformer.java | 74 +
.../column/unary/scalar/TrimColumnTransformer.java | 94 +
.../scalar/TryCastFunctionColumnTransformer.java | 85 +
.../unary/scalar/UpperColumnTransformer.java | 60 +
.../scalar/factory/CodecStrategiesFactory.java | 133 ++
.../factory/NumericCodecStrategiesFactory.java | 169 ++
.../unary/scalar/inteface/CodecStrategy.java | 27 +
.../dag/column/unary/scalar/util/HexUtils.java | 86 +
.../unary/scalar/util/SpookyHashV2Utils.java | 603 ++++++
.../unary/scalar/util/TransformerDebugUtils.java | 62 +
.../dag/udf/UDFParametersFactory.java | 55 +
.../calc/transformation/dag/udf/UDTFExecutor.java | 300 +++
.../calc/transformation/dag/util/BitwiseUtils.java | 210 ++
.../transformation/dag/util/CastFunctionUtils.java | 349 +++
.../dag/util/CommonTransformUtils.java | 46 +
.../transformation/dag/util/InputRowUtils.java | 67 +
.../calc/transformation/datastructure/Cache.java | 68 +
.../datastructure/SerializableList.java | 167 ++
.../iterator/ListForwardIterator.java | 28 +
.../iterator/RowListForwardIterator.java | 100 +
.../iterator/TVListForwardIterator.java | 108 +
.../row/ElasticSerializableRowList.java | 485 +++++
.../datastructure/row/SerializableRowList.java | 374 ++++
.../tv/ElasticSerializableBinaryTVList.java | 205 ++
.../tv/ElasticSerializableTVList.java | 287 +++
.../datastructure/tv/SerializableTVList.java | 402 ++++
.../datastructure/util/BinaryUtils.java | 48 +
.../org/apache/iotdb/calc/utils/HeapTraversal.java | 64 +
.../iotdb/calc/utils/IObjectFileService.java | 38 +
.../calc/utils/IObjectFileServiceProvider.java | 25 +
.../org/apache/iotdb/calc/utils/IObjectPath.java | 65 +
.../apache/iotdb/calc/utils/ObjectTypeUtils.java | 178 ++
.../iotdb/calc/utils/constant/SqlConstant.java | 125 ++
.../calc/utils/datastructure/MergeSortHeap.java | 117 +
.../calc/utils/datastructure/MergeSortKey.java | 45 +
.../iotdb/calc/utils/datastructure/SortKey.java | 33 +
.../apache/iotdb/calc/utils/sort/DiskSpiller.java | 184 ++
.../iotdb/calc/utils/sort/FileSpillerReader.java | 155 ++
.../apache/iotdb/calc/utils/sort/MemoryReader.java | 61 +
.../iotdb/calc/utils/sort/SortBufferManager.java | 88 +
.../apache/iotdb/calc/utils/sort/SortReader.java | 51 +
.../iotdb/calc/utils/sort/TableDiskSpiller.java | 48 +
.../iotdb/calc/utils/sort/TreeDiskSpiller.java | 44 +
.../exception/MemoryNotEnoughException.java | 31 -
.../exception/QueryProcessException.java | 45 -
.../execution/aggregation/Accumulator.java | 97 -
.../execution/aggregation/VarianceAccumulator.java | 282 ---
.../execution/operator/AbstractOperator.java | 110 -
.../execution/operator/CommonOperatorContext.java | 149 --
.../execution/operator/GroupedTopNBuilder.java | 32 -
.../operator/GroupedTopNRowNumberAccumulator.java | 483 -----
.../operator/GroupedTopNRowNumberBuilder.java | 192 --
.../execution/operator/IdRegistry.java | 76 -
.../calc_commons/execution/operator/Operator.java | 134 --
.../operator/RowIdComparisonStrategy.java | 24 -
.../execution/operator/RowIdHashStrategy.java | 27 -
.../execution/operator/RowReference.java | 45 -
.../operator/RowReferenceTsBlockManager.java | 386 ----
.../SimpleTsBlockWithPositionComparator.java | 52 -
.../operator/TsBlockWithPositionComparator.java | 26 -
.../process/AbstractConsumeAllOperator.java | 192 --
.../operator/process/AbstractFillOperator.java | 128 --
.../process/AbstractLinearFillOperator.java | 275 ---
.../operator/process/AbstractSortOperator.java | 369 ----
.../process/AggregationMergeSortOperator.java | 304 ---
.../operator/process/AssignUniqueIdOperator.java | 141 --
.../operator/process/CollectOperator.java | 140 --
.../operator/process/EnforceSingleRowOperator.java | 123 --
.../operator/process/FilterAndProjectOperator.java | 443 ----
.../execution/operator/process/LimitOperator.java | 116 -
.../operator/process/MappingCollectOperator.java | 81 -
.../operator/process/MergeSortOperator.java | 272 ---
.../execution/operator/process/OffsetOperator.java | 117 -
.../process/PatternRecognitionOperator.java | 460 ----
.../process/PreviousFillWithGroupOperator.java | 213 --
.../operator/process/ProcessOperator.java | 24 -
.../execution/operator/process/SortOperator.java | 87 -
.../operator/process/TableFillOperator.java | 56 -
.../operator/process/TableLinearFillOperator.java | 72 -
.../process/TableLinearFillWithGroupOperator.java | 171 --
.../operator/process/TableMergeSortOperator.java | 56 -
.../operator/process/TableSortOperator.java | 63 -
.../operator/process/TableStreamSortOperator.java | 220 --
.../operator/process/TableTopKOperator.java | 58 -
.../execution/operator/process/TopKOperator.java | 427 ----
.../execution/operator/process/ValuesOperator.java | 120 --
.../execution/operator/process/fill/IFill.java | 29 -
.../operator/process/fill/IFillFilter.java | 30 -
.../operator/process/fill/ILinearFill.java | 65 -
.../filter/AbstractMonthIntervalFillFilter.java | 41 -
.../fill/filter/FixedIntervalFillFilter.java | 39 -
.../fill/filter/MonthIntervalMSFillFilter.java | 45 -
.../fill/filter/MonthIntervalNSFillFilter.java | 51 -
.../fill/filter/MonthIntervalUSFillFilter.java | 52 -
.../process/fill/identity/IdentityFill.java | 37 -
.../process/fill/identity/IdentityLinearFill.java | 50 -
.../operator/process/fill/linear/LinearFill.java | 257 ---
.../process/function/PartitionRecognizer.java | 207 --
.../function/TableFunctionLeafOperator.java | 140 --
.../process/function/TableFunctionOperator.java | 297 ---
.../process/function/partition/PartitionCache.java | 122 --
.../process/function/partition/PartitionState.java | 62 -
.../operator/process/function/partition/Slice.java | 256 ---
.../process/gapfill/AbstractGapFillOperator.java | 241 ---
.../gapfill/AbstractGapFillWGroupOperator.java | 62 -
.../gapfill/AbstractGapFillWoGroupOperator.java | 52 -
.../process/gapfill/GapFillWGroupWMoOperator.java | 71 -
.../process/gapfill/GapFillWGroupWoMoOperator.java | 68 -
.../process/gapfill/GapFillWoGroupWMoOperator.java | 57 -
.../gapfill/GapFillWoGroupWoMoOperator.java | 53 -
.../join/SimpleNestedLoopCrossJoinOperator.java | 254 ---
.../process/join/merge/MergeSortComparator.java | 122 --
.../process/join/merge/SortKeyComparator.java | 55 -
.../comparator/AscBinaryTypeJoinKeyComparator.java | 97 -
.../AscBooleanTypeJoinKeyComparator.java | 95 -
.../comparator/AscDoubleTypeJoinKeyComparator.java | 92 -
.../comparator/AscFloatTypeJoinKeyComparator.java | 91 -
.../comparator/AscIntTypeJoinKeyComparator.java | 91 -
.../AscLongTypeIgnoreEqualJoinKeyComparator.java | 95 -
.../comparator/AscLongTypeJoinKeyComparator.java | 91 -
.../DescBinaryTypeJoinKeyComparator.java | 97 -
.../DescBooleanTypeJoinKeyComparator.java | 94 -
.../DescDoubleTypeJoinKeyComparator.java | 92 -
.../comparator/DescFloatTypeJoinKeyComparator.java | 92 -
.../comparator/DescIntTypeJoinKeyComparator.java | 91 -
.../DescLongTypeIgnoreEqualJoinKeyComparator.java | 95 -
.../comparator/DescLongTypeJoinKeyComparator.java | 91 -
.../join/merge/comparator/JoinKeyComparator.java | 63 -
.../merge/comparator/JoinKeyComparatorFactory.java | 94 -
.../process/rowpattern/LogicalIndexNavigation.java | 203 --
.../rowpattern/PatternAggregationTracker.java | 156 --
.../process/rowpattern/PatternAggregator.java | 178 --
.../process/rowpattern/PatternAggregators.java | 74 -
.../rowpattern/PatternPartitionExecutor.java | 427 ----
.../rowpattern/PatternVariableRecognizer.java | 151 --
.../rowpattern/PhysicalAggregationPointer.java | 32 -
.../process/rowpattern/PhysicalValueAccessor.java | 22 -
.../process/rowpattern/PhysicalValuePointer.java | 53 -
.../rowpattern/expression/ArithmeticOperator.java | 82 -
.../rowpattern/expression/BinaryComputation.java | 41 -
.../rowpattern/expression/BinaryOperator.java | 31 -
.../rowpattern/expression/CastComputation.java | 82 -
.../rowpattern/expression/ComparisonOperator.java | 167 --
.../process/rowpattern/expression/Computation.java | 222 --
.../rowpattern/expression/ConstantComputation.java | 35 -
.../rowpattern/expression/LogicalOperator.java | 55 -
.../rowpattern/expression/NaryComputation.java | 42 -
.../rowpattern/expression/NaryOperator.java | 32 -
.../expression/PatternExpressionComputation.java | 173 --
.../expression/ReferenceComputation.java | 39 -
.../process/rowpattern/matcher/ArrayView.java | 55 -
.../operator/process/rowpattern/matcher/Done.java | 45 -
.../process/rowpattern/matcher/Instruction.java | 62 -
.../process/rowpattern/matcher/IntList.java | 82 -
.../process/rowpattern/matcher/IntMultimap.java | 112 -
.../process/rowpattern/matcher/IntStack.java | 60 -
.../matcher/IrRowPatternToProgramRewriter.java | 264 ---
.../operator/process/rowpattern/matcher/Jump.java | 60 -
.../process/rowpattern/matcher/MatchEnd.java | 45 -
.../process/rowpattern/matcher/MatchLabel.java | 60 -
.../process/rowpattern/matcher/MatchResult.java | 49 -
.../process/rowpattern/matcher/MatchStart.java | 45 -
.../process/rowpattern/matcher/Matcher.java | 267 ---
.../rowpattern/matcher/PatternCaptures.java | 66 -
.../process/rowpattern/matcher/Program.java | 83 -
.../operator/process/rowpattern/matcher/Save.java | 45 -
.../operator/process/rowpattern/matcher/Split.java | 69 -
.../operator/process/window/RowNumberOperator.java | 214 --
.../process/window/TableWindowOperator.java | 315 ---
.../process/window/TopKRankingOperator.java | 278 ---
.../process/window/function/WindowFunction.java | 45 -
.../window/function/WindowFunctionFactory.java | 67 -
.../aggregate/AggregationWindowFunction.java | 113 -
.../function/aggregate/WindowAggregator.java | 132 --
.../window/function/rank/CumeDistFunction.java | 52 -
.../window/function/rank/DenseRankFunction.java | 52 -
.../window/function/rank/NTileFunction.java | 67 -
.../window/function/rank/PercentRankFunction.java | 63 -
.../process/window/function/rank/RankFunction.java | 57 -
.../window/function/rank/RankWindowFunction.java | 66 -
.../window/function/rank/RowNumberFunction.java | 41 -
.../window/function/value/FirstValueFunction.java | 64 -
.../process/window/function/value/LagFunction.java | 121 --
.../window/function/value/LastValueFunction.java | 64 -
.../window/function/value/LeadFunction.java | 122 --
.../window/function/value/NthValueFunction.java | 84 -
.../window/function/value/ValueWindowFunction.java | 52 -
.../process/window/partition/Partition.java | 237 --
.../window/partition/PartitionExecutor.java | 219 --
.../process/window/partition/frame/Frame.java | 26 -
.../process/window/partition/frame/FrameInfo.java | 203 --
.../window/partition/frame/GroupsFrame.java | 238 --
.../process/window/partition/frame/RangeFrame.java | 630 ------
.../process/window/partition/frame/RowsFrame.java | 104 -
.../operator/process/window/utils/ColumnList.java | 141 --
.../operator/process/window/utils/Range.java | 38 -
.../process/window/utils/RowComparator.java | 266 ---
.../AbstractAsofMergeSortJoinOperator.java | 198 --
.../relational/AbstractMergeSortJoinOperator.java | 606 ------
.../relational/AsofMergeSortInnerJoinOperator.java | 127 --
.../relational/AsofMergeSortLeftJoinOperator.java | 140 --
.../source/relational/MarkDistinctOperator.java | 166 --
.../relational/MergeSortFullOuterJoinOperator.java | 255 ---
.../relational/MergeSortInnerJoinOperator.java | 168 --
.../relational/MergeSortLeftJoinOperator.java | 163 --
.../relational/MergeSortSemiJoinOperator.java | 228 --
.../AbstractApproxMostFrequentAccumulator.java | 57 -
.../AbstractApproxPercentileAccumulator.java | 169 --
.../relational/aggregation/AccumulatorFactory.java | 683 ------
.../relational/aggregation/AggregationMask.java | 204 --
.../aggregation/AggregationOperator.java | 155 --
.../ApproxCountDistinctAccumulator.java | 269 ---
.../aggregation/ApproxPercentileAccumulator.java | 119 -
.../ApproxPercentileWithWeightAccumulator.java | 175 --
.../relational/aggregation/AvgAccumulator.java | 338 ---
.../BinaryApproxMostFrequentAccumulator.java | 130 --
.../BlobApproxMostFrequentAccumulator.java | 39 -
.../BooleanApproxMostFrequentAccumulator.java | 129 --
.../relational/aggregation/CountAccumulator.java | 126 --
.../aggregation/CountAllAccumulator.java | 97 -
.../relational/aggregation/CountIfAccumulator.java | 113 -
.../DoubleApproxMostFrequentAccumulator.java | 129 --
.../relational/aggregation/ExtremeAccumulator.java | 363 ----
.../relational/aggregation/FirstAccumulator.java | 564 -----
.../relational/aggregation/FirstByAccumulator.java | 625 ------
.../aggregation/FirstByDescAccumulator.java | 191 --
.../aggregation/FirstDescAccumulator.java | 172 --
.../FloatApproxMostFrequentAccumulator.java | 129 --
.../IntApproxMostFrequentAccumulator.java | 129 --
.../relational/aggregation/LastAccumulator.java | 538 -----
.../relational/aggregation/LastByAccumulator.java | 608 ------
.../aggregation/LastByDescAccumulator.java | 244 ---
.../aggregation/LastDescAccumulator.java | 197 --
.../LongApproxMostFrequentAccumulator.java | 128 --
.../aggregation/MaskedRecordIterator.java | 40 -
.../relational/aggregation/MaxAccumulator.java | 420 ----
.../relational/aggregation/MinAccumulator.java | 420 ----
.../relational/aggregation/RecordIterator.java | 201 --
.../relational/aggregation/SumAccumulator.java | 301 ---
.../relational/aggregation/TableAccumulator.java | 64 -
.../relational/aggregation/TableAggregator.java | 147 --
.../aggregation/TableMaxByAccumulator.java | 73 -
.../aggregation/TableMaxMinByBaseAccumulator.java | 532 -----
.../aggregation/TableMinByAccumulator.java | 73 -
.../aggregation/TableModeAccumulator.java | 751 -------
.../aggregation/TableVarianceAccumulator.java | 410 ----
.../UserDefinedAggregateFunctionAccumulator.java | 153 --
.../source/relational/aggregation/Utils.java | 137 --
.../ApproxMostFrequentBucketDeserializer.java | 21 -
.../ApproxMostFrequentBucketSerializer.java | 21 -
.../aggregation/approximate/Counter.java | 71 -
.../aggregation/approximate/DoublyLinkedList.java | 173 --
.../approximate/ExternalizableUtil.java | 31 -
.../aggregation/approximate/HyperLogLog.java | 247 ---
.../approximate/HyperLogLogStateFactory.java | 88 -
.../relational/aggregation/approximate/ITopK.java | 43 -
.../aggregation/approximate/ListNode2.java | 42 -
.../relational/aggregation/approximate/Pair.java | 56 -
.../aggregation/approximate/SpaceSaving.java | 147 --
.../approximate/SpaceSavingByteCalculator.java | 21 -
.../approximate/SpaceSavingStateFactory.java | 90 -
.../aggregation/approximate/StreamSummary.java | 294 ---
.../aggregation/approximate/TDigest.java | 915 --------
...stractGroupedApproxMostFrequentAccumulator.java | 67 -
...AbstractGroupedApproxPercentileAccumulator.java | 154 --
...BinaryGroupedApproxMostFrequentAccumulator.java | 105 -
.../BlobGroupedApproxMostFrequentAccumulator.java | 40 -
...ooleanGroupedApproxMostFrequentAccumulator.java | 104 -
...DoubleGroupedApproxMostFrequentAccumulator.java | 104 -
.../FloatGroupedApproxMostFrequentAccumulator.java | 104 -
.../aggregation/grouped/GroupedAccumulator.java | 52 -
.../aggregation/grouped/GroupedAggregator.java | 114 -
.../GroupedApproxCountDistinctAccumulator.java | 315 ---
.../GroupedApproxPercentileAccumulator.java | 144 --
...oupedApproxPercentileWithWeightAccumulator.java | 198 --
.../aggregation/grouped/GroupedAvgAccumulator.java | 248 ---
.../grouped/GroupedCountAccumulator.java | 92 -
.../grouped/GroupedCountAllAccumulator.java | 87 -
.../grouped/GroupedCountIfAccumulator.java | 93 -
.../grouped/GroupedExtremeAccumulator.java | 412 ----
.../grouped/GroupedFirstAccumulator.java | 654 ------
.../grouped/GroupedFirstByAccumulator.java | 731 -------
.../grouped/GroupedLastAccumulator.java | 654 ------
.../grouped/GroupedLastByAccumulator.java | 729 -------
.../aggregation/grouped/GroupedMaxAccumulator.java | 505 -----
.../grouped/GroupedMaxByAccumulator.java | 60 -
.../grouped/GroupedMaxMinByBaseAccumulator.java | 866 --------
.../aggregation/grouped/GroupedMinAccumulator.java | 505 -----
.../grouped/GroupedMinByAccumulator.java | 60 -
.../grouped/GroupedModeAccumulator.java | 600 ------
.../aggregation/grouped/GroupedSumAccumulator.java | 213 --
.../GroupedUserDefinedAggregateAccumulator.java | 161 --
.../grouped/GroupedVarianceAccumulator.java | 325 ---
.../grouped/HashAggregationOperator.java | 225 --
.../IntGroupedApproxMostFrequentAccumulator.java | 104 -
.../LongGroupedApproxMostFrequentAccumulator.java | 104 -
.../grouped/StreamingAggregationOperator.java | 288 ---
.../grouped/StreamingHashAggregationOperator.java | 354 ---
.../aggregation/grouped/array/BigArrays.java | 62 -
.../aggregation/grouped/array/BinaryBigArray.java | 82 -
.../aggregation/grouped/array/BooleanBigArray.java | 166 --
.../aggregation/grouped/array/ByteBigArray.java | 162 --
.../aggregation/grouped/array/DoubleBigArray.java | 175 --
.../aggregation/grouped/array/FloatBigArray.java | 175 --
.../grouped/array/HyperLogLogBigArray.java | 84 -
.../grouped/array/IntArrayFIFOQueue.java | 201 --
.../aggregation/grouped/array/IntBigArray.java | 192 --
.../aggregation/grouped/array/IntBigArrays.java | 194 --
.../aggregation/grouped/array/IntComparator.java | 33 -
.../aggregation/grouped/array/LongBigArray.java | 196 --
.../grouped/array/LongBigArrayFIFOQueue.java | 197 --
.../aggregation/grouped/array/MapBigArray.java | 94 -
.../aggregation/grouped/array/ObjectBigArray.java | 189 --
.../aggregation/grouped/array/ShortBigArray.java | 186 --
.../grouped/array/SpaceSavingBigArray.java | 93 -
.../aggregation/grouped/array/TDigestBigArray.java | 75 -
.../grouped/builder/HashAggregationBuilder.java | 41 -
.../builder/InMemoryHashAggregationBuilder.java | 275 ---
.../relational/ColumnTransformerBuilder.java | 1974 -----------------
.../metric/QueryExecutionMetricSet.java | 224 --
.../plan/planner/CommonOperatorUtils.java | 184 --
.../planner/ITableOperatorGeneratorContext.java | 30 -
.../plan/planner/TableOperatorGenerator.java | 2280 --------------------
.../planner/memory/MemoryReservationManager.java | 75 -
.../relational/metadata/CommonMetadataUtils.java | 185 --
.../plan/relational/metadata/ITypeMetadata.java | 29 -
.../planner/CastToBlobLiteralVisitor.java | 90 -
.../planner/CastToBooleanLiteralVisitor.java | 88 -
.../planner/CastToDateLiteralVisitor.java | 90 -
.../planner/CastToDoubleLiteralVisitor.java | 88 -
.../planner/CastToFloatLiteralVisitor.java | 88 -
.../planner/CastToInt32LiteralVisitor.java | 88 -
.../planner/CastToInt64LiteralVisitor.java | 88 -
.../planner/CastToStringLiteralVisitor.java | 95 -
.../planner/CastToTimestampLiteralVisitor.java | 97 -
.../ir/GlobalTimePredicateExtractVisitor.java | 308 ---
.../plan/relational/utils/matching/Capture.java | 43 -
.../plan/relational/utils/matching/Captures.java | 86 -
.../relational/utils/matching/DefaultPrinter.java | 77 -
.../plan/relational/utils/matching/Match.java | 66 -
.../plan/relational/utils/matching/Pattern.java | 120 --
.../relational/utils/matching/PatternVisitor.java | 46 -
.../plan/relational/utils/matching/Property.java | 89 -
.../relational/utils/matching/PropertyPattern.java | 51 -
.../utils/matching/pattern/CapturePattern.java | 53 -
.../utils/matching/pattern/EqualsPattern.java | 53 -
.../utils/matching/pattern/FilterPattern.java | 55 -
.../utils/matching/pattern/TypeOfPattern.java | 59 -
.../utils/matching/pattern/WithPattern.java | 65 -
.../AbstractTemporaryQueryDataFileService.java | 149 --
.../ITemporaryQueryDataFileServiceProvider.java | 25 -
.../dag/adapter/PointCollectorAdaptor.java | 97 -
.../AbstractCaseWhenThenColumnTransformer.java | 233 --
.../transformation/dag/column/ColumnCache.java | 62 -
.../dag/column/ColumnTransformer.java | 118 -
.../dag/column/FailFunctionColumnTransformer.java | 62 -
.../column/TableCaseWhenThenColumnTransformer.java | 43 -
.../column/TreeCaseWhenThenColumnTransformer.java | 64 -
.../ArithmeticAdditionColumnTransformer.java | 36 -
.../binary/ArithmeticBinaryColumnTransformer.java | 78 -
.../ArithmeticDivisionColumnTransformer.java | 36 -
.../binary/ArithmeticModuloColumnTransformer.java | 36 -
.../ArithmeticMultiplicationColumnTransformer.java | 37 -
.../ArithmeticSubtractionColumnTransformer.java | 36 -
.../dag/column/binary/BinaryColumnTransformer.java | 98 -
.../binary/CompareBinaryColumnTransformer.java | 127 --
.../binary/CompareEqualToColumnTransformer.java | 48 -
.../CompareGreaterEqualColumnTransformer.java | 36 -
.../CompareGreaterThanColumnTransformer.java | 36 -
.../binary/CompareLessEqualColumnTransformer.java | 36 -
.../binary/CompareLessThanColumnTransformer.java | 36 -
.../binary/CompareNonEqualColumnTransformer.java | 48 -
.../dag/column/binary/HmacColumnTransformer.java | 108 -
.../dag/column/binary/Like2ColumnTransformer.java | 92 -
.../column/binary/LogicAndColumnTransformer.java | 125 --
.../binary/LogicBinaryColumnTransformer.java | 42 -
.../column/binary/LogicOrColumnTransformer.java | 126 --
.../binary/factory/HmacStrategiesFactory.java | 93 -
.../dag/column/binary/strategies/HmacStrategy.java | 25 -
.../dag/column/leaf/ConstantColumnTransformer.java | 54 -
.../dag/column/leaf/IdentityColumnTransformer.java | 58 -
.../dag/column/leaf/LeafColumnTransformer.java | 42 -
.../dag/column/leaf/NullColumnTransformer.java | 41 -
.../dag/column/leaf/TimeColumnTransformer.java | 51 -
.../AbstractGreatestLeastColumnTransformer.java | 109 -
.../multi/BinaryGreatestColumnTransformer.java | 53 -
.../column/multi/BinaryLeastColumnTransformer.java | 53 -
.../multi/BooleanGreatestColumnTransformer.java | 52 -
.../multi/BooleanLeastColumnTransformer.java | 49 -
.../column/multi/CoalesceColumnTransformer.java | 74 -
.../multi/DoubleGreatestColumnTransformer.java | 52 -
.../column/multi/DoubleLeastColumnTransformer.java | 52 -
.../multi/FloatGreatestColumnTransformer.java | 52 -
.../column/multi/FloatLeastColumnTransformer.java | 52 -
.../multi/InBinaryMultiColumnTransformer.java | 59 -
.../multi/InBooleanMultiColumnTransformer.java | 58 -
.../multi/InDoubleMultiColumnTransformer.java | 58 -
.../multi/InFloatMultiColumnTransformer.java | 58 -
.../multi/InInt32MultiColumnTransformer.java | 58 -
.../multi/InInt64MultiColumnTransformer.java | 58 -
.../dag/column/multi/InMultiColumnTransformer.java | 66 -
.../multi/Int32GreatestColumnTransformer.java | 52 -
.../column/multi/Int32LeastColumnTransformer.java | 52 -
.../multi/Int64GreatestColumnTransformer.java | 52 -
.../column/multi/Int64LeastColumnTransformer.java | 52 -
.../multi/LogicalAndMultiColumnTransformer.java | 122 --
.../multi/LogicalMultiColumnTransformer.java | 44 -
.../multi/LogicalOrMultiColumnTransformer.java | 122 --
.../column/multi/MappableUDFColumnTransformer.java | 99 -
.../dag/column/multi/MultiColumnTransformer.java | 99 -
.../column/ternary/BetweenColumnTransformer.java | 123 --
.../ternary/CompareTernaryColumnTransformer.java | 39 -
.../dag/column/ternary/Like3ColumnTransformer.java | 105 -
.../dag/column/ternary/LpadColumnTransformer.java | 92 -
.../dag/column/ternary/RpadColumnTransformer.java | 92 -
.../column/ternary/TernaryColumnTransformer.java | 113 -
.../dag/column/ternary/utils/BytePaddingUtils.java | 87 -
.../udf/UserDefineScalarFunctionTransformer.java | 108 -
.../unary/ArithmeticNegationColumnTransformer.java | 65 -
.../dag/column/unary/InColumnTransformer.java | 269 ---
.../dag/column/unary/IsNullColumnTransformer.java | 55 -
.../dag/column/unary/LikeColumnTransformer.java | 74 -
.../column/unary/LogicNotColumnTransformer.java | 65 -
.../dag/column/unary/RegularColumnTransformer.java | 87 -
.../dag/column/unary/UnaryColumnTransformer.java | 75 -
.../column/unary/scalar/AbsColumnTransformer.java | 71 -
.../scalar/AbstractBitwise2ColumnTransformer.java | 71 -
.../scalar/AbstractBitwiseColumnTransformer.java | 62 -
.../AbstractCastFunctionColumnTransformer.java | 406 ----
.../scalar/AbstractLengthColumnTransformer.java | 60 -
.../column/unary/scalar/AcosColumnTransformer.java | 68 -
.../column/unary/scalar/AsinColumnTransformer.java | 68 -
.../column/unary/scalar/AtanColumnTransformer.java | 68 -
.../unary/scalar/BitCount2ColumnTransformer.java | 76 -
.../unary/scalar/BitCountColumnTransformer.java | 68 -
.../unary/scalar/BitwiseAnd2ColumnTransformer.java | 44 -
.../unary/scalar/BitwiseAndColumnTransformer.java | 42 -
.../scalar/BitwiseLeftShift2ColumnTransformer.java | 60 -
.../scalar/BitwiseLeftShiftColumnTransformer.java | 47 -
.../unary/scalar/BitwiseNotColumnTransformer.java | 63 -
.../unary/scalar/BitwiseOr2ColumnTransformer.java | 44 -
.../unary/scalar/BitwiseOrColumnTransformer.java | 42 -
.../BitwiseRightShift2ColumnTransformer.java | 60 -
...wiseRightShiftArithmetic2ColumnTransformer.java | 65 -
...twiseRightShiftArithmeticColumnTransformer.java | 49 -
.../scalar/BitwiseRightShiftColumnTransformer.java | 47 -
.../unary/scalar/BitwiseXor2ColumnTransformer.java | 44 -
.../unary/scalar/BitwiseXorColumnTransformer.java | 42 -
.../unary/scalar/BlobLengthColumnTransformer.java | 37 -
.../scalar/BytesToDoubleColumnTransformer.java | 78 -
.../scalar/BytesToFloatColumnTransformer.java | 79 -
.../unary/scalar/BytesToIntColumnTransformer.java | 81 -
.../unary/scalar/BytesToLongColumnTransformer.java | 80 -
.../dag/column/unary/scalar/CRC32Transformer.java | 61 -
.../scalar/CastFunctionColumnTransformer.java | 79 -
.../column/unary/scalar/CeilColumnTransformer.java | 68 -
.../unary/scalar/Concat2ColumnTransformer.java | 81 -
.../unary/scalar/ConcatColumnTransformer.java | 81 -
.../unary/scalar/ConcatMultiColumnTransformer.java | 90 -
.../column/unary/scalar/CosColumnTransformer.java | 68 -
.../column/unary/scalar/CoshColumnTransformer.java | 68 -
.../scalar/DateBinFunctionColumnTransformer.java | 231 --
.../unary/scalar/DegreesColumnTransformer.java | 68 -
.../column/unary/scalar/DiffColumnTransformer.java | 86 -
.../scalar/DiffFunctionColumnTransformer.java | 92 -
.../scalar/DoubleToBytesColumnTransformer.java | 61 -
.../unary/scalar/EndsWith2ColumnTransformer.java | 75 -
.../unary/scalar/EndsWithColumnTransformer.java | 65 -
.../column/unary/scalar/ExpColumnTransformer.java | 68 -
.../column/unary/scalar/ExtractTransformer.java | 106 -
.../scalar/FloatToBytesColumnTransformer.java | 61 -
.../unary/scalar/FloorColumnTransformer.java | 68 -
.../unary/scalar/FormatColumnTransformer.java | 117 -
.../scalar/GenericCodecColumnTransformer.java | 92 -
.../scalar/HmacConstantKeyColumnTransformer.java | 68 -
.../unary/scalar/IntToBytesColumnTransformer.java | 62 -
.../unary/scalar/LTrim2ColumnTransformer.java | 74 -
.../unary/scalar/LTrimColumnTransformer.java | 82 -
.../unary/scalar/LengthColumnTransformer.java | 37 -
.../column/unary/scalar/LnColumnTransformer.java | 68 -
.../unary/scalar/Log10ColumnTransformer.java | 68 -
.../unary/scalar/LongToBytesColumnTransformer.java | 60 -
.../unary/scalar/LowerColumnTransformer.java | 59 -
.../scalar/ObjectLengthColumnTransformer.java | 37 -
.../unary/scalar/RTrim2ColumnTransformer.java | 74 -
.../unary/scalar/RTrimColumnTransformer.java | 82 -
.../unary/scalar/RadiansColumnTransformer.java | 68 -
.../unary/scalar/RegexpLike2ColumnTransformer.java | 72 -
.../unary/scalar/RegexpLikeColumnTransformer.java | 64 -
.../unary/scalar/Replace2ColumnTransformer.java | 94 -
.../unary/scalar/Replace3ColumnTransformer.java | 110 -
.../scalar/ReplaceFunctionColumnTransformer.java | 77 -
.../unary/scalar/RoundColumnTransformer.java | 105 -
.../scalar/RoundFunctionColumnTransformer.java | 94 -
.../column/unary/scalar/SignColumnTransformer.java | 68 -
.../column/unary/scalar/SinColumnTransformer.java | 68 -
.../column/unary/scalar/SinhColumnTransformer.java | 68 -
.../column/unary/scalar/SqrtColumnTransformer.java | 68 -
.../unary/scalar/StartsWith2ColumnTransformer.java | 73 -
.../unary/scalar/StartsWithColumnTransformer.java | 73 -
.../unary/scalar/Strcmp2ColumnTransformer.java | 72 -
.../unary/scalar/StrcmpColumnTransformer.java | 62 -
.../unary/scalar/Strpos2ColumnTransformer.java | 72 -
.../unary/scalar/StrposColumnTransformer.java | 62 -
.../unary/scalar/SubString2ColumnTransformer.java | 86 -
.../unary/scalar/SubString3ColumnTransformer.java | 129 --
.../unary/scalar/SubStringColumnTransformer.java | 92 -
.../column/unary/scalar/TanColumnTransformer.java | 68 -
.../column/unary/scalar/TanhColumnTransformer.java | 68 -
.../unary/scalar/Trim2ColumnTransformer.java | 74 -
.../column/unary/scalar/TrimColumnTransformer.java | 94 -
.../scalar/TryCastFunctionColumnTransformer.java | 85 -
.../unary/scalar/UpperColumnTransformer.java | 60 -
.../scalar/factory/CodecStrategiesFactory.java | 133 --
.../factory/NumericCodecStrategiesFactory.java | 169 --
.../unary/scalar/inteface/CodecStrategy.java | 27 -
.../dag/column/unary/scalar/util/HexUtils.java | 86 -
.../unary/scalar/util/SpookyHashV2Utils.java | 603 ------
.../unary/scalar/util/TransformerDebugUtils.java | 62 -
.../dag/udf/UDFParametersFactory.java | 55 -
.../transformation/dag/udf/UDTFExecutor.java | 300 ---
.../transformation/dag/util/BitwiseUtils.java | 210 --
.../transformation/dag/util/CastFunctionUtils.java | 349 ---
.../dag/util/CommonTransformUtils.java | 46 -
.../transformation/dag/util/InputRowUtils.java | 67 -
.../transformation/datastructure/Cache.java | 68 -
.../datastructure/SerializableList.java | 167 --
.../iterator/ListForwardIterator.java | 28 -
.../iterator/RowListForwardIterator.java | 100 -
.../iterator/TVListForwardIterator.java | 108 -
.../row/ElasticSerializableRowList.java | 485 -----
.../datastructure/row/SerializableRowList.java | 374 ----
.../tv/ElasticSerializableBinaryTVList.java | 205 --
.../tv/ElasticSerializableTVList.java | 287 ---
.../datastructure/tv/SerializableTVList.java | 402 ----
.../datastructure/util/BinaryUtils.java | 48 -
.../iotdb/calc_commons/utils/HeapTraversal.java | 64 -
.../calc_commons/utils/IObjectFileService.java | 38 -
.../utils/IObjectFileServiceProvider.java | 25 -
.../iotdb/calc_commons/utils/IObjectPath.java | 65 -
.../iotdb/calc_commons/utils/ObjectTypeUtils.java | 178 --
.../calc_commons/utils/constant/SqlConstant.java | 125 --
.../utils/datastructure/MergeSortHeap.java | 117 -
.../utils/datastructure/MergeSortKey.java | 45 -
.../calc_commons/utils/datastructure/SortKey.java | 33 -
.../iotdb/calc_commons/utils/sort/DiskSpiller.java | 184 --
.../calc_commons/utils/sort/FileSpillerReader.java | 155 --
.../calc_commons/utils/sort/MemoryReader.java | 61 -
.../calc_commons/utils/sort/SortBufferManager.java | 88 -
.../iotdb/calc_commons/utils/sort/SortReader.java | 51 -
.../calc_commons/utils/sort/TableDiskSpiller.java | 48 -
.../calc_commons/utils/sort/TreeDiskSpiller.java | 44 -
.../consensus/request/read/ttl/ShowTTLPlan.java | 2 +-
.../response/pipe/task/PipeTableResp.java | 2 +-
.../iotdb/confignode/manager/ProcedureManager.java | 2 +-
.../source/PipeConfigTreePatternParseVisitor.java | 2 +-
.../impl/region/AddRegionPeerProcedure.java | 2 +-
.../impl/region/ReconstructRegionProcedure.java | 2 +-
.../impl/region/RegionMigrateProcedure.java | 2 +-
.../impl/region/RemoveRegionPeerProcedure.java | 2 +-
iotdb-core/datanode/pom.xml | 2 +-
.../org/apache/iotdb/db/conf/IoTDBDescriptor.java | 2 +-
.../consensus/statemachine/BaseStateMachine.java | 4 +-
.../dataregion/DataExecutionVisitor.java | 2 +-
.../dataregion/DataRegionStateMachine.java | 2 +-
.../IoTConsensusDataRegionStateMachine.java | 4 +-
.../schemaregion/SchemaExecutionVisitor.java | 2 +-
.../schemaregion/SchemaRegionStateMachine.java | 2 +-
.../iotdb/db/exception/BatchProcessException.java | 2 +-
.../db/exception/query/OutOfTTLException.java | 2 +-
.../db/pipe/agent/task/PipeDataNodeTaskAgent.java | 2 +-
.../agent/task/subtask/sink/PipeSinkSubtask.java | 2 +-
.../common/deletion/PipeDeleteDataNodeEvent.java | 2 +-
.../event/common/heartbeat/PipeHeartbeatEvent.java | 2 +-
.../schema/PipeSchemaRegionSnapshotEvent.java | 2 +-
.../schema/PipeSchemaRegionWritePlanEvent.java | 4 +-
.../processor/aggregate/AggregateProcessor.java | 2 +-
.../processor/TumblingWindowingProcessor.java | 4 +-
.../tumbling/TumblingTimeSamplingProcessor.java | 2 +-
.../legacy/IoTDBLegacyPipeReceiverAgent.java | 2 +-
.../protocol/legacy/loader/DeletionLoader.java | 2 +-
.../protocol/legacy/loader/TsFileLoader.java | 2 +-
.../protocol/thrift/IoTDBDataNodeReceiver.java | 10 +-
.../transform/converter/ValueConverter.java | 2 +-
.../statement/PipeConvertedInsertRowStatement.java | 2 +-
.../visitor/PipePlanToStatementVisitor.java | 6 +-
.../PipeStatementTablePatternParseVisitor.java | 2 +-
.../evolvable/request/PipeTransferPlanNodeReq.java | 4 +-
.../request/PipeTransferTabletBinaryReq.java | 2 +-
.../request/IoTConsensusV2DeleteNodeReq.java | 2 +-
.../request/IoTConsensusV2TabletBinaryReq.java | 2 +-
.../request/IoTConsensusV2TabletInsertNodeReq.java | 2 +-
.../sink/protocol/opcua/server/OpcUaNameSpace.java | 4 +-
.../sink/protocol/writeback/WriteBackSink.java | 2 +-
.../builder/PipeTableModelTsFileBuilderV2.java | 2 +-
.../util/builder/PipeTreeModelTsFileBuilderV2.java | 2 +-
.../source/dataregion/IoTDBDataRegionSource.java | 2 +-
...istoricalDataRegionTsFileAndDeletionSource.java | 2 +-
.../realtime/PipeRealtimeDataRegionSource.java | 2 +-
.../schemaregion/IoTDBSchemaRegionSource.java | 10 +-
.../PipePlanTablePatternParseVisitor.java | 2 +-
.../PipePlanTablePrivilegeParseVisitor.java | 2 +-
.../PipePlanTreePatternParseVisitor.java | 2 +-
.../PipePlanTreePrivilegeParseVisitor.java | 2 +-
.../PipeTableStatementToPlanVisitor.java | 6 +-
.../PipeTreeStatementToPlanVisitor.java | 4 +-
.../schemaregion/SchemaRegionListeningFilter.java | 4 +-
.../schemaregion/SchemaRegionListeningQueue.java | 2 +-
.../db/protocol/client/DataNodeInternalClient.java | 2 +-
.../an/DataNodeTableFunctionAINodeService.java | 2 +-
...DataNodeTableFunctionAINodeServiceProvider.java | 4 +-
.../iotdb/db/protocol/session/IClientSession.java | 4 +-
.../db/protocol/session/PreparedStatementInfo.java | 2 +-
.../iotdb/db/protocol/session/SessionManager.java | 6 +-
.../protocol/thrift/impl/ClientRPCServiceImpl.java | 46 +-
.../impl/DataNodeInternalRPCServiceImpl.java | 12 +-
.../thrift/impl/NativeStatementRequest.java | 2 +-
.../db/queryengine/common/MPPQueryContext.java | 14 +-
.../iotdb/db/queryengine/common/QueryId.java | 2 +-
.../db/queryengine/common/ResultNodeContext.java | 2 +-
.../queryengine/common/header/DatasetHeader.java | 4 +-
.../execution/aggregation/AccumulatorFactory.java | 16 +-
.../execution/aggregation/AvgAccumulator.java | 2 +-
.../execution/aggregation/CountAccumulator.java | 2 +-
.../execution/aggregation/CountIfAccumulator.java | 2 +-
.../aggregation/CountTimeAccumulator.java | 2 +-
.../execution/aggregation/ExtremeAccumulator.java | 2 +-
.../aggregation/FirstValueAccumulator.java | 2 +-
.../aggregation/LastValueAccumulator.java | 2 +-
.../aggregation/MaxMinByBaseAccumulator.java | 2 +-
.../execution/aggregation/MaxTimeAccumulator.java | 2 +-
.../execution/aggregation/MaxValueAccumulator.java | 2 +-
.../execution/aggregation/MinTimeAccumulator.java | 2 +-
.../execution/aggregation/MinValueAccumulator.java | 2 +-
.../execution/aggregation/SumAccumulator.java | 2 +-
.../aggregation/TimeDurationAccumulator.java | 2 +-
.../execution/aggregation/TreeAggregator.java | 10 +-
.../execution/aggregation/UDAFAccumulator.java | 6 +-
.../EmptyQueueSlidingWindowAggregator.java | 4 +-
.../MonotonicQueueSlidingWindowAggregator.java | 4 +-
.../NormalQueueSlidingWindowAggregator.java | 4 +-
.../slidingwindow/SlidingWindowAggregator.java | 4 +-
.../SlidingWindowAggregatorFactory.java | 4 +-
.../SmoothQueueSlidingWindowAggregator.java | 4 +-
.../timerangeiterator/AggrWindowIterator.java | 4 +-
.../TableDateBinTimeRangeIterator.java | 2 +-
.../TimeRangeIteratorFactory.java | 2 +-
.../queryengine/execution/driver/DataDriver.java | 6 +-
.../execution/driver/DataDriverContext.java | 2 +-
.../db/queryengine/execution/driver/Driver.java | 8 +-
.../execution/driver/DriverContext.java | 2 +-
.../queryengine/execution/driver/SchemaDriver.java | 2 +-
.../execution/executor/RegionWriteExecutor.java | 2 +-
.../fragment/FakedFragmentInstanceContext.java | 2 +-
.../fragment/FragmentInstanceContext.java | 8 +-
.../fragment/FragmentInstanceExecution.java | 2 +-
.../fragment/FragmentInstanceManager.java | 4 +-
.../INodeCommonFragmentInstanceContext.java | 2 +-
.../execution/operator/AggregationUtil.java | 2 +-
.../execution/operator/EmptyDataOperator.java | 4 +-
.../execution/operator/ExplainAnalyzeOperator.java | 10 +-
.../execution/operator/OperatorContext.java | 10 +-
.../operator/process/AbstractIntoOperator.java | 4 +-
.../operator/process/AbstractTreeIntoOperator.java | 4 +-
.../process/ActiveRegionScanMergeOperator.java | 6 +-
.../operator/process/AggregationOperator.java | 6 +-
.../operator/process/ColumnInjectOperator.java | 6 +-
.../operator/process/DeviceViewIntoOperator.java | 6 +-
.../operator/process/DeviceViewOperator.java | 6 +-
.../process/InsertTabletStatementGenerator.java | 2 +-
.../operator/process/ProjectOperator.java | 6 +-
.../process/RawDataAggregationOperator.java | 4 +-
.../operator/process/SingleDeviceViewOperator.java | 6 +-
.../process/SingleInputAggregationOperator.java | 4 +-
.../process/SlidingWindowAggregationOperator.java | 4 +-
.../TableInsertTabletStatementGenerator.java | 2 +-
.../operator/process/TableIntoOperator.java | 8 +-
.../operator/process/TagAggregationOperator.java | 6 +-
.../operator/process/TransformOperator.java | 14 +-
.../operator/process/TreeFillOperator.java | 6 +-
.../TreeInsertTabletStatementGenerator.java | 2 +-
.../operator/process/TreeIntoOperator.java | 6 +-
.../operator/process/TreeLinearFillOperator.java | 6 +-
.../operator/process/TreeMergeSortOperator.java | 6 +-
.../operator/process/TreeSortOperator.java | 8 +-
.../operator/process/TreeTopKOperator.java | 6 +-
.../operator/process/ai/InferenceOperator.java | 6 +-
.../operator/process/copyto/CopyToOptions.java | 2 +-
.../process/copyto/TableCopyToOperator.java | 6 +-
.../process/copyto/tsfile/CopyToTsFileOptions.java | 8 +-
.../process/join/FullOuterTimeJoinOperator.java | 6 +-
.../process/join/HorizontallyConcatOperator.java | 6 +-
.../process/join/InnerTimeJoinOperator.java | 8 +-
.../process/join/LeftOuterTimeJoinOperator.java | 6 +-
.../join/TableLeftOuterTimeJoinOperator.java | 4 +-
.../join/merge/MergeSortComparatorUtils.java | 4 +-
.../process/join/merge/MultiColumnMerger.java | 2 +-
.../join/merge/NonOverlappedMultiColumnMerger.java | 2 +-
.../process/join/merge/SingleColumnMerger.java | 2 +-
.../last/AbstractUpdateLastCacheOperator.java | 4 +-
.../last/AlignedUpdateLastCacheOperator.java | 4 +-
.../AlignedUpdateViewPathLastCacheOperator.java | 2 +-
.../process/last/LastQueryCollectOperator.java | 6 +-
.../process/last/LastQueryMergeOperator.java | 6 +-
.../operator/process/last/LastQueryOperator.java | 6 +-
.../process/last/LastQuerySortOperator.java | 6 +-
.../process/last/LastQueryTransformOperator.java | 6 +-
.../operator/process/last/LastQueryUtil.java | 2 +-
.../process/last/UpdateLastCacheOperator.java | 4 +-
.../last/UpdateViewPathLastCacheOperator.java | 2 +-
.../schema/CountGroupByLevelMergeOperator.java | 6 +-
.../schema/CountGroupByLevelScanOperator.java | 4 +-
.../operator/schema/CountMergeOperator.java | 6 +-
.../schema/NodeManageMemoryMergeOperator.java | 6 +-
.../operator/schema/NodePathsConvertOperator.java | 6 +-
.../operator/schema/NodePathsCountOperator.java | 6 +-
.../operator/schema/SchemaCountOperator.java | 4 +-
.../operator/schema/SchemaFetchMergeOperator.java | 6 +-
.../operator/schema/SchemaFetchScanOperator.java | 4 +-
.../operator/schema/SchemaQueryMergeOperator.java | 6 +-
.../schema/SchemaQueryOrderByHeatOperator.java | 6 +-
.../operator/schema/SchemaQueryScanOperator.java | 4 +-
.../schema/source/DeviceAttributeUpdater.java | 6 +-
.../schema/source/DeviceBlackListConstructor.java | 4 +-
.../schema/source/DevicePredicateFilter.java | 4 +-
.../schema/source/DevicePredicateHandler.java | 6 +-
.../operator/schema/source/DeviceUpdater.java | 4 +-
.../operator/sink/IdentitySinkOperator.java | 4 +-
.../operator/sink/ShuffleHelperOperator.java | 4 +-
.../execution/operator/sink/SinkOperator.java | 2 +-
.../AbstractRegionScanDataSourceOperator.java | 2 +-
.../AbstractSeriesAggregationScanOperator.java | 2 +-
.../operator/source/AbstractSourceOperator.java | 4 +-
.../source/ActiveDeviceRegionScanOperator.java | 2 +-
.../source/ActiveTimeSeriesRegionScanOperator.java | 2 +-
.../AlignedSeriesAggregationScanOperator.java | 4 +-
.../operator/source/AlignedSeriesScanOperator.java | 4 +-
.../operator/source/ExchangeOperator.java | 4 +-
.../operator/source/LastCacheScanOperator.java | 4 +-
.../source/SeriesAggregationScanOperator.java | 4 +-
.../operator/source/SeriesScanOperator.java | 4 +-
.../operator/source/ShowDiskUsageOperator.java | 4 +-
.../operator/source/ShowQueriesOperator.java | 8 +-
.../execution/operator/source/SourceOperator.java | 4 +-
.../relational/AbstractAggTableScanOperator.java | 10 +-
.../AbstractDefaultAggTableScanOperator.java | 4 +-
.../relational/AbstractTableScanOperator.java | 10 +-
.../source/relational/CteScanOperator.java | 6 +-
.../relational/DeviceIteratorScanOperator.java | 6 +-
.../InformationSchemaContentSupplierFactory.java | 18 +-
.../InformationSchemaTableScanOperator.java | 4 +-
.../relational/LastQueryAggTableScanOperator.java | 16 +-
.../MeasurementToTableViewAdaptorUtils.java | 4 +-
...onAlignedDeviceViewAggregationScanOperator.java | 8 +-
.../relational/TreeToTableViewAdaptorOperator.java | 8 +-
.../execution/schedule/DriverScheduler.java | 4 +-
.../execution/schedule/IDriverScheduler.java | 4 +-
.../iotdb/db/queryengine/plan/Coordinator.java | 34 +-
.../db/queryengine/plan/analyze/Analysis.java | 2 +-
.../db/queryengine/plan/analyze/AnalyzeUtils.java | 18 +-
.../queryengine/plan/analyze/AnalyzeVisitor.java | 6 +-
.../plan/analyze/ExpressionAnalyzer.java | 6 +-
.../plan/analyze/ExpressionTypeAnalyzer.java | 4 +-
.../queryengine/plan/analyze/PredicateUtils.java | 10 +-
.../plan/analyze/TemplatedAggregationAnalyze.java | 4 +-
.../db/queryengine/plan/analyze/TemplatedInfo.java | 2 +-
.../db/queryengine/plan/analyze/TypeProvider.java | 6 +-
.../plan/analyze/load/LoadTsFileAnalyzer.java | 6 +-
.../analyze/load/LoadTsFileTableSchemaCache.java | 4 +-
.../load/TreeSchemaAutoCreatorAndVerifier.java | 2 +-
.../analyze/schema/ClusterSchemaFetchExecutor.java | 2 +-
.../plan/analyze/schema/SchemaValidator.java | 2 +-
.../plan/execution/IQueryExecution.java | 2 +-
.../queryengine/plan/execution/QueryExecution.java | 6 +-
.../plan/execution/config/ConfigExecution.java | 2 +-
.../execution/config/TableConfigTaskVisitor.java | 20 +-
.../config/executor/ClusterConfigTaskExecutor.java | 8 +-
.../config/executor/IConfigTaskExecutor.java | 4 +-
.../config/metadata/GetTimeSlotListTask.java | 2 +-
.../config/metadata/ShowFunctionsTask.java | 10 +-
.../execution/config/metadata/ShowRegionTask.java | 2 +-
.../metadata/relational/DeleteDeviceTask.java | 2 +-
.../plan/execution/config/session/PrepareTask.java | 2 +-
.../config/session/PreparedStatementHelper.java | 2 +-
.../config/session/SetSqlDialectTask.java | 2 +-
.../execution/config/sys/pipe/ShowPipeTask.java | 2 +-
.../memory/StatementMemorySourceVisitor.java | 2 +-
.../TableModelStatementMemorySourceVisitor.java | 8 +-
.../db/queryengine/plan/expression/Expression.java | 6 +-
.../plan/expression/ExpressionFactory.java | 2 +-
.../plan/expression/binary/BinaryExpression.java | 8 +-
.../plan/expression/leaf/ConstantOperand.java | 2 +-
.../plan/expression/leaf/LeafOperand.java | 4 +-
.../plan/expression/leaf/NullOperand.java | 2 +-
.../plan/expression/leaf/TimeSeriesOperand.java | 4 +-
.../plan/expression/leaf/TimestampOperand.java | 2 +-
.../plan/expression/multi/FunctionExpression.java | 14 +-
.../multi/builtin/BuiltInScalarFunctionHelper.java | 2 +-
.../multi/builtin/helper/CastFunctionHelper.java | 6 +-
.../multi/builtin/helper/DiffFunctionHelper.java | 4 +-
.../builtin/helper/ReplaceFunctionHelper.java | 8 +-
.../multi/builtin/helper/RoundFunctionHelper.java | 6 +-
.../builtin/helper/SubStringFunctionHelper.java | 12 +-
.../expression/other/CaseWhenThenExpression.java | 8 +-
.../expression/other/GroupByTimeExpression.java | 6 +-
.../plan/expression/ternary/BetweenExpression.java | 2 +-
.../plan/expression/ternary/TernaryExpression.java | 6 +-
.../plan/expression/unary/InExpression.java | 2 +-
.../plan/expression/unary/IsNullExpression.java | 2 +-
.../plan/expression/unary/LikeExpression.java | 2 +-
.../plan/expression/unary/LogicNotExpression.java | 2 +-
.../plan/expression/unary/NegationExpression.java | 2 +-
.../plan/expression/unary/RegularExpression.java | 2 +-
.../plan/expression/unary/UnaryExpression.java | 6 +-
.../visitor/ColumnTransformerVisitor.java | 66 +-
.../visitor/CountTimeAggregationAmountVisitor.java | 2 +-
.../visitor/IntermediateLayerVisitor.java | 6 +-
.../expression/visitor/ReconstructVisitor.java | 2 +-
.../cartesian/BindSchemaForExpressionVisitor.java | 4 +-
.../cartesian/BindSchemaForPredicateVisitor.java | 4 +-
...catDeviceAndBindSchemaForExpressionVisitor.java | 4 +-
.../ConcatExpressionWithSuffixPathsVisitor.java | 2 +-
.../predicate/ConvertPredicateToFilterVisitor.java | 2 +-
.../ConvertPredicateToTimeFilterVisitor.java | 2 +-
.../plan/optimization/AggregationPushDown.java | 14 +-
.../plan/optimization/ColumnInjectionPushDown.java | 8 +-
.../plan/optimization/LimitOffsetPushDown.java | 10 +-
.../OrderByExpressionWithLimitChangeToTopK.java | 8 +-
.../plan/optimization/PlanOptimizer.java | 2 +-
.../plan/optimization/PredicatePushDown.java | 8 +-
.../db/queryengine/plan/parser/ASTVisitor.java | 60 +-
.../plan/parser/StatementGenerator.java | 6 +-
.../planner/DataNodeTableOperatorGenerator.java | 70 +-
.../plan/planner/LocalExecutionPlanContext.java | 10 +-
.../plan/planner/LocalExecutionPlanner.java | 10 +-
.../plan/planner/LogicalPlanBuilder.java | 12 +-
.../plan/planner/LogicalPlanVisitor.java | 2 +-
.../queryengine/plan/planner/LogicalPlanner.java | 2 +-
.../plan/planner/OperatorGeneratorUtil.java | 2 +-
.../plan/planner/OperatorTreeGenerator.java | 52 +-
.../plan/planner/PipelineDriverFactory.java | 2 +-
.../plan/planner/SubPlanTypeExtractor.java | 2 +-
.../plan/planner/TemplatedLogicalPlan.java | 4 +-
.../plan/planner/TemplatedLogicalPlanBuilder.java | 2 +-
.../planner/distribution/DistributionPlanner.java | 4 +-
.../planner/distribution/ExchangeNodeAdder.java | 6 +-
.../planner/distribution/NodeGroupContext.java | 6 +-
.../SimpleFragmentParallelPlanner.java | 4 +-
.../plan/planner/distribution/SourceRewriter.java | 24 +-
.../distribution/WriteFragmentParallelPlanner.java | 2 +-
.../ConsumeAllChildrenPipelineMemoryEstimator.java | 2 +-
...umeChildrenOneByOnePipelineMemoryEstimator.java | 2 +-
.../memory/FakedMemoryReservationManager.java | 2 +-
.../NotThreadSafeMemoryReservationManager.java | 2 +-
.../planner/memory/PipelineMemoryEstimator.java | 2 +-
.../memory/PipelineMemoryEstimatorFactory.java | 4 +-
.../plan/AbstractFragmentParallelPlanner.java | 4 +-
.../plan/planner/plan/FragmentInstance.java | 2 +-
.../plan/planner/plan/LogicalQueryPlan.java | 2 +-
.../plan/planner/plan/PlanFragment.java | 8 +-
.../plan/planner/plan/TableModelTimePredicate.java | 2 +-
.../plan/planner/plan/TimePredicate.java | 2 +-
.../plan/planner/plan/node/BaseSourceRewriter.java | 2 +-
.../plan/node/DataNodePlanNodeDeserializer.java | 4 +-
.../node/DataNodePlanNodeDeserializerProvider.java | 4 +-
.../plan/planner/plan/node/ExplainAnalyzeNode.java | 8 +-
.../plan/planner/plan/node/PlanGraphPrinter.java | 72 +-
.../plan/planner/plan/node/PlanNodeUtil.java | 2 +-
.../plan/planner/plan/node/PlanVisitor.java | 2 +-
.../plan/planner/plan/node/SimplePlanVisitor.java | 2 +-
.../plan/planner/plan/node/WritePlanNode.java | 6 +-
.../plan/node/load/LoadSingleTsFileNode.java | 4 +-
.../planner/plan/node/load/LoadTsFileNode.java | 4 +-
.../plan/node/load/LoadTsFilePieceNode.java | 6 +-
.../metadata/read/AbstractSchemaMergeNode.java | 6 +-
.../node/metadata/read/CountSchemaMergeNode.java | 8 +-
.../metadata/read/DeviceSchemaFetchScanNode.java | 8 +-
.../plan/node/metadata/read/DevicesCountNode.java | 6 +-
.../node/metadata/read/DevicesSchemaScanNode.java | 6 +-
.../metadata/read/LevelTimeSeriesCountNode.java | 6 +-
.../metadata/read/LogicalViewSchemaScanNode.java | 6 +-
.../read/NodeManagementMemoryMergeNode.java | 10 +-
.../node/metadata/read/NodePathsConvertNode.java | 10 +-
.../node/metadata/read/NodePathsCountNode.java | 10 +-
.../metadata/read/NodePathsSchemaScanNode.java | 6 +-
.../metadata/read/PathsUsingTemplateScanNode.java | 6 +-
.../node/metadata/read/SchemaFetchMergeNode.java | 8 +-
.../node/metadata/read/SchemaFetchScanNode.java | 6 +-
.../node/metadata/read/SchemaQueryMergeNode.java | 8 +-
.../metadata/read/SchemaQueryOrderByHeatNode.java | 10 +-
.../node/metadata/read/SchemaQueryScanNode.java | 8 +-
.../metadata/read/SeriesSchemaFetchScanNode.java | 8 +-
.../node/metadata/read/TableDeviceSourceNode.java | 8 +-
.../node/metadata/read/TimeSeriesCountNode.java | 6 +-
.../metadata/read/TimeSeriesSchemaScanNode.java | 6 +-
.../node/metadata/write/ActivateTemplateNode.java | 8 +-
.../write/AlterEncodingCompressorNode.java | 8 +-
.../node/metadata/write/AlterTimeSeriesNode.java | 8 +-
.../metadata/write/BatchActivateTemplateNode.java | 8 +-
.../write/ConstructSchemaBlackListNode.java | 8 +-
.../write/CreateAlignedTimeSeriesNode.java | 8 +-
.../metadata/write/CreateMultiTimeSeriesNode.java | 8 +-
.../node/metadata/write/CreateTimeSeriesNode.java | 8 +-
.../metadata/write/DeactivateTemplateNode.java | 8 +-
.../node/metadata/write/DeleteTimeSeriesNode.java | 8 +-
.../write/InternalBatchActivateTemplateNode.java | 8 +-
.../write/InternalCreateMultiTimeSeriesNode.java | 8 +-
.../write/InternalCreateTimeSeriesNode.java | 8 +-
.../metadata/write/PreDeactivateTemplateNode.java | 8 +-
.../write/RollbackPreDeactivateTemplateNode.java | 8 +-
.../write/RollbackSchemaBlackListNode.java | 8 +-
.../metadata/write/view/AlterLogicalViewNode.java | 8 +-
.../view/ConstructLogicalViewBlackListNode.java | 8 +-
.../metadata/write/view/CreateLogicalViewNode.java | 8 +-
.../metadata/write/view/DeleteLogicalViewNode.java | 8 +-
.../view/RollbackLogicalViewBlackListNode.java | 8 +-
.../plan/node/pipe/PipeEnrichedDeleteDataNode.java | 8 +-
.../plan/node/pipe/PipeEnrichedInsertNode.java | 8 +-
.../node/pipe/PipeEnrichedNonWritePlanNode.java | 8 +-
.../plan/node/pipe/PipeEnrichedWritePlanNode.java | 8 +-
.../plan/node/pipe/PipeOperateSchemaQueueNode.java | 8 +-
.../plan/node/process/AI/InferenceNode.java | 10 +-
.../node/process/ActiveRegionScanMergeNode.java | 10 +-
.../node/process/AggregationMergeSortNode.java | 10 +-
.../planner/plan/node/process/AggregationNode.java | 10 +-
.../planner/plan/node/process/CollectNode.java | 10 +-
.../plan/node/process/ColumnInjectNode.java | 10 +-
.../planner/plan/node/process/DeviceMergeNode.java | 10 +-
.../plan/node/process/DeviceViewIntoNode.java | 10 +-
.../planner/plan/node/process/DeviceViewNode.java | 10 +-
.../planner/plan/node/process/ExchangeNode.java | 12 +-
.../plan/planner/plan/node/process/FillNode.java | 10 +-
.../plan/planner/plan/node/process/FilterNode.java | 8 +-
.../plan/node/process/GroupByLevelNode.java | 10 +-
.../planner/plan/node/process/GroupByTagNode.java | 10 +-
.../plan/node/process/HorizontallyConcatNode.java | 10 +-
.../plan/planner/plan/node/process/IntoNode.java | 10 +-
.../plan/planner/plan/node/process/LimitNode.java | 10 +-
.../planner/plan/node/process/MergeSortNode.java | 10 +-
.../plan/planner/plan/node/process/OffsetNode.java | 10 +-
.../planner/plan/node/process/ProjectNode.java | 10 +-
.../plan/node/process/RawDataAggregationNode.java | 10 +-
.../plan/node/process/SingleDeviceViewNode.java | 10 +-
.../node/process/SlidingWindowAggregationNode.java | 10 +-
.../plan/planner/plan/node/process/SortNode.java | 10 +-
.../plan/planner/plan/node/process/TopKNode.java | 10 +-
.../planner/plan/node/process/TransformNode.java | 10 +-
.../node/process/join/FullOuterTimeJoinNode.java | 10 +-
.../plan/node/process/join/InnerTimeJoinNode.java | 10 +-
.../node/process/join/LeftOuterTimeJoinNode.java | 10 +-
.../node/process/last/LastQueryCollectNode.java | 10 +-
.../plan/node/process/last/LastQueryMergeNode.java | 10 +-
.../plan/node/process/last/LastQueryNode.java | 12 +-
.../node/process/last/LastQueryTransformNode.java | 10 +-
.../planner/plan/node/sink/IdentitySinkNode.java | 8 +-
.../plan/node/sink/MultiChildrenSinkNode.java | 4 +-
.../planner/plan/node/sink/ShuffleSinkNode.java | 8 +-
.../plan/planner/plan/node/sink/SinkNode.java | 4 +-
.../source/AlignedSeriesAggregationScanNode.java | 10 +-
.../plan/node/source/AlignedSeriesScanNode.java | 10 +-
.../plan/node/source/DeviceRegionScanNode.java | 8 +-
.../plan/node/source/LastQueryScanNode.java | 10 +-
.../plan/node/source/LastSeriesSourceNode.java | 2 +-
.../planner/plan/node/source/RegionScanNode.java | 6 +-
.../node/source/SeriesAggregationScanNode.java | 10 +-
.../node/source/SeriesAggregationSourceNode.java | 4 +-
.../planner/plan/node/source/SeriesScanNode.java | 10 +-
.../plan/node/source/SeriesScanSourceNode.java | 6 +-
.../planner/plan/node/source/SeriesSourceNode.java | 4 +-
.../plan/node/source/ShowDiskUsageNode.java | 8 +-
.../planner/plan/node/source/ShowQueriesNode.java | 8 +-
.../plan/node/source/TimeseriesRegionScanNode.java | 8 +-
.../plan/node/source/VirtualSourceNode.java | 4 +-
.../plan/node/write/AbstractDeleteDataNode.java | 4 +-
.../ContinuousSameSearchIndexSeparatorNode.java | 6 +-
.../planner/plan/node/write/DeleteDataNode.java | 8 +-
.../plan/node/write/InsertMultiTabletsNode.java | 8 +-
.../plan/planner/plan/node/write/InsertNode.java | 4 +-
.../planner/plan/node/write/InsertRowNode.java | 8 +-
.../planner/plan/node/write/InsertRowsNode.java | 8 +-
.../plan/node/write/InsertRowsOfOneDeviceNode.java | 8 +-
.../planner/plan/node/write/InsertTabletNode.java | 10 +-
.../plan/planner/plan/node/write/ObjectNode.java | 10 +-
.../plan/node/write/RelationalDeleteDataNode.java | 8 +-
.../plan/node/write/RelationalInsertRowNode.java | 6 +-
.../plan/node/write/RelationalInsertRowsNode.java | 6 +-
.../node/write/RelationalInsertTabletNode.java | 6 +-
.../plan/planner/plan/node/write/SearchNode.java | 2 +-
.../plan/parameter/AggregationDescriptor.java | 6 +-
.../CrossSeriesAggregationDescriptor.java | 2 +-
.../planner/plan/parameter/FillDescriptor.java | 2 +-
.../plan/parameter/GroupByTimeParameter.java | 2 +-
.../plan/planner/plan/parameter/OutputColumn.java | 2 +-
.../relational/analyzer/AggregationAnalyzer.java | 68 +-
.../plan/relational/analyzer/Analysis.java | 72 +-
.../plan/relational/analyzer/Analyzer.java | 10 +-
.../relational/analyzer/CanonicalizationAware.java | 4 +-
.../relational/analyzer/ExpressionAnalysis.java | 14 +-
.../relational/analyzer/ExpressionAnalyzer.java | 164 +-
.../relational/analyzer/ExpressionTreeUtils.java | 14 +-
.../plan/relational/analyzer/Field.java | 2 +-
.../analyzer/PatternRecognitionAnalysis.java | 10 +-
.../analyzer/PatternRecognitionAnalyzer.java | 30 +-
.../plan/relational/analyzer/RelationId.java | 4 +-
.../plan/relational/analyzer/RelationType.java | 2 +-
.../plan/relational/analyzer/Scope.java | 12 +-
.../analyzer/ScopeReferenceExtractor.java | 6 +-
.../relational/analyzer/StatementAnalyzer.java | 204 +-
.../analyzer/StatementAnalyzerFactory.java | 4 +-
.../predicate/ConvertPredicateToFilterVisitor.java | 60 +-
.../ConvertPredicateToTimeFilterVisitor.java | 34 +-
.../PredicateCombineIntoTableScanChecker.java | 34 +-
.../PredicatePushIntoMetadataChecker.java | 68 +-
.../predicate/PredicatePushIntoScanChecker.java | 30 +-
.../analyzer/predicate/PredicateVisitor.java | 26 +-
.../schema/CheckSchemaPredicateVisitor.java | 16 +-
.../ConvertSchemaPredicateToFilterVisitor.java | 36 +-
.../schema/ExtractPredicateColumnNameVisitor.java | 30 +-
.../tablefunction/TableArgumentAnalysis.java | 8 +-
.../plan/relational/metadata/Metadata.java | 16 +-
.../plan/relational/metadata/MetadataUtil.java | 6 +-
.../metadata/OperatorNotFoundException.java | 4 +-
.../plan/relational/metadata/TableMetadata.java | 4 +-
.../relational/metadata/TableMetadataImpl.java | 36 +-
.../relational/metadata/TreeDeviceViewSchema.java | 4 +-
.../metadata/fetcher/SchemaPredicateUtil.java | 8 +-
.../metadata/fetcher/TableDeviceSchemaFetcher.java | 2 +-
.../fetcher/TableHeaderSchemaValidator.java | 10 +-
.../plan/relational/planner/CteMaterializer.java | 16 +-
.../plan/relational/planner/EqualityInference.java | 8 +-
.../relational/planner/ExpressionExtractor.java | 14 +-
.../planner/ExpressionSymbolInliner.java | 6 +-
.../planner/IrExpressionInterpreter.java | 66 +-
.../plan/relational/planner/IrTypeAnalyzer.java | 78 +-
.../plan/relational/planner/LiteralEncoder.java | 28 +-
.../relational/planner/LiteralInterpreter.java | 22 +-
.../relational/planner/NoOpSymbolResolver.java | 2 +-
.../plan/relational/planner/NodeAndMappings.java | 4 +-
.../relational/planner/OrderingTranslator.java | 4 +-
.../plan/relational/planner/PlanBuilder.java | 12 +-
.../plan/relational/planner/PlanNodeSearcher.java | 2 +-
.../plan/relational/planner/PlannerContext.java | 2 +-
.../plan/relational/planner/PredicateUtils.java | 22 +-
.../plan/relational/planner/QueryPlanner.java | 104 +-
.../plan/relational/planner/RelationPlan.java | 4 +-
.../plan/relational/planner/RelationPlanner.java | 150 +-
.../plan/relational/planner/ScopeAware.java | 6 +-
.../relational/planner/SimplePlanRewriter.java | 2 +-
.../plan/relational/planner/SubqueryPlanner.java | 48 +-
.../plan/relational/planner/SymbolAllocator.java | 10 +-
.../plan/relational/planner/SymbolResolver.java | 2 +-
.../plan/relational/planner/SymbolsExtractor.java | 22 +-
.../relational/planner/TableLogicalPlanner.java | 36 +-
.../plan/relational/planner/TableModelPlanner.java | 10 +-
.../plan/relational/planner/TranslationMap.java | 28 +-
.../planner/distribute/AddExchangeNodes.java | 6 +-
.../planner/distribute/SubPlanGenerator.java | 4 +-
.../distribute/TableDistributedPlanGenerator.java | 94 +-
.../distribute/TableDistributedPlanner.java | 8 +-
.../distribute/TableModelQueryFragmentPlanner.java | 6 +-
.../TableModelTypeProviderExtractor.java | 36 +-
.../planner/ir/DefaultTraversalVisitor.java | 32 +-
.../planner/ir/DeterminismEvaluator.java | 4 +-
.../planner/ir/ExpressionNodeInliner.java | 2 +-
.../relational/planner/ir/ExpressionRewriter.java | 70 +-
.../planner/ir/ExpressionTreeRewriter.java | 78 +-
.../ExtractCommonPredicatesExpressionRewriter.java | 6 +-
.../ir/GapFillStartAndEndTimeExtractVisitor.java | 30 +-
.../plan/relational/planner/ir/IrUtils.java | 24 +-
.../planner/ir/NormalizeOrExpressionRewriter.java | 14 +-
...ithUncorrelatedScalarSubqueryReconstructor.java | 36 +-
.../planner/ir/ReplaceSymbolInExpression.java | 8 +-
.../planner/ir/SubExpressionExtractor.java | 4 +-
.../planner/iterative/IterativeOptimizer.java | 16 +-
.../plan/relational/planner/iterative/Lookup.java | 4 +-
.../plan/relational/planner/iterative/Memo.java | 4 +-
.../plan/relational/planner/iterative/Plans.java | 4 +-
.../plan/relational/planner/iterative/Rule.java | 8 +-
.../relational/planner/iterative/RuleIndex.java | 4 +-
.../iterative/rule/AggregationDecorrelation.java | 6 +-
.../rule/CanonicalizeExpressionRewriter.java | 28 +-
.../rule/EliminateLimitProjectWithTableScan.java | 12 +-
.../rule/EliminateLimitWithTableScan.java | 10 +-
.../iterative/rule/EvaluateEmptyIntersect.java | 12 +-
.../iterative/rule/ExpressionRewriteRuleSet.java | 22 +-
.../iterative/rule/GatherAndMergeWindows.java | 24 +-
.../planner/iterative/rule/ImplementExceptAll.java | 26 +-
.../rule/ImplementExceptDistinctAsUnion.java | 20 +-
.../iterative/rule/ImplementIntersectAll.java | 20 +-
.../rule/ImplementIntersectDistinctAsUnion.java | 20 +-
.../rule/ImplementPatternRecognition.java | 16 +-
.../rule/ImplementTableFunctionSource.java | 20 +-
.../planner/iterative/rule/InlineProjections.java | 22 +-
.../planner/iterative/rule/MergeExcept.java | 8 +-
.../planner/iterative/rule/MergeFilters.java | 10 +-
.../planner/iterative/rule/MergeIntersect.java | 8 +-
.../rule/MergeLimitOverProjectWithMergeSort.java | 18 +-
.../rule/MergeLimitOverProjectWithSort.java | 18 +-
.../iterative/rule/MergeLimitWithMergeSort.java | 16 +-
.../planner/iterative/rule/MergeLimitWithSort.java | 16 +-
.../planner/iterative/rule/MergeLimits.java | 10 +-
.../planner/iterative/rule/MergeUnion.java | 8 +-
.../MultipleDistinctAggregationToMarkDistinct.java | 12 +-
.../planner/iterative/rule/OptimizeRowPattern.java | 12 +-
.../iterative/rule/ProjectOffPushDownRule.java | 14 +-
.../iterative/rule/PruneAggregationColumns.java | 6 +-
.../rule/PruneAggregationSourceColumns.java | 8 +-
.../planner/iterative/rule/PruneApplyColumns.java | 6 +-
.../iterative/rule/PruneApplyCorrelation.java | 8 +-
.../iterative/rule/PruneApplySourceColumns.java | 10 +-
.../iterative/rule/PruneAssignUniqueIdColumns.java | 6 +-
.../planner/iterative/rule/PruneCopyToColumns.java | 4 +-
.../iterative/rule/PruneCorrelatedJoinColumns.java | 10 +-
.../rule/PruneCorrelatedJoinCorrelation.java | 8 +-
.../iterative/rule/PruneDistinctAggregation.java | 14 +-
.../rule/PruneEnforceSingleRowColumns.java | 6 +-
.../iterative/rule/PruneExceptSourceColumns.java | 8 +-
.../iterative/rule/PruneExplainAnalyzeColumns.java | 4 +-
.../planner/iterative/rule/PruneFillColumns.java | 6 +-
.../planner/iterative/rule/PruneFilterColumns.java | 6 +-
.../iterative/rule/PruneGapFillColumns.java | 6 +-
.../rule/PruneIntersectSourceColumns.java | 8 +-
.../iterative/rule/PruneJoinChildrenColumns.java | 8 +-
.../planner/iterative/rule/PruneJoinColumns.java | 6 +-
.../planner/iterative/rule/PruneLimitColumns.java | 6 +-
.../iterative/rule/PruneMarkDistinctColumns.java | 6 +-
.../planner/iterative/rule/PruneOffsetColumns.java | 6 +-
.../iterative/rule/PruneOutputSourceColumns.java | 6 +-
.../rule/PrunePatternRecognitionSourceColumns.java | 14 +-
.../iterative/rule/PruneProjectColumns.java | 6 +-
.../planner/iterative/rule/PruneSortColumns.java | 6 +-
.../rule/PruneTableFunctionProcessorColumns.java | 8 +-
.../PruneTableFunctionProcessorSourceColumns.java | 10 +-
.../iterative/rule/PruneTableScanColumns.java | 6 +-
.../planner/iterative/rule/PruneTopKColumns.java | 6 +-
.../planner/iterative/rule/PruneUnionColumns.java | 6 +-
.../iterative/rule/PruneUnionSourceColumns.java | 8 +-
.../planner/iterative/rule/PruneWindowColumns.java | 6 +-
.../iterative/rule/PushDownFilterIntoWindow.java | 26 +-
.../iterative/rule/PushDownLimitIntoWindow.java | 18 +-
.../rule/PushDownNegationsExpressionRewriter.java | 20 +-
.../rule/PushDownOffsetIntoTableScan.java | 10 +-
.../iterative/rule/PushLimitThroughOffset.java | 12 +-
.../iterative/rule/PushLimitThroughProject.java | 14 +-
.../iterative/rule/PushLimitThroughUnion.java | 14 +-
.../iterative/rule/PushProjectionThroughUnion.java | 22 +-
.../iterative/rule/PushTopKThroughUnion.java | 16 +-
.../iterative/rule/RemoveDuplicateConditions.java | 4 +-
.../iterative/rule/RemoveEmptyExceptBranches.java | 18 +-
.../iterative/rule/RemoveEmptyUnionBranches.java | 14 +-
.../rule/RemoveRedundantEnforceSingleRowNode.java | 6 +-
.../iterative/rule/RemoveRedundantExists.java | 18 +-
.../rule/RemoveRedundantIdentityProjections.java | 6 +-
.../iterative/rule/RemoveRedundantWindow.java | 8 +-
.../iterative/rule/RemoveTrivialFilters.java | 12 +-
.../rule/RemoveUnreferencedScalarApplyNodes.java | 6 +-
.../rule/RemoveUnreferencedScalarSubqueries.java | 14 +-
.../iterative/rule/ReplaceWindowWithRowNumber.java | 10 +-
.../planner/iterative/rule/SetOperationMerge.java | 12 +-
.../iterative/rule/SetOperationNodeTranslator.java | 54 +-
.../iterative/rule/SimplifyCountOverConstant.java | 32 +-
.../iterative/rule/SimplifyExpressions.java | 8 +-
.../rule/SingleDistinctAggregationToGroupBy.java | 14 +-
...orrelatedDistinctAggregationWithProjection.java | 32 +-
...elatedDistinctAggregationWithoutProjection.java | 28 +-
...mCorrelatedGlobalAggregationWithProjection.java | 38 +-
...rrelatedGlobalAggregationWithoutProjection.java | 38 +-
...CorrelatedGroupedAggregationWithProjection.java | 32 +-
...relatedGroupedAggregationWithoutProjection.java | 28 +-
.../rule/TransformCorrelatedJoinToJoin.java | 20 +-
.../rule/TransformCorrelatedScalarSubquery.java | 46 +-
.../rule/TransformExistsApplyToCorrelatedJoin.java | 46 +-
.../TransformFilteringSemiJoinToInnerJoin.java | 32 +-
...mUncorrelatedInPredicateSubqueryToSemiJoin.java | 12 +-
.../rule/TransformUncorrelatedSubqueryToJoin.java | 28 +-
.../relational/planner/iterative/rule/Util.java | 20 +-
.../planner/node/AggregationTableScanNode.java | 28 +-
.../node/AggregationTreeDeviceViewScanNode.java | 16 +-
.../AlignedAggregationTreeDeviceViewScanNode.java | 16 +-
.../relational/planner/node/ChildReplacer.java | 2 +-
.../plan/relational/planner/node/CopyToNode.java | 10 +-
.../plan/relational/planner/node/CteScanNode.java | 14 +-
.../planner/node/DeviceTableScanNode.java | 12 +-
.../plan/relational/planner/node/ExchangeNode.java | 12 +-
.../planner/node/ExplainAnalyzeNode.java | 10 +-
.../node/InformationSchemaTableScanNode.java | 14 +-
.../plan/relational/planner/node/IntoNode.java | 14 +-
...onAlignedAggregationTreeDeviceViewScanNode.java | 16 +-
.../plan/relational/planner/node/Patterns.java | 74 +-
...bleDiskUsageInformationSchemaTableScanNode.java | 12 +-
.../relational/planner/node/TableScanNode.java | 16 +-
.../node/TreeAlignedDeviceViewScanNode.java | 12 +-
.../planner/node/TreeDeviceViewScanNode.java | 10 +-
.../node/TreeNonAlignedDeviceViewScanNode.java | 12 +-
.../node/schema/AbstractTableDeviceQueryNode.java | 6 +-
.../schema/AbstractTableDevicesDeletionNode.java | 4 +-
...ctTableSchemaQueryAttributeSecurityVisitor.java | 2 +-
.../schema/ConstructTableDevicesBlackListNode.java | 8 +-
.../node/schema/CreateOrUpdateTableDeviceNode.java | 8 +-
.../planner/node/schema/DeleteTableDeviceNode.java | 8 +-
.../schema/DeleteTableDevicesInBlackListNode.java | 8 +-
.../schema/RollbackTableDevicesBlackListNode.java | 8 +-
.../node/schema/TableAttributeColumnDropNode.java | 8 +-
.../TableDeviceAttributeCommitUpdateNode.java | 8 +-
.../schema/TableDeviceAttributeUpdateNode.java | 14 +-
.../planner/node/schema/TableDeviceFetchNode.java | 8 +-
.../node/schema/TableDeviceQueryCountNode.java | 10 +-
.../node/schema/TableDeviceQueryScanNode.java | 10 +-
.../node/schema/TableNodeLocationAddNode.java | 8 +-
.../node/schema/TableSchemaQueryWriteVisitor.java | 2 +-
.../optimizations/AdaptivePlanOptimizer.java | 4 +-
.../CheckSubqueryNodesAreRewritten.java | 8 +-
.../planner/optimizations/JoinUtils.java | 10 +-
.../planner/optimizations/ParallelizeGrouping.java | 30 +-
.../optimizations/PlanNodeDecorrelator.java | 36 +-
.../planner/optimizations/PlanOptimizer.java | 4 +-
.../PushAggregationIntoTableScan.java | 16 +-
.../PushLimitOffsetIntoTableScan.java | 36 +-
.../optimizations/PushPredicateIntoTableScan.java | 68 +-
.../optimizations/QueryCardinalityUtil.java | 18 +-
.../planner/optimizations/SortElimination.java | 20 +-
.../planner/optimizations/SymbolMapper.java | 50 +-
.../TransformAggregationToStreamable.java | 26 +-
...mQuantifiedComparisonApplyToCorrelatedJoin.java | 60 +-
.../optimizations/TransformSortToStreamSort.java | 18 +-
.../optimizations/UnaliasSymbolReferences.java | 78 +-
.../relational/planner/optimizations/Util.java | 22 +-
.../rowpattern/RowPatternToIrRewriter.java | 58 +-
.../plan/relational/sql/ParameterExtractor.java | 12 +-
.../sql/ast/AbstractQueryDeviceWithCache.java | 8 +-
.../relational/sql/ast/AbstractTraverseDevice.java | 16 +-
.../plan/relational/sql/ast/AddColumn.java | 12 +-
.../relational/sql/ast/AlterColumnDataType.java | 16 +-
.../plan/relational/sql/ast/AlterDB.java | 4 +-
.../plan/relational/sql/ast/AlterPipe.java | 4 +-
.../plan/relational/sql/ast/AsofJoinOn.java | 20 +-
.../plan/relational/sql/ast/AstVisitor.java | 2 +-
.../plan/relational/sql/ast/ClearCache.java | 8 +-
.../plan/relational/sql/ast/ColumnDefinition.java | 14 +-
.../plan/relational/sql/ast/CopyTo.java | 10 +-
.../plan/relational/sql/ast/CountDevice.java | 8 +-
.../plan/relational/sql/ast/CountStatement.java | 12 +-
.../plan/relational/sql/ast/CreateDB.java | 4 +-
.../relational/sql/ast/CreateExternalService.java | 10 +-
.../plan/relational/sql/ast/CreateFunction.java | 10 +-
.../plan/relational/sql/ast/CreateIndex.java | 14 +-
.../plan/relational/sql/ast/CreateModel.java | 8 +-
.../relational/sql/ast/CreateOrUpdateDevice.java | 8 +-
.../plan/relational/sql/ast/CreatePipe.java | 4 +-
.../plan/relational/sql/ast/CreatePipePlugin.java | 4 +-
.../plan/relational/sql/ast/CreateTable.java | 12 +-
.../plan/relational/sql/ast/CreateTopic.java | 4 +-
.../plan/relational/sql/ast/CreateTraining.java | 8 +-
.../plan/relational/sql/ast/CreateView.java | 8 +-
.../plan/relational/sql/ast/DatabaseStatement.java | 8 +-
.../plan/relational/sql/ast/Deallocate.java | 12 +-
.../sql/ast/DefaultExpressionTraversalVisitor.java | 2 +-
.../sql/ast/DefaultTraversalVisitor.java | 118 +-
.../plan/relational/sql/ast/Delete.java | 14 +-
.../plan/relational/sql/ast/DeleteDevice.java | 20 +-
.../plan/relational/sql/ast/DescribeTable.java | 12 +-
.../plan/relational/sql/ast/DropColumn.java | 14 +-
.../plan/relational/sql/ast/DropDB.java | 12 +-
.../relational/sql/ast/DropExternalService.java | 10 +-
.../plan/relational/sql/ast/DropFunction.java | 10 +-
.../plan/relational/sql/ast/DropIndex.java | 14 +-
.../plan/relational/sql/ast/DropModel.java | 8 +-
.../plan/relational/sql/ast/DropPipe.java | 4 +-
.../plan/relational/sql/ast/DropPipePlugin.java | 4 +-
.../plan/relational/sql/ast/DropSubscription.java | 4 +-
.../plan/relational/sql/ast/DropTable.java | 12 +-
.../plan/relational/sql/ast/DropTopic.java | 4 +-
.../plan/relational/sql/ast/Execute.java | 14 +-
.../plan/relational/sql/ast/ExecuteImmediate.java | 14 +-
.../plan/relational/sql/ast/Explain.java | 10 +-
.../plan/relational/sql/ast/ExplainAnalyze.java | 10 +-
.../plan/relational/sql/ast/ExtendRegion.java | 8 +-
.../plan/relational/sql/ast/FetchDevice.java | 8 +-
.../queryengine/plan/relational/sql/ast/Flush.java | 2 +-
.../plan/relational/sql/ast/Insert.java | 16 +-
.../plan/relational/sql/ast/InsertRow.java | 4 +-
.../plan/relational/sql/ast/InsertRows.java | 4 +-
.../plan/relational/sql/ast/InsertTablet.java | 4 +-
.../plan/relational/sql/ast/KillQuery.java | 10 +-
.../plan/relational/sql/ast/LoadConfiguration.java | 2 +-
.../plan/relational/sql/ast/LoadModel.java | 8 +-
.../plan/relational/sql/ast/LoadTsFile.java | 10 +-
.../plan/relational/sql/ast/MigrateRegion.java | 10 +-
.../plan/relational/sql/ast/PipeEnriched.java | 8 +-
.../plan/relational/sql/ast/PipeStatement.java | 4 +-
.../plan/relational/sql/ast/Prepare.java | 12 +-
.../plan/relational/sql/ast/Property.java | 12 +-
.../plan/relational/sql/ast/ReconstructRegion.java | 8 +-
.../sql/ast/RelationalAuthorStatement.java | 8 +-
.../plan/relational/sql/ast/RemoveAINode.java | 8 +-
.../plan/relational/sql/ast/RemoveConfigNode.java | 8 +-
.../plan/relational/sql/ast/RemoveDataNode.java | 8 +-
.../plan/relational/sql/ast/RemoveRegion.java | 8 +-
.../plan/relational/sql/ast/RenameColumn.java | 14 +-
.../plan/relational/sql/ast/RenameTable.java | 14 +-
.../plan/relational/sql/ast/SetColumnComment.java | 14 +-
.../plan/relational/sql/ast/SetConfiguration.java | 2 +-
.../plan/relational/sql/ast/SetProperties.java | 12 +-
.../plan/relational/sql/ast/SetSqlDialect.java | 12 +-
.../plan/relational/sql/ast/SetSystemStatus.java | 2 +-
.../plan/relational/sql/ast/SetTableComment.java | 12 +-
.../plan/relational/sql/ast/ShowAIDevices.java | 8 +-
.../plan/relational/sql/ast/ShowAINodes.java | 10 +-
.../plan/relational/sql/ast/ShowAvailableUrls.java | 8 +-
.../plan/relational/sql/ast/ShowCluster.java | 10 +-
.../plan/relational/sql/ast/ShowClusterId.java | 10 +-
.../plan/relational/sql/ast/ShowConfigNodes.java | 10 +-
.../plan/relational/sql/ast/ShowConfiguration.java | 2 +-
.../relational/sql/ast/ShowCurrentDatabase.java | 10 +-
.../relational/sql/ast/ShowCurrentSqlDialect.java | 10 +-
.../relational/sql/ast/ShowCurrentTimestamp.java | 10 +-
.../plan/relational/sql/ast/ShowCurrentUser.java | 10 +-
.../plan/relational/sql/ast/ShowDB.java | 10 +-
.../plan/relational/sql/ast/ShowDataNodes.java | 10 +-
.../plan/relational/sql/ast/ShowDevice.java | 14 +-
.../relational/sql/ast/ShowExternalService.java | 12 +-
.../plan/relational/sql/ast/ShowFunctions.java | 10 +-
.../plan/relational/sql/ast/ShowIndex.java | 12 +-
.../plan/relational/sql/ast/ShowLoadedModels.java | 8 +-
.../plan/relational/sql/ast/ShowModels.java | 8 +-
.../plan/relational/sql/ast/ShowPipePlugins.java | 4 +-
.../plan/relational/sql/ast/ShowPipes.java | 4 +-
.../relational/sql/ast/ShowQueriesStatement.java | 12 +-
.../plan/relational/sql/ast/ShowRegions.java | 8 +-
.../plan/relational/sql/ast/ShowStatement.java | 16 +-
.../plan/relational/sql/ast/ShowSubscriptions.java | 4 +-
.../plan/relational/sql/ast/ShowTables.java | 12 +-
.../plan/relational/sql/ast/ShowTopics.java | 4 +-
.../plan/relational/sql/ast/ShowVariables.java | 10 +-
.../plan/relational/sql/ast/ShowVersion.java | 10 +-
.../relational/sql/ast/StackableAstVisitor.java | 2 +-
.../relational/sql/ast/StartExternalService.java | 10 +-
.../plan/relational/sql/ast/StartPipe.java | 4 +-
.../plan/relational/sql/ast/StartRepairData.java | 2 +-
.../relational/sql/ast/StopExternalService.java | 10 +-
.../plan/relational/sql/ast/StopPipe.java | 4 +-
.../plan/relational/sql/ast/StopRepairData.java | 2 +-
.../relational/sql/ast/SubscriptionStatement.java | 4 +-
.../plan/relational/sql/ast/TimeRange.java | 6 +-
.../plan/relational/sql/ast/UnloadModel.java | 8 +-
.../plan/relational/sql/ast/Update.java | 12 +-
.../plan/relational/sql/ast/UpdateAssignment.java | 10 +-
.../queryengine/plan/relational/sql/ast/Use.java | 12 +-
.../relational/sql/ast/ViewFieldDefinition.java | 10 +-
.../relational/sql/ast/WrappedInsertStatement.java | 6 +-
.../plan/relational/sql/ast/WrappedStatement.java | 4 +-
.../plan/relational/sql/parser/AstBuilder.java | 272 +--
.../plan/relational/sql/parser/ErrorHandler.java | 2 +-
.../plan/relational/sql/parser/SqlParser.java | 14 +-
.../plan/relational/sql/rewrite/ShowRewrite.java | 26 +-
.../relational/sql/rewrite/StatementRewrite.java | 10 +-
.../plan/relational/sql/util/AstUtil.java | 14 +-
.../relational/sql/util/DataNodeSqlFormatter.java | 12 +-
.../plan/relational/sql/util/QueryUtil.java | 56 +-
.../plan/relational/type/TypeCoercion.java | 2 +-
.../plan/relational/utils/NodeUtils.java | 4 +-
.../plan/scheduler/ClusterScheduler.java | 4 +-
.../scheduler/FragmentInstanceDispatcherImpl.java | 6 +-
.../scheduler/load/LoadTsFileDispatcherImpl.java | 4 +-
.../db/queryengine/plan/statement/Statement.java | 2 +-
.../plan/statement/component/FillComponent.java | 2 +-
.../plan/statement/crud/InsertBaseStatement.java | 8 +-
.../plan/statement/crud/InsertRowStatement.java | 6 +-
.../crud/InsertRowsOfOneDeviceStatement.java | 2 +-
.../plan/statement/crud/InsertRowsStatement.java | 4 +-
.../plan/statement/crud/InsertTabletStatement.java | 6 +-
.../plan/statement/crud/LoadTsFileStatement.java | 2 +-
.../plan/statement/crud/QueryStatement.java | 2 +-
.../plan/statement/pipe/PipeEnrichedStatement.java | 2 +-
.../plan/statement/sys/SetSqlDialectStatement.java | 2 +-
.../db/queryengine/plan/udf/TreeUDFUtils.java | 2 +-
.../FragmentInstanceStatisticsDrawer.java | 2 +-
.../transformation/api/LayerRowWindowReader.java | 2 +-
...izableRowRecordListBackedMultiColumnWindow.java | 2 +-
...wRecordListBackedMultiColumnWindowIterator.java | 2 +-
...ticSerializableTVListBackedSingleColumnRow.java | 2 +-
...SerializableTVListBackedSingleColumnWindow.java | 2 +-
...ableTVListBackedSingleColumnWindowIterator.java | 2 +-
.../dag/builder/EvaluationDAGBuilder.java | 4 +-
.../dag/input/ConstantInputReader.java | 2 +-
.../dag/input/QueryDataSetInputLayer.java | 6 +-
.../dag/input/TsBlockInputDataSet.java | 2 +-
.../intermediate/ConstantIntermediateLayer.java | 2 +-
.../dag/intermediate/IntermediateLayer.java | 2 +-
.../dag/intermediate/MultiInputLayer.java | 6 +-
.../SingleInputMultiReferenceLayer.java | 4 +-
.../SingleInputSingleReferenceLayer.java | 4 +-
.../transformation/dag/memory/SafetyLine.java | 2 +-
.../binary/ArithmeticBinaryTransformer.java | 2 +-
.../dag/transformer/binary/BinaryTransformer.java | 2 +-
.../binary/CompareBinaryTransformer.java | 2 +-
.../binary/CompareEqualToTransformer.java | 2 +-
.../binary/CompareGreaterEqualTransformer.java | 2 +-
.../binary/CompareGreaterThanTransformer.java | 2 +-
.../binary/CompareLessEqualTransformer.java | 2 +-
.../binary/CompareLessThanTransformer.java | 2 +-
.../binary/CompareNonEqualTransformer.java | 2 +-
.../multi/MappableUDFQueryRowTransformer.java | 2 +-
.../transformer/multi/UDFQueryRowTransformer.java | 2 +-
.../multi/UDFQueryRowWindowTransformer.java | 2 +-
.../dag/transformer/multi/UDFQueryTransformer.java | 2 +-
.../multi/UniversalUDFQueryTransformer.java | 6 +-
.../transformer/ternary/BetweenTransformer.java | 2 +-
.../ternary/CompareTernaryTransformer.java | 2 +-
.../transformer/ternary/TernaryTransformer.java | 2 +-
.../unary/ArithmeticNegationTransformer.java | 2 +-
.../dag/transformer/unary/InTransformer.java | 2 +-
.../dag/transformer/unary/IsNullTransformer.java | 2 +-
.../dag/transformer/unary/LikeTransformer.java | 2 +-
.../dag/transformer/unary/LogicNotTransformer.java | 2 +-
.../dag/transformer/unary/RegularTransformer.java | 2 +-
.../transformer/unary/TransparentTransformer.java | 2 +-
.../dag/transformer/unary/UnaryTransformer.java | 2 +-
.../unary/scalar/CastFunctionTransformer.java | 4 +-
.../unary/scalar/DiffFunctionTransformer.java | 2 +-
.../unary/scalar/RoundFunctionTransformer.java | 2 +-
.../scalar/SubStringFunctionColumnTransformer.java | 4 +-
.../unary/scalar/SubStringFunctionTransformer.java | 2 +-
.../dag/udf/UDAFInformationInferrer.java | 4 +-
.../transformation/dag/udf/UDTFContext.java | 4 +-
.../dag/udf/UDTFInformationInferrer.java | 4 +-
.../transformation/dag/util/LayerCacheUtils.java | 4 +-
.../transformation/dag/util/TransformUtils.java | 2 +-
.../transformation/dag/util/TypeUtils.java | 2 +-
.../GeneralRegionAttributeSecurityService.java | 2 +-
.../schemaregion/impl/SchemaRegionMemoryImpl.java | 18 +-
.../visitor/SchemaRegionPlanDeserializer.java | 2 +-
.../visitor/SchemaRegionPlanSerializer.java | 2 +-
.../reader/impl/TimeseriesReaderWithViewFetch.java | 2 +-
.../schemaregion/utils/ResourceByPathUtils.java | 4 +-
.../db/schemaengine/table/DataNodeTableCache.java | 2 +-
.../java/org/apache/iotdb/db/service/DataNode.java | 6 +-
...aNodeTemporaryQueryDataFileServiceProvider.java | 4 +-
.../db/service/TemporaryQueryDataFileService.java | 2 +-
.../db/service/metrics/DataNodeMetricsHelper.java | 2 +-
.../metrics/IoTDBInternalLocalReporter.java | 4 +-
.../db/storageengine/dataregion/DataRegion.java | 10 +-
.../dataregion/IDataRegionForQuery.java | 2 +-
.../dataregion/VirtualDataRegion.java | 2 +-
.../dataregion/memtable/AbstractMemTable.java | 2 +-
.../memtable/AbstractWritableMemChunk.java | 4 +-
.../dataregion/memtable/IMemTable.java | 2 +-
.../dataregion/memtable/ReadOnlyMemChunk.java | 2 +-
.../dataregion/memtable/TsFileProcessor.java | 6 +-
.../modification/TableDeletionEntry.java | 2 +-
.../dataregion/modification/TreeDeletionEntry.java | 2 +-
.../read/reader/chunk/DiskAlignedChunkLoader.java | 2 +-
.../read/reader/chunk/DiskChunkLoader.java | 2 +-
.../read/reader/common/PriorityMergeReader.java | 2 +-
.../DataRegionTableSizeQueryContext.java | 2 +-
.../dataregion/wal/buffer/WALEntry.java | 4 +-
.../storageengine/dataregion/wal/node/WALNode.java | 2 +-
...ertedInsertTabletStatementExceptionVisitor.java | 2 +-
.../converter/LoadTsFileDataTypeConverter.java | 2 +-
.../apache/iotdb/db/tools/IoTDBDataDirViewer.java | 2 +-
.../iotdb/db/tools/TsFileResourcePrinter.java | 2 +-
.../db/trigger/executor/TriggerFireVisitor.java | 2 +-
.../org/apache/iotdb/db/utils/CommonUtils.java | 6 +-
.../apache/iotdb/db/utils/DataNodeAuthUtils.java | 2 +-
.../iotdb/db/utils/DataNodeDateTimeUtils.java | 2 +-
.../iotdb/db/utils/DataNodeObjectFileService.java | 4 +-
.../utils/DataNodeObjectFileServiceProvider.java | 4 +-
.../apache/iotdb/db/utils/ErrorHandlingUtils.java | 2 +-
.../org/apache/iotdb/db/utils/SchemaUtils.java | 2 +-
.../apache/iotdb/db/utils/TypeInferenceUtils.java | 2 +-
.../apache/iotdb/db/utils/cte/MemoryReader.java | 2 +-
...service.ITemporaryQueryDataFileServiceProvider} | 0
...he.iotdb.calc.utils.IObjectFileServiceProvider} | 0
...lanner.plan.node.IPlanNodeDeserializerProvider} | 0
...l.function.ITableFunctionAINodeServiceProvider} | 0
.../dataregion/DataRegionStateMachineTest.java | 2 +-
.../SchemaRegionSimpleRecoverTest.java | 8 +-
.../schemaRegion/SchemaRegionTestUtil.java | 2 +-
.../db/pipe/consensus/DeletionRecoverTest.java | 2 +-
.../db/pipe/consensus/DeletionResourceTest.java | 2 +-
.../pipe/event/PipeTabletInsertionEventTest.java | 2 +-
.../pipe/sink/PipeDataNodeThriftRequestTest.java | 2 +-
.../PipePlanTablePatternParseVisitorTest.java | 4 +-
.../PipePlanTreePatternParseVisitorTest.java | 2 +-
.../db/pipe/source/PipeRealtimeExtractTest.java | 2 +-
.../source/SchemaRegionListeningQueueTest.java | 2 +-
.../org/apache/iotdb/db/qp/sql/ASTVisitorTest.java | 2 +-
.../queryengine/common/schematree/NodeRefTest.java | 2 +-
.../db/queryengine/execution/DataDriverTest.java | 8 +-
.../execution/aggregation/AccumulatorTest.java | 2 +-
.../executor/RegionWriteExecutorTest.java | 2 +-
.../fragment/FragmentInstanceExecutionTest.java | 4 +-
.../operator/AggregationMergeSortOperatorTest.java | 8 +-
.../operator/AggregationOperatorTest.java | 8 +-
.../AlignedSeriesAggregationScanOperatorTest.java | 4 +-
.../operator/AlignedSeriesScanOperatorTest.java | 4 +-
.../execution/operator/CteScanOperatorTest.java | 8 +-
.../operator/DeviceIteratorScanOperatorTest.java | 4 +-
.../operator/DeviceViewIntoOperatorTest.java | 6 +-
.../execution/operator/DeviceViewOperatorTest.java | 4 +-
.../execution/operator/ExchangeOperatorTest.java | 2 +-
.../execution/operator/FillOperatorTest.java | 14 +-
.../operator/HorizontallyConcatOperatorTest.java | 2 +-
.../operator/LastQueryMergeOperatorTest.java | 4 +-
.../execution/operator/LastQueryOperatorTest.java | 2 +-
.../operator/LastQueryTreeSortOperatorTest.java | 2 +-
.../execution/operator/LimitOperatorTest.java | 6 +-
.../operator/MergeTreeSortOperatorTest.java | 10 +-
.../execution/operator/MultiColumnMergerTest.java | 2 +-
...nAlignedTreeDeviceViewScanOperatorTreeTest.java | 22 +-
.../NonOverlappedMultiColumnMergerTest.java | 2 +-
.../execution/operator/OffsetOperatorTest.java | 8 +-
.../execution/operator/OperatorMemoryTest.java | 24 +-
.../operator/RawDataAggregationOperatorTest.java | 6 +-
.../SeriesAggregationScanOperatorTest.java | 2 +-
.../execution/operator/SeriesScanOperatorTest.java | 2 +-
.../execution/operator/SingleColumnMergerTest.java | 2 +-
.../operator/SingleDeviceViewOperatorTest.java | 4 +-
.../SlidingWindowAggregationOperatorTest.java | 4 +-
.../operator/SortOperatorSortBranchTest.java | 8 +-
.../execution/operator/TransformOperatorTest.java | 8 +-
.../execution/operator/TreeIntoOperatorTest.java | 6 +-
.../operator/TreeLinearFillOperatorTest.java | 12 +-
.../execution/operator/TreeSortOperatorTest.java | 8 +-
.../execution/operator/TreeTopKOperatorTest.java | 6 +-
.../operator/UpdateLastCacheOperatorTest.java | 2 +-
.../operator/ViewFromTreeAdaptorOperatorTest.java | 6 +-
.../process/TableStreamSortOperatorTest.java | 14 +-
.../operator/process/ValuesOperatorTest.java | 6 +-
.../fill/filter/MonthIntervalFillFilterTest.java | 6 +-
.../gapfill/GapFillWGroupWMoOperatorTest.java | 18 +-
.../gapfill/GapFillWGroupWoMoOperatorTest.java | 18 +-
.../gapfill/GapFillWoGroupWMoOperatorTest.java | 12 +-
.../gapfill/GapFillWoGroupWoMoOperatorTest.java | 10 +-
.../process/join/InnerTimeJoinOperatorTest.java | 4 +-
.../join/LeftOuterTimeJoinOperatorTest.java | 2 +-
.../rowpattern/IrRowPatternOptimizationTest.java | 26 +-
.../operator/process/rowpattern/MatcherTest.java | 38 +-
.../process/rowpattern/PatternExpressionTest.java | 10 +-
.../process/tvf/TableFunctionOperatorTest.java | 10 +-
.../process/window/RowNumberOperatorTest.java | 8 +-
.../process/window/TableWindowOperatorTest.java | 14 +-
.../window/TableWindowOperatorTestUtils.java | 2 +-
.../process/window/TopKRankingOperatorTest.java | 12 +-
.../process/window/function/FunctionTestUtils.java | 14 +-
.../aggregate/AggregationWindowFunctionTest.java | 10 +-
.../window/function/rank/CumeDistFunctionTest.java | 6 +-
.../function/rank/DenseRankFunctionTest.java | 6 +-
.../window/function/rank/NTileFunctionTest.java | 6 +-
.../function/rank/PercentRankFunctionTest.java | 6 +-
.../window/function/rank/RankFunctionTest.java | 6 +-
.../function/rank/RowNumberFunctionTest.java | 6 +-
.../function/value/FirstValueFunctionTest.java | 8 +-
.../window/function/value/LagFunctionTest.java | 6 +-
.../function/value/LastValueFunctionTest.java | 8 +-
.../window/function/value/LeadFunctionTest.java | 6 +-
.../function/value/NthValueFunctionTest.java | 8 +-
.../window/partition/frame/FrameTestUtils.java | 18 +-
.../window/partition/frame/GroupsFrameTest.java | 2 +-
.../window/partition/frame/RangeFrameTest.java | 4 +-
.../window/partition/frame/RowsFrameTest.java | 2 +-
.../schema/CountGroupByLevelMergeOperatorTest.java | 2 +-
.../operator/schema/SchemaCountOperatorTest.java | 2 +-
.../schema/SchemaQueryScanOperatorTest.java | 2 +-
.../operator/sink/IdentitySinkOperatorTest.java | 2 +-
.../sink/SinkOperatorDownStreamNodeIdTest.java | 6 +-
.../source/relational/TableScanOperatorTest.java | 4 +-
.../execution/schedule/DriverSchedulerTest.java | 2 +-
.../ConvertPredicateToTimeFilterTest.java | 2 +-
.../db/queryengine/plan/analyze/AnalyzeTest.java | 2 +-
.../plan/optimization/AggregationPushDownTest.java | 2 +-
.../optimization/ColumnInjectionPushDownTest.java | 4 +-
.../plan/optimization/LimitOffsetPushDownTest.java | 6 +-
.../plan/optimization/OptimizationTestUtil.java | 2 +-
.../plan/optimization/PredicatePushDownTest.java | 2 +-
.../plan/optimization/TestPlanBuilder.java | 6 +-
.../plan/parser/StatementGeneratorTest.java | 6 +-
.../queryengine/plan/planner/ExpressionTest.java | 2 +-
.../plan/planner/FragmentInstanceSerdeTest.java | 6 +-
.../plan/planner/PipelineBuilderTest.java | 6 +-
.../distribution/AggregationAlignByDeviceTest.java | 2 +-
.../distribution/AggregationDistributionTest.java | 4 +-
.../distribution/AggregationTableScanTest.java | 24 +-
.../AlignByDeviceOrderByLimitOffsetTest.java | 2 +-
.../AlignByTimeOrderByLimitOffsetTest.java | 2 +-
.../planner/distribution/AlignedByDeviceTest.java | 2 +-
.../distribution/DistributionPlannerBasicTest.java | 6 +-
.../distribution/DistributionPlannerCycleTest.java | 2 +-
.../plan/planner/distribution/LastQueryTest.java | 4 +-
.../distribution/NoDataRegionPlanningTest.java | 2 +-
.../distribution/RegionScanPlanningTest.java | 2 +-
.../plan/planner/distribution/Util.java | 2 +-
.../plan/planner/distribution/Util2.java | 2 +-
.../logical/DataQueryLogicalPlannerTest.java | 2 +-
.../planner/logical/LogicalPlannerTestUtil.java | 4 +-
.../logical/RegionScanLogicalPlannerTest.java | 6 +-
.../logical/SchemaQueryLogicalPlannerTest.java | 4 +-
.../plan/planner/node/PlanGraphPrinterTest.java | 2 +-
.../planner/node/PlanNodeDeserializeHelper.java | 4 +-
.../plan/planner/node/load/LoadTsFileNodeTest.java | 2 +-
.../read/DeviceSchemaFetchScanNodeTest.java | 4 +-
.../read/DeviceSchemaScanNodeSerdeTest.java | 2 +-
.../NodeManagementMemoryMergeNodeSerdeTest.java | 2 +-
.../read/PathsUsingTemplateScanNodeTest.java | 4 +-
.../metadata/read/SchemaCountNodeSerdeTest.java | 2 +-
.../metadata/read/SchemaFetchMergeNodeTest.java | 4 +-
.../read/SeriesSchemaFetchScanNodeTest.java | 4 +-
.../read/TimeSeriesSchemaScanNodeSerdeTest.java | 2 +-
.../metadata/write/MetadataWriteNodeSerDeTest.java | 6 +-
.../pipe/PipeEnrichedDeleteDataNodeSerdeTest.java | 6 +-
.../node/pipe/PipeEnrichedInsertNodeSerdeTest.java | 4 +-
.../PipeEnrichedNonWritePlanNodeSerdeTest.java | 6 +-
.../pipe/PipeEnrichedWritePlanNodeSerdeTest.java | 6 +-
.../node/process/AggregationNodeSerdeTest.java | 2 +-
.../node/process/DeviceViewNodeSerdeTest.java | 2 +-
.../node/process/ExchangeNodeSerdeTest.java | 2 +-
.../planner/node/process/FillNodeSerdeTest.java | 4 +-
.../planner/node/process/FilterNodeSerdeTest.java | 2 +-
.../node/process/GroupByLevelNodeSerdeTest.java | 2 +-
.../node/process/GroupByTagNodeSerdeTest.java | 2 +-
.../planner/node/process/IntoNodeSerdeTest.java | 6 +-
.../planner/node/process/LimitNodeSerdeTest.java | 2 +-
.../planner/node/process/OffsetNodeSerdeTest.java | 2 +-
.../process/SingleDeviceViewNodeSerdeTest.java | 2 +-
.../planner/node/process/SortNodeSerdeTest.java | 2 +-
.../node/process/TimeJoinNodeSerdeTest.java | 4 +-
.../planner/node/process/WindowNodeSerdeTest.java | 28 +-
.../node/sink/IdentitySinkNodeSerdeTest.java | 2 +-
.../node/sink/ShuffleSinkHandleNodeSerdeTest.java | 2 +-
.../source/SeriesAggregationScanNodeSerdeTest.java | 4 +-
.../node/source/SeriesScanNodeSerdeTest.java | 4 +-
.../planner/node/source/SourceNodeSerdeTest.java | 6 +-
...nuousSameSearchIndexSeparatorNodeSerDeTest.java | 4 +-
.../node/write/DeleteDataNodeSerdeTest.java | 6 +-
.../write/InsertMultiTabletsNodeSerdeTest.java | 4 +-
.../planner/node/write/InsertRowNodeSerdeTest.java | 4 +-
.../node/write/InsertRowsNodeSerdeTest.java | 4 +-
.../write/InsertRowsOfOneDeviceNodeSerdeTest.java | 4 +-
.../node/write/InsertTabletNodeSerdeTest.java | 4 +-
.../planner/node/write/WritePlanNodeSplitTest.java | 2 +-
.../node/write/RelationalDeleteDataNodeTest.java | 6 +-
.../analyzer/AggregationCornerCaseTest.java | 22 +-
.../plan/relational/analyzer/AggregationTest.java | 26 +-
.../plan/relational/analyzer/AnalyzerTest.java | 34 +-
.../analyzer/AsofInnerJoinOperatorTest.java | 8 +-
.../plan/relational/analyzer/AsofJoinTest.java | 16 +-
.../plan/relational/analyzer/AuthTest.java | 8 +-
.../plan/relational/analyzer/DistinctTest.java | 2 +-
.../relational/analyzer/ExtractExpressionTest.java | 4 +-
.../relational/analyzer/InsertIntoQueryTest.java | 10 +-
.../plan/relational/analyzer/JoinTest.java | 44 +-
.../analyzer/LimitOffsetPushDownTest.java | 16 +-
.../analyzer/PushAggregationThroughUnionTest.java | 6 +-
.../analyzer/RowPatternRecognitionTest.java | 8 +-
.../plan/relational/analyzer/SortTest.java | 18 +-
.../plan/relational/analyzer/SubQueryTest.java | 16 +-
.../plan/relational/analyzer/TSBSMetadata.java | 28 +-
.../plan/relational/analyzer/TSBSTest.java | 34 +-
.../relational/analyzer/TableFunctionTest.java | 16 +-
.../plan/relational/analyzer/TestMetadata.java | 40 +-
.../plan/relational/analyzer/TestPlanBuilder.java | 22 +-
.../plan/relational/analyzer/TestUtils.java | 16 +-
.../plan/relational/analyzer/TreeViewTest.java | 6 +-
.../relational/planner/CorrelatedSubqueryTest.java | 14 +-
.../relational/planner/CteMaterializerTest.java | 16 +-
.../plan/relational/planner/CteSubqueryTest.java | 8 +-
.../plan/relational/planner/ExampleTest.java | 28 +-
.../planner/PatternRecognitionNodeSerdeTest.java | 44 +-
.../plan/relational/planner/PlanTester.java | 10 +-
.../relational/planner/PredicateUtilsTest.java | 6 +-
.../planner/UncorrelatedSubqueryTest.java | 24 +-
.../AggregationDeviceTableScanMatcher.java | 8 +-
.../planner/assertions/AggregationFunction.java | 6 +-
.../assertions/AggregationFunctionMatcher.java | 8 +-
.../assertions/AggregationFunctionProvider.java | 8 +-
.../planner/assertions/AggregationMatcher.java | 8 +-
.../planner/assertions/AggregationStepMatcher.java | 6 +-
.../planner/assertions/AliasMatcher.java | 8 +-
.../planner/assertions/AliasPresent.java | 6 +-
.../planner/assertions/AsofJoinClauseProvider.java | 6 +-
.../planner/assertions/AssignUniqueIdMatcher.java | 8 +-
.../assertions/BaseStrictSymbolsMatcher.java | 6 +-
.../planner/assertions/ColumnReference.java | 10 +-
.../planner/assertions/CteScanMatcher.java | 6 +-
.../planner/assertions/DeviceTableScanMatcher.java | 4 +-
.../planner/assertions/EquiJoinClauseProvider.java | 2 +-
.../planner/assertions/ExchangeNodeMatcher.java | 8 +-
.../planner/assertions/ExpressionMatcher.java | 10 +-
.../planner/assertions/ExpressionVerifier.java | 60 +-
.../planner/assertions/FilterMatcher.java | 8 +-
.../planner/assertions/GroupMatcher.java | 6 +-
.../assertions/IdentityProjectionMatcher.java | 6 +-
.../InformationSchemaTableScanMatcher.java | 4 +-
.../relational/planner/assertions/JoinMatcher.java | 10 +-
.../planner/assertions/LimitMatcher.java | 8 +-
.../planner/assertions/MarkDistinctMatcher.java | 6 +-
.../relational/planner/assertions/MatchResult.java | 2 +-
.../relational/planner/assertions/Matcher.java | 4 +-
.../planner/assertions/NotPlanNodeMatcher.java | 4 +-
.../planner/assertions/OffsetMatcher.java | 6 +-
.../planner/assertions/OutputMatcher.java | 8 +-
.../relational/planner/assertions/PlanAssert.java | 8 +-
.../planner/assertions/PlanMatchPattern.java | 80 +-
.../planner/assertions/PlanMatchingVisitor.java | 10 +-
.../planner/assertions/PlanNodeMatcher.java | 4 +-
.../planner/assertions/PlanTestSymbol.java | 2 +-
.../planner/assertions/PredicateMatcher.java | 4 +-
.../planner/assertions/RvalueMatcher.java | 8 +-
.../planner/assertions/SemiJoinMatcher.java | 6 +-
.../relational/planner/assertions/SortMatcher.java | 6 +-
.../planner/assertions/SpecificationProvider.java | 6 +-
.../assertions/StrictAssignedSymbolsMatcher.java | 8 +-
.../planner/assertions/StrictSymbolsMatcher.java | 6 +-
.../relational/planner/assertions/SymbolAlias.java | 2 +-
.../planner/assertions/SymbolAliases.java | 8 +-
.../assertions/TableFunctionProcessorMatcher.java | 10 +-
.../planner/assertions/TableScanMatcher.java | 8 +-
.../relational/planner/assertions/TopKMatcher.java | 6 +-
.../plan/relational/planner/assertions/Util.java | 4 +-
.../planner/assertions/WindowFunctionMatcher.java | 10 +-
.../informationschema/CurrentQueriesTest.java | 8 +-
.../predicate/TablePredicateConversionTest.java | 14 +-
.../relational/sql/AstMemoryEstimatorTest.java | 2 +-
.../sql/ast/SqlParserErrorHandlerTest.java | 2 +-
.../relational/sql/parser/AuthorStatementTest.java | 4 +-
.../plan/statement/InsertStatementTest.java | 8 +-
.../plan/statement/StatementTestUtils.java | 6 +-
.../builder/EvaluationDAGBuilderTest.java | 6 +-
...meticAndCompareBinaryColumnTransformerTest.java | 24 +-
.../binary/LogicBinaryColumnTransformerTest.java | 8 +-
.../binary/hmac/HmacMd5ColumnTransformerTest.java | 10 +-
.../binary/hmac/HmacSha1ColumnTransformerTest.java | 10 +-
.../hmac/HmacSha256ColumnTransformerTest.java | 10 +-
.../hmac/HmacSha512ColumnTransformerTest.java | 10 +-
.../column/ternary/LpadColumnTransformerTest.java | 4 +-
.../column/ternary/RpadColumnTransformerTest.java | 4 +-
.../column/unary/UnaryColumnTransformerTest.java | 16 +-
.../scalar/BlobLengthColumnTransformerTest.java | 4 +-
.../column/unary/scalar/DateBinFunctionTest.java | 2 +-
.../FromBigEndian32ColumnTransformerTest.java | 6 +-
.../FromBigEndian64ColumnTransformerTest.java | 6 +-
...omIEEE754_32BigEndianColumnTransformerTest.java | 6 +-
...omIEEE754_64BigEndianColumnTransformerTest.java | 6 +-
.../FromLittleEndian32ColumnTransformerTest.java | 6 +-
.../FromLittleEndian64ColumnTransformerTest.java | 6 +-
.../ToBigEndian32ColumnTransformerTest.java | 6 +-
.../ToBigEndian64ColumnTransformerTest.java | 6 +-
...ToIEEE754_32BigEndianColumnTransformerTest.java | 6 +-
...ToIEEE754_64BigEndianColumnTransformerTest.java | 6 +-
.../ToLittleEndian32ColumnTransformerTest.java | 6 +-
.../ToLittleEndian64ColumnTransformerTest.java | 6 +-
.../unary/scalar/ReverseColumnTransformerTest.java | 6 +-
.../FromBase32ColumnTransformerTest.java | 6 +-
.../FromBase64ColumnTransformerTest.java | 6 +-
.../FromBase64UrlColumnTransformerTest.java | 6 +-
.../ToBase32ColumnTransformerTest.java | 6 +-
.../ToBase64ColumnTransformerTest.java | 6 +-
.../ToBase64UrlColumnTransformerTest.java | 6 +-
.../scalar/hashing/Crc32ColumnTransformerTest.java | 4 +-
.../scalar/hashing/Md5ColumnTransformerTest.java | 6 +-
.../hashing/Murmur3ColumnTransformerTest.java | 6 +-
.../scalar/hashing/Sha1ColumnTransformerTest.java | 6 +-
.../hashing/Sha256ColumnTransformerTest.java | 6 +-
.../hashing/Sha512ColumnTransformerTest.java | 6 +-
.../SpookyHashV2_32ColumnTransformerTest.java | 6 +-
.../SpookyHashV2_64ColumnTransformerTest.java | 6 +-
.../hashing/XxHash64ColumnTransformerTest.java | 6 +-
.../hexEncoding/FromHexColumnTransformerTest.java | 6 +-
.../hexEncoding/ToHexColumnTransformerTest.java | 6 +-
.../transformation/dag/util/BitwiseUtilsTest.java | 18 +-
.../ElasticSerializableRowListTest.java | 8 +-
.../ElasticSerializableTVListTest.java | 6 +-
.../transformation/datastructure/LRUCache.java | 2 +-
.../datastructure/SerializableRowListTest.java | 2 +-
.../datastructure/SerializableTVListTest.java | 2 +-
.../DataNodeInternalRPCServiceImplTest.java | 2 +-
.../storageengine/dataregion/DataRegionTest.java | 4 +-
.../db/storageengine/dataregion/TTLQueryTest.java | 2 +-
.../iotdb/db/storageengine/dataregion/TTLTest.java | 4 +-
...eCrossSpaceCompactionWithFastPerformerTest.java | 2 +-
...sSpaceCompactionWithReadPointPerformerTest.java | 2 +-
.../InnerSeqCompactionWithFastPerformerTest.java | 2 +-
...nerSeqCompactionWithReadChunkPerformerTest.java | 2 +-
.../settle/SettleRequestHandlerTest.java | 2 +-
.../memtable/AlignedTVListIteratorTest.java | 2 +-
.../memtable/MemChunkDeserializeTest.java | 2 +-
.../dataregion/memtable/MemTableTestUtils.java | 2 +-
.../memtable/NonAlignedTVListIteratorTest.java | 2 +-
.../dataregion/memtable/PrimitiveMemTableTest.java | 8 +-
.../dataregion/memtable/TsFileProcessorTest.java | 2 +-
.../dataregion/wal/WALManagerTest.java | 2 +-
.../storageengine/dataregion/wal/WALTestUtils.java | 4 +-
.../wal/allocation/ElasticStrategyTest.java | 2 +-
.../wal/allocation/FirstCreateStrategyTest.java | 2 +-
.../wal/allocation/RoundRobinStrategyTest.java | 2 +-
.../dataregion/wal/buffer/WALBufferCommonTest.java | 4 +-
.../wal/compression/WALCompressionTest.java | 2 +-
.../dataregion/wal/io/WALFileTest.java | 2 +-
.../wal/node/ConsensusReqReaderTest.java | 4 +-
.../dataregion/wal/node/WALFakeNodeTest.java | 2 +-
.../dataregion/wal/node/WALNodeTest.java | 2 +-
.../wal/node/WalDeleteOutdatedNewTest.java | 2 +-
.../wal/recover/WALRecoverManagerTest.java | 4 +-
.../wal/recover/WALRepairWriterTest.java | 2 +-
.../wal/recover/file/TsFilePlanRedoerTest.java | 2 +-
.../file/UnsealedTsFileRecoverPerformerTest.java | 2 +-
.../rescon/memory/TimePartitionManagerTest.java | 2 +-
.../db/trigger/executor/TriggerExecuteTest.java | 2 +-
.../apache/iotdb/db/utils/DateTimeUtilsTest.java | 2 +-
.../apache/iotdb/db/utils/EnvironmentUtils.java | 2 +-
.../iotdb/db/utils/ErrorHandlingUtilsTest.java | 2 +-
.../org/apache/iotdb/db/utils/MemUtilsTest.java | 2 +-
.../org/apache/iotdb/db/utils/SchemaUtilsTest.java | 2 +-
.../db/utils/TimestampPrecisionUtilsTest.java | 2 +-
.../iotdb/db/utils/TypeInferenceUtilsTest.java | 2 +-
.../db/utils/datastructure/MergeSortHeapTest.java | 6 +-
.../apache/iotdb/db/utils/sort/SortUtilTest.java | 14 +-
.../node_commons/common/ConnectionInfo.java | 57 -
.../iotdb/commons/node_commons/common/NodeRef.java | 63 -
.../commons/node_commons/common/SessionInfo.java | 196 --
.../commons/node_commons/common/SqlDialect.java | 56 -
.../execution/MemoryEstimationHelper.java | 138 --
.../aggregation/grouped/UpdateMemory.java | 32 -
.../grouped/hash/CombineHashFunction.java | 37 -
.../aggregation/grouped/hash/FlatGroupByHash.java | 210 --
.../aggregation/grouped/hash/FlatHash.java | 605 ------
.../aggregation/grouped/hash/FlatHashStrategy.java | 55 -
.../aggregation/grouped/hash/GroupByHash.java | 61 -
.../aggregation/grouped/hash/HashStrategy.java | 225 --
.../aggregation/grouped/hash/MarkDistinctHash.java | 90 -
.../grouped/hash/NoChannelGroupByHash.java | 72 -
.../grouped/hash/VariableWidthData.java | 197 --
.../aggregation/grouped/hash/XxHash64.java | 276 ---
.../plan/analyze/ITableTypeProvider.java | 36 -
.../plan/expression/multi/FunctionType.java | 28 -
.../plan/node/CommonPlanNodeDeserializer.java | 141 --
.../planner/plan/node/ICoreQueryPlanVisitor.java | 227 --
.../planner/plan/node/IPartitionRelatedNode.java | 26 -
.../planner/plan/node/IPlanNodeDeserializer.java | 29 -
.../plan/node/IPlanNodeDeserializerProvider.java | 19 -
.../plan/planner/plan/node/IPlanVisitor.java | 24 -
.../plan/planner/plan/node/PlanNode.java | 217 --
.../plan/planner/plan/node/PlanNodeId.java | 83 -
.../plan/planner/plan/node/PlanNodeType.java | 259 ---
.../plan/node/process/MultiChildProcessNode.java | 85 -
.../planner/plan/node/process/ProcessNode.java | 30 -
.../plan/node/process/SingleChildProcessNode.java | 92 -
.../plan/node/process/TwoChildProcessNode.java | 101 -
.../plan/planner/plan/node/source/SourceNode.java | 37 -
.../plan/planner/plan/parameter/InputLocation.java | 72 -
.../plan/relational/analyzer/NodeRef.java | 63 -
.../plan/relational/function/BoundSignature.java | 129 --
.../plan/relational/function/FunctionId.java | 70 -
.../plan/relational/function/FunctionKind.java | 45 -
.../function/ITableFunctionAINodeService.java | 28 -
.../ITableFunctionAINodeServiceProvider.java | 25 -
.../relational/function/ITableFunctionFactory.java | 28 -
.../function/InterpretedFunctionInvoker.java | 83 -
.../function/LongVariableConstraint.java | 64 -
.../plan/relational/function/OperatorType.java | 67 -
.../function/ResolvedFunctionCallBuilder.java | 58 -
.../plan/relational/function/Signature.java | 213 --
.../function/TableBuiltinTableFunction.java | 97 -
.../relational/function/TableFunctionFactory.java | 39 -
.../function/TypeVariableConstraint.java | 192 --
.../function/arithmetic/AdditionResolver.java | 97 -
.../function/arithmetic/DivisionResolver.java | 81 -
.../function/arithmetic/ModulusResolver.java | 81 -
.../arithmetic/MultiplicationResolver.java | 81 -
.../function/arithmetic/SubtractionResolver.java | 89 -
.../function/tvf/ClassifyTableFunction.java | 379 ----
.../function/tvf/ForecastTableFunction.java | 541 -----
.../function/tvf/PatternMatchTableFunction.java | 266 ---
.../function/tvf/TableFunctionUtils.java | 74 -
.../relational/function/tvf/match/MatchConfig.java | 34 -
.../function/tvf/match/QetchAlgorithm.java | 683 ------
.../function/tvf/match/model/MatchState.java | 233 --
.../function/tvf/match/model/PatternSegment.java | 285 ---
.../relational/function/tvf/match/model/Point.java | 42 -
.../function/tvf/match/model/RegexMatchState.java | 396 ----
.../function/tvf/match/model/Section.java | 238 --
.../plan/relational/metadata/ColumnMetadata.java | 213 --
.../plan/relational/metadata/ColumnSchema.java | 188 --
.../relational/metadata/FunctionNullability.java | 118 -
.../plan/relational/metadata/ResolvedFunction.java | 145 --
.../plan/relational/metadata/TableSchema.java | 239 --
.../plan/relational/planner/Assignments.java | 261 ---
.../planner/DataOrganizationSpecification.java | 106 -
.../plan/relational/planner/OrderingScheme.java | 137 --
.../plan/relational/planner/SortOrder.java | 50 -
.../plan/relational/planner/Symbol.java | 100 -
.../planner/iterative/GroupReference.java | 93 -
.../relational/planner/node/AggregationNode.java | 734 -------
.../plan/relational/planner/node/ApplyNode.java | 247 ---
.../relational/planner/node/AssignUniqueId.java | 98 -
.../plan/relational/planner/node/CollectNode.java | 132 --
.../planner/node/CorrelatedJoinNode.java | 171 --
.../planner/node/EnforceSingleRowNode.java | 87 -
.../plan/relational/planner/node/ExceptNode.java | 100 -
.../plan/relational/planner/node/FillNode.java | 51 -
.../plan/relational/planner/node/FilterNode.java | 116 -
.../plan/relational/planner/node/GapFillNode.java | 231 --
.../plan/relational/planner/node/GroupNode.java | 105 -
.../relational/planner/node/IntersectNode.java | 99 -
.../plan/relational/planner/node/JoinNode.java | 532 -----
.../plan/relational/planner/node/LimitNode.java | 134 --
.../relational/planner/node/LinearFillNode.java | 147 --
.../relational/planner/node/MarkDistinctNode.java | 163 --
.../plan/relational/planner/node/Measure.java | 95 -
.../relational/planner/node/MergeSortNode.java | 142 --
.../plan/relational/planner/node/OffsetNode.java | 112 -
.../plan/relational/planner/node/OutputNode.java | 155 --
.../planner/node/PatternRecognitionNode.java | 385 ----
.../relational/planner/node/PreviousFillNode.java | 194 --
.../plan/relational/planner/node/ProjectNode.java | 131 --
.../relational/planner/node/RowNumberNode.java | 216 --
.../plan/relational/planner/node/RowsPerMatch.java | 127 --
.../plan/relational/planner/node/SemiJoinNode.java | 182 --
.../relational/planner/node/SetOperationNode.java | 138 --
.../relational/planner/node/SkipToPosition.java | 47 -
.../plan/relational/planner/node/SortNode.java | 132 --
.../relational/planner/node/StreamSortNode.java | 121 --
.../relational/planner/node/TableFunctionNode.java | 372 ----
.../planner/node/TableFunctionProcessorNode.java | 296 ---
.../plan/relational/planner/node/TopKNode.java | 174 --
.../relational/planner/node/TopKRankingNode.java | 209 --
.../plan/relational/planner/node/UnionNode.java | 127 --
.../relational/planner/node/ValueFillNode.java | 107 -
.../plan/relational/planner/node/ValuesNode.java | 237 --
.../plan/relational/planner/node/WindowNode.java | 607 ------
.../planner/rowpattern/AggregationLabelSet.java | 100 -
.../rowpattern/AggregationValuePointer.java | 147 --
.../planner/rowpattern/ClassifierValuePointer.java | 70 -
.../rowpattern/ExpressionAndValuePointers.java | 250 ---
.../planner/rowpattern/IrAlternation.java | 99 -
.../relational/planner/rowpattern/IrAnchor.java | 87 -
.../planner/rowpattern/IrConcatenation.java | 100 -
.../relational/planner/rowpattern/IrEmpty.java | 62 -
.../relational/planner/rowpattern/IrExclusion.java | 79 -
.../relational/planner/rowpattern/IrLabel.java | 85 -
.../rowpattern/IrPatternAlternationOptimizer.java | 141 --
.../planner/rowpattern/IrPermutation.java | 96 -
.../planner/rowpattern/IrQuantified.java | 88 -
.../planner/rowpattern/IrQuantifier.java | 126 --
.../planner/rowpattern/IrRowPattern.java | 119 -
.../planner/rowpattern/IrRowPatternFlattener.java | 206 --
.../planner/rowpattern/IrRowPatternVisitor.java | 68 -
.../planner/rowpattern/LogicalIndexPointer.java | 154 --
.../rowpattern/MatchNumberValuePointer.java | 45 -
.../relational/planner/rowpattern/Patterns.java | 83 -
.../planner/rowpattern/ScalarValuePointer.java | 82 -
.../planner/rowpattern/ValuePointer.java | 17 -
.../plan/relational/security/Identity.java | 51 -
.../plan/relational/sql/ast/AliasedRelation.java | 126 --
.../plan/relational/sql/ast/AllColumns.java | 143 --
.../plan/relational/sql/ast/AllRows.java | 76 -
.../plan/relational/sql/ast/AnchorPattern.java | 94 -
.../sql/ast/ArithmeticBinaryExpression.java | 154 --
.../sql/ast/ArithmeticUnaryExpression.java | 155 --
.../sql/ast/AstMemoryEstimationHelper.java | 123 --
.../plan/relational/sql/ast/BetweenPredicate.java | 141 --
.../plan/relational/sql/ast/BinaryLiteral.java | 156 --
.../plan/relational/sql/ast/BooleanLiteral.java | 122 --
.../node_commons/plan/relational/sql/ast/Cast.java | 171 --
.../relational/sql/ast/CoalesceExpression.java | 131 --
.../plan/relational/sql/ast/Columns.java | 107 -
.../relational/sql/ast/CommonQueryAstVisitor.java | 467 ----
.../relational/sql/ast/ComparisonExpression.java | 225 --
.../plan/relational/sql/ast/CurrentDatabase.java | 86 -
.../plan/relational/sql/ast/CurrentTime.java | 127 --
.../plan/relational/sql/ast/CurrentUser.java | 86 -
.../plan/relational/sql/ast/DataType.java | 28 -
.../plan/relational/sql/ast/DataTypeParameter.java | 34 -
.../plan/relational/sql/ast/DecimalLiteral.java | 114 -
.../relational/sql/ast/DereferenceExpression.java | 164 --
.../plan/relational/sql/ast/DoubleLiteral.java | 121 --
.../plan/relational/sql/ast/EmptyPattern.java | 79 -
.../plan/relational/sql/ast/Except.java | 119 -
.../plan/relational/sql/ast/ExcludedPattern.java | 90 -
.../plan/relational/sql/ast/ExistsPredicate.java | 92 -
.../plan/relational/sql/ast/Expression.java | 182 --
.../plan/relational/sql/ast/Extract.java | 150 --
.../plan/relational/sql/ast/FieldReference.java | 91 -
.../node_commons/plan/relational/sql/ast/Fill.java | 184 --
.../plan/relational/sql/ast/FloatLiteral.java | 117 -
.../plan/relational/sql/ast/FrameBound.java | 152 --
.../plan/relational/sql/ast/FunctionCall.java | 358 ---
.../plan/relational/sql/ast/GenericDataType.java | 123 --
.../plan/relational/sql/ast/GenericLiteral.java | 144 --
.../plan/relational/sql/ast/GroupBy.java | 111 -
.../plan/relational/sql/ast/GroupingElement.java | 36 -
.../plan/relational/sql/ast/GroupingSets.java | 128 --
.../plan/relational/sql/ast/IAstVisitor.java | 17 -
.../plan/relational/sql/ast/Identifier.java | 189 --
.../plan/relational/sql/ast/IfExpression.java | 119 -
.../plan/relational/sql/ast/InListExpression.java | 122 --
.../plan/relational/sql/ast/InPredicate.java | 118 -
.../plan/relational/sql/ast/Intersect.java | 103 -
.../relational/sql/ast/IsNotNullPredicate.java | 108 -
.../plan/relational/sql/ast/IsNullPredicate.java | 108 -
.../node_commons/plan/relational/sql/ast/Join.java | 178 --
.../plan/relational/sql/ast/JoinCriteria.java | 39 -
.../plan/relational/sql/ast/JoinOn.java | 84 -
.../plan/relational/sql/ast/JoinUsing.java | 81 -
.../plan/relational/sql/ast/LikePredicate.java | 163 --
.../plan/relational/sql/ast/Limit.java | 107 -
.../plan/relational/sql/ast/Literal.java | 47 -
.../plan/relational/sql/ast/LogicalExpression.java | 159 --
.../plan/relational/sql/ast/LongLiteral.java | 148 --
.../plan/relational/sql/ast/MeasureDefinition.java | 102 -
.../plan/relational/sql/ast/NaturalJoin.java | 60 -
.../node_commons/plan/relational/sql/ast/Node.java | 82 -
.../plan/relational/sql/ast/NodeLocation.java | 68 -
.../plan/relational/sql/ast/NotExpression.java | 108 -
.../plan/relational/sql/ast/NullIfExpression.java | 99 -
.../plan/relational/sql/ast/NullLiteral.java | 92 -
.../plan/relational/sql/ast/NumericParameter.java | 99 -
.../plan/relational/sql/ast/Offset.java | 105 -
.../relational/sql/ast/OneOrMoreQuantifier.java | 43 -
.../plan/relational/sql/ast/OrderBy.java | 129 --
.../plan/relational/sql/ast/Parameter.java | 93 -
.../relational/sql/ast/PatternAlternation.java | 92 -
.../relational/sql/ast/PatternConcatenation.java | 92 -
.../relational/sql/ast/PatternPermutation.java | 92 -
.../plan/relational/sql/ast/PatternQuantifier.java | 82 -
.../sql/ast/PatternRecognitionRelation.java | 227 --
.../plan/relational/sql/ast/PatternVariable.java | 90 -
.../plan/relational/sql/ast/ProcessingMode.java | 88 -
.../plan/relational/sql/ast/QualifiedName.java | 247 ---
.../sql/ast/QuantifiedComparisonExpression.java | 137 --
.../plan/relational/sql/ast/QuantifiedPattern.java | 102 -
.../plan/relational/sql/ast/Query.java | 211 --
.../plan/relational/sql/ast/QueryBody.java | 34 -
.../relational/sql/ast/QuerySpecification.java | 210 --
.../plan/relational/sql/ast/RangeQuantifier.java | 107 -
.../plan/relational/sql/ast/Relation.java | 32 -
.../node_commons/plan/relational/sql/ast/Row.java | 121 --
.../plan/relational/sql/ast/RowPattern.java | 31 -
.../relational/sql/ast/SearchedCaseExpression.java | 162 --
.../plan/relational/sql/ast/Select.java | 110 -
.../plan/relational/sql/ast/SelectItem.java | 27 -
.../plan/relational/sql/ast/SetOperation.java | 42 -
.../relational/sql/ast/SimpleCaseExpression.java | 181 --
.../plan/relational/sql/ast/SimpleGroupBy.java | 101 -
.../plan/relational/sql/ast/SingleColumn.java | 154 --
.../plan/relational/sql/ast/SkipTo.java | 145 --
.../plan/relational/sql/ast/SortItem.java | 157 --
.../plan/relational/sql/ast/Statement.java | 68 -
.../plan/relational/sql/ast/StringLiteral.java | 123 --
.../relational/sql/ast/SubqueryExpression.java | 91 -
.../plan/relational/sql/ast/SubsetDefinition.java | 104 -
.../plan/relational/sql/ast/SymbolReference.java | 98 -
.../plan/relational/sql/ast/Table.java | 100 -
.../relational/sql/ast/TableExpressionType.java | 66 -
.../relational/sql/ast/TableFunctionArgument.java | 106 -
.../sql/ast/TableFunctionInvocation.java | 106 -
.../sql/ast/TableFunctionTableArgument.java | 138 --
.../plan/relational/sql/ast/TableSubquery.java | 97 -
.../node_commons/plan/relational/sql/ast/Trim.java | 153 --
.../plan/relational/sql/ast/TypeParameter.java | 90 -
.../plan/relational/sql/ast/Union.java | 103 -
.../plan/relational/sql/ast/Values.java | 94 -
.../relational/sql/ast/VariableDefinition.java | 102 -
.../plan/relational/sql/ast/WhenClause.java | 124 --
.../plan/relational/sql/ast/Window.java | 30 -
.../plan/relational/sql/ast/WindowDefinition.java | 101 -
.../plan/relational/sql/ast/WindowFrame.java | 157 --
.../plan/relational/sql/ast/WindowReference.java | 108 -
.../relational/sql/ast/WindowSpecification.java | 224 --
.../node_commons/plan/relational/sql/ast/With.java | 111 -
.../plan/relational/sql/ast/WithQuery.java | 160 --
.../relational/sql/ast/ZeroOrMoreQuantifier.java | 43 -
.../relational/sql/ast/ZeroOrOneQuantifier.java | 43 -
.../sql/parser/CaseInsensitiveStream.java | 85 -
.../relational/sql/parser/ParsingException.java | 69 -
.../sql/util/CommonQuerySqlFormatter.java | 705 ------
.../relational/sql/util/ExpressionFormatter.java | 789 -------
.../relational/sql/util/ReservedIdentifiers.java | 84 -
.../relational/sql/util/RowPatternFormatter.java | 143 --
.../plan/relational/type/InternalTypeManager.java | 147 --
.../plan/relational/type/NamedTypeSignature.java | 79 -
.../plan/relational/type/ParameterKind.java | 27 -
.../plan/relational/type/RowFieldName.java | 63 -
.../plan/relational/type/StandardTypes.java | 55 -
.../node_commons/plan/relational/type/TypeId.java | 66 -
.../plan/relational/type/TypeManager.java | 38 -
.../relational/type/TypeNotFoundException.java | 43 -
.../plan/relational/type/TypeSignature.java | 207 --
.../relational/type/TypeSignatureParameter.java | 175 --
.../relational/type/TypeSignatureTranslator.java | 113 -
.../relational/utils/ResultColumnAppender.java | 145 --
.../plan/relational/utils/TypeUtil.java | 513 -----
.../plan/statement/component/FillPolicy.java | 33 -
.../plan/udf/BuiltinAggregationFunction.java | 142 --
.../plan/udf/BuiltinScalarFunction.java | 67 -
.../udf/BuiltinTimeSeriesGeneratingFunction.java | 180 --
.../node_commons/plan/udf/TableUDFUtils.java | 93 -
.../plan/udf/UDFManagementService.java | 296 ---
.../node_commons/plan/udf/UDTFForecast.java | 259 ---
.../commons/node_commons/utils/DateTimeUtils.java | 732 -------
.../utils/TimestampPrecisionUtils.java | 100 -
.../node_commons/utils/cte/CteDataStore.java | 109 -
.../commons/queryengine/common/ConnectionInfo.java | 57 +
.../iotdb/commons/queryengine/common/NodeRef.java | 63 +
.../commons/queryengine/common/SessionInfo.java | 196 ++
.../commons/queryengine/common/SqlDialect.java | 56 +
.../execution/MemoryEstimationHelper.java | 138 ++
.../aggregation/grouped/UpdateMemory.java | 32 +
.../grouped/hash/CombineHashFunction.java | 37 +
.../aggregation/grouped/hash/FlatGroupByHash.java | 210 ++
.../aggregation/grouped/hash/FlatHash.java | 605 ++++++
.../aggregation/grouped/hash/FlatHashStrategy.java | 55 +
.../aggregation/grouped/hash/GroupByHash.java | 61 +
.../aggregation/grouped/hash/HashStrategy.java | 225 ++
.../aggregation/grouped/hash/MarkDistinctHash.java | 90 +
.../grouped/hash/NoChannelGroupByHash.java | 72 +
.../grouped/hash/VariableWidthData.java | 197 ++
.../aggregation/grouped/hash/XxHash64.java | 276 +++
.../plan/analyze/ITableTypeProvider.java | 36 +
.../plan/expression/multi/FunctionType.java | 28 +
.../plan/node/CommonPlanNodeDeserializer.java | 141 ++
.../planner/plan/node/ICoreQueryPlanVisitor.java | 227 ++
.../planner/plan/node/IPartitionRelatedNode.java | 26 +
.../planner/plan/node/IPlanNodeDeserializer.java | 29 +
.../plan/node/IPlanNodeDeserializerProvider.java | 19 +
.../plan/planner/plan/node/IPlanVisitor.java | 24 +
.../plan/planner/plan/node/PlanNode.java | 217 ++
.../plan/planner/plan/node/PlanNodeId.java | 83 +
.../plan/planner/plan/node/PlanNodeType.java | 259 +++
.../plan/node/process/MultiChildProcessNode.java | 85 +
.../planner/plan/node/process/ProcessNode.java | 30 +
.../plan/node/process/SingleChildProcessNode.java | 92 +
.../plan/node/process/TwoChildProcessNode.java | 101 +
.../plan/planner/plan/node/source/SourceNode.java | 37 +
.../plan/planner/plan/parameter/InputLocation.java | 72 +
.../plan/relational/analyzer/NodeRef.java | 63 +
.../plan/relational/function/BoundSignature.java | 129 ++
.../plan/relational/function/FunctionId.java | 70 +
.../plan/relational/function/FunctionKind.java | 45 +
.../function/ITableFunctionAINodeService.java | 28 +
.../ITableFunctionAINodeServiceProvider.java | 25 +
.../relational/function/ITableFunctionFactory.java | 28 +
.../function/InterpretedFunctionInvoker.java | 83 +
.../function/LongVariableConstraint.java | 64 +
.../plan/relational/function/OperatorType.java | 67 +
.../function/ResolvedFunctionCallBuilder.java | 58 +
.../plan/relational/function/Signature.java | 213 ++
.../function/TableBuiltinTableFunction.java | 97 +
.../relational/function/TableFunctionFactory.java | 39 +
.../function/TypeVariableConstraint.java | 192 ++
.../function/arithmetic/AdditionResolver.java | 97 +
.../function/arithmetic/DivisionResolver.java | 81 +
.../function/arithmetic/ModulusResolver.java | 81 +
.../arithmetic/MultiplicationResolver.java | 81 +
.../function/arithmetic/SubtractionResolver.java | 89 +
.../function/tvf/ClassifyTableFunction.java | 379 ++++
.../function/tvf/ForecastTableFunction.java | 541 +++++
.../function/tvf/PatternMatchTableFunction.java | 266 +++
.../function/tvf/TableFunctionUtils.java | 74 +
.../relational/function/tvf/match/MatchConfig.java | 34 +
.../function/tvf/match/QetchAlgorithm.java | 683 ++++++
.../function/tvf/match/model/MatchState.java | 233 ++
.../function/tvf/match/model/PatternSegment.java | 285 +++
.../relational/function/tvf/match/model/Point.java | 42 +
.../function/tvf/match/model/RegexMatchState.java | 396 ++++
.../function/tvf/match/model/Section.java | 238 ++
.../plan/relational/metadata/ColumnMetadata.java | 213 ++
.../plan/relational/metadata/ColumnSchema.java | 188 ++
.../relational/metadata/FunctionNullability.java | 118 +
.../plan/relational/metadata/ResolvedFunction.java | 145 ++
.../plan/relational/metadata/TableSchema.java | 239 ++
.../plan/relational/planner/Assignments.java | 261 +++
.../planner/DataOrganizationSpecification.java | 106 +
.../plan/relational/planner/OrderingScheme.java | 137 ++
.../plan/relational/planner/SortOrder.java | 50 +
.../plan/relational/planner/Symbol.java | 100 +
.../planner/iterative/GroupReference.java | 93 +
.../relational/planner/node/AggregationNode.java | 734 +++++++
.../plan/relational/planner/node/ApplyNode.java | 247 +++
.../relational/planner/node/AssignUniqueId.java | 98 +
.../plan/relational/planner/node/CollectNode.java | 132 ++
.../planner/node/CorrelatedJoinNode.java | 171 ++
.../planner/node/EnforceSingleRowNode.java | 87 +
.../plan/relational/planner/node/ExceptNode.java | 100 +
.../plan/relational/planner/node/FillNode.java | 51 +
.../plan/relational/planner/node/FilterNode.java | 116 +
.../plan/relational/planner/node/GapFillNode.java | 231 ++
.../plan/relational/planner/node/GroupNode.java | 105 +
.../relational/planner/node/IntersectNode.java | 99 +
.../plan/relational/planner/node/JoinNode.java | 532 +++++
.../plan/relational/planner/node/LimitNode.java | 134 ++
.../relational/planner/node/LinearFillNode.java | 147 ++
.../relational/planner/node/MarkDistinctNode.java | 163 ++
.../plan/relational/planner/node/Measure.java | 95 +
.../relational/planner/node/MergeSortNode.java | 142 ++
.../plan/relational/planner/node/OffsetNode.java | 112 +
.../plan/relational/planner/node/OutputNode.java | 155 ++
.../planner/node/PatternRecognitionNode.java | 385 ++++
.../relational/planner/node/PreviousFillNode.java | 194 ++
.../plan/relational/planner/node/ProjectNode.java | 131 ++
.../relational/planner/node/RowNumberNode.java | 216 ++
.../plan/relational/planner/node/RowsPerMatch.java | 127 ++
.../plan/relational/planner/node/SemiJoinNode.java | 182 ++
.../relational/planner/node/SetOperationNode.java | 138 ++
.../relational/planner/node/SkipToPosition.java | 47 +
.../plan/relational/planner/node/SortNode.java | 132 ++
.../relational/planner/node/StreamSortNode.java | 121 ++
.../relational/planner/node/TableFunctionNode.java | 372 ++++
.../planner/node/TableFunctionProcessorNode.java | 296 +++
.../plan/relational/planner/node/TopKNode.java | 174 ++
.../relational/planner/node/TopKRankingNode.java | 209 ++
.../plan/relational/planner/node/UnionNode.java | 127 ++
.../relational/planner/node/ValueFillNode.java | 107 +
.../plan/relational/planner/node/ValuesNode.java | 237 ++
.../plan/relational/planner/node/WindowNode.java | 607 ++++++
.../planner/rowpattern/AggregationLabelSet.java | 100 +
.../rowpattern/AggregationValuePointer.java | 147 ++
.../planner/rowpattern/ClassifierValuePointer.java | 70 +
.../rowpattern/ExpressionAndValuePointers.java | 250 +++
.../planner/rowpattern/IrAlternation.java | 99 +
.../relational/planner/rowpattern/IrAnchor.java | 87 +
.../planner/rowpattern/IrConcatenation.java | 100 +
.../relational/planner/rowpattern/IrEmpty.java | 62 +
.../relational/planner/rowpattern/IrExclusion.java | 79 +
.../relational/planner/rowpattern/IrLabel.java | 85 +
.../rowpattern/IrPatternAlternationOptimizer.java | 141 ++
.../planner/rowpattern/IrPermutation.java | 96 +
.../planner/rowpattern/IrQuantified.java | 88 +
.../planner/rowpattern/IrQuantifier.java | 126 ++
.../planner/rowpattern/IrRowPattern.java | 119 +
.../planner/rowpattern/IrRowPatternFlattener.java | 206 ++
.../planner/rowpattern/IrRowPatternVisitor.java | 68 +
.../planner/rowpattern/LogicalIndexPointer.java | 154 ++
.../rowpattern/MatchNumberValuePointer.java | 45 +
.../relational/planner/rowpattern/Patterns.java | 83 +
.../planner/rowpattern/ScalarValuePointer.java | 82 +
.../planner/rowpattern/ValuePointer.java | 17 +
.../plan/relational/security/Identity.java | 51 +
.../plan/relational/sql/ast/AliasedRelation.java | 126 ++
.../plan/relational/sql/ast/AllColumns.java | 143 ++
.../plan/relational/sql/ast/AllRows.java | 76 +
.../plan/relational/sql/ast/AnchorPattern.java | 94 +
.../sql/ast/ArithmeticBinaryExpression.java | 154 ++
.../sql/ast/ArithmeticUnaryExpression.java | 155 ++
.../sql/ast/AstMemoryEstimationHelper.java | 123 ++
.../plan/relational/sql/ast/BetweenPredicate.java | 141 ++
.../plan/relational/sql/ast/BinaryLiteral.java | 156 ++
.../plan/relational/sql/ast/BooleanLiteral.java | 122 ++
.../queryengine/plan/relational/sql/ast/Cast.java | 171 ++
.../relational/sql/ast/CoalesceExpression.java | 131 ++
.../plan/relational/sql/ast/Columns.java | 107 +
.../relational/sql/ast/CommonQueryAstVisitor.java | 467 ++++
.../relational/sql/ast/ComparisonExpression.java | 225 ++
.../plan/relational/sql/ast/CurrentDatabase.java | 86 +
.../plan/relational/sql/ast/CurrentTime.java | 127 ++
.../plan/relational/sql/ast/CurrentUser.java | 86 +
.../plan/relational/sql/ast/DataType.java | 28 +
.../plan/relational/sql/ast/DataTypeParameter.java | 34 +
.../plan/relational/sql/ast/DecimalLiteral.java | 114 +
.../relational/sql/ast/DereferenceExpression.java | 164 ++
.../plan/relational/sql/ast/DoubleLiteral.java | 121 ++
.../plan/relational/sql/ast/EmptyPattern.java | 79 +
.../plan/relational/sql/ast/Except.java | 119 +
.../plan/relational/sql/ast/ExcludedPattern.java | 90 +
.../plan/relational/sql/ast/ExistsPredicate.java | 92 +
.../plan/relational/sql/ast/Expression.java | 182 ++
.../plan/relational/sql/ast/Extract.java | 150 ++
.../plan/relational/sql/ast/FieldReference.java | 91 +
.../queryengine/plan/relational/sql/ast/Fill.java | 184 ++
.../plan/relational/sql/ast/FloatLiteral.java | 117 +
.../plan/relational/sql/ast/FrameBound.java | 152 ++
.../plan/relational/sql/ast/FunctionCall.java | 358 +++
.../plan/relational/sql/ast/GenericDataType.java | 123 ++
.../plan/relational/sql/ast/GenericLiteral.java | 144 ++
.../plan/relational/sql/ast/GroupBy.java | 111 +
.../plan/relational/sql/ast/GroupingElement.java | 36 +
.../plan/relational/sql/ast/GroupingSets.java | 128 ++
.../plan/relational/sql/ast/IAstVisitor.java | 17 +
.../plan/relational/sql/ast/Identifier.java | 189 ++
.../plan/relational/sql/ast/IfExpression.java | 119 +
.../plan/relational/sql/ast/InListExpression.java | 122 ++
.../plan/relational/sql/ast/InPredicate.java | 118 +
.../plan/relational/sql/ast/Intersect.java | 103 +
.../relational/sql/ast/IsNotNullPredicate.java | 108 +
.../plan/relational/sql/ast/IsNullPredicate.java | 108 +
.../queryengine/plan/relational/sql/ast/Join.java | 178 ++
.../plan/relational/sql/ast/JoinCriteria.java | 39 +
.../plan/relational/sql/ast/JoinOn.java | 84 +
.../plan/relational/sql/ast/JoinUsing.java | 81 +
.../plan/relational/sql/ast/LikePredicate.java | 163 ++
.../queryengine/plan/relational/sql/ast/Limit.java | 107 +
.../plan/relational/sql/ast/Literal.java | 47 +
.../plan/relational/sql/ast/LogicalExpression.java | 159 ++
.../plan/relational/sql/ast/LongLiteral.java | 148 ++
.../plan/relational/sql/ast/MeasureDefinition.java | 102 +
.../plan/relational/sql/ast/NaturalJoin.java | 60 +
.../queryengine/plan/relational/sql/ast/Node.java | 82 +
.../plan/relational/sql/ast/NodeLocation.java | 68 +
.../plan/relational/sql/ast/NotExpression.java | 108 +
.../plan/relational/sql/ast/NullIfExpression.java | 99 +
.../plan/relational/sql/ast/NullLiteral.java | 92 +
.../plan/relational/sql/ast/NumericParameter.java | 99 +
.../plan/relational/sql/ast/Offset.java | 105 +
.../relational/sql/ast/OneOrMoreQuantifier.java | 43 +
.../plan/relational/sql/ast/OrderBy.java | 129 ++
.../plan/relational/sql/ast/Parameter.java | 93 +
.../relational/sql/ast/PatternAlternation.java | 92 +
.../relational/sql/ast/PatternConcatenation.java | 92 +
.../relational/sql/ast/PatternPermutation.java | 92 +
.../plan/relational/sql/ast/PatternQuantifier.java | 82 +
.../sql/ast/PatternRecognitionRelation.java | 227 ++
.../plan/relational/sql/ast/PatternVariable.java | 90 +
.../plan/relational/sql/ast/ProcessingMode.java | 88 +
.../plan/relational/sql/ast/QualifiedName.java | 247 +++
.../sql/ast/QuantifiedComparisonExpression.java | 137 ++
.../plan/relational/sql/ast/QuantifiedPattern.java | 102 +
.../queryengine/plan/relational/sql/ast/Query.java | 211 ++
.../plan/relational/sql/ast/QueryBody.java | 34 +
.../relational/sql/ast/QuerySpecification.java | 210 ++
.../plan/relational/sql/ast/RangeQuantifier.java | 107 +
.../plan/relational/sql/ast/Relation.java | 32 +
.../queryengine/plan/relational/sql/ast/Row.java | 121 ++
.../plan/relational/sql/ast/RowPattern.java | 31 +
.../relational/sql/ast/SearchedCaseExpression.java | 162 ++
.../plan/relational/sql/ast/Select.java | 110 +
.../plan/relational/sql/ast/SelectItem.java | 27 +
.../plan/relational/sql/ast/SetOperation.java | 42 +
.../relational/sql/ast/SimpleCaseExpression.java | 181 ++
.../plan/relational/sql/ast/SimpleGroupBy.java | 101 +
.../plan/relational/sql/ast/SingleColumn.java | 154 ++
.../plan/relational/sql/ast/SkipTo.java | 145 ++
.../plan/relational/sql/ast/SortItem.java | 157 ++
.../plan/relational/sql/ast/Statement.java | 68 +
.../plan/relational/sql/ast/StringLiteral.java | 123 ++
.../relational/sql/ast/SubqueryExpression.java | 91 +
.../plan/relational/sql/ast/SubsetDefinition.java | 104 +
.../plan/relational/sql/ast/SymbolReference.java | 98 +
.../queryengine/plan/relational/sql/ast/Table.java | 100 +
.../relational/sql/ast/TableExpressionType.java | 66 +
.../relational/sql/ast/TableFunctionArgument.java | 106 +
.../sql/ast/TableFunctionInvocation.java | 106 +
.../sql/ast/TableFunctionTableArgument.java | 138 ++
.../plan/relational/sql/ast/TableSubquery.java | 97 +
.../queryengine/plan/relational/sql/ast/Trim.java | 153 ++
.../plan/relational/sql/ast/TypeParameter.java | 90 +
.../queryengine/plan/relational/sql/ast/Union.java | 103 +
.../plan/relational/sql/ast/Values.java | 94 +
.../relational/sql/ast/VariableDefinition.java | 102 +
.../plan/relational/sql/ast/WhenClause.java | 124 ++
.../plan/relational/sql/ast/Window.java | 30 +
.../plan/relational/sql/ast/WindowDefinition.java | 101 +
.../plan/relational/sql/ast/WindowFrame.java | 157 ++
.../plan/relational/sql/ast/WindowReference.java | 108 +
.../relational/sql/ast/WindowSpecification.java | 224 ++
.../queryengine/plan/relational/sql/ast/With.java | 111 +
.../plan/relational/sql/ast/WithQuery.java | 160 ++
.../relational/sql/ast/ZeroOrMoreQuantifier.java | 43 +
.../relational/sql/ast/ZeroOrOneQuantifier.java | 43 +
.../sql/parser/CaseInsensitiveStream.java | 85 +
.../relational/sql/parser/ParsingException.java | 69 +
.../sql/util/CommonQuerySqlFormatter.java | 705 ++++++
.../relational/sql/util/ExpressionFormatter.java | 789 +++++++
.../relational/sql/util/ReservedIdentifiers.java | 84 +
.../relational/sql/util/RowPatternFormatter.java | 143 ++
.../plan/relational/type/InternalTypeManager.java | 147 ++
.../plan/relational/type/NamedTypeSignature.java | 79 +
.../plan/relational/type/ParameterKind.java | 27 +
.../plan/relational/type/RowFieldName.java | 63 +
.../plan/relational/type/StandardTypes.java | 55 +
.../queryengine/plan/relational/type/TypeId.java | 66 +
.../plan/relational/type/TypeManager.java | 38 +
.../relational/type/TypeNotFoundException.java | 43 +
.../plan/relational/type/TypeSignature.java | 207 ++
.../relational/type/TypeSignatureParameter.java | 175 ++
.../relational/type/TypeSignatureTranslator.java | 113 +
.../relational/utils/ResultColumnAppender.java | 145 ++
.../plan/relational/utils/TypeUtil.java | 513 +++++
.../plan/statement/component/FillPolicy.java | 33 +
.../plan/udf/BuiltinAggregationFunction.java | 142 ++
.../plan/udf/BuiltinScalarFunction.java | 67 +
.../udf/BuiltinTimeSeriesGeneratingFunction.java | 180 ++
.../queryengine/plan/udf/TableUDFUtils.java | 93 +
.../queryengine/plan/udf/UDFManagementService.java | 296 +++
.../commons/queryengine/plan/udf/UDTFForecast.java | 259 +++
.../commons/queryengine/utils/DateTimeUtils.java | 732 +++++++
.../queryengine/utils/TimestampPrecisionUtils.java | 100 +
.../queryengine/utils/cte/CteDataStore.java | 109 +
2884 files changed, 117121 insertions(+), 117119 deletions(-)
diff --git a/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java
index eca0a4e7006..6e8ce1fd7cb 100644
--- a/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java
+++ b/external-service-impl/mqtt/src/main/java/org/apache/iotdb/mqtt/MPPPublishHandler.java
@@ -20,9 +20,9 @@ package org.apache.iotdb.mqtt;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
import org.apache.iotdb.commons.conf.IoTDBConstant.ClientVersion;
-import org.apache.iotdb.commons.node_commons.common.SqlDialect;
-import org.apache.iotdb.commons.node_commons.utils.TimestampPrecisionUtils;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.queryengine.common.SqlDialect;
+import org.apache.iotdb.commons.queryengine.utils.TimestampPrecisionUtils;
import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
import org.apache.iotdb.db.auth.AuthorityChecker;
import org.apache.iotdb.db.conf.IoTDBConfig;
diff --git a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/ExceptionHandler.java b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/ExceptionHandler.java
index 055882e60b8..57d78a527dc 100644
--- a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/ExceptionHandler.java
+++ b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/ExceptionHandler.java
@@ -17,14 +17,14 @@
package org.apache.iotdb.rest.protocol.table.v1.handler;
-import org.apache.iotdb.calc_commons.exception.QueryProcessException;
+import org.apache.iotdb.calc.exception.QueryProcessException;
import org.apache.iotdb.commons.auth.AuthException;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.exception.IoTDBException;
import org.apache.iotdb.commons.exception.MetadataException;
import org.apache.iotdb.commons.exception.SemanticException;
import org.apache.iotdb.commons.exception.auth.AccessDeniedException;
-import org.apache.iotdb.commons.node_commons.plan.relational.sql.parser.ParsingException;
+import org.apache.iotdb.commons.queryengine.plan.relational.sql.parser.ParsingException;
import org.apache.iotdb.db.exception.StorageEngineException;
import org.apache.iotdb.db.exception.metadata.DatabaseNotSetException;
import org.apache.iotdb.db.exception.sql.StatementAnalyzeException;
diff --git a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/ExecuteStatementHandler.java b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/ExecuteStatementHandler.java
index 3bc5bcf5373..5ec75c0d4ce 100644
--- a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/ExecuteStatementHandler.java
+++ b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/ExecuteStatementHandler.java
@@ -17,8 +17,8 @@
package org.apache.iotdb.rest.protocol.table.v1.handler;
-import org.apache.iotdb.commons.node_commons.plan.relational.sql.ast.Query;
-import org.apache.iotdb.commons.node_commons.plan.relational.sql.ast.Statement;
+import org.apache.iotdb.commons.queryengine.plan.relational.sql.ast.Query;
+import org.apache.iotdb.commons.queryengine.plan.relational.sql.ast.Statement;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.CountDevice;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.DescribeTable;
import org.apache.iotdb.db.queryengine.plan.relational.sql.ast.Explain;
diff --git a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/QueryDataSetHandler.java b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/QueryDataSetHandler.java
index 8e1a60cb421..6aa4d028cec 100644
--- a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/QueryDataSetHandler.java
+++ b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/QueryDataSetHandler.java
@@ -18,8 +18,8 @@
package org.apache.iotdb.rest.protocol.table.v1.handler;
import org.apache.iotdb.commons.exception.IoTDBException;
-import org.apache.iotdb.commons.node_commons.plan.relational.sql.ast.Query;
-import org.apache.iotdb.commons.node_commons.plan.relational.sql.ast.Statement;
+import org.apache.iotdb.commons.queryengine.plan.relational.sql.ast.Query;
+import org.apache.iotdb.commons.queryengine.plan.relational.sql.ast.Statement;
import org.apache.iotdb.db.queryengine.common.header.DatasetHeader;
import org.apache.iotdb.db.queryengine.plan.execution.IQueryExecution;
import org.apache.iotdb.rest.protocol.model.ExecutionStatus;
diff --git a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/StatementConstructionHandler.java b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/StatementConstructionHandler.java
index 15c8f21224e..e4f9c23c69a 100644
--- a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/StatementConstructionHandler.java
+++ b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/handler/StatementConstructionHandler.java
@@ -18,8 +18,8 @@
package org.apache.iotdb.rest.protocol.table.v1.handler;
import org.apache.iotdb.commons.exception.IllegalPathException;
-import org.apache.iotdb.commons.node_commons.utils.TimestampPrecisionUtils;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.queryengine.utils.TimestampPrecisionUtils;
import org.apache.iotdb.commons.schema.table.column.TsTableColumnCategory;
import org.apache.iotdb.db.exception.WriteProcessRejectException;
import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertTabletStatement;
diff --git a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/impl/RestApiServiceImpl.java b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/impl/RestApiServiceImpl.java
index 5b6c2094b9b..cfc71323be0 100644
--- a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/impl/RestApiServiceImpl.java
+++ b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/table/v1/impl/RestApiServiceImpl.java
@@ -18,8 +18,8 @@
package org.apache.iotdb.rest.protocol.table.v1.impl;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.node_commons.common.SqlDialect;
-import org.apache.iotdb.commons.node_commons.plan.relational.sql.ast.Statement;
+import org.apache.iotdb.commons.queryengine.common.SqlDialect;
+import org.apache.iotdb.commons.queryengine.plan.relational.sql.ast.Statement;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.conf.rest.IoTDBRestServiceDescriptor;
diff --git a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v1/handler/ExceptionHandler.java b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v1/handler/ExceptionHandler.java
index 551fbf8cd99..761b01d7c6d 100644
--- a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v1/handler/ExceptionHandler.java
+++ b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v1/handler/ExceptionHandler.java
@@ -17,7 +17,7 @@
package org.apache.iotdb.rest.protocol.v1.handler;
-import org.apache.iotdb.calc_commons.exception.QueryProcessException;
+import org.apache.iotdb.calc.exception.QueryProcessException;
import org.apache.iotdb.commons.auth.AuthException;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.exception.IoTDBException;
diff --git a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v1/handler/StatementConstructionHandler.java b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v1/handler/StatementConstructionHandler.java
index 25647fdfb32..74f679ec611 100644
--- a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v1/handler/StatementConstructionHandler.java
+++ b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v1/handler/StatementConstructionHandler.java
@@ -18,7 +18,7 @@
package org.apache.iotdb.rest.protocol.v1.handler;
import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.node_commons.utils.TimestampPrecisionUtils;
+import org.apache.iotdb.commons.queryengine.utils.TimestampPrecisionUtils;
import org.apache.iotdb.commons.utils.PathUtils;
import org.apache.iotdb.db.exception.WriteProcessRejectException;
import org.apache.iotdb.db.queryengine.plan.analyze.cache.schema.DataNodeDevicePathCache;
diff --git a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/handler/ExceptionHandler.java b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/handler/ExceptionHandler.java
index 6dc1bbe3cba..2a5d1d4416a 100644
--- a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/handler/ExceptionHandler.java
+++ b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/handler/ExceptionHandler.java
@@ -17,7 +17,7 @@
package org.apache.iotdb.rest.protocol.v2.handler;
-import org.apache.iotdb.calc_commons.exception.QueryProcessException;
+import org.apache.iotdb.calc.exception.QueryProcessException;
import org.apache.iotdb.commons.auth.AuthException;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.exception.IoTDBException;
diff --git a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/handler/StatementConstructionHandler.java b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/handler/StatementConstructionHandler.java
index 6175bd91117..729517bf500 100644
--- a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/handler/StatementConstructionHandler.java
+++ b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/handler/StatementConstructionHandler.java
@@ -18,7 +18,7 @@
package org.apache.iotdb.rest.protocol.v2.handler;
import org.apache.iotdb.commons.exception.MetadataException;
-import org.apache.iotdb.commons.node_commons.utils.TimestampPrecisionUtils;
+import org.apache.iotdb.commons.queryengine.utils.TimestampPrecisionUtils;
import org.apache.iotdb.commons.utils.PathUtils;
import org.apache.iotdb.db.exception.WriteProcessRejectException;
import org.apache.iotdb.db.exception.metadata.DataTypeMismatchException;
diff --git a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/impl/RestApiServiceImpl.java b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/impl/RestApiServiceImpl.java
index 5b206179c50..e66d35617e1 100644
--- a/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/impl/RestApiServiceImpl.java
+++ b/external-service-impl/rest/src/main/java/org/apache/iotdb/rest/protocol/v2/impl/RestApiServiceImpl.java
@@ -18,8 +18,8 @@
package org.apache.iotdb.rest.protocol.v2.impl;
import org.apache.iotdb.common.rpc.thrift.TSStatus;
-import org.apache.iotdb.commons.node_commons.common.SessionInfo;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.queryengine.common.SessionInfo;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.conf.rest.IoTDBRestServiceDescriptor;
diff --git a/integration-test/pom.xml b/integration-test/pom.xml
index 072bc905caa..c61509ed2c8 100644
--- a/integration-test/pom.xml
+++ b/integration-test/pom.xml
@@ -129,6 +129,11 @@
<artifactId>node-commons</artifactId>
<version>2.0.7-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.iotdb</groupId>
+ <artifactId>calc-commons</artifactId>
+ <version>2.0.7-SNAPSHOT</version>
+ </dependency>
<dependency>
<groupId>org.apache.iotdb</groupId>
<artifactId>iotdb-thrift-commons</artifactId>
diff --git a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/EnvUtils.java b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/EnvUtils.java
index 74e5228b989..51fd05d8eaf 100644
--- a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/EnvUtils.java
+++ b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/EnvUtils.java
@@ -31,11 +31,11 @@ import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
+import static org.apache.iotdb.commons.queryengine.utils.DateTimeUtils.convertLongToDate;
import static org.apache.iotdb.consensus.ConsensusFactory.IOT_CONSENSUS;
import static org.apache.iotdb.consensus.ConsensusFactory.IOT_CONSENSUS_V2;
import static org.apache.iotdb.consensus.ConsensusFactory.RATIS_CONSENSUS;
import static org.apache.iotdb.consensus.ConsensusFactory.SIMPLE_CONSENSUS;
-import static org.apache.iotdb.commons.node_commons.utils.DateTimeUtils.convertLongToDate;
import static org.apache.iotdb.it.env.cluster.ClusterConstant.CLUSTER_CONFIGURATIONS;
import static org.apache.iotdb.it.env.cluster.ClusterConstant.DEFAULT_CONFIG_NODE_NUM;
import static org.apache.iotdb.it.env.cluster.ClusterConstant.DEFAULT_DATA_NODE_NUM;
diff --git a/integration-test/src/main/java/org/apache/iotdb/itbase/constant/BuiltinAggregationFunctionEnum.java b/integration-test/src/main/java/org/apache/iotdb/itbase/constant/BuiltinAggregationFunctionEnum.java
index 673b7bd81bf..15c8a532b2b 100644
--- a/integration-test/src/main/java/org/apache/iotdb/itbase/constant/BuiltinAggregationFunctionEnum.java
+++ b/integration-test/src/main/java/org/apache/iotdb/itbase/constant/BuiltinAggregationFunctionEnum.java
@@ -19,7 +19,7 @@
package org.apache.iotdb.itbase.constant;
-import org.apache.iotdb.commons.node_commons.plan.udf.BuiltinAggregationFunction;
+import org.apache.iotdb.commons.queryengine.plan.udf.BuiltinAggregationFunction;
import java.util.Arrays;
import java.util.HashSet;
@@ -58,11 +58,8 @@ public enum BuiltinAggregationFunctionEnum {
private static final Set<String> NATIVE_FUNCTION_NAMES =
new HashSet<>(
- Arrays.stream(
- BuiltinAggregationFunction.values())
- .map(
- BuiltinAggregationFunction
- ::getFunctionName)
+ Arrays.stream(BuiltinAggregationFunction.values())
+ .map(BuiltinAggregationFunction::getFunctionName)
.collect(Collectors.toList()));
public static Set<String> getNativeFunctionNames() {
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBTimePartitionIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBTimePartitionIT.java
index 951582bbcc2..470e68de651 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBTimePartitionIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBTimePartitionIT.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.confignode.it.partition;
+import org.apache.iotdb.calc.utils.constant.SqlConstant;
import org.apache.iotdb.commons.client.sync.SyncConfigNodeIServiceClient;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.schema.SchemaConstant;
@@ -28,7 +29,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TGetDatabaseReq;
import org.apache.iotdb.confignode.rpc.thrift.TShowDatabaseResp;
import org.apache.iotdb.consensus.ConsensusFactory;
import org.apache.iotdb.db.queryengine.plan.statement.metadata.ShowDatabaseStatement;
-import org.apache.iotdb.calc_commons.utils.constant.SqlConstant;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.ClusterIT;
diff --git a/integration-test/src/test/java/org/apache/iotdb/confignode/it/procedure/IoTDBProcedureIT.java b/integration-test/src/test/java/org/apache/iotdb/confignode/it/procedure/IoTDBProcedureIT.java
index 39d27ff2ea2..b86067eddcd 100644
--- a/integration-test/src/test/java/org/apache/iotdb/confignode/it/procedure/IoTDBProcedureIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/confignode/it/procedure/IoTDBProcedureIT.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.confignode.it.procedure;
+import org.apache.iotdb.calc.utils.constant.SqlConstant;
import org.apache.iotdb.commons.client.sync.SyncConfigNodeIServiceClient;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.schema.SchemaConstant;
@@ -28,7 +29,6 @@ import org.apache.iotdb.confignode.rpc.thrift.TGetDatabaseReq;
import org.apache.iotdb.confignode.rpc.thrift.TShowDatabaseResp;
import org.apache.iotdb.confignode.rpc.thrift.TTestOperation;
import org.apache.iotdb.db.queryengine.plan.statement.metadata.ShowDatabaseStatement;
-import org.apache.iotdb.calc_commons.utils.constant.SqlConstant;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.ClusterIT;
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiTAGsWithAttributesTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiTAGsWithAttributesTableIT.java
index 7b959696068..5e18a8468c7 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiTAGsWithAttributesTableIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiTAGsWithAttributesTableIT.java
@@ -35,12 +35,12 @@ import java.sql.Connection;
import java.sql.Statement;
import java.util.Arrays;
+import static org.apache.iotdb.commons.queryengine.plan.relational.planner.node.JoinNode.JoinType.FULL;
+import static org.apache.iotdb.commons.queryengine.plan.relational.planner.node.JoinNode.JoinType.INNER;
+import static org.apache.iotdb.commons.queryengine.plan.relational.planner.node.JoinNode.JoinType.LEFT;
+import static org.apache.iotdb.commons.queryengine.plan.relational.planner.node.JoinNode.JoinType.RIGHT;
import static org.apache.iotdb.db.it.utils.TestUtils.tableAssertTestFail;
import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
-import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode.JoinType.FULL;
-import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode.JoinType.INNER;
-import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode.JoinType.LEFT;
-import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode.JoinType.RIGHT;
import static org.junit.Assert.fail;
/** In this IT, table has more than one TAGs and Attributes. */
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/udf/IoTDBSQLFunctionManagementIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/udf/IoTDBSQLFunctionManagementIT.java
index 769567860e1..f414171cf46 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/udf/IoTDBSQLFunctionManagementIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/udf/IoTDBSQLFunctionManagementIT.java
@@ -18,9 +18,9 @@
*/
package org.apache.iotdb.relational.it.db.it.udf;
+import org.apache.iotdb.commons.queryengine.plan.relational.function.TableBuiltinTableFunction;
import org.apache.iotdb.commons.udf.builtin.relational.TableBuiltinAggregationFunction;
import org.apache.iotdb.commons.udf.builtin.relational.TableBuiltinScalarFunction;
-import org.apache.iotdb.db.queryengine.plan.relational.function.TableBuiltinTableFunction;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.TableClusterIT;
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionTableIT.java
index 132b8a03439..94a4157deb2 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionTableIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBCastFunctionTableIT.java
@@ -19,7 +19,7 @@
package org.apache.iotdb.relational.it.query.old.builtinfunction.scalar;
-import org.apache.iotdb.commons.node_commons.utils.DateTimeUtils;
+import org.apache.iotdb.commons.queryengine.utils.DateTimeUtils;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.TableClusterIT;
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBFormatFunctionTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBFormatFunctionTableIT.java
index d3ef2fb8d78..bd7aeded17f 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBFormatFunctionTableIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/builtinfunction/scalar/IoTDBFormatFunctionTableIT.java
@@ -14,7 +14,7 @@
package org.apache.iotdb.relational.it.query.old.builtinfunction.scalar;
-import org.apache.iotdb.commons.node_commons.utils.DateTimeUtils;
+import org.apache.iotdb.commons.queryengine.utils.DateTimeUtils;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.TableClusterIT;
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/query/IoTDBArithmeticTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/query/IoTDBArithmeticTableIT.java
index e9d985d733c..c4961da8222 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/query/IoTDBArithmeticTableIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/old/query/IoTDBArithmeticTableIT.java
@@ -19,7 +19,7 @@
package org.apache.iotdb.relational.it.query.old.query;
-import org.apache.iotdb.commons.node_commons.utils.DateTimeUtils;
+import org.apache.iotdb.commons.queryengine.utils.DateTimeUtils;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.TableClusterIT;
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/view/old/query/IoTDBArithmeticTableViewIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/view/old/query/IoTDBArithmeticTableViewIT.java
index d6a3817c44a..296a63cc678 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/view/old/query/IoTDBArithmeticTableViewIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/view/old/query/IoTDBArithmeticTableViewIT.java
@@ -19,7 +19,7 @@
package org.apache.iotdb.relational.it.query.view.old.query;
-import org.apache.iotdb.commons.node_commons.utils.DateTimeUtils;
+import org.apache.iotdb.commons.queryengine.utils.DateTimeUtils;
import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.TableClusterIT;
diff --git a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/AbstractDataTool.java b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/AbstractDataTool.java
index e5e2301d640..11695d786b8 100644
--- a/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/AbstractDataTool.java
+++ b/iotdb-client/cli/src/main/java/org/apache/iotdb/tool/data/AbstractDataTool.java
@@ -19,13 +19,13 @@
package org.apache.iotdb.tool.data;
-import org.apache.iotdb.calc_commons.utils.constant.SqlConstant;
+import org.apache.iotdb.calc.utils.constant.SqlConstant;
import org.apache.iotdb.cli.type.ExitType;
import org.apache.iotdb.cli.utils.CliContext;
import org.apache.iotdb.cli.utils.IoTPrinter;
import org.apache.iotdb.cli.utils.JlineUtils;
import org.apache.iotdb.commons.exception.IllegalPathException;
-import org.apache.iotdb.commons.node_commons.utils.DateTimeUtils;
+import org.apache.iotdb.commons.queryengine.utils.DateTimeUtils;
import org.apache.iotdb.commons.schema.column.ColumnHeaderConstant;
import org.apache.iotdb.commons.utils.PathUtils;
import org.apache.iotdb.exception.ArgsErrorException;
diff --git a/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticBinaryColumnTransformer.ftl b/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticBinaryColumnTransformer.ftl
index a6c20aa6b93..48beb26fedb 100644
--- a/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticBinaryColumnTransformer.ftl
+++ b/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticBinaryColumnTransformer.ftl
@@ -25,14 +25,14 @@
<#--Main Part-->
<#if (first.instance == "DATE" || first.instance == "TIMESTAMP") && (second.instance == "INT" || second.instance == "LONG")><#if operator.name == "Addition" || operator.name == "Subtraction">
-<@pp.changeOutputFile name="/org/apache/iotdb/calc_commons/transformation/dag/column/binary/${className}.java" />
+<@pp.changeOutputFile name="/org/apache/iotdb/calc/transformation/dag/column/binary/${className}.java" />
<#--Date + int || Date + long || Timestamp + int || Timestamp + long-->
<#--Date - int || Date - long || Timestamp - int || Timestamp - long-->
-package org.apache.iotdb.calc_commons.transformation.dag.column.binary;
+package org.apache.iotdb.calc.transformation.dag.column.binary;
import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
-import org.apache.iotdb.calc_commons.transformation.dag.column.ColumnTransformer;
-import org.apache.iotdb.commons.node_commons.utils.DateTimeUtils;
+import org.apache.iotdb.calc.transformation.dag.column.ColumnTransformer;
+import org.apache.iotdb.commons.queryengine.utils.DateTimeUtils;
import org.apache.tsfile.block.column.Column;
import org.apache.tsfile.block.column.ColumnBuilder;
@@ -171,12 +171,12 @@ public class ${className} extends BinaryColumnTransformer {
<#elseif (second.instance == "DATE" || second.instance =="TIMESTAMP") && (first.instance == "INT" || first.instance == "LONG")>
<#if operator.name == "Addition">
<#--int + Date || long + Date || int + Timestamp || long + Timestamp-->
-<@pp.changeOutputFile name="/org/apache/iotdb/calc_commons/transformation/dag/column/binary/${className}.java" />
-package org.apache.iotdb.calc_commons.transformation.dag.column.binary;
+<@pp.changeOutputFile name="/org/apache/iotdb/calc/transformation/dag/column/binary/${className}.java" />
+package org.apache.iotdb.calc.transformation.dag.column.binary;
import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
-import org.apache.iotdb.calc_commons.transformation.dag.column.ColumnTransformer;
-import org.apache.iotdb.commons.node_commons.utils.DateTimeUtils;
+import org.apache.iotdb.calc.transformation.dag.column.ColumnTransformer;
+import org.apache.iotdb.commons.queryengine.utils.DateTimeUtils;
import org.apache.tsfile.block.column.Column;
import org.apache.tsfile.block.column.ColumnBuilder;
@@ -276,7 +276,7 @@ public class ${className} extends BinaryColumnTransformer {
}
</#if>
<#elseif first.instance != "DATE" && first.instance != "TIMESTAMP" && second.instance != "DATE" && second.instance != "TIMESTAMP">
-<@pp.changeOutputFile name="/org/apache/iotdb/calc_commons/transformation/dag/column/binary/${className}.java" />
+<@pp.changeOutputFile name="/org/apache/iotdb/calc/transformation/dag/column/binary/${className}.java" />
<#--int、long、float、double with + - * / %-->
<#--assign resultType-->
<#if first.dataType == "double" || second.dataType == "double">
@@ -289,11 +289,11 @@ public class ${className} extends BinaryColumnTransformer {
<#assign resultType = "int" />
</#if>
<#--Parting line-->
-package org.apache.iotdb.calc_commons.transformation.dag.column.binary;
+package org.apache.iotdb.calc.transformation.dag.column.binary;
import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
import org.apache.iotdb.commons.exception.SemanticException;
-import org.apache.iotdb.calc_commons.transformation.dag.column.ColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.ColumnTransformer;
import org.apache.tsfile.block.column.Column;
import org.apache.tsfile.block.column.ColumnBuilder;
diff --git a/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticColumnTransformerApi.ftl b/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticColumnTransformerApi.ftl
index 8bd04ede4d0..f4aac11f133 100644
--- a/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticColumnTransformerApi.ftl
+++ b/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticColumnTransformerApi.ftl
@@ -18,22 +18,22 @@
*/
<@pp.dropOutputFile />
-<@pp.changeOutputFile name="/org/apache/iotdb/calc_commons/transformation/dag/column/binary/ArithmeticColumnTransformerApi.java" />
-package org.apache.iotdb.calc_commons.transformation.dag.column.binary;
+<@pp.changeOutputFile name="/org/apache/iotdb/calc/transformation/dag/column/binary/ArithmeticColumnTransformerApi.java" />
+package org.apache.iotdb.calc.transformation.dag.column.binary;
import org.apache.tsfile.read.common.type.Type;
-import org.apache.iotdb.commons.node_commons.plan.relational.function.arithmetic.AdditionResolver;
-import org.apache.iotdb.commons.node_commons.plan.relational.function.arithmetic.DivisionResolver;
-import org.apache.iotdb.commons.node_commons.plan.relational.function.arithmetic.ModulusResolver;
-import org.apache.iotdb.commons.node_commons.plan.relational.function.arithmetic.MultiplicationResolver;
-import org.apache.iotdb.commons.node_commons.plan.relational.function.arithmetic.SubtractionResolver;
-import org.apache.iotdb.calc_commons.transformation.dag.column.ColumnTransformer;
-import org.apache.iotdb.calc_commons.transformation.dag.column.unary.DoubleNegationColumnTransformer;
-import org.apache.iotdb.calc_commons.transformation.dag.column.unary.FloatNegationColumnTransformer;
-import org.apache.iotdb.calc_commons.transformation.dag.column.unary.IntNegationColumnTransformer;
-import org.apache.iotdb.calc_commons.transformation.dag.column.unary.LongNegationColumnTransformer;
-import org.apache.iotdb.calc_commons.transformation.dag.column.unary.TimestampNegationColumnTransformer;
+import org.apache.iotdb.commons.queryengine.plan.relational.function.arithmetic.AdditionResolver;
+import org.apache.iotdb.commons.queryengine.plan.relational.function.arithmetic.DivisionResolver;
+import org.apache.iotdb.commons.queryengine.plan.relational.function.arithmetic.ModulusResolver;
+import org.apache.iotdb.commons.queryengine.plan.relational.function.arithmetic.MultiplicationResolver;
+import org.apache.iotdb.commons.queryengine.plan.relational.function.arithmetic.SubtractionResolver;
+import org.apache.iotdb.calc.transformation.dag.column.ColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.unary.DoubleNegationColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.unary.FloatNegationColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.unary.IntNegationColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.unary.LongNegationColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.unary.TimestampNegationColumnTransformer;
import java.time.ZoneId;
import java.util.Arrays;
diff --git a/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticUnaryColumnTransformer.ftl b/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticUnaryColumnTransformer.ftl
index 22543780267..1c71ecb7690 100644
--- a/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticUnaryColumnTransformer.ftl
+++ b/iotdb-core/calc-commons/src/main/codegen/templates/ArithmeticUnaryColumnTransformer.ftl
@@ -22,11 +22,11 @@
<#assign newType = type.type?replace("Type","")>
<#assign className = "${newType}NegationColumnTransformer">
<#if newType != "Date">
- <@pp.changeOutputFile name="/org/apache/iotdb/calc_commons/transformation/dag/column/unary/${className}.java" />
-package org.apache.iotdb.calc_commons.transformation.dag.column.unary;
+ <@pp.changeOutputFile name="/org/apache/iotdb/calc/transformation/dag/column/unary/${className}.java" />
+package org.apache.iotdb.calc.transformation.dag.column.unary;
import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
-import org.apache.iotdb.calc_commons.transformation.dag.column.ColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.ColumnTransformer;
import org.apache.tsfile.block.column.Column;
import org.apache.tsfile.block.column.ColumnBuilder;
diff --git a/iotdb-core/calc-commons/src/main/codegen/templates/ModeAccumulator.ftl b/iotdb-core/calc-commons/src/main/codegen/templates/ModeAccumulator.ftl
index cdd2381331d..c881219a97c 100644
--- a/iotdb-core/calc-commons/src/main/codegen/templates/ModeAccumulator.ftl
+++ b/iotdb-core/calc-commons/src/main/codegen/templates/ModeAccumulator.ftl
@@ -21,9 +21,9 @@
<#list allDataTypes.types as type>
<#assign className = "${type.dataType?cap_first}ModeAccumulator">
- <@pp.changeOutputFile name="/org/apache/iotdb/calc_commons/execution/aggregation/${className}.java" />
+ <@pp.changeOutputFile name="/org/apache/iotdb/calc/execution/aggregation/${className}.java" />
-package org.apache.iotdb.calc_commons.execution.aggregation;
+package org.apache.iotdb.calc.execution.aggregation;
import com.google.common.collect.ImmutableList;
import org.apache.iotdb.commons.conf.CommonDescriptor;
diff --git a/iotdb-core/calc-commons/src/main/codegen/templates/constantFill.ftl b/iotdb-core/calc-commons/src/main/codegen/templates/constantFill.ftl
index 67083df1274..88d01849ba9 100644
--- a/iotdb-core/calc-commons/src/main/codegen/templates/constantFill.ftl
+++ b/iotdb-core/calc-commons/src/main/codegen/templates/constantFill.ftl
@@ -20,10 +20,10 @@
<#list allDataTypes.types as type>
<#assign className = "${type.dataType?cap_first}ConstantFill">
- <@pp.changeOutputFile name="/org/apache/iotdb/calc_commons/execution/operator/process/fill/constant/${className}.java" />
-package org.apache.iotdb.calc_commons.execution.operator.process.fill.constant;
+ <@pp.changeOutputFile name="/org/apache/iotdb/calc/execution/operator/process/fill/constant/${className}.java" />
+package org.apache.iotdb.calc.execution.operator.process.fill.constant;
-import org.apache.iotdb.calc_commons.execution.operator.process.fill.IFill;
+import org.apache.iotdb.calc.execution.operator.process.fill.IFill;
import org.apache.tsfile.read.common.block.column.${type.column};
import org.apache.tsfile.block.column.Column;
import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
diff --git a/iotdb-core/calc-commons/src/main/codegen/templates/linearFill.ftl b/iotdb-core/calc-commons/src/main/codegen/templates/linearFill.ftl
index 9d2bad3412d..301708018b6 100644
--- a/iotdb-core/calc-commons/src/main/codegen/templates/linearFill.ftl
+++ b/iotdb-core/calc-commons/src/main/codegen/templates/linearFill.ftl
@@ -21,8 +21,8 @@
<#list decimalDataTypes.types as type>
<#assign className = "${type.dataType?cap_first}LinearFill">
- <@pp.changeOutputFile name="/org/apache/iotdb/calc_commons/execution/operator/process/fill/linear/${className}.java" />
-package org.apache.iotdb.calc_commons.execution.operator.process.fill.linear;
+ <@pp.changeOutputFile name="/org/apache/iotdb/calc/execution/operator/process/fill/linear/${className}.java" />
+package org.apache.iotdb.calc.execution.operator.process.fill.linear;
import org.apache.tsfile.block.column.Column;
import org.apache.tsfile.read.common.block.column.${type.column};
diff --git a/iotdb-core/calc-commons/src/main/codegen/templates/previousFill.ftl b/iotdb-core/calc-commons/src/main/codegen/templates/previousFill.ftl
index 93a2c2cf960..e15f0893540 100644
--- a/iotdb-core/calc-commons/src/main/codegen/templates/previousFill.ftl
+++ b/iotdb-core/calc-commons/src/main/codegen/templates/previousFill.ftl
@@ -21,10 +21,10 @@
<#list allDataTypes.types as type>
<#assign className = "${type.dataType?cap_first}PreviousFill">
- <@pp.changeOutputFile name="/org/apache/iotdb/calc_commons/execution/operator/process/fill/previous/${className}.java" />
-package org.apache.iotdb.calc_commons.execution.operator.process.fill.previous;
+ <@pp.changeOutputFile name="/org/apache/iotdb/calc/execution/operator/process/fill/previous/${className}.java" />
+package org.apache.iotdb.calc.execution.operator.process.fill.previous;
-import org.apache.iotdb.calc_commons.execution.operator.process.fill.IFill;
+import org.apache.iotdb.calc.execution.operator.process.fill.IFill;
import org.apache.tsfile.block.column.Column;
import org.apache.tsfile.read.common.block.column.${type.column};
import org.apache.tsfile.read.common.block.column.${type.column}Builder;
diff --git a/iotdb-core/calc-commons/src/main/codegen/templates/previousFillWithTimeDuration.ftl b/iotdb-core/calc-commons/src/main/codegen/templates/previousFillWithTimeDuration.ftl
index 149443bba02..22b0ff91efa 100644
--- a/iotdb-core/calc-commons/src/main/codegen/templates/previousFillWithTimeDuration.ftl
+++ b/iotdb-core/calc-commons/src/main/codegen/templates/previousFillWithTimeDuration.ftl
@@ -21,11 +21,11 @@
<#list allDataTypes.types as type>
<#assign className = "${type.dataType?cap_first}PreviousFillWithTimeDuration">
- <@pp.changeOutputFile name="/org/apache/iotdb/calc_commons/execution/operator/process/fill/previous/${className}.java" />
-package org.apache.iotdb.calc_commons.execution.operator.process.fill.previous;
+ <@pp.changeOutputFile name="/org/apache/iotdb/calc/execution/operator/process/fill/previous/${className}.java" />
+package org.apache.iotdb.calc.execution.operator.process.fill.previous;
-import org.apache.iotdb.calc_commons.execution.operator.process.fill.IFill;
-import org.apache.iotdb.calc_commons.execution.operator.process.fill.IFillFilter;
+import org.apache.iotdb.calc.execution.operator.process.fill.IFill;
+import org.apache.iotdb.calc.execution.operator.process.fill.IFillFilter;
import org.apache.tsfile.block.column.Column;
import org.apache.tsfile.read.common.block.column.${type.column};
import org.apache.tsfile.read.common.block.column.${type.column}Builder;
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/exception/MemoryNotEnoughException.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/exception/MemoryNotEnoughException.java
new file mode 100644
index 00000000000..1a2924916de
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/exception/MemoryNotEnoughException.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.exception;
+
+import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
+
+import static org.apache.iotdb.rpc.TSStatusCode.QUERY_EXECUTION_MEMORY_NOT_ENOUGH;
+
+public class MemoryNotEnoughException extends IoTDBRuntimeException {
+
+ public MemoryNotEnoughException(String message) {
+ super(message, QUERY_EXECUTION_MEMORY_NOT_ENOUGH.getStatusCode());
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/exception/QueryProcessException.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/exception/QueryProcessException.java
new file mode 100644
index 00000000000..3d9753c4275
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/exception/QueryProcessException.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.exception;
+
+import org.apache.iotdb.commons.exception.IoTDBException;
+import org.apache.iotdb.commons.exception.IoTDBRuntimeException;
+import org.apache.iotdb.rpc.TSStatusCode;
+
+public class QueryProcessException extends IoTDBException {
+
+ private static final long serialVersionUID = -683191083844850054L;
+
+ public QueryProcessException(String message) {
+ super(message, TSStatusCode.QUERY_PROCESS_ERROR.getStatusCode());
+ }
+
+ public QueryProcessException(String message, int errorCode) {
+ super(message, errorCode);
+ }
+
+ public QueryProcessException(IoTDBException e) {
+ super(e, e.getErrorCode(), e.isUserException());
+ }
+
+ public QueryProcessException(IoTDBRuntimeException e) {
+ super(e, e.getErrorCode(), e.isUserException());
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/aggregation/Accumulator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/aggregation/Accumulator.java
new file mode 100644
index 00000000000..38b0c535393
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/aggregation/Accumulator.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.aggregation;
+
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.block.column.ColumnBuilder;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.metadata.statistics.Statistics;
+import org.apache.tsfile.utils.BitMap;
+
+public interface Accumulator {
+
+ /**
+ * Column should be like: |Time | Value |
+ *
+ * <p>IgnoringNull is required when considering the row where the value of controlColumn is null
+ *
+ * <p>bitMap is required for group-by framework. When needed(eq. controlColumn is null), bitMap
+ * can guide accumulator to skip some rows
+ */
+ void addInput(Column[] columns, BitMap bitMap);
+
+ /**
+ * Sliding window constantly add and remove partial result in the window. Aggregation functions
+ * need to implement this method to support sliding window feature.
+ */
+ default void removeIntermediate(Column[] partialResult) {
+ throw new UnsupportedOperationException(
+ "This type of accumulator does not support remove input!");
+ }
+
+ /**
+ * For aggregation function like COUNT, SUM, partialResult should be single; But for AVG,
+ * last_value, it should be double column with dictionary order.
+ */
+ void addIntermediate(Column[] partialResult);
+
+ /**
+ * This method can only be used in seriesAggregateScanOperator, it will use different statistics
+ * based on the type of Accumulator.
+ */
+ void addStatistics(Statistics statistics);
+
+ /**
+ * Attention: setFinal should be invoked only once, and addInput() and addIntermediate() are not
+ * allowed again.
+ */
+ void setFinal(Column finalResult);
+
+ /**
+ * For aggregation function like COUNT, SUM, partialResult should be single, so its output column
+ * is single too; But for AVG(COUNT and SUM), LAST_VALUE(LAST_VALUE and MAX_TIME), the output
+ * columns should be double in dictionary order.
+ */
+ void outputIntermediate(ColumnBuilder[] tsBlockBuilder);
+
+ /** Final result is single column for any aggregation function. */
+ void outputFinal(ColumnBuilder tsBlockBuilder);
+
+ void reset();
+
+ /**
+ * This method can only be used in seriesAggregateScanOperator. For first_value or last_value in
+ * decreasing order, we can get final result by the first record.
+ */
+ boolean hasFinalResult();
+
+ TSDataType[] getIntermediateType();
+
+ TSDataType getFinalType();
+
+ /**
+ * The return value equals to the length of tsBlockBuilder in {@link
+ * #outputIntermediate(ColumnBuilder[])}}. Currently only aggregation `Avg, FirstValue, LastValue,
+ * TimeDuration` will return 2.
+ */
+ default int getPartialResultSize() {
+ return 1;
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/aggregation/VarianceAccumulator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/aggregation/VarianceAccumulator.java
new file mode 100644
index 00000000000..48972749c3a
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/aggregation/VarianceAccumulator.java
@@ -0,0 +1,282 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.aggregation;
+
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.block.column.ColumnBuilder;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.file.metadata.statistics.Statistics;
+import org.apache.tsfile.utils.Binary;
+import org.apache.tsfile.utils.BitMap;
+import org.apache.tsfile.utils.BytesUtils;
+import org.apache.tsfile.write.UnSupportedDataTypeException;
+
+import java.util.Arrays;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+public class VarianceAccumulator implements Accumulator {
+ public enum VarianceType {
+ STDDEV_POP,
+ STDDEV_SAMP,
+ VAR_POP,
+ VAR_SAMP,
+ }
+
+ private final TSDataType seriesDataType;
+
+ private final VarianceType varianceType;
+
+ private long count;
+ private double mean;
+ private double m2;
+
+ public VarianceAccumulator(TSDataType seriesDataType, VarianceType varianceType) {
+ this.seriesDataType = seriesDataType;
+ this.varianceType = varianceType;
+ }
+
+ @Override
+ public void addInput(Column[] columns, BitMap bitMap) {
+ switch (seriesDataType) {
+ case INT32:
+ addIntInput(columns, bitMap);
+ return;
+ case INT64:
+ addLongInput(columns, bitMap);
+ return;
+ case FLOAT:
+ addFloatInput(columns, bitMap);
+ return;
+ case DOUBLE:
+ addDoubleInput(columns, bitMap);
+ return;
+ case TEXT:
+ case BLOB:
+ case OBJECT:
+ case BOOLEAN:
+ case DATE:
+ case STRING:
+ case TIMESTAMP:
+ default:
+ throw new UnSupportedDataTypeException(
+ String.format("Unsupported data type in aggregation variance : %s", seriesDataType));
+ }
+ }
+
+ @Override
+ public void addIntermediate(Column[] partialResult) {
+ checkArgument(partialResult.length == 1, "partialResult of variance should be 1");
+ if (partialResult[0].isNull(0)) {
+ return;
+ }
+ byte[] bytes = partialResult[0].getBinary(0).getValues();
+ long intermediateCount = BytesUtils.bytesToLong(bytes, Long.BYTES);
+ double intermediateMean = BytesUtils.bytesToDouble(bytes, Long.BYTES);
+ double intermediateM2 = BytesUtils.bytesToDouble(bytes, (Long.BYTES + Double.BYTES));
+
+ long newCount = count + intermediateCount;
+ double newMean = ((intermediateCount * intermediateMean) + (count * mean)) / newCount;
+ double delta = intermediateMean - mean;
+
+ m2 = m2 + intermediateM2 + delta * delta * intermediateCount * count / newCount;
+ count = newCount;
+ mean = newMean;
+ }
+
+ @Override
+ public void removeIntermediate(Column[] input) {
+ checkArgument(input.length == 1, "Input of variance should be 1");
+ if (input[0].isNull(0)) {
+ return;
+ }
+ // Deserialize
+ byte[] bytes = input[0].getBinary(0).getValues();
+ long intermediateCount = BytesUtils.bytesToLong(bytes, Long.BYTES);
+ double intermediateMean = BytesUtils.bytesToDouble(bytes, Long.BYTES);
+ double intermediateM2 = BytesUtils.bytesToDouble(bytes, (Long.BYTES + Double.BYTES));
+ // Remove from state
+ long newCount = count - intermediateCount;
+ double newMean = ((count * mean) - (intermediateCount * intermediateMean)) / newCount;
+ double delta = intermediateMean - mean;
+
+ m2 = m2 - intermediateM2 - delta * delta * intermediateCount * count / newCount;
+ count = newCount;
+ mean = newMean;
+ }
+
+ @Override
+ public void addStatistics(Statistics statistics) {
+ throw new UnsupportedOperationException(getClass().getName());
+ }
+
+ @Override
+ public void setFinal(Column finalResult) {
+ reset();
+ if (finalResult.isNull(0)) {
+ return;
+ }
+ count = 1;
+ double value = finalResult.getDouble(0);
+ mean = value;
+ m2 = value * value;
+ }
+
+ @Override
+ public void outputIntermediate(ColumnBuilder[] columnBuilders) {
+ checkArgument(columnBuilders.length == 1, "partialResult of variance should be 1");
+ if (count == 0) {
+ columnBuilders[0].appendNull();
+ } else {
+ byte[] bytes = serialize();
+ columnBuilders[0].writeBinary(new Binary(bytes));
+ }
+ }
+
+ private byte[] serialize() {
+ byte[] countBytes = BytesUtils.longToBytes(count);
+ byte[] meanBytes = BytesUtils.doubleToBytes(mean);
+ byte[] m2Bytes = BytesUtils.doubleToBytes(m2);
+
+ return BytesUtils.concatByteArrayList(Arrays.asList(countBytes, meanBytes, m2Bytes));
+ }
+
+ @Override
+ public void outputFinal(ColumnBuilder columnBuilder) {
+ switch (varianceType) {
+ case STDDEV_POP:
+ if (count == 0) {
+ columnBuilder.appendNull();
+ } else {
+ columnBuilder.writeDouble(Math.sqrt(m2 / count));
+ }
+ break;
+ case STDDEV_SAMP:
+ if (count < 2) {
+ columnBuilder.appendNull();
+ } else {
+ columnBuilder.writeDouble(Math.sqrt(m2 / (count - 1)));
+ }
+ break;
+ case VAR_POP:
+ if (count == 0) {
+ columnBuilder.appendNull();
+ } else {
+ columnBuilder.writeDouble(m2 / count);
+ }
+ break;
+ case VAR_SAMP:
+ if (count < 2) {
+ columnBuilder.appendNull();
+ } else {
+ columnBuilder.writeDouble(m2 / (count - 1));
+ }
+ break;
+ default:
+ throw new EnumConstantNotPresentException(VarianceType.class, varianceType.name());
+ }
+ }
+
+ @Override
+ public void reset() {
+ count = 0;
+ mean = 0.0;
+ m2 = 0.0;
+ }
+
+ @Override
+ public boolean hasFinalResult() {
+ return false;
+ }
+
+ @Override
+ public TSDataType[] getIntermediateType() {
+ return new TSDataType[] {TSDataType.TEXT};
+ }
+
+ @Override
+ public TSDataType getFinalType() {
+ return TSDataType.DOUBLE;
+ }
+
+ private void addIntInput(Column[] columns, BitMap bitmap) {
+ int size = columns[0].getPositionCount();
+ for (int i = 0; i < size; i++) {
+ if (bitmap != null && !bitmap.isMarked(i)) {
+ continue;
+ }
+ if (!columns[1].isNull(i)) {
+ int value = columns[1].getInt(i);
+ count++;
+ double delta = value - mean;
+ mean += delta / count;
+ m2 += delta * (value - mean);
+ }
+ }
+ }
+
+ private void addLongInput(Column[] columns, BitMap bitmap) {
+ int size = columns[0].getPositionCount();
+ for (int i = 0; i < size; i++) {
+ if (bitmap != null && !bitmap.isMarked(i)) {
+ continue;
+ }
+ if (!columns[1].isNull(i)) {
+ long value = columns[1].getLong(i);
+ count++;
+ double delta = value - mean;
+ mean += delta / count;
+ m2 += delta * (value - mean);
+ }
+ }
+ }
+
+ private void addFloatInput(Column[] columns, BitMap bitmap) {
+ int size = columns[0].getPositionCount();
+ for (int i = 0; i < size; i++) {
+ if (bitmap != null && !bitmap.isMarked(i)) {
+ continue;
+ }
+ if (!columns[1].isNull(i)) {
+ float value = columns[1].getFloat(i);
+ count++;
+ double delta = value - mean;
+ mean += delta / count;
+ m2 += delta * (value - mean);
+ }
+ }
+ }
+
+ private void addDoubleInput(Column[] columns, BitMap bitmap) {
+ int size = columns[0].getPositionCount();
+ for (int i = 0; i < size; i++) {
+ if (bitmap != null && !bitmap.isMarked(i)) {
+ continue;
+ }
+ if (!columns[1].isNull(i)) {
+ double value = columns[1].getDouble(i);
+ count++;
+ double delta = value - mean;
+ mean += delta / count;
+ m2 += delta * (value - mean);
+ }
+ }
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/AbstractOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/AbstractOperator.java
new file mode 100644
index 00000000000..cc09d7fe971
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/AbstractOperator.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public abstract class AbstractOperator implements Operator {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AbstractOperator.class);
+ protected CommonOperatorContext operatorContext;
+
+ protected long maxReturnSize =
+ TSFileDescriptor.getInstance().getConfig().getMaxTsBlockSizeInBytes();
+ protected int maxTupleSizeOfTsBlock = -1;
+ protected TsBlock resultTsBlock;
+ protected TsBlock retainedTsBlock;
+ protected int startOffset = 0;
+
+ public void initializeMaxTsBlockLength(TsBlock tsBlock) {
+ if (maxTupleSizeOfTsBlock != -1) {
+ return;
+ }
+ // oneTupleSize should be greater than 0 to avoid division by zero
+ long oneTupleSize =
+ Math.max(
+ 1,
+ (tsBlock.getSizeInBytes() - tsBlock.getTotalInstanceSize())
+ / tsBlock.getPositionCount());
+ if (oneTupleSize > maxReturnSize) {
+ // make sure at least one-tuple-at-a-time
+ this.maxTupleSizeOfTsBlock = 1;
+ LOGGER.warn(
+ "Only one tuple can be sent each time caused by limited memory, oneTupleSize: {}B, maxReturnSize: {}B",
+ oneTupleSize,
+ maxReturnSize);
+ } else {
+ this.maxTupleSizeOfTsBlock = (int) (maxReturnSize / oneTupleSize);
+ }
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("maxTupleSizeOfTsBlock is:{}", maxTupleSizeOfTsBlock);
+ }
+ }
+
+ public TsBlock checkTsBlockSizeAndGetResult() {
+ if (resultTsBlock == null) {
+ throw new IllegalArgumentException("Result tsBlock cannot be null");
+ } else if (resultTsBlock.isEmpty()) {
+ TsBlock res = resultTsBlock;
+ resultTsBlock = null;
+ return res;
+ }
+ if (maxTupleSizeOfTsBlock == -1) {
+ initializeMaxTsBlockLength(resultTsBlock);
+ }
+
+ if (resultTsBlock.getPositionCount() <= maxTupleSizeOfTsBlock) {
+ TsBlock res = resultTsBlock;
+ resultTsBlock = null;
+ return res;
+ } else {
+ retainedTsBlock = resultTsBlock;
+ resultTsBlock = null;
+ return getResultFromRetainedTsBlock();
+ }
+ }
+
+ public TsBlock getResultFromRetainedTsBlock() {
+ TsBlock res;
+ if (maxTupleSizeOfTsBlock == -1) {
+ initializeMaxTsBlockLength(retainedTsBlock);
+ }
+ if (retainedTsBlock.getPositionCount() - startOffset <= maxTupleSizeOfTsBlock) {
+ res = retainedTsBlock.subTsBlock(startOffset);
+ retainedTsBlock = null;
+ startOffset = 0;
+ } else {
+ res = retainedTsBlock.getRegion(startOffset, maxTupleSizeOfTsBlock);
+ startOffset += maxTupleSizeOfTsBlock;
+ }
+ if (LOGGER.isDebugEnabled()) {
+ LOGGER.debug("Current tsBlock size is : {}", res.getRetainedSizeInBytes());
+ }
+ return res;
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/CommonOperatorContext.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/CommonOperatorContext.java
new file mode 100644
index 00000000000..2c99fa5d777
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/CommonOperatorContext.java
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+import org.apache.iotdb.calc.plan.planner.memory.MemoryReservationManager;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
+import org.apache.iotdb.commons.queryengine.plan.planner.plan.node.PlanNodeId;
+import org.apache.iotdb.commons.utils.TestOnly;
+
+import io.airlift.units.Duration;
+import org.apache.tsfile.utils.Accountable;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Contains common information about {@link Operator} execution.
+ *
+ * <p>Not thread-safe.
+ */
+public abstract class CommonOperatorContext implements Accountable {
+
+ protected static Duration maxRunTime =
+ new Duration(
+ CommonDescriptor.getInstance().getConfig().getDriverTaskExecutionTimeSliceInMs(),
+ TimeUnit.MILLISECONDS);
+
+ protected final int operatorId;
+ // It seems it's never used.
+ protected final PlanNodeId planNodeId;
+ protected String operatorType;
+
+ protected long totalExecutionTimeInNanos = 0L;
+ protected long nextCalledCount = 0L;
+ protected long hasNextCalledCount = 0L;
+
+ // SpecifiedInfo is used to record some custom information for the operator,
+ // which will be shown in the result of EXPLAIN ANALYZE to analyze the query.
+ protected final Map<String, Object> specifiedInfo = new ConcurrentHashMap<>();
+ protected long output = 0;
+ protected long estimatedMemorySize;
+
+ protected CommonOperatorContext(int operatorId, PlanNodeId planNodeId, String operatorType) {
+ this.operatorId = operatorId;
+ this.planNodeId = planNodeId;
+ this.operatorType = operatorType;
+ }
+
+ public int getOperatorId() {
+ return operatorId;
+ }
+
+ public String getOperatorType() {
+ return operatorType;
+ }
+
+ public void setOperatorType(String operatorType) {
+ this.operatorType = operatorType;
+ }
+
+ public static Duration getMaxRunTime() {
+ return maxRunTime;
+ }
+
+ @TestOnly
+ public Duration getMaxRunTimeForTest() {
+ return maxRunTime;
+ }
+
+ public static void setMaxRunTime(Duration maxRunTime) {
+ CommonOperatorContext.maxRunTime = maxRunTime;
+ }
+
+ public PlanNodeId getPlanNodeId() {
+ return planNodeId;
+ }
+
+ public abstract MemoryReservationManager getMemoryReservationContext();
+
+ public abstract int getFragmentId();
+
+ public abstract int getPipelineId();
+
+ public void recordExecutionTime(long executionTimeInNanos) {
+ this.totalExecutionTimeInNanos += executionTimeInNanos;
+ }
+
+ public void recordNextCalled() {
+ this.nextCalledCount++;
+ }
+
+ public void recordHasNextCalled() {
+ this.hasNextCalledCount++;
+ }
+
+ public long getTotalExecutionTimeInNanos() {
+ return totalExecutionTimeInNanos;
+ }
+
+ public long getNextCalledCount() {
+ return nextCalledCount;
+ }
+
+ public long getHasNextCalledCount() {
+ return hasNextCalledCount;
+ }
+
+ public void setEstimatedMemorySize(long estimatedMemorySize) {
+ this.estimatedMemorySize = estimatedMemorySize;
+ }
+
+ public long getEstimatedMemorySize() {
+ return estimatedMemorySize;
+ }
+
+ public void addOutputRows(long outputRows) {
+ this.output += outputRows;
+ }
+
+ public long getOutputRows() {
+ return output;
+ }
+
+ public void recordSpecifiedInfo(String key, String value) {
+ specifiedInfo.put(key, value);
+ }
+
+ public Map<String, Object> getSpecifiedInfo() {
+ return specifiedInfo;
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/GroupedTopNBuilder.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/GroupedTopNBuilder.java
new file mode 100644
index 00000000000..79118650766
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/GroupedTopNBuilder.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+import org.apache.tsfile.read.common.block.TsBlock;
+
+import java.util.Iterator;
+
+public interface GroupedTopNBuilder {
+ void addTsBlock(TsBlock tsBlock);
+
+ Iterator<TsBlock> getResult();
+
+ long getEstimatedSizeInBytes();
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/GroupedTopNRowNumberAccumulator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/GroupedTopNRowNumberAccumulator.java
new file mode 100644
index 00000000000..284e325ff5a
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/GroupedTopNRowNumberAccumulator.java
@@ -0,0 +1,483 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+import org.apache.iotdb.calc.execution.operator.source.relational.aggregation.grouped.array.LongBigArray;
+import org.apache.iotdb.calc.execution.operator.source.relational.aggregation.grouped.array.LongBigArrayFIFOQueue;
+import org.apache.iotdb.calc.utils.HeapTraversal;
+
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.function.LongConsumer;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Verify.verify;
+import static java.util.Objects.requireNonNull;
+
+public class GroupedTopNRowNumberAccumulator {
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(GroupedTopNRowNumberAccumulator.class);
+ private static final long UNKNOWN_INDEX = -1;
+
+ private final GroupIdToHeapBuffer groupIdToHeapBuffer = new GroupIdToHeapBuffer();
+ private final HeapNodeBuffer heapNodeBuffer = new HeapNodeBuffer();
+ private final HeapTraversal heapTraversal = new HeapTraversal();
+
+ private final RowIdComparisonStrategy strategy;
+ private final int topN;
+ private final LongConsumer rowIdEvictionListener;
+
+ public GroupedTopNRowNumberAccumulator(
+ RowIdComparisonStrategy strategy, int topN, LongConsumer rowIdEvictionListener) {
+ this.strategy = requireNonNull(strategy, "strategy is null");
+ checkArgument(topN > 0, "topN must be greater than zero");
+ this.topN = topN;
+ this.rowIdEvictionListener =
+ requireNonNull(rowIdEvictionListener, "rowIdEvictionListener is null");
+ }
+
+ public long sizeOf() {
+ return INSTANCE_SIZE
+ + groupIdToHeapBuffer.sizeOf()
+ + heapNodeBuffer.sizeOf()
+ + heapTraversal.sizeOf();
+ }
+
+ public int findFirstPositionToAdd(
+ TsBlock newTsBlock,
+ int groupCount,
+ int[] groupIds,
+ TsBlockWithPositionComparator comparator,
+ RowReferenceTsBlockManager tsBlockManager) {
+ int currentTotalGroups = groupIdToHeapBuffer.getTotalGroups();
+ groupIdToHeapBuffer.allocateGroupIfNeeded(groupCount);
+
+ for (int position = 0; position < newTsBlock.getPositionCount(); position++) {
+ int groupId = groupIds[position];
+ if (groupId >= currentTotalGroups || calculateRootRowNumber(groupId) < topN) {
+ return position;
+ }
+ long heapRootNodeIndex = groupIdToHeapBuffer.getHeapRootNodeIndex(groupId);
+ if (heapRootNodeIndex == UNKNOWN_INDEX) {
+ return position;
+ }
+ long rowId = heapNodeBuffer.getRowId(heapRootNodeIndex);
+ TsBlock rightTsBlock = tsBlockManager.getTsBlock(rowId);
+ int rightPosition = tsBlockManager.getPosition(rowId);
+ if (comparator.compareTo(newTsBlock, position, rightTsBlock, rightPosition) < 0) {
+ return position;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Add the specified row to this accumulator.
+ *
+ * <p>This may trigger row eviction callbacks if other rows have to be evicted to make space.
+ *
+ * @return true if this row was incorporated, false otherwise
+ */
+ public boolean add(int groupId, RowReference rowReference) {
+ groupIdToHeapBuffer.allocateGroupIfNeeded(groupId);
+
+ long heapRootNodeIndex = groupIdToHeapBuffer.getHeapRootNodeIndex(groupId);
+ if (heapRootNodeIndex == UNKNOWN_INDEX || calculateRootRowNumber(groupId) < topN) {
+ heapInsert(groupId, rowReference.allocateRowId());
+ return true;
+ }
+ if (rowReference.compareTo(strategy, heapNodeBuffer.getRowId(heapRootNodeIndex)) < 0) {
+ heapPopAndInsert(groupId, rowReference.allocateRowId(), rowIdEvictionListener);
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Drain the contents of groupId from this accumulator to the provided output row ID buffer.
+ *
+ * <p>Rows will be presented in increasing rank order. Draining will not trigger any row eviction
+ * callbacks. After this method completion, the Accumulator will contain zero rows for the
+ * specified groupId.
+ *
+ * @return number of rows deposited to the output buffer
+ */
+ public long drainTo(int groupId, LongBigArray rowIdOutput) {
+ long heapSize = groupIdToHeapBuffer.getHeapSize(groupId);
+ rowIdOutput.ensureCapacity(heapSize);
+ // Heap is inverted to output order, so insert back to front
+ for (long i = heapSize - 1; i >= 0; i--) {
+ rowIdOutput.set(i, peekRootRowId(groupId));
+ // No eviction listener needed because this is an explicit caller directive to extract data
+ heapPop(groupId, null);
+ }
+ return heapSize;
+ }
+
+ private long calculateRootRowNumber(int groupId) {
+ return groupIdToHeapBuffer.getHeapSize(groupId);
+ }
+
+ private long peekRootRowId(int groupId) {
+ long heapRootNodeIndex = groupIdToHeapBuffer.getHeapRootNodeIndex(groupId);
+ checkArgument(heapRootNodeIndex != UNKNOWN_INDEX, "No root to peek");
+ return heapNodeBuffer.getRowId(heapRootNodeIndex);
+ }
+
+ private long getChildIndex(long heapNodeIndex, HeapTraversal.Child child) {
+ return child == HeapTraversal.Child.LEFT
+ ? heapNodeBuffer.getLeftChildHeapIndex(heapNodeIndex)
+ : heapNodeBuffer.getRightChildHeapIndex(heapNodeIndex);
+ }
+
+ private void setChildIndex(long heapNodeIndex, HeapTraversal.Child child, long newChildIndex) {
+ if (child == HeapTraversal.Child.LEFT) {
+ heapNodeBuffer.setLeftChildHeapIndex(heapNodeIndex, newChildIndex);
+ } else {
+ heapNodeBuffer.setRightChildHeapIndex(heapNodeIndex, newChildIndex);
+ }
+ }
+
+ /**
+ * Pop the root node off the group ID's max heap.
+ *
+ * @param contextEvictionListener optional callback for the root node that gets popped off
+ */
+ private void heapPop(int groupId, LongConsumer contextEvictionListener) {
+ long heapRootNodeIndex = groupIdToHeapBuffer.getHeapRootNodeIndex(groupId);
+ checkArgument(heapRootNodeIndex != UNKNOWN_INDEX, "Group ID has an empty heap");
+
+ long lastNodeIndex = heapDetachLastInsertionLeaf(groupId);
+ long lastRowId = heapNodeBuffer.getRowId(lastNodeIndex);
+ heapNodeBuffer.deallocate(lastNodeIndex);
+
+ if (lastNodeIndex == heapRootNodeIndex) {
+ // The root is the last node remaining
+ if (contextEvictionListener != null) {
+ contextEvictionListener.accept(lastRowId);
+ }
+ } else {
+ // Pop the root and insert lastRowId back into the heap to ensure a balanced tree
+ heapPopAndInsert(groupId, lastRowId, contextEvictionListener);
+ }
+ }
+
+ /**
+ * Detaches (but does not deallocate) the leaf in the bottom right-most position in the heap.
+ *
+ * <p>Given the fixed insertion order, the bottom right-most leaf will correspond to the last leaf
+ * node inserted into the balanced heap.
+ *
+ * @return leaf node index that was detached from the heap
+ */
+ private long heapDetachLastInsertionLeaf(int groupId) {
+ long heapRootNodeIndex = groupIdToHeapBuffer.getHeapRootNodeIndex(groupId);
+ long heapSize = groupIdToHeapBuffer.getHeapSize(groupId);
+
+ long previousNodeIndex = UNKNOWN_INDEX;
+ HeapTraversal.Child childPosition = null;
+ long currentNodeIndex = heapRootNodeIndex;
+
+ heapTraversal.resetWithPathTo(heapSize);
+ while (!heapTraversal.isTarget()) {
+ previousNodeIndex = currentNodeIndex;
+ childPosition = heapTraversal.nextChild();
+ currentNodeIndex = getChildIndex(currentNodeIndex, childPosition);
+ verify(currentNodeIndex != UNKNOWN_INDEX, "Target node must exist");
+ }
+
+ // Detach the last insertion leaf node, but do not deallocate yet
+ if (previousNodeIndex == UNKNOWN_INDEX) {
+ // Last insertion leaf was the root node
+ groupIdToHeapBuffer.setHeapRootNodeIndex(groupId, UNKNOWN_INDEX);
+ groupIdToHeapBuffer.setHeapSize(groupId, 0);
+ } else {
+ setChildIndex(previousNodeIndex, childPosition, UNKNOWN_INDEX);
+ groupIdToHeapBuffer.addHeapSize(groupId, -1);
+ }
+
+ return currentNodeIndex;
+ }
+
+ /**
+ * Inserts a new row into the heap for the specified group ID.
+ *
+ * <p>The technique involves traversing the heap from the root to a new bottom left-priority leaf
+ * position, potentially swapping heap nodes along the way to find the proper insertion position
+ * for the new row. Insertions always fill the left child before the right, and fill up an entire
+ * heap level before moving to the next level.
+ */
+ private void heapInsert(int groupId, long newRowId) {
+ long heapRootNodeIndex = groupIdToHeapBuffer.getHeapRootNodeIndex(groupId);
+ if (heapRootNodeIndex == UNKNOWN_INDEX) {
+ // Heap is currently empty, so this will be the first node
+ heapRootNodeIndex = heapNodeBuffer.allocateNewNode(newRowId);
+
+ groupIdToHeapBuffer.setHeapRootNodeIndex(groupId, heapRootNodeIndex);
+ groupIdToHeapBuffer.setHeapSize(groupId, 1);
+ return;
+ }
+
+ long previousHeapNodeIndex = UNKNOWN_INDEX;
+ HeapTraversal.Child childPosition = null;
+ long currentHeapNodeIndex = heapRootNodeIndex;
+
+ heapTraversal.resetWithPathTo(groupIdToHeapBuffer.getHeapSize(groupId) + 1);
+ while (!heapTraversal.isTarget()) {
+ long currentRowId = heapNodeBuffer.getRowId(currentHeapNodeIndex);
+ if (strategy.compare(newRowId, currentRowId) > 0) {
+ // Swap the row values
+ heapNodeBuffer.setRowId(currentHeapNodeIndex, newRowId);
+
+ newRowId = currentRowId;
+ }
+
+ previousHeapNodeIndex = currentHeapNodeIndex;
+ childPosition = heapTraversal.nextChild();
+ currentHeapNodeIndex = getChildIndex(currentHeapNodeIndex, childPosition);
+ }
+
+ verify(
+ previousHeapNodeIndex != UNKNOWN_INDEX && childPosition != null,
+ "heap must have at least one node before starting traversal");
+ verify(currentHeapNodeIndex == UNKNOWN_INDEX, "New child shouldn't exist yet");
+
+ long newHeapNodeIndex = heapNodeBuffer.allocateNewNode(newRowId);
+
+ // Link the new child to the parent
+ setChildIndex(previousHeapNodeIndex, childPosition, newHeapNodeIndex);
+
+ groupIdToHeapBuffer.incrementHeapSize(groupId);
+ }
+
+ /**
+ * Pop the root node off the group ID's max heap and insert the newRowId.
+ *
+ * <p>These two operations are more efficient if performed together. The technique involves
+ * swapping the new row into the root position, and applying a heap down bubbling operation to
+ * heap-ify.
+ *
+ * @param contextEvictionListener optional callback for the root node that gets popped off
+ */
+ private void heapPopAndInsert(int groupId, long newRowId, LongConsumer contextEvictionListener) {
+ long heapRootNodeIndex = groupIdToHeapBuffer.getHeapRootNodeIndex(groupId);
+ checkState(heapRootNodeIndex != UNKNOWN_INDEX, "popAndInsert() requires at least a root node");
+
+ // Clear contents of the root node to create a vacancy for another row
+ long poppedRowId = heapNodeBuffer.getRowId(heapRootNodeIndex);
+
+ long currentNodeIndex = heapRootNodeIndex;
+ while (true) {
+ long maxChildNodeIndex = heapNodeBuffer.getLeftChildHeapIndex(currentNodeIndex);
+ if (maxChildNodeIndex == UNKNOWN_INDEX) {
+ // Left is always inserted before right, so a missing left child means there can't be a
+ // right child,
+ // which means this must already be a leaf position.
+ break;
+ }
+ long maxChildRowId = heapNodeBuffer.getRowId(maxChildNodeIndex);
+
+ long rightChildNodeIndex = heapNodeBuffer.getRightChildHeapIndex(currentNodeIndex);
+ if (rightChildNodeIndex != UNKNOWN_INDEX) {
+ long rightRowId = heapNodeBuffer.getRowId(rightChildNodeIndex);
+ if (strategy.compare(rightRowId, maxChildRowId) > 0) {
+ maxChildNodeIndex = rightChildNodeIndex;
+ maxChildRowId = rightRowId;
+ }
+ }
+
+ if (strategy.compare(newRowId, maxChildRowId) >= 0) {
+ // New row is greater than or equal to both children, so the heap invariant is satisfied by
+ // inserting the
+ // new row at this position
+ break;
+ }
+
+ // Swap the max child row value into the current node
+ heapNodeBuffer.setRowId(currentNodeIndex, maxChildRowId);
+
+ // Max child now has an unfilled vacancy, so continue processing with that as the current node
+ currentNodeIndex = maxChildNodeIndex;
+ }
+
+ heapNodeBuffer.setRowId(currentNodeIndex, newRowId);
+
+ if (contextEvictionListener != null) {
+ contextEvictionListener.accept(poppedRowId);
+ }
+ }
+
+ /**
+ * Buffer abstracting a mapping from group ID to a heap. The group ID provides the index for all
+ * operations.
+ */
+ private static class GroupIdToHeapBuffer {
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(GroupIdToHeapBuffer.class);
+
+ /*
+ * Memory layout:
+ * [LONG] heapNodeIndex1,
+ * [LONG] heapNodeIndex2,
+ * ...
+ */
+ // Since we have a single element per group, this array is effectively indexed on group ID
+ private final LongBigArray heapIndexBuffer = new LongBigArray(UNKNOWN_INDEX);
+
+ /*
+ * Memory layout:
+ * [LONG] heapSize1,
+ * [LONG] heapSize2,
+ * ...
+ */
+ // Since we have a single element per group, this array is effectively indexed on group ID
+ private final LongBigArray sizeBuffer = new LongBigArray(0);
+
+ private int totalGroups;
+
+ public void allocateGroupIfNeeded(int groupId) {
+ if (totalGroups > groupId) {
+ return;
+ }
+ // Group IDs generated by GroupByHash are always generated consecutively starting from 0, so
+ // observing a
+ // group ID N means groups [0, N] inclusive must exist.
+ totalGroups = groupId + 1;
+ heapIndexBuffer.ensureCapacity(totalGroups);
+ sizeBuffer.ensureCapacity(totalGroups);
+ }
+
+ public int getTotalGroups() {
+ return totalGroups;
+ }
+
+ public long getHeapRootNodeIndex(int groupId) {
+ return heapIndexBuffer.get(groupId);
+ }
+
+ public void setHeapRootNodeIndex(int groupId, long heapNodeIndex) {
+ heapIndexBuffer.set(groupId, heapNodeIndex);
+ }
+
+ public long getHeapSize(int groupId) {
+ return sizeBuffer.get(groupId);
+ }
+
+ public void setHeapSize(int groupId, long count) {
+ sizeBuffer.set(groupId, count);
+ }
+
+ public void addHeapSize(int groupId, long delta) {
+ sizeBuffer.add(groupId, delta);
+ }
+
+ public void incrementHeapSize(int groupId) {
+ sizeBuffer.increment(groupId);
+ }
+
+ public long sizeOf() {
+ return INSTANCE_SIZE + heapIndexBuffer.sizeOf() + sizeBuffer.sizeOf();
+ }
+ }
+
+ /**
+ * Buffer abstracting storage of nodes in the heap. Nodes are referenced by their node index for
+ * operations.
+ */
+ private static class HeapNodeBuffer {
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(HeapNodeBuffer.class);
+ private static final int POSITIONS_PER_ENTRY = 3;
+ private static final int LEFT_CHILD_HEAP_INDEX_OFFSET = 1;
+ private static final int RIGHT_CHILD_HEAP_INDEX_OFFSET = 2;
+
+ /*
+ * Memory layout:
+ * [LONG] rowId1, [LONG] leftChildNodeIndex1, [LONG] rightChildNodeIndex1,
+ * [LONG] rowId2, [LONG] leftChildNodeIndex2, [LONG] rightChildNodeIndex2,
+ * ...
+ */
+ private final LongBigArray buffer = new LongBigArray();
+
+ private final LongBigArrayFIFOQueue emptySlots = new LongBigArrayFIFOQueue();
+
+ private long capacity;
+
+ /**
+ * Allocates storage for a new heap node.
+ *
+ * @return index referencing the node
+ */
+ public long allocateNewNode(long rowId) {
+ long newHeapIndex;
+ if (!emptySlots.isEmpty()) {
+ newHeapIndex = emptySlots.dequeueLong();
+ } else {
+ newHeapIndex = capacity;
+ capacity++;
+ buffer.ensureCapacity(capacity * POSITIONS_PER_ENTRY);
+ }
+
+ setRowId(newHeapIndex, rowId);
+ setLeftChildHeapIndex(newHeapIndex, UNKNOWN_INDEX);
+ setRightChildHeapIndex(newHeapIndex, UNKNOWN_INDEX);
+
+ return newHeapIndex;
+ }
+
+ public void deallocate(long index) {
+ emptySlots.enqueue(index);
+ }
+
+ public long getActiveNodeCount() {
+ return capacity - emptySlots.longSize();
+ }
+
+ public long getRowId(long index) {
+ return buffer.get(index * POSITIONS_PER_ENTRY);
+ }
+
+ public void setRowId(long index, long rowId) {
+ buffer.set(index * POSITIONS_PER_ENTRY, rowId);
+ }
+
+ public long getLeftChildHeapIndex(long index) {
+ return buffer.get(index * POSITIONS_PER_ENTRY + LEFT_CHILD_HEAP_INDEX_OFFSET);
+ }
+
+ public void setLeftChildHeapIndex(long index, long childHeapIndex) {
+ buffer.set(index * POSITIONS_PER_ENTRY + LEFT_CHILD_HEAP_INDEX_OFFSET, childHeapIndex);
+ }
+
+ public long getRightChildHeapIndex(long index) {
+ return buffer.get(index * POSITIONS_PER_ENTRY + RIGHT_CHILD_HEAP_INDEX_OFFSET);
+ }
+
+ public void setRightChildHeapIndex(long index, long childHeapIndex) {
+ buffer.set(index * POSITIONS_PER_ENTRY + RIGHT_CHILD_HEAP_INDEX_OFFSET, childHeapIndex);
+ }
+
+ public long sizeOf() {
+ return INSTANCE_SIZE + buffer.sizeOf() + emptySlots.sizeOf();
+ }
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/GroupedTopNRowNumberBuilder.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/GroupedTopNRowNumberBuilder.java
new file mode 100644
index 00000000000..78c01ef14c0
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/GroupedTopNRowNumberBuilder.java
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+import org.apache.iotdb.calc.execution.operator.source.relational.aggregation.grouped.array.LongBigArray;
+import org.apache.iotdb.commons.queryengine.execution.operator.source.relational.aggregation.grouped.hash.GroupByHash;
+
+import com.google.common.collect.AbstractIterator;
+import com.google.common.collect.ImmutableList;
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.block.column.ColumnBuilder;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.Iterator;
+import java.util.List;
+
+import static org.apache.iotdb.calc.plan.planner.CommonOperatorUtils.TIME_COLUMN_TEMPLATE;
+
+public class GroupedTopNRowNumberBuilder implements GroupedTopNBuilder {
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(GroupedTopNRowNumberBuilder.class);
+
+ private final List<TSDataType> sourceTypes;
+ private final boolean produceRowNumber;
+ private final int[] groupByChannels;
+ private final GroupByHash groupByHash;
+ private final RowReferenceTsBlockManager tsBlockManager = new RowReferenceTsBlockManager();
+ private final GroupedTopNRowNumberAccumulator groupedTopNRowNumberAccumulator;
+ private final TsBlockWithPositionComparator comparator;
+
+ private int effectiveGroupCount = 0;
+
+ public GroupedTopNRowNumberBuilder(
+ List<TSDataType> sourceTypes,
+ TsBlockWithPositionComparator comparator,
+ int topN,
+ boolean produceRowNumber,
+ int[] groupByChannels,
+ GroupByHash groupByHash) {
+ this.sourceTypes = sourceTypes;
+ this.produceRowNumber = produceRowNumber;
+ this.groupByChannels = groupByChannels;
+ this.groupByHash = groupByHash;
+ this.comparator = comparator;
+
+ this.groupedTopNRowNumberAccumulator =
+ new GroupedTopNRowNumberAccumulator(
+ (leftRowId, rightRowId) -> {
+ TsBlock leftTsBlock = tsBlockManager.getTsBlock(leftRowId);
+ int leftPosition = tsBlockManager.getPosition(leftRowId);
+ TsBlock rightTsBlock = tsBlockManager.getTsBlock(rightRowId);
+ int rightPosition = tsBlockManager.getPosition(rightRowId);
+ return comparator.compareTo(leftTsBlock, leftPosition, rightTsBlock, rightPosition);
+ },
+ topN,
+ tsBlockManager::dereference);
+ }
+
+ @Override
+ public void addTsBlock(TsBlock tsBlock) {
+ int[] groupIds;
+ if (groupByChannels.length == 0) {
+ groupIds = new int[tsBlock.getPositionCount()];
+ if (tsBlock.getPositionCount() > 0) {
+ effectiveGroupCount = 1;
+ }
+ } else {
+ groupIds = groupByHash.getGroupIds(tsBlock.getColumns(groupByChannels));
+ effectiveGroupCount = groupByHash.getGroupCount();
+ }
+
+ processTsBlock(tsBlock, effectiveGroupCount, groupIds);
+ }
+
+ @Override
+ public Iterator<TsBlock> getResult() {
+ return new ResultIterator();
+ }
+
+ @Override
+ public long getEstimatedSizeInBytes() {
+ return INSTANCE_SIZE
+ + groupByHash.getEstimatedSize()
+ + tsBlockManager.sizeOf()
+ + groupedTopNRowNumberAccumulator.sizeOf();
+ }
+
+ private void processTsBlock(TsBlock newTsBlock, int groupCount, int[] groupIds) {
+ int firstPositionToAdd =
+ groupedTopNRowNumberAccumulator.findFirstPositionToAdd(
+ newTsBlock, groupCount, groupIds, comparator, tsBlockManager);
+ if (firstPositionToAdd < 0) {
+ return;
+ }
+
+ try (RowReferenceTsBlockManager.LoadCursor loadCursor =
+ tsBlockManager.add(newTsBlock, firstPositionToAdd)) {
+ for (int position = firstPositionToAdd;
+ position < newTsBlock.getPositionCount();
+ position++) {
+ int groupId = groupIds[position];
+ loadCursor.advance();
+ groupedTopNRowNumberAccumulator.add(groupId, loadCursor);
+ }
+ }
+
+ tsBlockManager.compactIfNeeded();
+ }
+
+ private class ResultIterator extends AbstractIterator<TsBlock> {
+ private final TsBlockBuilder tsBlockBuilder;
+ private final int groupIdCount = effectiveGroupCount;
+ private int currentGroupId = -1;
+ private final LongBigArray rowIdOutput = new LongBigArray();
+ private long currentGroupSize;
+ private int currentIndexInGroup;
+
+ ResultIterator() {
+ ImmutableList.Builder<TSDataType> sourceTypesBuilders =
+ ImmutableList.<TSDataType>builder().addAll(sourceTypes);
+ if (produceRowNumber) {
+ sourceTypesBuilders.add(TSDataType.INT64);
+ }
+ tsBlockBuilder = new TsBlockBuilder(sourceTypesBuilders.build());
+ }
+
+ @Override
+ protected TsBlock computeNext() {
+ tsBlockBuilder.reset();
+ while (!tsBlockBuilder.isFull()) {
+ while (currentIndexInGroup >= currentGroupSize) {
+ if (currentGroupId + 1 >= groupIdCount) {
+ if (tsBlockBuilder.isEmpty()) {
+ return endOfData();
+ }
+ return tsBlockBuilder.build(
+ new RunLengthEncodedColumn(
+ TIME_COLUMN_TEMPLATE, tsBlockBuilder.getPositionCount()));
+ }
+ currentGroupId++;
+ currentGroupSize = groupedTopNRowNumberAccumulator.drainTo(currentGroupId, rowIdOutput);
+ currentIndexInGroup = 0;
+ }
+
+ long rowId = rowIdOutput.get(currentIndexInGroup);
+ TsBlock tsBlock = tsBlockManager.getTsBlock(rowId);
+ int position = tsBlockManager.getPosition(rowId);
+ for (int i = 0; i < sourceTypes.size(); i++) {
+ ColumnBuilder builder = tsBlockBuilder.getColumnBuilder(i);
+ Column column = tsBlock.getColumn(i);
+ builder.write(column, position);
+ }
+ if (produceRowNumber) {
+ ColumnBuilder builder = tsBlockBuilder.getColumnBuilder(sourceTypes.size());
+ builder.writeLong(currentIndexInGroup + 1);
+ }
+ tsBlockBuilder.declarePosition();
+ currentIndexInGroup++;
+
+ // Deference the row for hygiene, but no need to compact them at this point
+ tsBlockManager.dereference(rowId);
+ }
+
+ if (tsBlockBuilder.isEmpty()) {
+ return endOfData();
+ }
+ return tsBlockBuilder.build(
+ new RunLengthEncodedColumn(TIME_COLUMN_TEMPLATE, tsBlockBuilder.getPositionCount()));
+ }
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/IdRegistry.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/IdRegistry.java
new file mode 100644
index 00000000000..bb5abd17ddd
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/IdRegistry.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+import org.apache.iotdb.calc.execution.operator.source.relational.aggregation.grouped.array.IntArrayFIFOQueue;
+
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.HashMap;
+import java.util.function.IntFunction;
+
+public class IdRegistry<T> {
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(IdRegistry.class);
+
+ private final HashMap<Integer, T> objects = new HashMap<>();
+ private final IntFIFOQueue emptySlots = new IntFIFOQueue();
+
+ /**
+ * Provides a new ID referencing the provided object.
+ *
+ * @return ID referencing the provided object
+ */
+ public T allocateId(IntFunction<T> factory) {
+ T result;
+ if (emptySlots.size() != 0) {
+ int id = emptySlots.dequeueInt();
+ result = factory.apply(id);
+ objects.put(id, result);
+ } else {
+ result = factory.apply(objects.size());
+ objects.put(objects.size(), result);
+ }
+ return result;
+ }
+
+ public void deallocate(int id) {
+ objects.remove(id);
+ emptySlots.enqueue(id);
+ }
+
+ public T get(int id) {
+ return objects.get(id);
+ }
+
+ /** Does not include the sizes of the referenced objects themselves. */
+ public long sizeOf() {
+ return INSTANCE_SIZE + RamUsageEstimator.sizeOfMap(objects) + emptySlots.sizeOf();
+ }
+
+ private static class IntFIFOQueue extends IntArrayFIFOQueue {
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(IntFIFOQueue.class);
+
+ public long sizeOf() {
+ return INSTANCE_SIZE + RamUsageEstimator.sizeOf(array);
+ }
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/Operator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/Operator.java
new file mode 100644
index 00000000000..a2c937e0bb7
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/Operator.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.utils.Accountable;
+
+import static com.google.common.util.concurrent.Futures.immediateVoidFuture;
+
+public interface Operator extends AutoCloseable, Accountable {
+
+ ListenableFuture<?> NOT_BLOCKED = immediateVoidFuture();
+
+ CommonOperatorContext getOperatorContext();
+
+ /**
+ * Returns a future that will be completed when the operator becomes unblocked. If the operator is
+ * not blocked, this method should return {@code NOT_BLOCKED}.
+ */
+ @SuppressWarnings("squid:S1452")
+ default ListenableFuture<?> isBlocked() {
+ return NOT_BLOCKED;
+ }
+
+ default TsBlock nextWithTimer() throws Exception {
+ CommonOperatorContext context = getOperatorContext();
+ long startTime = System.nanoTime();
+ TsBlock output = null;
+ try {
+ output = next();
+ } finally {
+ context.recordExecutionTime(System.nanoTime() - startTime);
+ if (output != null) {
+ context.addOutputRows(output.getPositionCount());
+ }
+ context.recordNextCalled();
+ }
+ return output;
+ }
+
+ /**
+ * Gets next tsBlock from this operator. If no data is currently available, return null.
+ *
+ * @throws Exception Error happened while fetching next batch
+ */
+ @SuppressWarnings("squid:S112")
+ TsBlock next() throws Exception;
+
+ default boolean hasNextWithTimer() throws Exception {
+ CommonOperatorContext context = getOperatorContext();
+ long startTime = System.nanoTime();
+
+ try {
+ return hasNext();
+ } finally {
+ context.recordExecutionTime(System.nanoTime() - startTime);
+ context.recordHasNextCalled();
+ }
+ }
+
+ default long calculateMaxPeekMemoryWithCounter() {
+ long maxPeekMemory = calculateMaxPeekMemory();
+ getOperatorContext().setEstimatedMemorySize(maxPeekMemory);
+ return maxPeekMemory;
+ }
+
+ /**
+ * return true if the operator has more data, otherwise false.
+ *
+ * @throws Exception Error happened while judging whether there exists next batch
+ */
+ @SuppressWarnings("squid:S112")
+ boolean hasNext() throws Exception;
+
+ /**
+ * The close method cleans up the resources occupied by this Operator. This method will always be
+ * called before releasing the Operator reference.
+ *
+ * <p><b>Note:</b> If this Operator has child Operators, please ensure that child operators are
+ * also closed.
+ *
+ * @throws Exception An exception occurred during the close operation.
+ */
+ @Override
+ void close() throws Exception;
+
+ /**
+ * Is this operator completely finished processing and no more output TsBlock will be produced.
+ *
+ * @throws Exception Error happened while judging whether operator is finished
+ */
+ @SuppressWarnings("squid:S112")
+ boolean isFinished() throws Exception;
+
+ /**
+ * We should also consider the memory used by its children operator, so the calculation logic may
+ * be like: long estimatedOfCurrentOperator = XXXXX; return max(estimatedOfCurrentOperator,
+ * child1.calculateMaxPeekMemory(), child2.calculateMaxPeekMemory(), ....).
+ *
+ * <p>Each operator's MaxPeekMemory should also take retained size of each child operator into
+ * account.
+ *
+ * @return estimated max memory footprint that the Operator Tree(rooted from this operator) will
+ * use while doing its own read processing
+ */
+ long calculateMaxPeekMemory();
+
+ /** return estimated max memory footprint for returned TsBlock when calling operator.next(). */
+ long calculateMaxReturnSize();
+
+ /**
+ * return each operator's retained size(including all its children's retained size) after calling
+ * its next() method.
+ */
+ long calculateRetainedSizeAfterCallingNext();
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowIdComparisonStrategy.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowIdComparisonStrategy.java
new file mode 100644
index 00000000000..02b28466efa
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowIdComparisonStrategy.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+public interface RowIdComparisonStrategy {
+ int compare(long leftRowId, long rightRowId);
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowIdHashStrategy.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowIdHashStrategy.java
new file mode 100644
index 00000000000..984efa9a96c
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowIdHashStrategy.java
@@ -0,0 +1,27 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+/** Hash strategy that evaluates over row IDs */
+public interface RowIdHashStrategy {
+ boolean equals(long leftRowId, long rightRowId);
+
+ long hashCode(long rowId);
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowReference.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowReference.java
new file mode 100644
index 00000000000..b56c9f8983f
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowReference.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+/**
+ * Reference to a row.
+ *
+ * <p>Note: RowReference gives us the ability to defer row ID generation (which can be expensive in
+ * tight loops).
+ */
+public interface RowReference {
+ /**
+ * Compares the referenced row to the specified row ID using the provided RowIdComparisonStrategy.
+ */
+ int compareTo(RowIdComparisonStrategy strategy, long rowId);
+
+ /**
+ * Checks equality of the referenced row with the specified row ID using the provided
+ * RowIdHashStrategy.
+ */
+ boolean equals(RowIdHashStrategy strategy, long rowId);
+
+ /** Calculates the hash of the referenced row using the provided RowIdHashStrategy. */
+ long hash(RowIdHashStrategy strategy);
+
+ /** Allocate a stable row ID that can be used to reference this row at a future point. */
+ long allocateRowId();
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowReferenceTsBlockManager.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowReferenceTsBlockManager.java
new file mode 100644
index 00000000000..dd81ab2f55f
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/RowReferenceTsBlockManager.java
@@ -0,0 +1,386 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+import org.apache.iotdb.calc.execution.operator.source.relational.aggregation.grouped.array.IntBigArray;
+import org.apache.iotdb.calc.execution.operator.source.relational.aggregation.grouped.array.LongBigArrayFIFOQueue;
+
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.Arrays;
+import java.util.HashSet;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Verify.verify;
+
+public class RowReferenceTsBlockManager {
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(RowReferenceTsBlockManager.class);
+ private static final long TSBLOCK_ACCOUNTING_INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(TsBlockAccounting.class);
+ private static final int RESERVED_ROW_ID_FOR_CURSOR = -1;
+
+ private final IdRegistry<TsBlockAccounting> tsBlocks = new IdRegistry<>();
+ private final RowIdBuffer rowIdBuffer = new RowIdBuffer();
+ private final HashSet<Integer> compactionCandidates = new HashSet<>();
+
+ private LoadCursor currentCursor;
+ private long tsBlockBytes;
+
+ public LoadCursor add(TsBlock tsBlock) {
+ return add(tsBlock, 0);
+ }
+
+ public LoadCursor add(TsBlock tsBlock, int startingPosition) {
+ checkState(currentCursor == null, "Cursor still active");
+ checkArgument(
+ startingPosition >= 0 && startingPosition <= tsBlock.getPositionCount(),
+ "invalid startingPosition: %s",
+ startingPosition);
+
+ TsBlockAccounting tsBlockAccounting =
+ tsBlocks.allocateId(id -> new TsBlockAccounting(id, tsBlock));
+
+ tsBlockAccounting.lockTsBlock();
+ currentCursor =
+ new LoadCursor(
+ tsBlockAccounting,
+ startingPosition,
+ () -> {
+ // Initiate additional actions on close
+ checkState(currentCursor != null);
+ tsBlockAccounting.unlockTsBlock();
+ tsBlockAccounting.loadTsBlockLoadIfNeeded();
+ // Account for tsBlock size after lazy loading (which can change the tsBlock size)
+ tsBlockBytes += tsBlockAccounting.sizeOf();
+ currentCursor = null;
+
+ checkTsBlockMaintenance(tsBlockAccounting);
+ });
+
+ return currentCursor;
+ }
+
+ public void dereference(long rowId) {
+ TsBlockAccounting tsBlockAccounting = tsBlocks.get(rowIdBuffer.getTsBlockId(rowId));
+ tsBlockAccounting.dereference(rowId);
+ checkTsBlockMaintenance(tsBlockAccounting);
+ }
+
+ private void checkTsBlockMaintenance(TsBlockAccounting tsBlockAccounting) {
+ int tsBlockId = tsBlockAccounting.getTsBlockId();
+ if (tsBlockAccounting.isPruneEligible()) {
+ compactionCandidates.remove(tsBlockId);
+ tsBlocks.deallocate(tsBlockId);
+ tsBlockBytes -= tsBlockAccounting.sizeOf();
+ } else if (tsBlockAccounting.isCompactionEligible()) {
+ compactionCandidates.add(tsBlockId);
+ }
+ }
+
+ public TsBlock getTsBlock(long rowId) {
+ if (isCursorRowId(rowId)) {
+ checkState(currentCursor != null, "No active cursor");
+ return currentCursor.getTsBlock();
+ }
+ int tsBlockId = rowIdBuffer.getTsBlockId(rowId);
+ return tsBlocks.get(tsBlockId).getTsBlock();
+ }
+
+ public int getPosition(long rowId) {
+ if (isCursorRowId(rowId)) {
+ checkState(currentCursor != null, "No active cursor");
+ // rowId for cursors only reference the single current position
+ return currentCursor.getCurrentPosition();
+ }
+ return rowIdBuffer.getPosition(rowId);
+ }
+
+ private static boolean isCursorRowId(long rowId) {
+ return rowId == RESERVED_ROW_ID_FOR_CURSOR;
+ }
+
+ public void compactIfNeeded() {
+ for (int tsBlockId : compactionCandidates) {
+ TsBlockAccounting tsBlockAccounting = tsBlocks.get(tsBlockId);
+ tsBlockBytes -= tsBlockAccounting.sizeOf();
+ tsBlockAccounting.compact();
+ tsBlockBytes += tsBlockAccounting.sizeOf();
+ }
+ compactionCandidates.clear();
+ }
+
+ public long sizeOf() {
+ return INSTANCE_SIZE
+ + tsBlockBytes
+ + tsBlocks.sizeOf()
+ + rowIdBuffer.sizeOf()
+ + RamUsageEstimator.sizeOfHashSet(compactionCandidates);
+ }
+
+ /**
+ * Cursor that allows callers to advance through the registered page and dictate whether a
+ * specific position should be preserved with a stable row ID. Row ID generation can be expensive
+ * in tight loops, so this allows callers to quickly skip positions that won't be needed.
+ */
+ public static final class LoadCursor implements RowReference, AutoCloseable {
+ private final TsBlockAccounting tsBlockAccounting;
+ private final Runnable closeCallback;
+
+ private int currentPosition;
+
+ private LoadCursor(
+ TsBlockAccounting tsBlockAccounting, int startingPosition, Runnable closeCallback) {
+ this.tsBlockAccounting = tsBlockAccounting;
+ this.currentPosition = startingPosition - 1;
+ this.closeCallback = closeCallback;
+ }
+
+ private TsBlock getTsBlock() {
+ return tsBlockAccounting.getTsBlock();
+ }
+
+ private int getCurrentPosition() {
+ checkState(currentPosition >= 0, "Not yet advanced");
+ return currentPosition;
+ }
+
+ public boolean advance() {
+ if (currentPosition >= tsBlockAccounting.getTsBlock().getPositionCount() - 1) {
+ return false;
+ }
+ currentPosition++;
+ return true;
+ }
+
+ @Override
+ public int compareTo(RowIdComparisonStrategy strategy, long rowId) {
+ checkState(currentPosition >= 0, "Not yet advanced");
+ return strategy.compare(RESERVED_ROW_ID_FOR_CURSOR, rowId);
+ }
+
+ @Override
+ public boolean equals(RowIdHashStrategy strategy, long rowId) {
+ checkState(currentPosition >= 0, "Not yet advanced");
+ return strategy.equals(RESERVED_ROW_ID_FOR_CURSOR, rowId);
+ }
+
+ @Override
+ public long hash(RowIdHashStrategy strategy) {
+ checkState(currentPosition >= 0, "Not yet advanced");
+ return strategy.hashCode(RESERVED_ROW_ID_FOR_CURSOR);
+ }
+
+ @Override
+ public long allocateRowId() {
+ checkState(currentPosition >= 0, "Not yet advanced");
+ return tsBlockAccounting.referencePosition(currentPosition);
+ }
+
+ @Override
+ public void close() {
+ closeCallback.run();
+ }
+ }
+
+ private final class TsBlockAccounting {
+ private static final int COMPACTION_MIN_FILL_MULTIPLIER = 2;
+
+ private final int tsBlockId;
+ private TsBlock tsBlock;
+ private boolean isTsBlockLoaded;
+ private long[] rowIds;
+ // Start off locked to give the caller time to declare which rows to reference
+ private boolean lockedTsBlock = true;
+ private int activePositions;
+
+ public TsBlockAccounting(int tsBlockId, TsBlock tsBlock) {
+ this.tsBlockId = tsBlockId;
+ this.tsBlock = tsBlock;
+ rowIds = new long[tsBlock.getPositionCount()];
+ Arrays.fill(rowIds, RowIdBuffer.UNKNOWN_ID);
+ }
+
+ /** Record the position as referenced and return a corresponding stable row ID */
+ public long referencePosition(int position) {
+ long rowId = rowIds[position];
+ if (rowId == RowIdBuffer.UNKNOWN_ID) {
+ rowId = rowIdBuffer.allocateRowId(tsBlockId, position);
+ rowIds[position] = rowId;
+ activePositions++;
+ }
+ return rowId;
+ }
+
+ /**
+ * Locks the current TsBlock so that it can't be compacted (thus allowing for stable
+ * position-based access).
+ */
+ public void lockTsBlock() {
+ lockedTsBlock = true;
+ }
+
+ /** Unlocks the current TsBlock so that it becomes eligible for compaction. */
+ public void unlockTsBlock() {
+ lockedTsBlock = false;
+ }
+
+ public int getTsBlockId() {
+ return tsBlockId;
+ }
+
+ public TsBlock getTsBlock() {
+ return tsBlock;
+ }
+
+ /** Dereferences the row ID from this TsBlock. */
+ public void dereference(long rowId) {
+ int position = rowIdBuffer.getPosition(rowId);
+ checkArgument(rowId == rowIds[position], "rowId does not match this TsBlock");
+ rowIds[position] = RowIdBuffer.UNKNOWN_ID;
+ activePositions--;
+ rowIdBuffer.deallocate(rowId);
+ }
+
+ public boolean isPruneEligible() {
+ // Pruning is only allowed if the TsBlock is unlocked
+ return !lockedTsBlock && activePositions == 0;
+ }
+
+ public boolean isCompactionEligible() {
+ // Compaction is only allowed if the TsBlock is unlocked
+ return !lockedTsBlock
+ && activePositions * COMPACTION_MIN_FILL_MULTIPLIER < tsBlock.getPositionCount();
+ }
+
+ public void loadTsBlockLoadIfNeeded() {
+ if (!isTsBlockLoaded && activePositions > 0) {
+ // tsBlock = tsBlock.getLoadedPage();
+ isTsBlockLoaded = true;
+ }
+ }
+
+ public void compact() {
+ checkState(!lockedTsBlock, "Should not attempt compaction when TsBlock is locked");
+
+ if (activePositions == tsBlock.getPositionCount()) {
+ return;
+ }
+
+ loadTsBlockLoadIfNeeded();
+
+ int newIndex = 0;
+ int[] positionsToKeep = new int[activePositions];
+ long[] newRowIds = new long[activePositions];
+ for (int i = 0; i < tsBlock.getPositionCount() && newIndex < positionsToKeep.length; i++) {
+ long rowId = rowIds[i];
+ positionsToKeep[newIndex] = i;
+ newRowIds[newIndex] = rowId;
+ newIndex += rowId == RowIdBuffer.UNKNOWN_ID ? 0 : 1;
+ }
+ verify(newIndex == activePositions);
+ for (int i = 0; i < newRowIds.length; i++) {
+ rowIdBuffer.setPosition(newRowIds[i], i);
+ }
+
+ // Compact TsBlock
+ // page = page.copyPositions(positionsToKeep, 0, positionsToKeep.length);
+ rowIds = newRowIds;
+ }
+
+ public long sizeOf() {
+ // Getting the size of a TsBlock forces a lazy TsBlock to be loaded, so only provide the size
+ // after
+ // an explicit decision to load
+ long loadedTsBlockSize = isTsBlockLoaded ? tsBlock.getSizeInBytes() : 0;
+ return TSBLOCK_ACCOUNTING_INSTANCE_SIZE
+ + loadedTsBlockSize
+ + RamUsageEstimator.sizeOf(rowIds);
+ }
+ }
+
+ /**
+ * Buffer abstracting a mapping between row IDs and their associated TsBlock IDs and positions.
+ */
+ private static class RowIdBuffer {
+ public static final long UNKNOWN_ID = -1;
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(RowIdBuffer.class);
+
+ /*
+ * Memory layout:
+ * [INT] TsBlockId1, [INT] position1,
+ * [INT] TsBlockId2, [INT] position2,
+ * ...
+ */
+ private final IntBigArray buffer = new IntBigArray();
+
+ private final LongBigArrayFIFOQueue emptySlots = new LongBigArrayFIFOQueue();
+
+ private long capacity;
+
+ /**
+ * Provides a new row ID referencing the provided TsBlock position.
+ *
+ * @return ID referencing the provided TsBlock position
+ */
+ public long allocateRowId(int tsBlockId, int position) {
+ long newRowId;
+ if (!emptySlots.isEmpty()) {
+ newRowId = emptySlots.dequeueLong();
+ } else {
+ newRowId = capacity;
+ capacity++;
+ buffer.ensureCapacity(capacity * 2);
+ }
+
+ setTsBlockId(newRowId, tsBlockId);
+ setPosition(newRowId, position);
+
+ return newRowId;
+ }
+
+ public void deallocate(long rowId) {
+ emptySlots.enqueue(rowId);
+ }
+
+ public int getTsBlockId(long rowId) {
+ return buffer.get(rowId * 2);
+ }
+
+ public void setTsBlockId(long rowId, int tsBlockId) {
+ buffer.set(rowId * 2, tsBlockId);
+ }
+
+ public int getPosition(long rowId) {
+ return buffer.get(rowId * 2 + 1);
+ }
+
+ public void setPosition(long rowId, int position) {
+ buffer.set(rowId * 2 + 1, position);
+ }
+
+ public long sizeOf() {
+ return INSTANCE_SIZE + buffer.sizeOf() + emptySlots.sizeOf();
+ }
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/SimpleTsBlockWithPositionComparator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/SimpleTsBlockWithPositionComparator.java
new file mode 100644
index 00000000000..8cab1352032
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/SimpleTsBlockWithPositionComparator.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+import org.apache.iotdb.calc.execution.operator.process.join.merge.MergeSortComparator;
+import org.apache.iotdb.calc.utils.datastructure.MergeSortKey;
+import org.apache.iotdb.calc.utils.datastructure.SortKey;
+import org.apache.iotdb.commons.queryengine.plan.relational.planner.SortOrder;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+public class SimpleTsBlockWithPositionComparator implements TsBlockWithPositionComparator {
+ private final Comparator<SortKey> comparator;
+
+ public SimpleTsBlockWithPositionComparator(
+ List<TSDataType> types, List<Integer> sortChannels, List<SortOrder> sortOrders) {
+ List<TSDataType> sortedTypes = new ArrayList<>();
+ for (Integer sortChannel : sortChannels) {
+ sortedTypes.add(types.get(sortChannel));
+ }
+ this.comparator =
+ MergeSortComparator.getComparatorForTable(sortOrders, sortChannels, sortedTypes);
+ }
+
+ @Override
+ public int compareTo(TsBlock left, int leftPosition, TsBlock right, int rightPosition) {
+ return comparator.compare(
+ new MergeSortKey(left, leftPosition), new MergeSortKey(right, rightPosition));
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/TsBlockWithPositionComparator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/TsBlockWithPositionComparator.java
new file mode 100644
index 00000000000..e8b50d7ab73
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/TsBlockWithPositionComparator.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator;
+
+import org.apache.tsfile.read.common.block.TsBlock;
+
+public interface TsBlockWithPositionComparator {
+ int compareTo(TsBlock left, int leftPosition, TsBlock right, int rightPosition);
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractConsumeAllOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractConsumeAllOperator.java
new file mode 100644
index 00000000000..c774023ca90
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractConsumeAllOperator.java
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.AbstractOperator;
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.read.common.block.TsBlock;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import static com.google.common.util.concurrent.Futures.successfulAsList;
+
+/** ConsumeAllOperator will consume all children's result every time. */
+public abstract class AbstractConsumeAllOperator extends AbstractOperator
+ implements ProcessOperator {
+ protected final List<Operator> children;
+ protected final int inputOperatorsCount;
+
+ /** TsBlock from child operator. Only one cache now. */
+ protected TsBlock[] inputTsBlocks;
+
+ protected final boolean[] canCallNext;
+ protected int readyChildIndex;
+
+ /** Index of the child that is currently fetching input */
+ protected int currentChildIndex = 0;
+
+ /** Indicate whether we found an empty child input in one loop */
+ protected boolean hasEmptyChildInput = false;
+
+ protected AbstractConsumeAllOperator(
+ CommonOperatorContext operatorContext, List<Operator> children) {
+ this.operatorContext = operatorContext;
+ this.children = children;
+ this.inputOperatorsCount = children.size();
+ this.inputTsBlocks = new TsBlock[inputOperatorsCount];
+ this.canCallNext = new boolean[inputOperatorsCount];
+ for (int i = 0; i < inputOperatorsCount; i++) {
+ canCallNext[i] = false;
+ }
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ boolean hasReadyChild = false;
+ readyChildIndex = 0;
+ List<ListenableFuture<?>> listenableFutures = new ArrayList<>();
+ for (int i = 0; i < inputOperatorsCount; i++) {
+ if (!isEmpty(i) || children.get(i) == null) {
+ continue;
+ }
+ ListenableFuture<?> blocked = children.get(i).isBlocked();
+ if (blocked.isDone()) {
+ hasReadyChild = true;
+ canCallNext[i] = true;
+ readyChildIndex = i;
+ } else {
+ listenableFutures.add(blocked);
+ }
+ }
+ return (hasReadyChild || listenableFutures.isEmpty())
+ ? NOT_BLOCKED
+ : successfulAsList(listenableFutures);
+ }
+
+ /**
+ * Try to cache one result of each child.
+ *
+ * @return true if results of all children are ready. Return false if some children is blocked or
+ * return null.
+ * @throws Exception errors happened while getting tsblock from children
+ */
+ protected boolean prepareInput() throws Exception {
+ // start stopwatch
+ long maxRuntime = operatorContext.getMaxRunTime().roundTo(TimeUnit.NANOSECONDS);
+ long start = System.nanoTime();
+
+ while (System.nanoTime() - start < maxRuntime && currentChildIndex < inputOperatorsCount) {
+ if (canSkipCurrentChild(currentChildIndex)) {
+ currentChildIndex++;
+ continue;
+ }
+ if (canCallNext[currentChildIndex]) {
+ if (children.get(currentChildIndex).hasNextWithTimer()) {
+ inputTsBlocks[currentChildIndex] = getNextTsBlock(currentChildIndex);
+ canCallNext[currentChildIndex] = false;
+ // child operator has next but return an empty TsBlock which means that it may not
+ // finish calculation in given time slice.
+ // In such case, TimeJoinOperator can't go on calculating, so we just return null.
+ // We can also use the while loop here to continuously call the hasNext() and next()
+ // methods of the child operator until its hasNext() returns false or the next() gets
+ // the data that is not empty, but this will cause the execution time of the while loop
+ // to be uncontrollable and may exceed all allocated time slice
+ if (isEmpty(currentChildIndex)) {
+ hasEmptyChildInput = true;
+ } else {
+ processCurrentInputTsBlock(currentChildIndex);
+ }
+ } else {
+ handleFinishedChild(currentChildIndex);
+ }
+ } else {
+ hasEmptyChildInput = true;
+ }
+ currentChildIndex++;
+ }
+
+ if (currentChildIndex == inputOperatorsCount) {
+ // start a new loop
+ currentChildIndex = 0;
+ if (!hasEmptyChildInput) {
+ // all children are ready now
+ return true;
+ } else {
+ // In a new loop, previously empty child input could be non-empty now, and we can skip the
+ // children that have generated input
+ hasEmptyChildInput = false;
+ }
+ }
+ return false;
+ }
+
+ /** If the tsBlock is null or has no more data in the tsBlock, return true; else return false. */
+ protected boolean isEmpty(int index) {
+ return inputTsBlocks[index] == null || inputTsBlocks[index].isEmpty();
+ }
+
+ // region helper function used in prepareInput, the subclass can have its own implementation
+
+ /**
+ * @param currentChildIndex the index of the child
+ * @return true if we can skip the currentChild in prepareInput
+ */
+ protected boolean canSkipCurrentChild(int currentChildIndex) {
+ return !isEmpty(currentChildIndex) || children.get(currentChildIndex) == null;
+ }
+
+ /**
+ * @param currentInputIndex index of the input TsBlock
+ */
+ protected void processCurrentInputTsBlock(int currentInputIndex) {
+ // do nothing here, the subclass have its own implementation
+ }
+
+ /**
+ * @param currentChildIndex the index of the child
+ * @throws Exception Potential Exception thrown by Operator.close()
+ */
+ protected void handleFinishedChild(int currentChildIndex) throws Exception {
+ children.get(currentChildIndex).close();
+ children.set(currentChildIndex, null);
+ }
+
+ // endregion
+
+ @Override
+ public void close() throws Exception {
+ for (Operator child : children) {
+ if (child != null) {
+ child.close();
+ }
+ }
+ // friendly for gc
+ inputTsBlocks = null;
+ }
+
+ protected TsBlock getNextTsBlock(int childIndex) throws Exception {
+ return children.get(childIndex).nextWithTimer();
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractFillOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractFillOperator.java
new file mode 100644
index 00000000000..e354c6e9e62
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractFillOperator.java
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.execution.operator.process.fill.IFill;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+/** Used for previous and constant value fill. */
+public abstract class AbstractFillOperator implements ProcessOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(AbstractFillOperator.class);
+ private final CommonOperatorContext operatorContext;
+ private final IFill[] fillArray;
+ private final Operator child;
+ private final int outputColumnCount;
+
+ protected AbstractFillOperator(
+ CommonOperatorContext operatorContext, IFill[] fillArray, Operator child) {
+ this.operatorContext = requireNonNull(operatorContext, "operatorContext is null");
+ checkArgument(
+ fillArray != null && fillArray.length > 0, "fillArray should not be null or empty");
+ this.fillArray = fillArray;
+ this.child = requireNonNull(child, "child operator is null");
+ this.outputColumnCount = fillArray.length;
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ return child.isBlocked();
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ TsBlock block = child.nextWithTimer();
+ if (block == null) {
+ return null;
+ }
+
+ checkArgument(
+ outputColumnCount == block.getValueColumnCount(),
+ "outputColumnCount is not equal to value column count of child operator's TsBlock");
+
+ Column[] valueColumns = new Column[outputColumnCount];
+
+ for (int i = 0; i < outputColumnCount; i++) {
+ valueColumns[i] = fillArray[i].fill(getHelperColumn(block), block.getColumn(i));
+ }
+
+ return TsBlock.wrapBlocksWithoutCopy(
+ block.getPositionCount(), block.getTimeColumn(), valueColumns);
+ }
+
+ protected abstract Column getHelperColumn(TsBlock tsBlock);
+
+ @Override
+ public boolean hasNext() throws Exception {
+ return child.hasNextWithTimer();
+ }
+
+ @Override
+ public void close() throws Exception {
+ child.close();
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ return child.isFinished();
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ // while doing constant and previous fill, we may need to copy the corresponding column if there
+ // exists null values
+ // so the max peek memory may be double
+ return 2 * child.calculateMaxPeekMemory() + child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ // we can safely ignore one line cached in IFill
+ return child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return child.calculateMaxReturnSize();
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(child)
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext);
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractLinearFillOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractLinearFillOperator.java
new file mode 100644
index 00000000000..2e523d1bf4c
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractLinearFillOperator.java
@@ -0,0 +1,275 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.execution.operator.process.fill.ILinearFill;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+public abstract class AbstractLinearFillOperator implements ProcessOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(AbstractLinearFillOperator.class);
+ private final CommonOperatorContext operatorContext;
+ protected final ILinearFill[] fillArray;
+ private final Operator child;
+ protected final int outputColumnCount;
+ private final List<TsBlock> cachedTsBlock;
+
+ private final List<Long> cachedRowIndex;
+
+ private final List<Integer> cachedLastRowIndexForNonNullHelperColumn;
+
+ private long currentRowIndex = 0;
+ // next TsBlock Index for each Column
+ private final int[] nextTsBlockIndex;
+
+ /**
+ * indicate whether we can call child.next(). it's used to make sure that child.next() will only
+ * be called once in AbstractLinearFillOperator.next().
+ */
+ private boolean canCallNext;
+
+ // indicate whether there is more TsBlock for child operator
+ protected boolean noMoreTsBlock;
+
+ protected AbstractLinearFillOperator(
+ CommonOperatorContext operatorContext, ILinearFill[] fillArray, Operator child) {
+ this.operatorContext = requireNonNull(operatorContext, "operatorContext is null");
+ checkArgument(
+ fillArray != null && fillArray.length > 0, "fillArray should not be null or empty");
+ this.fillArray = fillArray;
+ this.child = requireNonNull(child, "child operator is null");
+ this.outputColumnCount = fillArray.length;
+ this.cachedTsBlock = new ArrayList<>();
+ this.cachedRowIndex = new ArrayList<>();
+ this.cachedLastRowIndexForNonNullHelperColumn = new ArrayList<>();
+ this.nextTsBlockIndex = new int[outputColumnCount];
+ Arrays.fill(this.nextTsBlockIndex, 1);
+ this.canCallNext = false;
+ this.noMoreTsBlock = true;
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ return child.isBlocked();
+ }
+
+ @SuppressWarnings("squid:S3776")
+ @Override
+ public TsBlock next() throws Exception {
+
+ // make sure we call child.next() at most once
+ if (cachedTsBlock.isEmpty() && !tryToGetNextTsBlock()) {
+ return null;
+ }
+
+ TsBlock tempResult = null;
+ while (tempResult == null && !cachedTsBlock.isEmpty()) {
+ TsBlock originTsBlock = cachedTsBlock.get(0);
+ long currentEndRowIndex =
+ cachedRowIndex.get(0) + cachedLastRowIndexForNonNullHelperColumn.get(0);
+ // Step 1: judge whether we can fill current TsBlock, if TsBlock that we can get is not
+ // enough,
+ // we just return null
+ for (int columnIndex = 0; columnIndex < outputColumnCount; columnIndex++) {
+ // current valueColumn can't be filled using current information
+ if (fillArray[columnIndex].needPrepareForNext(
+ currentEndRowIndex,
+ originTsBlock.getColumn(columnIndex),
+ cachedLastRowIndexForNonNullHelperColumn.get(0))) {
+ // current cached TsBlock is not enough to fill this column
+ while (!isCachedTsBlockEnough(columnIndex, currentEndRowIndex)) {
+ // if we failed to get next TsBlock
+ if (!tryToGetNextTsBlock()) {
+ // there is no more TsBlock for current group, so we have to fill this Column
+ if (noMoreTsBlockForCurrentGroup()) {
+ // break the while-loop, continue to judge next Column
+ break;
+ } else {
+ // there is still more TsBlock, so current calculation is not finished, and we just
+ // return null
+ return buildFinalResult(tempResult);
+ }
+ }
+ }
+ }
+ }
+ // Step 2: fill current TsBlock
+ originTsBlock = cachedTsBlock.remove(0);
+ long startRowIndex = cachedRowIndex.remove(0);
+ cachedLastRowIndexForNonNullHelperColumn.remove(0);
+ resetFill();
+
+ Column[] columns = new Column[outputColumnCount];
+ for (int i = 0; i < outputColumnCount; i++) {
+ columns[i] =
+ fillArray[i].fill(
+ getHelperColumn(originTsBlock), originTsBlock.getColumn(i), startRowIndex);
+ }
+ tempResult = append(originTsBlock.getPositionCount(), originTsBlock.getTimeColumn(), columns);
+ for (int i = 0; i < outputColumnCount; i++) {
+ // make sure nextTsBlockIndex for each column >= 1
+ nextTsBlockIndex[i] = Math.max(1, nextTsBlockIndex[i] - 1);
+ }
+ }
+ return buildFinalResult(tempResult);
+ }
+
+ boolean noMoreTsBlockForCurrentGroup() {
+ return noMoreTsBlock;
+ }
+
+ protected abstract Column getHelperColumn(TsBlock tsBlock);
+
+ // -1 means all values of helper column in @param{tsBlock} are null
+ protected abstract Integer getLastRowIndexForNonNullHelperColumn(TsBlock tsBlock);
+
+ TsBlock append(int length, Column timeColumn, Column[] valueColumns) {
+ return new TsBlock(length, timeColumn, valueColumns);
+ }
+
+ TsBlock buildFinalResult(TsBlock tempResult) {
+ return tempResult;
+ }
+
+ void resetFill() {
+ // do nothing
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ // if child.hasNext() return false, it means that there is no more tsBlocks
+ noMoreTsBlock = !child.hasNextWithTimer();
+ // if there is more tsBlock, we can call child.next() once
+ canCallNext = !noMoreTsBlock;
+ return !cachedTsBlock.isEmpty() || !noMoreTsBlock;
+ }
+
+ @Override
+ public void close() throws Exception {
+ child.close();
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ return cachedTsBlock.isEmpty() && child.isFinished();
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ // while doing linear fill, we may need to copy the corresponding column if there exists null
+ // values, and we may also need to cache next TsBlock to get next not null value
+ // so the max peek memory may be triple or more, here we just use 3 as the estimated factor
+ // because in most cases, we will get next not null value in next TsBlock
+ return 3 * child.calculateMaxPeekMemory() + child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return child.calculateMaxReturnSize();
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ // we can safely ignore two lines cached in LinearFill
+ return child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(child)
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext)
+ + RamUsageEstimator.sizeOf(nextTsBlockIndex);
+ }
+
+ /**
+ * Judge whether we can use current cached TsBlock to fill Column.
+ *
+ * @param columnIndex index for column which need to be filled
+ * @param currentEndRowIndex row index for endTime of column which need to be filled
+ * @return true if current cached TsBlock is enough to fill Column at columnIndex, otherwise
+ * false.
+ */
+ private boolean isCachedTsBlockEnough(int columnIndex, long currentEndRowIndex) {
+ // next TsBlock has already been in the cachedTsBlock
+ while (nextTsBlockIndex[columnIndex] < cachedTsBlock.size()) {
+ TsBlock nextTsBlock = cachedTsBlock.get(nextTsBlockIndex[columnIndex]);
+ long startRowIndex = cachedRowIndex.get(nextTsBlockIndex[columnIndex]);
+ nextTsBlockIndex[columnIndex]++;
+ if (fillArray[columnIndex].prepareForNext(
+ startRowIndex,
+ currentEndRowIndex,
+ getHelperColumn(nextTsBlock),
+ nextTsBlock.getColumn(columnIndex))) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Try to get next TsBlock
+ *
+ * @return true if we succeed to get next TsBlock and add it into cachedTsBlock, otherwise false
+ * @throws Exception errors happened while getting next batch data
+ */
+ private boolean tryToGetNextTsBlock() throws Exception {
+ if (canCallNext) { // if we can call child.next(), we call that and cache it in
+ // cachedTsBlock
+ canCallNext = false;
+ TsBlock nextTsBlock = child.nextWithTimer();
+ // child operator's calculation is not finished, so we just return null
+ if (nextTsBlock == null || nextTsBlock.isEmpty()) {
+ return false;
+ } else { // otherwise, we cache it
+ updateCachedData(nextTsBlock);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void updateCachedData(TsBlock tsBlock) {
+ cachedTsBlock.add(tsBlock);
+ cachedRowIndex.add(currentRowIndex);
+ cachedLastRowIndexForNonNullHelperColumn.add(getLastRowIndexForNonNullHelperColumn(tsBlock));
+ currentRowIndex += tsBlock.getPositionCount();
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractSortOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractSortOperator.java
new file mode 100644
index 00000000000..82d0b94b334
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AbstractSortOperator.java
@@ -0,0 +1,369 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.utils.datastructure.MergeSortHeap;
+import org.apache.iotdb.calc.utils.datastructure.MergeSortKey;
+import org.apache.iotdb.calc.utils.datastructure.SortKey;
+import org.apache.iotdb.calc.utils.sort.DiskSpiller;
+import org.apache.iotdb.calc.utils.sort.MemoryReader;
+import org.apache.iotdb.calc.utils.sort.SortBufferManager;
+import org.apache.iotdb.calc.utils.sort.SortReader;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
+import org.apache.iotdb.commons.exception.IoTDBException;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.block.column.ColumnBuilder;
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.TimeColumnBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+public abstract class AbstractSortOperator implements ProcessOperator {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AbstractSortOperator.class);
+
+ protected final CommonOperatorContext operatorContext;
+ protected final Operator inputOperator;
+ protected final TsBlockBuilder tsBlockBuilder;
+
+ // Use to output the result in memory.
+ // Because the memory may be larger than tsBlockBuilder's max size
+ // so the data may be return in multiple times.
+ private int curRow = -1;
+
+ private List<SortKey> cachedData;
+ private final Comparator<SortKey> comparator;
+ private long cachedBytes;
+ private final DiskSpiller diskSpiller;
+ private SortBufferManager sortBufferManager;
+
+ // For mergeSort
+
+ private MergeSortHeap mergeSortHeap;
+ private List<SortReader> sortReaders;
+ protected boolean[] noMoreData;
+
+ private final int maxReturnSize =
+ TSFileDescriptor.getInstance().getConfig().getMaxTsBlockSizeInBytes();
+
+ protected long prepareUntilReadyCost = 0;
+ protected long dataSize = 0;
+ private long sortCost = 0;
+
+ AbstractSortOperator(
+ CommonOperatorContext operatorContext,
+ Operator inputOperator,
+ List<TSDataType> dataTypes,
+ DiskSpiller diskSpiller,
+ Comparator<SortKey> comparator) {
+ this.operatorContext = operatorContext;
+ this.inputOperator = inputOperator;
+ this.tsBlockBuilder = new TsBlockBuilder(dataTypes);
+ this.cachedData = new ArrayList<>();
+ this.comparator = comparator;
+ this.cachedBytes = 0;
+ this.diskSpiller = diskSpiller;
+ this.sortBufferManager =
+ new SortBufferManager(
+ TSFileDescriptor.getInstance().getConfig().getMaxTsBlockSizeInBytes(),
+ CommonDescriptor.getInstance().getConfig().getSortBufferSize());
+ }
+
+ protected void buildResult() throws IoTDBException {
+ if (diskSpiller.hasSpilledData()) {
+ try {
+ prepareSortReaders();
+ mergeSort();
+ } catch (Exception e) {
+ clear();
+ throw e;
+ }
+ } else {
+ if (curRow == -1) {
+ long startTime = System.nanoTime();
+ cachedData.sort(comparator);
+ sortCost += System.nanoTime() - startTime;
+ curRow = 0;
+ }
+ buildTsBlockInMemory();
+ }
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ return inputOperator.isBlocked();
+ }
+
+ private void recordMetrics() {
+ operatorContext.recordSpecifiedInfo("prepareCost/ns", Long.toString(prepareUntilReadyCost));
+ operatorContext.recordSpecifiedInfo("sortedDataSize", Long.toString(dataSize));
+ operatorContext.recordSpecifiedInfo("sortCost/ns", Long.toString(sortCost));
+ int spilledFileSize = diskSpiller.getFileSize();
+ if (spilledFileSize > 0) {
+ operatorContext.recordSpecifiedInfo(
+ "merge sort branch", Integer.toString(diskSpiller.getFileSize() + 1));
+ }
+ }
+
+ private void prepareSortReaders() throws IoTDBException {
+ if (sortReaders != null) {
+ return;
+ }
+ sortReaders = new ArrayList<>();
+ if (cachedBytes != 0) {
+ cachedData.sort(comparator);
+ if (sortBufferManager.allocate(cachedBytes)) {
+ sortReaders.add(
+ new MemoryReader(
+ cachedData.stream().map(MergeSortKey::new).collect(Collectors.toList())));
+ } else {
+ sortBufferManager.allocateOneSortBranch();
+ diskSpiller.spillSortedData(cachedData);
+ cachedData = null;
+ }
+ }
+ sortReaders.addAll(diskSpiller.getReaders(sortBufferManager));
+ // if reader is finished
+ noMoreData = new boolean[sortReaders.size()];
+ }
+
+ protected void cacheTsBlock(TsBlock tsBlock) throws IoTDBException {
+ long bytesSize = tsBlock.getSizeInBytes();
+ if (bytesSize + cachedBytes < sortBufferManager.getSortBufferSize()) {
+ cachedBytes += bytesSize;
+ for (int i = 0; i < tsBlock.getPositionCount(); i++) {
+ cachedData.add(new MergeSortKey(tsBlock, i));
+ }
+ } else {
+ cachedData.sort(comparator);
+ spill();
+ cachedData.clear();
+ cachedBytes = bytesSize;
+ for (int i = 0; i < tsBlock.getPositionCount(); i++) {
+ cachedData.add(new MergeSortKey(tsBlock, i));
+ }
+ }
+ }
+
+ private void spill() throws IoTDBException {
+ // if current memory cannot put this tsBlock, an exception will be thrown in spillSortedData()
+ // because there should be at least tsBlockBuilderStatus.DEFAULT_MAX_TSBLOCK_SIZE_IN_BYTES for
+ // one branch.
+ sortBufferManager.allocateOneSortBranch();
+ diskSpiller.spillSortedData(cachedData);
+ }
+
+ private void buildTsBlockInMemory() {
+ TimeColumnBuilder timeColumnBuilder = tsBlockBuilder.getTimeColumnBuilder();
+ ColumnBuilder[] valueColumnBuilders = tsBlockBuilder.getValueColumnBuilders();
+ for (int i = curRow; i < cachedData.size(); i++) {
+ SortKey sortKey = cachedData.get(i);
+ TsBlock tsBlock = sortKey.tsBlock;
+ appendTime(timeColumnBuilder, tsBlock.getTimeByIndex(sortKey.rowIndex));
+ for (int j = 0; j < valueColumnBuilders.length; j++) {
+ if (tsBlock.getColumn(j).isNull(sortKey.rowIndex)) {
+ valueColumnBuilders[j].appendNull();
+ continue;
+ }
+ valueColumnBuilders[j].write(tsBlock.getColumn(j), sortKey.rowIndex);
+ }
+ tsBlockBuilder.declarePosition();
+ curRow++;
+ if (tsBlockBuilder.isFull()) {
+ break;
+ }
+ }
+ }
+
+ private void mergeSort() throws IoTDBException {
+
+ // 1. fill the input from each reader
+ initMergeSortHeap();
+
+ long startTime = System.nanoTime();
+ long maxRuntime = operatorContext.getMaxRunTime().roundTo(TimeUnit.NANOSECONDS);
+
+ // 2. do merge sort until one TsBlock is consumed up
+ TimeColumnBuilder timeBuilder = tsBlockBuilder.getTimeColumnBuilder();
+ ColumnBuilder[] valueColumnBuilders = tsBlockBuilder.getValueColumnBuilders();
+ while (!mergeSortHeap.isEmpty()) {
+
+ MergeSortKey mergeSortKey = mergeSortHeap.poll();
+ TsBlock targetBlock = mergeSortKey.tsBlock;
+ appendTime(timeBuilder, targetBlock.getTimeByIndex(mergeSortKey.rowIndex));
+ for (int i = 0; i < valueColumnBuilders.length; i++) {
+ if (targetBlock.getColumn(i).isNull(mergeSortKey.rowIndex)) {
+ valueColumnBuilders[i].appendNull();
+ continue;
+ }
+ valueColumnBuilders[i].write(targetBlock.getColumn(i), mergeSortKey.rowIndex);
+ }
+ tsBlockBuilder.declarePosition();
+
+ int readerIndex = mergeSortKey.inputChannelIndex;
+ mergeSortKey = readNextMergeSortKey(readerIndex);
+ if (mergeSortKey != null) {
+ mergeSortHeap.push(mergeSortKey);
+ } else {
+ noMoreData[readerIndex] = true;
+ sortReaders.get(readerIndex).releaseMemory();
+ }
+
+ // break if time is out or tsBlockBuilder is full or sortBuffer is not enough
+ if (System.nanoTime() - startTime > maxRuntime || tsBlockBuilder.isFull()) {
+ break;
+ }
+ }
+ sortCost += System.nanoTime() - startTime;
+ }
+
+ protected abstract void appendTime(TimeColumnBuilder timeBuilder, long time);
+
+ private void initMergeSortHeap() throws IoTDBException {
+ if (mergeSortHeap == null) {
+ mergeSortHeap = new MergeSortHeap(sortReaders.size(), comparator);
+ for (int i = 0; i < sortReaders.size(); i++) {
+ SortReader sortReader = sortReaders.get(i);
+ if (sortReader.hasNext()) {
+ MergeSortKey mergeSortKey = sortReader.next();
+ mergeSortKey.inputChannelIndex = i;
+ mergeSortHeap.push(mergeSortKey);
+ } else {
+ noMoreData[i] = true;
+ sortReader.releaseMemory();
+ }
+ }
+ }
+ }
+
+ private MergeSortKey readNextMergeSortKey(int readerIndex) throws IoTDBException {
+ SortReader sortReader = sortReaders.get(readerIndex);
+ if (sortReader.hasNext()) {
+ MergeSortKey mergeSortKey = sortReader.next();
+ mergeSortKey.inputChannelIndex = readerIndex;
+ return mergeSortKey;
+ }
+ return null;
+ }
+
+ private boolean hasMoreData() {
+ if (noMoreData == null) {
+ return true;
+ }
+ for (boolean noMore : noMoreData) {
+ if (!noMore) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void clear() {
+ if (!diskSpiller.hasSpilledData()) {
+ return;
+ }
+ try {
+ if (sortReaders != null) {
+ for (SortReader sortReader : sortReaders) {
+ sortReader.close();
+ }
+ }
+ sortReaders = null;
+ diskSpiller.reset();
+ } catch (Exception e) {
+ LOGGER.warn("Fail to close fileChannel", e);
+ }
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ return inputOperator.hasNextWithTimer() || hasMoreSortedData();
+ }
+
+ protected boolean hasMoreSortedData() {
+ return (!diskSpiller.hasSpilledData()
+ && ((curRow == -1 && !cachedData.isEmpty())
+ || (curRow != -1 && curRow != cachedData.size())))
+ || (diskSpiller.hasSpilledData() && hasMoreData());
+ }
+
+ @Override
+ public void close() throws Exception {
+ recordMetrics();
+ cachedData = null;
+ clear();
+ inputOperator.close();
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ return !this.hasNextWithTimer();
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ return inputOperator.calculateMaxPeekMemoryWithCounter()
+ + inputOperator.calculateRetainedSizeAfterCallingNext()
+ + sortBufferManager.getSortBufferSize();
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return maxReturnSize;
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ return inputOperator.calculateRetainedSizeAfterCallingNext()
+ + sortBufferManager.getSortBufferSize();
+ }
+
+ protected void resetSortRelatedResource() {
+ curRow = -1;
+ cachedData = new ArrayList<>();
+ cachedBytes = 0;
+ clear();
+ sortBufferManager =
+ new SortBufferManager(
+ sortBufferManager.getMaxTsBlockSizeInBytes(), sortBufferManager.getSortBufferSize());
+ if (mergeSortHeap != null && !mergeSortHeap.isEmpty()) {
+ throw new IllegalStateException("mergeSortHeap should be empty!");
+ }
+ mergeSortHeap = null;
+ noMoreData = null;
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AggregationMergeSortOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AggregationMergeSortOperator.java
new file mode 100644
index 00000000000..6f106d680df
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AggregationMergeSortOperator.java
@@ -0,0 +1,304 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.aggregation.Accumulator;
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.utils.datastructure.MergeSortHeap;
+import org.apache.iotdb.calc.utils.datastructure.MergeSortKey;
+import org.apache.iotdb.calc.utils.datastructure.SortKey;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.block.column.ColumnBuilder;
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.TimeColumnBuilder;
+import org.apache.tsfile.utils.Binary;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import static com.google.common.util.concurrent.Futures.successfulAsList;
+
+public class AggregationMergeSortOperator extends AbstractConsumeAllOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(AggregationMergeSortOperator.class);
+
+ private final List<Accumulator> accumulators;
+
+ private final List<TSDataType> dataTypes;
+
+ private final TsBlockBuilder tsBlockBuilder;
+
+ private final boolean[] noMoreTsBlocks;
+
+ private final MergeSortHeap mergeSortHeap;
+
+ private final boolean hasGroupBy;
+
+ private boolean finished;
+
+ private Binary lastDevice;
+
+ private long lastTime;
+
+ public AggregationMergeSortOperator(
+ CommonOperatorContext operatorContext,
+ List<Operator> children,
+ List<TSDataType> dataTypes,
+ List<Accumulator> accumulators,
+ boolean hasGroupBy,
+ Comparator<SortKey> comparator) {
+ super(operatorContext, children);
+ this.dataTypes = dataTypes;
+ this.tsBlockBuilder = new TsBlockBuilder(dataTypes);
+ this.noMoreTsBlocks = new boolean[this.inputOperatorsCount];
+ this.accumulators = accumulators;
+ this.hasGroupBy = hasGroupBy;
+ this.mergeSortHeap = new MergeSortHeap(inputOperatorsCount, comparator);
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ long startTime = System.nanoTime();
+ long maxRuntime = operatorContext.getMaxRunTime().roundTo(TimeUnit.NANOSECONDS);
+
+ // init all element in inputTsBlocks
+ if (!prepareInput()) {
+ return null;
+ }
+
+ tsBlockBuilder.reset();
+ while (!mergeSortHeap.isEmpty()) {
+ MergeSortKey mergeSortKey = mergeSortHeap.poll();
+ TsBlock targetBlock = mergeSortKey.tsBlock;
+ int rowIndex = mergeSortKey.rowIndex;
+ Binary currentDevice = targetBlock.getColumn(0).getBinary(rowIndex);
+ long currentTime = targetBlock.getTimeByIndex(rowIndex);
+ if (lastDevice != null && (!currentDevice.equals(lastDevice) || currentTime != lastTime)) {
+ outputResultToTsBlock();
+ }
+
+ lastDevice = currentDevice;
+ lastTime = currentTime;
+
+ int cnt = 1;
+ for (Accumulator accumulator : accumulators) {
+ if (accumulator.getPartialResultSize() == 2) {
+ Column first =
+ hasGroupBy
+ ? targetBlock.getColumn(cnt++).subColumn(rowIndex)
+ : targetBlock.getColumn(cnt++);
+ Column second =
+ hasGroupBy
+ ? targetBlock.getColumn(cnt++).subColumn(rowIndex)
+ : targetBlock.getColumn(cnt++);
+ accumulator.addIntermediate(new Column[] {first, second});
+ } else {
+ Column column =
+ hasGroupBy
+ ? targetBlock.getColumn(cnt++).subColumn(rowIndex)
+ : targetBlock.getColumn(cnt++);
+ accumulator.addIntermediate(new Column[] {column});
+ }
+ }
+
+ if (mergeSortKey.rowIndex == mergeSortKey.tsBlock.getPositionCount() - 1) {
+ inputTsBlocks[mergeSortKey.inputChannelIndex] = null;
+ break;
+ } else {
+ mergeSortKey.rowIndex++;
+ mergeSortHeap.push(mergeSortKey);
+ }
+
+ // break if time is out or tsBlockBuilder is full
+ if (System.nanoTime() - startTime > maxRuntime || tsBlockBuilder.isFull()) {
+ break;
+ }
+ }
+
+ if (mergeSortHeap.isEmpty()) {
+ outputResultToTsBlock();
+ }
+
+ return tsBlockBuilder.getPositionCount() > 0 ? tsBlockBuilder.build() : null;
+ }
+
+ private void outputResultToTsBlock() {
+ TimeColumnBuilder timeBuilder = tsBlockBuilder.getTimeColumnBuilder();
+ ColumnBuilder[] valueColumnBuilders = tsBlockBuilder.getValueColumnBuilders();
+ timeBuilder.writeLong(lastTime);
+ valueColumnBuilders[0].writeBinary(lastDevice);
+ for (int i = 1; i < dataTypes.size(); i++) {
+ accumulators.get(i - 1).outputFinal(valueColumnBuilders[i]);
+ }
+ tsBlockBuilder.declarePosition();
+ accumulators.forEach(Accumulator::reset);
+ lastDevice = null;
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ if (finished) {
+ return false;
+ }
+
+ for (int i = 0; i < inputOperatorsCount; i++) {
+ if (isInputNotEmpty(i)) {
+ return true;
+ } else if (!noMoreTsBlocks[i]) {
+ if (!canCallNext[i] || children.get(i).hasNextWithTimer()) {
+ return true;
+ } else {
+ handleFinishedChild(i);
+ }
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ boolean hasReadyChild = false;
+ List<ListenableFuture<?>> listenableFutures = new ArrayList<>();
+
+ for (int i = 0; i < inputOperatorsCount; i++) {
+ if (noMoreTsBlocks[i] || isInputNotEmpty(i) || children.get(i) == null) {
+ continue;
+ }
+ ListenableFuture<?> blocked = children.get(i).isBlocked();
+ if (blocked.isDone()) {
+ hasReadyChild = true;
+ // only when not blocked, canCallNext[i] equals true
+ canCallNext[i] = true;
+ } else {
+ listenableFutures.add(blocked);
+ }
+ }
+
+ return (hasReadyChild || listenableFutures.isEmpty())
+ ? NOT_BLOCKED
+ : successfulAsList(listenableFutures);
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ if (finished) {
+ return true;
+ }
+
+ finished = true;
+ for (int i = 0; i < inputOperatorsCount; i++) {
+ if (!noMoreTsBlocks[i] || isInputNotEmpty(i)) {
+ finished = false;
+ break;
+ }
+ }
+ return finished;
+ }
+
+ @Override
+ public void close() throws Exception {
+ for (int i = 0; i < inputOperatorsCount; i++) {
+ final Operator operator = children.get(i);
+ if (operator != null) {
+ operator.close();
+ }
+ }
+ }
+
+ @Override
+ protected void handleFinishedChild(int currentChildIndex) throws Exception {
+ // invoking this method when children.get(currentChildIndex).hasNext return false
+ noMoreTsBlocks[currentChildIndex] = true;
+ inputTsBlocks[currentChildIndex] = null;
+ children.get(currentChildIndex).close();
+ children.set(currentChildIndex, null);
+ }
+
+ @Override
+ protected boolean canSkipCurrentChild(int currentChildIndex) {
+ return noMoreTsBlocks[currentChildIndex]
+ || !isEmpty(currentChildIndex)
+ || children.get(currentChildIndex) == null;
+ }
+
+ @Override
+ protected void processCurrentInputTsBlock(int currentInputIndex) {
+ mergeSortHeap.push(new MergeSortKey(inputTsBlocks[currentInputIndex], 0, currentInputIndex));
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ long maxPeekMemory = TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
+ // inputTsBlocks will cache all the tsBlocks returned by inputOperators
+ for (Operator operator : children) {
+ maxPeekMemory += operator.calculateMaxReturnSize();
+ maxPeekMemory += operator.calculateRetainedSizeAfterCallingNext();
+ }
+ for (Operator operator : children) {
+ maxPeekMemory = Math.max(maxPeekMemory, operator.calculateMaxPeekMemory());
+ }
+ return Math.max(maxPeekMemory, calculateMaxReturnSize());
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return TSFileDescriptor.getInstance().getConfig().getMaxTsBlockSizeInBytes();
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ long currentRetainedSize = 0;
+ long minChildReturnSize = Long.MAX_VALUE;
+ for (Operator child : children) {
+ long maxReturnSize = child.calculateMaxReturnSize();
+ minChildReturnSize = Math.min(minChildReturnSize, maxReturnSize);
+ currentRetainedSize += (maxReturnSize + child.calculateRetainedSizeAfterCallingNext());
+ }
+ return currentRetainedSize - minChildReturnSize;
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + RamUsageEstimator.sizeOf(noMoreTsBlocks)
+ + children.stream()
+ .mapToLong(MemoryEstimationHelper::getEstimatedSizeOfAccountableObject)
+ .sum()
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext)
+ + RamUsageEstimator.sizeOf(canCallNext)
+ + tsBlockBuilder.getRetainedSizeInBytes();
+ }
+
+ private boolean isInputNotEmpty(int index) {
+ return inputTsBlocks[index] != null && !inputTsBlocks[index].isEmpty();
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AssignUniqueIdOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AssignUniqueIdOperator.java
new file mode 100644
index 00000000000..f7faaadc0a5
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/AssignUniqueIdOperator.java
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.column.LongColumnBuilder;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.concurrent.atomic.AtomicLong;
+
+import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Verify.verify;
+
+public class AssignUniqueIdOperator implements ProcessOperator {
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(AssignUniqueIdOperator.class);
+
+ private static final long ROW_IDS_PER_REQUEST = 1L << 20L;
+ private static final long MAX_ROW_ID = 1L << 40L;
+
+ private final CommonOperatorContext operatorContext;
+ private final Operator child;
+
+ private final AtomicLong rowIdPool = new AtomicLong();
+ private final long uniqueValueMask;
+
+ private long rowIdCounter;
+ private long maxRowIdCounterValue;
+
+ public AssignUniqueIdOperator(CommonOperatorContext operatorContext, Operator child) {
+ this.operatorContext = operatorContext;
+ this.child = child;
+
+ this.uniqueValueMask =
+ (((long) operatorContext.getFragmentId()) << 54)
+ | (((long) operatorContext.getPipelineId()) << 40);
+ requestValues();
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ return child.isBlocked();
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ TsBlock tsBlock = child.nextWithTimer();
+ if (tsBlock == null || tsBlock.isEmpty()) {
+ return null;
+ }
+ return tsBlock.appendValueColumns(new Column[] {generateIdColumn(tsBlock.getPositionCount())});
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ return child.hasNext();
+ }
+
+ @Override
+ public void close() throws Exception {
+ if (child != null) {
+ child.close();
+ }
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ return child.isFinished();
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ return child.calculateMaxPeekMemory();
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return child.calculateMaxReturnSize()
+ + (long) Long.SIZE * TSFileDescriptor.getInstance().getConfig().getMaxTsBlockLineNumber();
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ return child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(child)
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext);
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+
+ private Column generateIdColumn(int positionCount) {
+ LongColumnBuilder columnBuilder = new LongColumnBuilder(null, positionCount);
+ for (int currentPosition = 0; currentPosition < positionCount; currentPosition++) {
+ if (rowIdCounter >= maxRowIdCounterValue) {
+ requestValues();
+ }
+ long rowId = rowIdCounter++;
+ verify((rowId & uniqueValueMask) == 0, "RowId and uniqueValue mask overlaps");
+ columnBuilder.writeLong(uniqueValueMask | rowId);
+ }
+ return columnBuilder.build();
+ }
+
+ private void requestValues() {
+ rowIdCounter = rowIdPool.getAndAdd(ROW_IDS_PER_REQUEST);
+ maxRowIdCounterValue = Math.min(rowIdCounter + ROW_IDS_PER_REQUEST, MAX_ROW_ID);
+ checkState(rowIdCounter < MAX_ROW_ID, "Unique row id exceeds a limit: %s", MAX_ROW_ID);
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/CollectOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/CollectOperator.java
new file mode 100644
index 00000000000..921d273d04e
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/CollectOperator.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+import org.apache.iotdb.commons.utils.TestOnly;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.List;
+
+public class CollectOperator implements ProcessOperator {
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(CollectOperator.class);
+
+ private final CommonOperatorContext operatorContext;
+ protected final List<Operator> children;
+ private boolean inited = false;
+
+ protected int currentIndex;
+
+ public CollectOperator(CommonOperatorContext operatorContext, List<Operator> children) {
+ this.operatorContext = operatorContext;
+ this.children = children;
+ this.currentIndex = 0;
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ return currentIndex < children.size();
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ if (children.get(currentIndex).hasNextWithTimer()) {
+ return children.get(currentIndex).nextWithTimer();
+ } else {
+ closeCurrentChild(currentIndex);
+ currentIndex++;
+ return null;
+ }
+ }
+
+ protected void closeCurrentChild(int index) throws Exception {
+ children.get(index).close();
+ children.set(index, null);
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ if (!inited) {
+ inited = true;
+ for (Operator child : children) {
+ child.isBlocked();
+ }
+ }
+ if (currentIndex >= children.size()) {
+ return NOT_BLOCKED;
+ }
+ return children.get(currentIndex).isBlocked();
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ return currentIndex >= children.size();
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+
+ @Override
+ public void close() throws Exception {
+ for (int i = currentIndex, n = children.size(); i < n; i++) {
+ Operator currentChild = children.get(i);
+ if (currentChild != null) {
+ closeCurrentChild(i);
+ }
+ }
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ long maxPeekMemory = 0;
+ for (Operator child : children) {
+ maxPeekMemory = Math.max(maxPeekMemory, child.calculateMaxPeekMemoryWithCounter());
+ }
+ return maxPeekMemory;
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ long maxReturnSize = 0;
+ for (Operator child : children) {
+ maxReturnSize = Math.max(maxReturnSize, child.calculateMaxReturnSize());
+ }
+ return maxReturnSize;
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ return 0L;
+ }
+
+ @TestOnly
+ public List<Operator> getChildren() {
+ return children;
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + children.stream()
+ .mapToLong(MemoryEstimationHelper::getEstimatedSizeOfAccountableObject)
+ .sum()
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext);
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/EnforceSingleRowOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/EnforceSingleRowOperator.java
new file mode 100644
index 00000000000..6a300c2cdfe
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/EnforceSingleRowOperator.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.commons.exception.SemanticException;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+public class EnforceSingleRowOperator implements ProcessOperator {
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(EnforceSingleRowOperator.class);
+
+ private static final String MULTIPLE_ROWS_ERROR_MESSAGE =
+ "Scalar sub-query has returned multiple rows.";
+
+ private static final String NO_RESULT_ERROR_MESSAGE = "Scalar sub-query does not have output.";
+
+ private final CommonOperatorContext operatorContext;
+ private final Operator child;
+
+ private boolean finished = false;
+
+ public EnforceSingleRowOperator(CommonOperatorContext operatorContext, Operator child) {
+ this.operatorContext = operatorContext;
+ this.child = child;
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ return child.isBlocked();
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ TsBlock tsBlock = child.nextWithTimer();
+ if (tsBlock == null || tsBlock.isEmpty()) {
+ return tsBlock;
+ }
+ if (tsBlock.getPositionCount() > 1 || finished) {
+ throw new SemanticException(MULTIPLE_ROWS_ERROR_MESSAGE);
+ }
+ finished = true;
+ return tsBlock;
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ return !isFinished();
+ }
+
+ @Override
+ public void close() throws Exception {
+ if (child != null) {
+ child.close();
+ }
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ boolean childFinished = child.isFinished();
+ if (childFinished && !finished) {
+ // finished == false means the child has no result returned up to now, but we need at least
+ // one result.
+ throw new SemanticException(NO_RESULT_ERROR_MESSAGE);
+ }
+ // Even if finished == true, we can not return true here, we need to call child.next() to check
+ // if child has more data.
+ // For example, if the child is a TableScanOperator with a filter, childFinished = false does
+ // not mean that the child can produce more data.(see the isFinished() of TableScanOperator)
+ return childFinished;
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ return child.calculateMaxPeekMemory();
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return child.calculateMaxReturnSize()
+ / TSFileDescriptor.getInstance().getConfig().getMaxTsBlockLineNumber();
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ return child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(child)
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext);
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/FilterAndProjectOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/FilterAndProjectOperator.java
new file mode 100644
index 00000000000..16e0cd7b330
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/FilterAndProjectOperator.java
@@ -0,0 +1,443 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.transformation.dag.column.AbstractCaseWhenThenColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.ColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.FailFunctionColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.binary.BinaryColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.leaf.IdentityColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.leaf.LeafColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.multi.MappableUDFColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.multi.MultiColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.ternary.TernaryColumnTransformer;
+import org.apache.iotdb.calc.transformation.dag.column.unary.UnaryColumnTransformer;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.block.column.ColumnBuilder;
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
+import org.apache.tsfile.read.common.block.column.TimeColumnBuilder;
+import org.apache.tsfile.utils.Pair;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.OptionalInt;
+
+public class FilterAndProjectOperator implements ProcessOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(FilterAndProjectOperator.class);
+
+ private final Operator inputOperator;
+
+ private final List<LeafColumnTransformer> filterLeafColumnTransformerList;
+
+ private final ColumnTransformer filterOutputTransformer;
+
+ private final List<ColumnTransformer> commonTransformerList;
+
+ private final List<LeafColumnTransformer> projectLeafColumnTransformerList;
+
+ private final List<ColumnTransformer> projectOutputTransformerList;
+
+ private final TsBlockBuilder filterTsBlockBuilder;
+
+ private final boolean hasNonMappableUDF;
+
+ private final CommonOperatorContext operatorContext;
+
+ // false when we only need to do projection
+ private final boolean hasFilter;
+
+ private long filteredRowCount = 0;
+
+ @SuppressWarnings("squid:S107")
+ public FilterAndProjectOperator(
+ CommonOperatorContext operatorContext,
+ Operator inputOperator,
+ List<TSDataType> filterOutputDataTypes,
+ List<LeafColumnTransformer> filterLeafColumnTransformerList,
+ ColumnTransformer filterOutputTransformer,
+ List<ColumnTransformer> commonTransformerList,
+ List<LeafColumnTransformer> projectLeafColumnTransformerList,
+ List<ColumnTransformer> projectOutputTransformerList,
+ boolean hasNonMappableUDF,
+ boolean hasFilter) {
+ this.operatorContext = operatorContext;
+ this.inputOperator = inputOperator;
+ this.filterLeafColumnTransformerList = filterLeafColumnTransformerList;
+ this.filterOutputTransformer = filterOutputTransformer;
+ this.commonTransformerList = commonTransformerList;
+ this.projectLeafColumnTransformerList = projectLeafColumnTransformerList;
+ this.projectOutputTransformerList = projectOutputTransformerList;
+ this.hasNonMappableUDF = hasNonMappableUDF;
+ this.filterTsBlockBuilder = new TsBlockBuilder(8, filterOutputDataTypes);
+ this.hasFilter = hasFilter;
+ }
+
+ public FilterAndProjectOperator(
+ FilterAndProjectOperator filterAndProjectOperator, Operator inputOperator) {
+ this.operatorContext = filterAndProjectOperator.operatorContext;
+ this.filterLeafColumnTransformerList = filterAndProjectOperator.filterLeafColumnTransformerList;
+ this.filterOutputTransformer = filterAndProjectOperator.filterOutputTransformer;
+ this.commonTransformerList = filterAndProjectOperator.commonTransformerList;
+ this.projectLeafColumnTransformerList =
+ filterAndProjectOperator.projectLeafColumnTransformerList;
+ this.projectOutputTransformerList = filterAndProjectOperator.projectOutputTransformerList;
+ this.hasNonMappableUDF = filterAndProjectOperator.hasNonMappableUDF;
+ this.hasFilter = filterAndProjectOperator.hasFilter;
+ this.filterTsBlockBuilder = filterAndProjectOperator.filterTsBlockBuilder;
+ this.inputOperator = inputOperator;
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ TsBlock input = inputOperator.nextWithTimer();
+ if (input == null) {
+ return null;
+ }
+
+ if (!hasFilter) {
+ return getTransformedTsBlock(input);
+ }
+
+ long inputRowCount = input.getPositionCount();
+ TsBlock filterResult = getFilterTsBlock(input);
+ filteredRowCount += inputRowCount - filterResult.getPositionCount();
+ operatorContext.recordSpecifiedInfo("Filtered Rows", Long.toString(filteredRowCount));
+
+ // contains non-mappable udf, we leave calculation for TransformOperator
+ if (hasNonMappableUDF) {
+ return filterResult;
+ }
+ return getTransformedTsBlock(filterResult);
+ }
+
+ /**
+ * Return the TsBlock that contains both initial input columns and columns of common
+ * subexpressions after filtering.
+ */
+ private TsBlock getFilterTsBlock(TsBlock input) {
+ final Column originTimeColumn = input.getTimeColumn();
+ final int positionCount = originTimeColumn.getPositionCount();
+ // feed Filter ColumnTransformer, including TimeStampColumnTransformer and constant
+ for (LeafColumnTransformer leafColumnTransformer : filterLeafColumnTransformerList) {
+ leafColumnTransformer.initFromTsBlock(input);
+ }
+
+ filterOutputTransformer.tryEvaluate();
+
+ Column filterColumn = filterOutputTransformer.getColumn();
+
+ // reuse this builder
+ filterTsBlockBuilder.reset();
+
+ List<Column> resultColumns = new ArrayList<>();
+ for (int i = 0, n = input.getValueColumnCount(); i < n; i++) {
+ resultColumns.add(input.getColumn(i));
+ }
+
+ if (!hasNonMappableUDF) {
+ // get result of calculated common sub expressions
+ for (ColumnTransformer columnTransformer : commonTransformerList) {
+ // CASE WHEN clause would clear all its cache
+ // evaluate again to acquire cache
+ columnTransformer.tryEvaluate();
+ resultColumns.add(columnTransformer.getColumn());
+ }
+ }
+
+ final ColumnBuilder[] columnBuilders = filterTsBlockBuilder.getValueColumnBuilders();
+ if (originTimeColumn instanceof RunLengthEncodedColumn) {
+ int rowCount =
+ constructFilteredTsBlock(resultColumns, filterColumn, columnBuilders, positionCount);
+ filterTsBlockBuilder.declarePositions(rowCount);
+
+ return filterTsBlockBuilder.build(originTimeColumn.getRegion(0, rowCount));
+
+ } else {
+ final TimeColumnBuilder timeBuilder = filterTsBlockBuilder.getTimeColumnBuilder();
+ int rowCount =
+ constructFilteredTsBlock(
+ resultColumns,
+ timeBuilder,
+ filterColumn,
+ originTimeColumn,
+ columnBuilders,
+ positionCount);
+
+ filterTsBlockBuilder.declarePositions(rowCount);
+ return filterTsBlockBuilder.build();
+ }
+ }
+
+ private static int constructFilteredTsBlock(
+ List<Column> resultColumns,
+ TimeColumnBuilder timeBuilder,
+ Column filterColumn,
+ Column originTimeColumn,
+ ColumnBuilder[] columnBuilders,
+ int positionCount) {
+ // construct result TsBlock of filter
+ int rowCount = 0;
+ for (int i = 0, n = resultColumns.size(); i < n; i++) {
+ Column curColumn = resultColumns.get(i);
+ for (int j = 0; j < positionCount; j++) {
+ if (satisfy(filterColumn, j)) {
+ if (i == 0) {
+ rowCount++;
+ timeBuilder.writeLong(originTimeColumn.getLong(j));
+ }
+ if (curColumn.isNull(j)) {
+ columnBuilders[i].appendNull();
+ } else {
+ columnBuilders[i].write(curColumn, j);
+ }
+ }
+ }
+ }
+ return rowCount;
+ }
+
+ public static int constructFilteredTsBlock(
+ List<Column> resultColumns,
+ Column filterColumn,
+ ColumnBuilder[] columnBuilders,
+ int positionCount) {
+ // construct result TsBlock of filter
+ int rowCount = 0;
+ for (int i = 0, n = resultColumns.size(); i < n; i++) {
+ Column curColumn = resultColumns.get(i);
+ for (int j = 0; j < positionCount; j++) {
+ if (satisfy(filterColumn, j)) {
+ if (i == 0) {
+ rowCount++;
+ }
+ if (curColumn.isNull(j)) {
+ columnBuilders[i].appendNull();
+ } else {
+ columnBuilders[i].write(curColumn, j);
+ }
+ }
+ }
+ }
+ return rowCount;
+ }
+
+ public static boolean satisfy(Column filterColumn, int rowIndex) {
+ return !filterColumn.isNull(rowIndex) && filterColumn.getBoolean(rowIndex);
+ }
+
+ private TsBlock getTransformedTsBlock(TsBlock input) {
+ final Column originTimeColumn = input.getTimeColumn();
+ final int positionCount = originTimeColumn.getPositionCount();
+ // feed pre calculated data
+ for (LeafColumnTransformer leafColumnTransformer : projectLeafColumnTransformerList) {
+ leafColumnTransformer.initFromTsBlock(input);
+ }
+
+ List<Column> resultColumns = new ArrayList<>();
+ for (ColumnTransformer columnTransformer : projectOutputTransformerList) {
+ columnTransformer.tryEvaluate();
+ resultColumns.add(columnTransformer.getColumn());
+ }
+ return TsBlock.wrapBlocksWithoutCopy(
+ positionCount, originTimeColumn, resultColumns.toArray(new Column[0]));
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ return inputOperator.hasNextWithTimer();
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ return inputOperator.isFinished();
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ return inputOperator.isBlocked();
+ }
+
+ @Override
+ public void close() throws Exception {
+ for (ColumnTransformer columnTransformer : projectOutputTransformerList) {
+ columnTransformer.close();
+ }
+ if (filterOutputTransformer != null) {
+ filterOutputTransformer.close();
+ }
+ inputOperator.close();
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ long maxPeekMemory = inputOperator.calculateMaxReturnSize();
+ int maxCachedColumn = 0;
+ // Only do projection, calculate max cached column size of calc tree
+ if (!hasFilter) {
+ for (int i = 0; i < projectOutputTransformerList.size(); i++) {
+ ColumnTransformer c = projectOutputTransformerList.get(i);
+ maxCachedColumn = Math.max(maxCachedColumn, 1 + i + getMaxLevelOfColumnTransformerTree(c));
+ }
+ return Math.max(
+ maxPeekMemory,
+ (long) maxCachedColumn
+ * TSFileDescriptor.getInstance().getConfig().getPageSizeInByte())
+ + inputOperator.calculateRetainedSizeAfterCallingNext();
+ }
+
+ // has Filter
+ maxCachedColumn =
+ Math.max(
+ 1 + getMaxLevelOfColumnTransformerTree(filterOutputTransformer),
+ 1 + commonTransformerList.size());
+ if (!hasNonMappableUDF) {
+ for (int i = 0; i < projectOutputTransformerList.size(); i++) {
+ ColumnTransformer c = projectOutputTransformerList.get(i);
+ maxCachedColumn = Math.max(maxCachedColumn, 1 + i + getMaxLevelOfColumnTransformerTree(c));
+ }
+ }
+ return Math.max(
+ maxPeekMemory,
+ (long) maxCachedColumn * TSFileDescriptor.getInstance().getConfig().getPageSizeInByte())
+ + inputOperator.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ // time + all value columns
+ if (!hasFilter || !hasNonMappableUDF) {
+ return (long) (1 + projectOutputTransformerList.size())
+ * TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
+ } else {
+ return (long) (1 + filterTsBlockBuilder.getValueColumnBuilders().length)
+ * TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
+ }
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ return inputOperator.calculateRetainedSizeAfterCallingNext();
+ }
+
+ private int getMaxLevelOfColumnTransformerTree(ColumnTransformer columnTransformer) {
+ if (columnTransformer instanceof LeafColumnTransformer) {
+ // Time column is always calculated, we ignore it here. Constant column is ignored.
+ if (columnTransformer instanceof IdentityColumnTransformer) {
+ return 1;
+ } else {
+ return 0;
+ }
+ } else if (columnTransformer instanceof UnaryColumnTransformer) {
+ return Math.max(
+ 2,
+ getMaxLevelOfColumnTransformerTree(
+ ((UnaryColumnTransformer) columnTransformer).getChildColumnTransformer()));
+ } else if (columnTransformer instanceof BinaryColumnTransformer) {
+ int childMaxLevel =
+ Math.max(
+ getMaxLevelOfColumnTransformerTree(
+ ((BinaryColumnTransformer) columnTransformer).getLeftTransformer()),
+ getMaxLevelOfColumnTransformerTree(
+ ((BinaryColumnTransformer) columnTransformer).getRightTransformer()));
+ return Math.max(3, childMaxLevel);
+ } else if (columnTransformer instanceof TernaryColumnTransformer) {
+ int childMaxLevel =
+ Math.max(
+ getMaxLevelOfColumnTransformerTree(
+ ((TernaryColumnTransformer) columnTransformer).getFirstColumnTransformer()),
+ Math.max(
+ getMaxLevelOfColumnTransformerTree(
+ ((TernaryColumnTransformer) columnTransformer).getSecondColumnTransformer()),
+ getMaxLevelOfColumnTransformerTree(
+ ((TernaryColumnTransformer) columnTransformer).getThirdColumnTransformer())));
+ return Math.max(4, childMaxLevel);
+ } else if (columnTransformer instanceof MultiColumnTransformer) {
+ int childrenCount = ((MultiColumnTransformer) columnTransformer).getChildren().size();
+ OptionalInt childMaxLevel =
+ ((MultiColumnTransformer) columnTransformer)
+ .getChildren().stream().mapToInt(this::getMaxLevelOfColumnTransformerTree).max();
+
+ return Math.max(childrenCount + 1, childMaxLevel.orElse(childrenCount + 1));
+ } else if (columnTransformer instanceof MappableUDFColumnTransformer) {
+ int childMaxLevel = 0;
+ for (ColumnTransformer c :
+ ((MappableUDFColumnTransformer) columnTransformer).getInputColumnTransformers()) {
+ childMaxLevel = Math.max(childMaxLevel, getMaxLevelOfColumnTransformerTree(c));
+ }
+ return Math.max(
+ 1
+ + ((MappableUDFColumnTransformer) columnTransformer)
+ .getInputColumnTransformers()
+ .length,
+ childMaxLevel);
+ } else if (columnTransformer instanceof AbstractCaseWhenThenColumnTransformer) {
+ int childMaxLevel = 0;
+ int childCount = 0;
+ for (Pair<ColumnTransformer, ColumnTransformer> whenThenColumnTransformer :
+ ((AbstractCaseWhenThenColumnTransformer) columnTransformer)
+ .getWhenThenColumnTransformers()) {
+ childMaxLevel =
+ Math.max(
+ childMaxLevel, getMaxLevelOfColumnTransformerTree(whenThenColumnTransformer.left));
+ childMaxLevel =
+ Math.max(
+ childMaxLevel, getMaxLevelOfColumnTransformerTree(whenThenColumnTransformer.right));
+ childCount++;
+ }
+ childMaxLevel =
+ Math.max(
+ childMaxLevel,
+ getMaxLevelOfColumnTransformerTree(
+ ((AbstractCaseWhenThenColumnTransformer) columnTransformer)
+ .getElseTransformer()));
+ childMaxLevel = Math.max(childMaxLevel, childCount + 2);
+ return childMaxLevel;
+ } else if (columnTransformer instanceof FailFunctionColumnTransformer) {
+ return 0;
+ } else {
+ throw new UnsupportedOperationException("Unsupported ColumnTransformer");
+ }
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(inputOperator)
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext)
+ + filterTsBlockBuilder.getRetainedSizeInBytes();
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/LimitOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/LimitOperator.java
new file mode 100644
index 00000000000..9f21dcf86a6
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/LimitOperator.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+public class LimitOperator implements ProcessOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(LimitOperator.class);
+ private final CommonOperatorContext operatorContext;
+ private long remainingLimit;
+ private final Operator child;
+
+ public LimitOperator(CommonOperatorContext operatorContext, long limit, Operator child) {
+ this.operatorContext = requireNonNull(operatorContext, "operatorContext is null");
+ checkArgument(limit >= 0, "limit must be at least zero");
+ this.remainingLimit = limit;
+ this.child = requireNonNull(child, "child operator is null");
+ }
+
+ public LimitOperator(LimitOperator limitOperator, Operator child) {
+ this.operatorContext = limitOperator.operatorContext;
+ this.remainingLimit = limitOperator.remainingLimit;
+ this.child = child;
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ return child.isBlocked();
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ TsBlock block = child.nextWithTimer();
+ if (block == null) {
+ return null;
+ }
+ TsBlock res = block;
+ if (block.getPositionCount() <= remainingLimit) {
+ remainingLimit -= block.getPositionCount();
+ } else {
+ res = block.getRegion(0, (int) remainingLimit);
+ remainingLimit = 0;
+ }
+ return res;
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ return remainingLimit > 0 && child.hasNextWithTimer();
+ }
+
+ @Override
+ public void close() throws Exception {
+ child.close();
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ return remainingLimit == 0 || child.isFinished();
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ return child.calculateMaxPeekMemoryWithCounter();
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return child.calculateMaxReturnSize();
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ return child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(child)
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext);
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/MappingCollectOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/MappingCollectOperator.java
new file mode 100644
index 00000000000..8bc1c18e9e6
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/MappingCollectOperator.java
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.plan.planner.CommonOperatorUtils;
+
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.List;
+
+public class MappingCollectOperator extends CollectOperator {
+ protected static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(MappingCollectOperator.class);
+
+ // record mapping for each child
+ private final List<List<Integer>> mappings;
+
+ private final int outputColumnsCount;
+
+ public MappingCollectOperator(
+ CommonOperatorContext operatorContext,
+ List<Operator> children,
+ List<List<Integer>> mappings) {
+ super(operatorContext, children);
+ this.mappings = mappings;
+ outputColumnsCount = mappings.get(0).size();
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ if (children.get(currentIndex).hasNextWithTimer()) {
+ TsBlock tsBlock = children.get(currentIndex).nextWithTimer();
+ if (tsBlock == null) {
+ return null;
+ } else {
+ Column[] columns = new Column[outputColumnsCount];
+ List<Integer> mapping = mappings.get(currentIndex);
+ for (int i = 0; i < columns.length; i++) {
+ columns[i] = tsBlock.getColumn(mapping.get(i));
+ }
+ return TsBlock.wrapBlocksWithoutCopy(
+ tsBlock.getPositionCount(),
+ new RunLengthEncodedColumn(
+ CommonOperatorUtils.TIME_COLUMN_TEMPLATE, tsBlock.getPositionCount()),
+ columns);
+ }
+ } else {
+ closeCurrentChild(currentIndex);
+ currentIndex++;
+ return null;
+ }
+ }
+
+ protected void closeCurrentChild(int index) throws Exception {
+ children.get(index).close();
+ children.set(index, null);
+ mappings.set(index, null);
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/MergeSortOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/MergeSortOperator.java
new file mode 100644
index 00000000000..613d3f549d7
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/MergeSortOperator.java
@@ -0,0 +1,272 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.utils.datastructure.MergeSortHeap;
+import org.apache.iotdb.calc.utils.datastructure.MergeSortKey;
+import org.apache.iotdb.calc.utils.datastructure.SortKey;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.block.column.ColumnBuilder;
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.TimeColumnBuilder;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import static com.google.common.util.concurrent.Futures.successfulAsList;
+
+public abstract class MergeSortOperator extends AbstractConsumeAllOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(MergeSortOperator.class);
+
+ private final List<TSDataType> dataTypes;
+ private final TsBlockBuilder tsBlockBuilder;
+ private final boolean[] noMoreTsBlocks;
+ private final MergeSortHeap mergeSortHeap;
+ private final Comparator<SortKey> comparator;
+
+ private boolean finished;
+
+ protected MergeSortOperator(
+ CommonOperatorContext operatorContext,
+ List<Operator> inputOperators,
+ List<TSDataType> dataTypes,
+ Comparator<SortKey> comparator) {
+ super(operatorContext, inputOperators);
+ this.dataTypes = dataTypes;
+ this.mergeSortHeap = new MergeSortHeap(inputOperatorsCount, comparator);
+ this.comparator = comparator;
+ this.noMoreTsBlocks = new boolean[inputOperatorsCount];
+ this.tsBlockBuilder = new TsBlockBuilder(dataTypes);
+ operatorContext.recordSpecifiedInfo("Merge sort branches", String.valueOf(inputOperatorsCount));
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ boolean hasReadyChild = false;
+ List<ListenableFuture<?>> listenableFutures = new ArrayList<>();
+ for (int i = 0; i < inputOperatorsCount; i++) {
+ if (noMoreTsBlocks[i] || !isEmpty(i) || children.get(i) == null) {
+ continue;
+ }
+ ListenableFuture<?> blocked = children.get(i).isBlocked();
+ if (blocked.isDone()) {
+ hasReadyChild = true;
+ canCallNext[i] = true;
+ } else {
+ listenableFutures.add(blocked);
+ }
+ }
+ return (hasReadyChild || listenableFutures.isEmpty())
+ ? NOT_BLOCKED
+ : successfulAsList(listenableFutures);
+ }
+
+ @SuppressWarnings({"squid:S3776", "squid:S135"})
+ @Override
+ public TsBlock next() throws Exception {
+ // start stopwatch
+ long startTime = System.nanoTime();
+ long maxRuntime = operatorContext.getMaxRunTime().roundTo(TimeUnit.NANOSECONDS);
+
+ // 1. fill consumed up TsBlock
+ if (!prepareInput()) {
+ return null;
+ }
+
+ // 2. check if we can directly return the original TsBlock instead of merging way
+ MergeSortKey minMergeSortKey = mergeSortHeap.poll();
+ if (mergeSortHeap.isEmpty()
+ || comparator.compare(
+ new MergeSortKey(
+ minMergeSortKey.tsBlock, minMergeSortKey.tsBlock.getPositionCount() - 1),
+ mergeSortHeap.peek())
+ < 0) {
+ inputTsBlocks[minMergeSortKey.inputChannelIndex] = null;
+ return minMergeSortKey.rowIndex == 0
+ ? minMergeSortKey.tsBlock
+ : minMergeSortKey.tsBlock.subTsBlock(minMergeSortKey.rowIndex);
+ }
+ mergeSortHeap.push(minMergeSortKey);
+
+ // 3. do merge sort until one TsBlock is consumed up
+ tsBlockBuilder.reset();
+ TimeColumnBuilder timeBuilder = tsBlockBuilder.getTimeColumnBuilder();
+ ColumnBuilder[] valueColumnBuilders = tsBlockBuilder.getValueColumnBuilders();
+ while (!mergeSortHeap.isEmpty()) {
+ MergeSortKey mergeSortKey = mergeSortHeap.poll();
+ TsBlock targetBlock = mergeSortKey.tsBlock;
+ int rowIndex = mergeSortKey.rowIndex;
+ appendTime(timeBuilder, targetBlock.getTimeByIndex(rowIndex));
+ for (int i = 0; i < valueColumnBuilders.length; i++) {
+ if (targetBlock.getColumn(i).isNull(rowIndex)) {
+ valueColumnBuilders[i].appendNull();
+ continue;
+ }
+ valueColumnBuilders[i].write(targetBlock.getColumn(i), rowIndex);
+ }
+ tsBlockBuilder.declarePosition();
+ if (mergeSortKey.rowIndex == mergeSortKey.tsBlock.getPositionCount() - 1) {
+ inputTsBlocks[mergeSortKey.inputChannelIndex] = null;
+ break;
+ } else {
+ mergeSortKey.rowIndex++;
+ mergeSortHeap.push(mergeSortKey);
+ }
+ // break if time is out or tsBlockBuilder is full
+ if (System.nanoTime() - startTime > maxRuntime || tsBlockBuilder.isFull()) {
+ break;
+ }
+ }
+ return buildResult(tsBlockBuilder);
+ }
+
+ protected abstract void appendTime(TimeColumnBuilder timeBuilder, long time);
+
+ protected abstract TsBlock buildResult(TsBlockBuilder resultBuilder);
+
+ @Override
+ public boolean hasNext() throws Exception {
+ if (finished) {
+ return false;
+ }
+ for (int i = 0; i < inputOperatorsCount; i++) {
+ if (!isEmpty(i)) {
+ return true;
+ } else if (!noMoreTsBlocks[i]) {
+ if (!canCallNext[i] || children.get(i).hasNextWithTimer()) {
+ return true;
+ } else {
+ children.get(i).close();
+ children.set(i, null);
+ noMoreTsBlocks[i] = true;
+ inputTsBlocks[i] = null;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ if (finished) {
+ return true;
+ }
+ finished = true;
+
+ for (int i = 0; i < inputOperatorsCount; i++) {
+ if (!noMoreTsBlocks[i] || !isEmpty(i)) {
+ finished = false;
+ break;
+ }
+ }
+ return finished;
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ // MergeToolKit will cache startKey and endKey
+ long maxPeekMemory = TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
+ // inputTsBlocks will cache all the tsBlocks returned by inputOperators
+ for (Operator operator : children) {
+ maxPeekMemory += operator.calculateMaxReturnSize();
+ maxPeekMemory += operator.calculateRetainedSizeAfterCallingNext();
+ }
+ for (Operator operator : children) {
+ maxPeekMemory = Math.max(maxPeekMemory, operator.calculateMaxPeekMemoryWithCounter());
+ }
+ return Math.max(maxPeekMemory, calculateMaxReturnSize());
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return (1L + dataTypes.size()) * TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ long currentRetainedSize = 0;
+ long minChildReturnSize = Long.MAX_VALUE;
+ for (Operator child : children) {
+ long maxReturnSize = child.calculateMaxReturnSize();
+ minChildReturnSize = Math.min(minChildReturnSize, maxReturnSize);
+ currentRetainedSize += (maxReturnSize + child.calculateRetainedSizeAfterCallingNext());
+ }
+ return currentRetainedSize - minChildReturnSize;
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + children.stream()
+ .mapToLong(MemoryEstimationHelper::getEstimatedSizeOfAccountableObject)
+ .sum()
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext)
+ + RamUsageEstimator.sizeOf(canCallNext)
+ + RamUsageEstimator.sizeOf(noMoreTsBlocks)
+ + tsBlockBuilder.getRetainedSizeInBytes();
+ }
+
+ // region helper function used in prepareInput
+
+ /**
+ * @param currentChildIndex the index of the child
+ * @return true if we can skip the currentChild in prepareInput
+ */
+ @Override
+ protected boolean canSkipCurrentChild(int currentChildIndex) {
+ return noMoreTsBlocks[currentChildIndex]
+ || !isEmpty(currentChildIndex)
+ || children.get(currentChildIndex) == null;
+ }
+
+ /**
+ * @param currentInputIndex index of the input TsBlock
+ */
+ @Override
+ protected void processCurrentInputTsBlock(int currentInputIndex) {
+ mergeSortHeap.push(new MergeSortKey(inputTsBlocks[currentInputIndex], 0, currentInputIndex));
+ }
+
+ /**
+ * @param currentChildIndex the index of the child
+ * @throws Exception Potential Exception thrown by Operator.close()
+ */
+ @Override
+ protected void handleFinishedChild(int currentChildIndex) throws Exception {
+ noMoreTsBlocks[currentChildIndex] = true;
+ inputTsBlocks[currentChildIndex] = null;
+ children.get(currentChildIndex).close();
+ children.set(currentChildIndex, null);
+ }
+
+ // endregion
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/OffsetOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/OffsetOperator.java
new file mode 100644
index 00000000000..376f3d9d221
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/OffsetOperator.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+public class OffsetOperator implements ProcessOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(OffsetOperator.class);
+ private final CommonOperatorContext operatorContext;
+ private long remainingOffset;
+ private final Operator child;
+
+ public OffsetOperator(CommonOperatorContext operatorContext, long offset, Operator child) {
+ this.operatorContext = requireNonNull(operatorContext, "operatorContext is null");
+ checkArgument(offset >= 0, "offset must be at least zero");
+ this.remainingOffset = offset;
+ this.child = requireNonNull(child, "child operator is null");
+ }
+
+ public OffsetOperator(OffsetOperator offsetOperator, Operator child) {
+ this.operatorContext = offsetOperator.operatorContext;
+ this.remainingOffset = offsetOperator.remainingOffset;
+ this.child = child;
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ return child.isBlocked();
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ TsBlock block = child.nextWithTimer();
+ if (block == null) {
+ return null;
+ }
+ if (remainingOffset > 0) {
+ // It's safe to narrow long to int here, because block.getPositionCount() will always be less
+ // than Integer.MAX_VALUE
+ int offset = (int) Math.min(remainingOffset, block.getPositionCount());
+ remainingOffset -= offset;
+ return block.getRegion(offset, block.getPositionCount() - offset);
+ } else {
+ return block;
+ }
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ return child.hasNextWithTimer();
+ }
+
+ @Override
+ public void close() throws Exception {
+ child.close();
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ return child.isFinished();
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ return child.calculateMaxPeekMemoryWithCounter();
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return child.calculateMaxReturnSize();
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ return child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(child)
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext);
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/PatternRecognitionOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/PatternRecognitionOperator.java
new file mode 100644
index 00000000000..d0ee968c0e5
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/PatternRecognitionOperator.java
@@ -0,0 +1,460 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.execution.operator.process.rowpattern.LogicalIndexNavigation;
+import org.apache.iotdb.calc.execution.operator.process.rowpattern.PatternAggregator;
+import org.apache.iotdb.calc.execution.operator.process.rowpattern.PatternPartitionExecutor;
+import org.apache.iotdb.calc.execution.operator.process.rowpattern.PatternVariableRecognizer;
+import org.apache.iotdb.calc.execution.operator.process.rowpattern.expression.PatternExpressionComputation;
+import org.apache.iotdb.calc.execution.operator.process.rowpattern.matcher.Matcher;
+import org.apache.iotdb.calc.execution.operator.process.window.utils.RowComparator;
+import org.apache.iotdb.calc.plan.planner.memory.MemoryReservationManager;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+import org.apache.iotdb.commons.queryengine.plan.relational.planner.node.RowsPerMatch;
+import org.apache.iotdb.commons.queryengine.plan.relational.planner.node.SkipToPosition;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+import static org.apache.iotdb.calc.plan.planner.CommonOperatorUtils.MAX_RESERVED_MEMORY;
+import static org.apache.iotdb.calc.plan.planner.CommonOperatorUtils.TIME_COLUMN_TEMPLATE;
+
+public class PatternRecognitionOperator implements ProcessOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(PatternRecognitionOperator.class);
+
+ private final CommonOperatorContext operatorContext;
+ private final Operator child;
+ private final List<TSDataType> inputDataTypes;
+ private final List<Integer> outputChannels;
+ private final TsBlockBuilder tsBlockBuilder;
+ private final MemoryReservationManager memoryReservationManager;
+
+ // Partition
+ private final List<Integer> partitionChannels;
+ private final RowComparator partitionComparator;
+ private final List<TsBlock> cachedTsBlocks;
+ private int startIndexInFirstBlock;
+
+ // Sort
+ private final List<Integer> sortChannels;
+
+ // Transformation
+ private LinkedList<PatternPartitionExecutor> cachedPartitionExecutors;
+
+ // Pattern Recognition
+ private final RowsPerMatch rowsPerMatch;
+ private final SkipToPosition skipToPosition;
+ private final Optional<LogicalIndexNavigation> skipToNavigation;
+ private final Matcher matcher;
+ private final List<PatternVariableRecognizer.PatternVariableComputation>
+ labelPatternVariableComputations;
+ private final List<PatternAggregator> patternAggregators;
+ private final List<PatternExpressionComputation> measureComputations;
+ private final List<String> labelNames;
+
+ private long totalMemorySize;
+ private long maxUsedMemory;
+ private final long maxRuntime;
+
+ public PatternRecognitionOperator(
+ CommonOperatorContext operatorContext,
+ Operator child,
+ List<TSDataType> inputDataTypes,
+ List<TSDataType> outputDataTypes,
+ List<Integer> outputChannels,
+ List<Integer> partitionChannels,
+ List<Integer> sortChannels,
+ RowsPerMatch rowsPerMatch,
+ SkipToPosition skipToPosition,
+ Optional<LogicalIndexNavigation> skipToNavigation,
+ Matcher matcher,
+ List<PatternVariableRecognizer.PatternVariableComputation> labelPatternVariableComputations,
+ List<PatternAggregator> patternAggregators,
+ List<PatternExpressionComputation> measureComputations,
+ List<String> labelNames) {
+ this.operatorContext = operatorContext;
+ this.child = child;
+ this.inputDataTypes = ImmutableList.copyOf(inputDataTypes);
+ this.outputChannels = ImmutableList.copyOf(outputChannels);
+ this.tsBlockBuilder = new TsBlockBuilder(outputDataTypes);
+
+ // Partition Part
+ this.partitionChannels = ImmutableList.copyOf(partitionChannels);
+ // Acquire partition channels' data types
+ List<TSDataType> partitionDataTypes = new ArrayList<>();
+ for (Integer channel : partitionChannels) {
+ partitionDataTypes.add(inputDataTypes.get(channel));
+ }
+ this.partitionComparator = new RowComparator(partitionDataTypes);
+
+ // Sort Part
+ this.sortChannels = ImmutableList.copyOf(sortChannels);
+
+ // Transformation part
+ this.cachedPartitionExecutors = new LinkedList<>();
+
+ // Pattern Recognition part
+ this.rowsPerMatch = rowsPerMatch;
+ this.skipToPosition = skipToPosition;
+ this.skipToNavigation = skipToNavigation;
+ this.matcher = matcher;
+ this.labelPatternVariableComputations = ImmutableList.copyOf(labelPatternVariableComputations);
+ this.patternAggregators = ImmutableList.copyOf(patternAggregators);
+ this.measureComputations = ImmutableList.copyOf(measureComputations);
+ this.labelNames = ImmutableList.copyOf(labelNames);
+
+ this.cachedTsBlocks = new ArrayList<>();
+ this.startIndexInFirstBlock = -1;
+
+ this.maxRuntime = this.operatorContext.getMaxRunTime().roundTo(TimeUnit.NANOSECONDS);
+ this.totalMemorySize = 0;
+ this.maxUsedMemory = 0;
+ this.memoryReservationManager = operatorContext.getMemoryReservationContext();
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ return child.isBlocked();
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ long startTime = System.nanoTime();
+
+ // Transform is not finished
+ if (!cachedPartitionExecutors.isEmpty()) {
+ TsBlock tsBlock = transform(startTime);
+ if (tsBlock != null) {
+ return tsBlock;
+ }
+ // Receive more data when result TsBlock builder is not full
+ // In this case, all partition executors are done
+ }
+
+ if (child.hasNextWithTimer()) {
+ // This TsBlock is pre-sorted with PARTITION BY and ORDER BY channels
+ TsBlock preSortedBlock = child.nextWithTimer();
+ // StreamSort Operator sometimes returns null
+ if (preSortedBlock == null || preSortedBlock.isEmpty()) {
+ return null;
+ }
+
+ cachedPartitionExecutors = partition(preSortedBlock);
+ if (cachedPartitionExecutors.isEmpty()) {
+ // No partition found
+ // i.e., partition crosses multiple TsBlocks
+ return null;
+ }
+
+ // May return null if builder is not full
+ return transform(startTime);
+ } else if (!cachedTsBlocks.isEmpty()) {
+ // Form last partition
+ TsBlock lastTsBlock = cachedTsBlocks.get(cachedTsBlocks.size() - 1);
+ int endIndexOfLastTsBlock = lastTsBlock.getPositionCount();
+ PatternPartitionExecutor partitionExecutor =
+ new PatternPartitionExecutor(
+ cachedTsBlocks,
+ inputDataTypes,
+ startIndexInFirstBlock,
+ endIndexOfLastTsBlock,
+ outputChannels,
+ sortChannels,
+ rowsPerMatch,
+ skipToPosition,
+ skipToNavigation,
+ matcher,
+ labelPatternVariableComputations,
+ patternAggregators,
+ measureComputations,
+ labelNames);
+ cachedPartitionExecutors.addLast(partitionExecutor);
+ cachedTsBlocks.clear();
+ releaseAllCachedTsBlockMemory();
+
+ TsBlock tsBlock = transform(startTime);
+ if (tsBlock == null) {
+ // TsBlockBuilder is not full
+ // Force build since this is the last partition
+ tsBlock =
+ tsBlockBuilder.build(
+ new RunLengthEncodedColumn(
+ TIME_COLUMN_TEMPLATE, tsBlockBuilder.getPositionCount()));
+ tsBlockBuilder.reset();
+ }
+
+ return tsBlock;
+ } else if (!tsBlockBuilder.isEmpty()) {
+ // Return remaining data in result TsBlockBuilder
+ // This happens when last partition is too large
+ // And TsBlockBuilder is not full at the end of transform
+ return getTsBlockFromTsBlockBuilder();
+ }
+
+ return null;
+ }
+
+ private LinkedList<PatternPartitionExecutor> partition(TsBlock tsBlock) {
+ LinkedList<PatternPartitionExecutor> partitionExecutors = new LinkedList<>();
+
+ int partitionStartInCurrentBlock = 0;
+ int partitionEndInCurrentBlock = partitionStartInCurrentBlock + 1;
+
+ // In this stage, we only consider partition channels
+ List<Column> partitionColumns = extractPartitionColumns(tsBlock);
+
+ // Previous TsBlocks forms a partition
+ if (!cachedTsBlocks.isEmpty()) {
+ TsBlock lastTsBlock = cachedTsBlocks.get(cachedTsBlocks.size() - 1);
+ int endIndexOfLastTsBlock = lastTsBlock.getPositionCount();
+
+ // Whether the first row of current TsBlock is not equal to
+ // last row of previous cached TsBlocks
+ List<Column> lastPartitionColumns = extractPartitionColumns(lastTsBlock);
+ if (!partitionComparator.equal(
+ partitionColumns, 0, lastPartitionColumns, endIndexOfLastTsBlock - 1)) {
+
+ PatternPartitionExecutor partitionExecutor =
+ new PatternPartitionExecutor(
+ cachedTsBlocks,
+ inputDataTypes,
+ startIndexInFirstBlock,
+ endIndexOfLastTsBlock,
+ outputChannels,
+ sortChannels,
+ rowsPerMatch,
+ skipToPosition,
+ skipToNavigation,
+ matcher,
+ labelPatternVariableComputations,
+ patternAggregators,
+ measureComputations,
+ labelNames);
+
+ partitionExecutors.addLast(partitionExecutor);
+ cachedTsBlocks.clear();
+ releaseAllCachedTsBlockMemory();
+ startIndexInFirstBlock = -1;
+ }
+ }
+
+ // Try to find all partitions
+ int count = tsBlock.getPositionCount();
+ while (count == 1 || partitionEndInCurrentBlock < count) {
+ // Try to find one partition
+ while (partitionEndInCurrentBlock < count
+ && partitionComparator.equalColumns(
+ partitionColumns, partitionStartInCurrentBlock, partitionEndInCurrentBlock)) {
+ partitionEndInCurrentBlock++;
+ }
+
+ if (partitionEndInCurrentBlock != count) {
+ // Find partition
+ PatternPartitionExecutor partitionExecutor;
+ if (partitionStartInCurrentBlock != 0 || startIndexInFirstBlock == -1) {
+ // Small partition within this TsBlock
+ partitionExecutor =
+ new PatternPartitionExecutor(
+ Collections.singletonList(tsBlock),
+ inputDataTypes,
+ partitionStartInCurrentBlock,
+ partitionEndInCurrentBlock,
+ outputChannels,
+ sortChannels,
+ rowsPerMatch,
+ skipToPosition,
+ skipToNavigation,
+ matcher,
+ labelPatternVariableComputations,
+ patternAggregators,
+ measureComputations,
+ labelNames);
+ } else {
+ // Large partition crosses multiple TsBlocks
+ reserveOneTsBlockMemory(tsBlock);
+ cachedTsBlocks.add(tsBlock);
+ partitionExecutor =
+ new PatternPartitionExecutor(
+ cachedTsBlocks,
+ inputDataTypes,
+ startIndexInFirstBlock,
+ partitionEndInCurrentBlock,
+ outputChannels,
+ sortChannels,
+ rowsPerMatch,
+ skipToPosition,
+ skipToNavigation,
+ matcher,
+ labelPatternVariableComputations,
+ patternAggregators,
+ measureComputations,
+ labelNames);
+ // Clear TsBlock of last partition
+ cachedTsBlocks.clear();
+ releaseAllCachedTsBlockMemory();
+ }
+ partitionExecutors.addLast(partitionExecutor);
+
+ partitionStartInCurrentBlock = partitionEndInCurrentBlock;
+ partitionEndInCurrentBlock = partitionStartInCurrentBlock + 1;
+ } else {
+ // Last partition of TsBlock
+ // The beginning of next TsBlock may have rows in this partition
+ if (startIndexInFirstBlock == -1) {
+ startIndexInFirstBlock = partitionStartInCurrentBlock;
+ }
+ reserveOneTsBlockMemory(tsBlock);
+ cachedTsBlocks.add(tsBlock);
+ // For count == 1
+ break;
+ }
+ }
+
+ return partitionExecutors;
+ }
+
+ private TsBlock transform(long startTime) {
+ while (!cachedPartitionExecutors.isEmpty()) {
+ PatternPartitionExecutor partitionExecutor = cachedPartitionExecutors.getFirst();
+
+ while (System.nanoTime() - startTime < maxRuntime
+ && !tsBlockBuilder.isFull()
+ && partitionExecutor.hasNext()) {
+ partitionExecutor.processNextRow(tsBlockBuilder);
+ }
+
+ if (!partitionExecutor.hasNext()) {
+ cachedPartitionExecutors.removeFirst();
+ }
+
+ if (System.nanoTime() - startTime >= maxRuntime || tsBlockBuilder.isFull()) {
+ return getTsBlockFromTsBlockBuilder();
+ }
+ }
+
+ // Reach partition end, but builder is not full yet
+ return null;
+ }
+
+ private List<Column> extractPartitionColumns(TsBlock tsBlock) {
+ List<Column> partitionColumns = new ArrayList<>(partitionChannels.size());
+ for (int channel : partitionChannels) {
+ Column partitionColumn = tsBlock.getColumn(channel);
+ partitionColumns.add(partitionColumn);
+ }
+ return partitionColumns;
+ }
+
+ private TsBlock getTsBlockFromTsBlockBuilder() {
+ TsBlock result =
+ tsBlockBuilder.build(
+ new RunLengthEncodedColumn(TIME_COLUMN_TEMPLATE, tsBlockBuilder.getPositionCount()));
+ tsBlockBuilder.reset();
+ return result;
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ return !cachedPartitionExecutors.isEmpty()
+ || child.hasNext()
+ || !cachedTsBlocks.isEmpty()
+ || !tsBlockBuilder.isEmpty();
+ }
+
+ @Override
+ public void close() throws Exception {
+ child.close();
+ if (totalMemorySize != 0) {
+ memoryReservationManager.releaseMemoryCumulatively(totalMemorySize);
+ }
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ return !this.hasNextWithTimer();
+ }
+
+ private void reserveOneTsBlockMemory(TsBlock tsBlock) {
+ long reserved = tsBlock.getTotalInstanceSize();
+ memoryReservationManager.reserveMemoryCumulatively(reserved);
+ totalMemorySize += reserved;
+ maxUsedMemory = Math.max(maxUsedMemory, totalMemorySize);
+ operatorContext.recordSpecifiedInfo(MAX_RESERVED_MEMORY, Long.toString(maxUsedMemory));
+ }
+
+ private void releaseAllCachedTsBlockMemory() {
+ long released = cachedTsBlocks.stream().mapToInt(TsBlock::getTotalInstanceSize).sum();
+ memoryReservationManager.releaseMemoryCumulatively(released);
+ totalMemorySize -= released;
+ // No need to update maxUsedMemory
+ operatorContext.recordSpecifiedInfo(MAX_RESERVED_MEMORY, Long.toString(maxUsedMemory));
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ long maxPeekMemoryFromInput = child.calculateMaxPeekMemoryWithCounter();
+ long maxPeekMemoryFromCurrent =
+ TSFileDescriptor.getInstance().getConfig().getMaxTsBlockSizeInBytes();
+ return Math.max(maxPeekMemoryFromInput, maxPeekMemoryFromCurrent)
+ + child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return TSFileDescriptor.getInstance().getConfig().getMaxTsBlockSizeInBytes();
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ return child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(child)
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext)
+ + tsBlockBuilder.getRetainedSizeInBytes();
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/PreviousFillWithGroupOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/PreviousFillWithGroupOperator.java
new file mode 100644
index 00000000000..06f1d635470
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/PreviousFillWithGroupOperator.java
@@ -0,0 +1,213 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.execution.operator.process.fill.IFill;
+import org.apache.iotdb.calc.utils.datastructure.SortKey;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.block.column.ColumnBuilder;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.Comparator;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static java.util.Objects.requireNonNull;
+
+/** Used for table previous fill with group. */
+public class PreviousFillWithGroupOperator implements ProcessOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(PreviousFillWithGroupOperator.class);
+ private final CommonOperatorContext operatorContext;
+ private final IFill[] fillArray;
+ private final Operator child;
+ private final int outputColumnCount;
+
+ // start from 0, never will be -1
+ private final int helperColumnIndex;
+
+ private final Comparator<SortKey> groupKeyComparator;
+
+ private final TsBlockBuilder resultBuilder;
+
+ private SortKey lastRow = null;
+
+ public PreviousFillWithGroupOperator(
+ CommonOperatorContext operatorContext,
+ IFill[] fillArray,
+ Operator child,
+ int helperColumnIndex,
+ Comparator<SortKey> groupKeyComparator,
+ List<TSDataType> dataTypes) {
+ this.operatorContext = requireNonNull(operatorContext, "operatorContext is null");
+ checkArgument(
+ fillArray != null && fillArray.length > 0, "fillArray should not be null or empty");
+ this.fillArray = fillArray;
+ this.child = requireNonNull(child, "child operator is null");
+ this.outputColumnCount = fillArray.length;
+ checkArgument(
+ helperColumnIndex >= 0,
+ "helperColumnIndex for PreviousFillWithGroupOperator should never be negative");
+ this.helperColumnIndex = helperColumnIndex;
+ this.groupKeyComparator = groupKeyComparator;
+ this.resultBuilder = new TsBlockBuilder(dataTypes);
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ TsBlock block = child.nextWithTimer();
+ if (block == null) {
+ return null;
+ }
+
+ checkArgument(
+ outputColumnCount == block.getValueColumnCount(),
+ "outputColumnCount is not equal to value column count of child operator's TsBlock");
+
+ // current TsBlock's first row is not same group as the last row of previous TsBlock
+ // we need to call reset the fill
+ if (lastRow != null && groupKeyComparator.compare(lastRow, new SortKey(block, 0)) != 0) {
+ resetFill();
+ }
+
+ // update lastRow
+ this.lastRow = new SortKey(block, block.getPositionCount() - 1);
+ // all rows in current TsBlock belong to same group
+ if (lastRow.rowIndex == 0 || groupKeyComparator.compare(new SortKey(block, 0), lastRow) == 0) {
+ Column[] valueColumns = new Column[outputColumnCount];
+
+ for (int i = 0; i < outputColumnCount; i++) {
+ valueColumns[i] = fillArray[i].fill(block.getColumn(helperColumnIndex), block.getColumn(i));
+ }
+ return TsBlock.wrapBlocksWithoutCopy(
+ block.getPositionCount(), block.getTimeColumn(), valueColumns);
+ } else {
+ // otherwise, we need to split the current TsBlock and reset the fill between different groups
+ resultBuilder.reset();
+ SortKey currentGroupKey = new SortKey(block, 0);
+ for (int i = 1; i <= lastRow.rowIndex; i++) {
+ SortKey nextGroupKey = new SortKey(block, i);
+
+ if (groupKeyComparator.compare(currentGroupKey, nextGroupKey) != 0) {
+ // don't belong to same group, need to split here and build result for current group, then
+ // reset the fill
+ buildResultForCurrentGroup(block, currentGroupKey.rowIndex, i - 1);
+ resetFill();
+ currentGroupKey = nextGroupKey;
+ }
+ }
+
+ // take care of the last group
+ // we don't need to reset the fill, because we can only decide whether to reset once we get
+ // next TsBlock
+ buildResultForCurrentGroup(block, currentGroupKey.rowIndex, lastRow.rowIndex);
+
+ return resultBuilder.build(block.getTimeColumn());
+ }
+ }
+
+ private void resetFill() {
+ for (IFill fill : fillArray) {
+ fill.reset();
+ }
+ }
+
+ // startIndex and endIndex are all including.
+ // we won't build timeColumn in this method
+ private void buildResultForCurrentGroup(TsBlock block, int startIndex, int endIndex) {
+
+ int length = endIndex - startIndex + 1;
+ resultBuilder.declarePositions(length);
+
+ Column helperColumn = block.getColumn(helperColumnIndex).getRegion(startIndex, length);
+ for (int i = 0; i < outputColumnCount; i++) {
+ Column column =
+ fillArray[i].fill(helperColumn, block.getColumn(i).getRegion(startIndex, length));
+ ColumnBuilder builder = resultBuilder.getColumnBuilder(i);
+ for (int rowIndex = 0; rowIndex < length; rowIndex++) {
+ if (column.isNull(rowIndex)) {
+ builder.appendNull();
+ } else {
+ builder.write(column, rowIndex);
+ }
+ }
+ }
+ }
+
+ @Override
+ public ListenableFuture<?> isBlocked() {
+ return child.isBlocked();
+ }
+
+ @Override
+ public CommonOperatorContext getOperatorContext() {
+ return operatorContext;
+ }
+
+ @Override
+ public long calculateMaxPeekMemory() {
+ // while doing previous fill, we may need to copy the corresponding column if there
+ // exists null values so the max peek memory may be double
+ return 2 * child.calculateMaxPeekMemory() + child.calculateRetainedSizeAfterCallingNext();
+ }
+
+ @Override
+ public long calculateRetainedSizeAfterCallingNext() {
+ // we may need to cache the last tsblock in groupKeyComparator
+ return child.calculateRetainedSizeAfterCallingNext() + child.calculateMaxReturnSize();
+ }
+
+ @Override
+ public long calculateMaxReturnSize() {
+ return child.calculateMaxReturnSize();
+ }
+
+ @Override
+ public void close() throws Exception {
+ child.close();
+ lastRow = null;
+ }
+
+ @Override
+ public boolean isFinished() throws Exception {
+ return child.isFinished();
+ }
+
+ @Override
+ public boolean hasNext() throws Exception {
+ return child.hasNextWithTimer();
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(child)
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext);
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/ProcessOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/ProcessOperator.java
new file mode 100644
index 00000000000..22462a55446
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/ProcessOperator.java
@@ -0,0 +1,24 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.Operator;
+
+public interface ProcessOperator extends Operator {}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/SortOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/SortOperator.java
new file mode 100644
index 00000000000..0b546eee702
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/SortOperator.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.utils.datastructure.SortKey;
+import org.apache.iotdb.calc.utils.sort.DiskSpiller;
+import org.apache.iotdb.commons.exception.IoTDBException;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.Comparator;
+import java.util.List;
+
+public abstract class SortOperator extends AbstractSortOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(SortOperator.class);
+
+ protected SortOperator(
+ CommonOperatorContext operatorContext,
+ Operator inputOperator,
+ List<TSDataType> dataTypes,
+ DiskSpiller diskSpiller,
+ Comparator<SortKey> comparator) {
+ super(operatorContext, inputOperator, dataTypes, diskSpiller, comparator);
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ if (!inputOperator.hasNextWithTimer()) {
+ buildResult();
+ TsBlock res = buildFinalResult(tsBlockBuilder);
+ tsBlockBuilder.reset();
+ return res;
+ }
+ long startTime = System.nanoTime();
+ try {
+ TsBlock tsBlock = inputOperator.nextWithTimer();
+ if (tsBlock == null) {
+ return null;
+ }
+ dataSize += tsBlock.getSizeInBytes();
+ cacheTsBlock(tsBlock);
+ } catch (IoTDBException e) {
+ clear();
+ throw e;
+ } finally {
+ prepareUntilReadyCost += System.nanoTime() - startTime;
+ }
+
+ return null;
+ }
+
+ protected abstract TsBlock buildFinalResult(TsBlockBuilder resultBuilder);
+
+ @Override
+ public long ramBytesUsed() {
+ return INSTANCE_SIZE
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(inputOperator)
+ + MemoryEstimationHelper.getEstimatedSizeOfAccountableObject(operatorContext)
+ + RamUsageEstimator.sizeOf(noMoreData)
+ + tsBlockBuilder.getRetainedSizeInBytes();
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableFillOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableFillOperator.java
new file mode 100644
index 00000000000..5b41bb657de
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableFillOperator.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.execution.operator.process.fill.IFill;
+
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.read.common.block.TsBlock;
+
+public class TableFillOperator extends AbstractFillOperator {
+
+ // start from 0, index -1 for:
+ // a. not specifying timeDuration parameter in FILL(PREVIOUS)
+ // b. FILL(VALUE)
+ private final int helperColumnIndex;
+
+ public TableFillOperator(
+ CommonOperatorContext operatorContext,
+ IFill[] fillArray,
+ Operator child,
+ int helperColumnIndex) {
+ super(operatorContext, fillArray, child);
+ this.helperColumnIndex = helperColumnIndex;
+ }
+
+ @Override
+ protected Column getHelperColumn(TsBlock tsBlock) {
+ // if helperColumnIndex is -1, HelperColumn won't be used, so just return TimeColumn in TsBlock
+ // instead
+ return helperColumnIndex == -1 ? tsBlock.getTimeColumn() : tsBlock.getColumn(helperColumnIndex);
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return super.ramBytesUsed() + Integer.BYTES;
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableLinearFillOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableLinearFillOperator.java
new file mode 100644
index 00000000000..b0f75ef4b29
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableLinearFillOperator.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.execution.operator.process.fill.ILinearFill;
+
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.read.common.block.TsBlock;
+
+// table linear fill without GROUP_FILL
+public class TableLinearFillOperator extends AbstractLinearFillOperator {
+
+ // start from 0
+ private final int helperColumnIndex;
+
+ public TableLinearFillOperator(
+ CommonOperatorContext operatorContext,
+ ILinearFill[] fillArray,
+ Operator child,
+ int helperColumnIndex) {
+ super(operatorContext, fillArray, child);
+ this.helperColumnIndex = helperColumnIndex;
+ }
+
+ @Override
+ protected Column getHelperColumn(TsBlock tsBlock) {
+ // if helperColumnIndex is -1, HelperColumn won't be used, so just return TimeColumn in TsBlock
+ // instead
+ return tsBlock.getColumn(helperColumnIndex);
+ }
+
+ @Override
+ protected Integer getLastRowIndexForNonNullHelperColumn(TsBlock tsBlock) {
+ Column helperColumn = getHelperColumn(tsBlock);
+ int size = tsBlock.getPositionCount();
+ if (!helperColumn.mayHaveNull()) {
+ return size - 1;
+ } else {
+ int i = size - 1;
+ for (; i >= 0; i--) {
+ if (!helperColumn.isNull(i)) {
+ break;
+ }
+ }
+ return i;
+ }
+ }
+
+ @Override
+ public long ramBytesUsed() {
+ return super.ramBytesUsed() + Integer.BYTES;
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableLinearFillWithGroupOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableLinearFillWithGroupOperator.java
new file mode 100644
index 00000000000..883ee156edc
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableLinearFillWithGroupOperator.java
@@ -0,0 +1,171 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.execution.operator.process.fill.ILinearFill;
+import org.apache.iotdb.calc.plan.planner.CommonOperatorUtils;
+import org.apache.iotdb.calc.utils.datastructure.SortKey;
+
+import org.apache.tsfile.block.column.Column;
+import org.apache.tsfile.block.column.ColumnBuilder;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+public class TableLinearFillWithGroupOperator extends TableLinearFillOperator {
+
+ private final List<Boolean> groupSplitter;
+
+ private final List<Boolean> noMoreTsBlockForCurrentGroup;
+
+ private final Comparator<SortKey> groupKeyComparator;
+
+ private final TsBlockBuilder resultBuilder;
+
+ private SortKey lastRow = null;
+
+ public TableLinearFillWithGroupOperator(
+ CommonOperatorContext operatorContext,
+ ILinearFill[] fillArray,
+ Operator child,
+ int helperColumnIndex,
+ Comparator<SortKey> groupKeyComparator,
+ List<TSDataType> dataTypes) {
+ super(operatorContext, fillArray, child, helperColumnIndex);
+ this.groupSplitter = new ArrayList<>();
+ this.noMoreTsBlockForCurrentGroup = new ArrayList<>();
+ this.groupKeyComparator = groupKeyComparator;
+ this.resultBuilder = new TsBlockBuilder(dataTypes);
+ }
+
+ @Override
+ // we won't build timeColumn in this method
+ TsBlock append(int length, Column timeColumn, Column[] valueColumns) {
+ for (int i = 0; i < outputColumnCount; i++) {
+ Column column = valueColumns[i];
+ ColumnBuilder builder = resultBuilder.getColumnBuilder(i);
+ for (int rowIndex = 0; rowIndex < length; rowIndex++) {
+ if (column.isNull(rowIndex)) {
+ builder.appendNull();
+ } else {
+ builder.write(column, rowIndex);
+ }
+ }
+ }
+ resultBuilder.declarePositions(length);
+ return null;
+ }
+
+ @Override
+ TsBlock buildFinalResult(TsBlock tempResult) {
+ TsBlock result = null;
+ if (!resultBuilder.isEmpty()) {
+ Column timeColumn =
+ new RunLengthEncodedColumn(
+ CommonOperatorUtils.TIME_COLUMN_TEMPLATE, resultBuilder.getPositionCount());
+ result = resultBuilder.build(timeColumn);
+ resultBuilder.reset();
+ }
+ return result;
+ }
+
+ @Override
+ boolean noMoreTsBlockForCurrentGroup() {
+ return noMoreTsBlock || noMoreTsBlockForCurrentGroup.get(0);
+ }
+
+ @Override
+ void resetFill() {
+ // if current tsblock belongs to another group, we need to reset fill.
+ if (Boolean.TRUE.equals(groupSplitter.remove(0))) {
+ for (ILinearFill fill : fillArray) {
+ fill.reset();
+ }
+ }
+ noMoreTsBlockForCurrentGroup.remove(0);
+ }
+
+ @Override
+ public void close() throws Exception {
+ super.close();
+ lastRow = null;
+ }
+
+ @Override
+ void updateCachedData(TsBlock tsBlock) {
+
+ boolean isFirstGroupOfCurrentTsBlock = true;
+ SortKey currentGroupKey = new SortKey(tsBlock, 0);
+ int size = tsBlock.getPositionCount();
+ for (int i = 1; i < size; i++) {
+ SortKey nextGroupKey = new SortKey(tsBlock, i);
+
+ if (groupKeyComparator.compare(currentGroupKey, nextGroupKey) != 0) {
+ int length = i - currentGroupKey.rowIndex;
+ TsBlock currentGroup = tsBlock.getRegion(currentGroupKey.rowIndex, length);
+ super.updateCachedData(currentGroup);
+ if (isFirstGroupOfCurrentTsBlock) {
+ isFirstGroupOfCurrentTsBlock = false;
+ boolean isNewGroup = isNewGroup(currentGroupKey);
+ // if it's new group, update noMoreTsBlockFor previous group in previous TsBlock if there
+ // exists
+ if (isNewGroup && !noMoreTsBlockForCurrentGroup.isEmpty()) {
+ noMoreTsBlockForCurrentGroup.set(noMoreTsBlockForCurrentGroup.size() - 1, true);
+ }
+ groupSplitter.add(isNewGroup);
+ } else {
+ groupSplitter.add(true);
+ }
+ noMoreTsBlockForCurrentGroup.add(true);
+ currentGroupKey = nextGroupKey;
+ }
+ }
+
+ int length = size - currentGroupKey.rowIndex;
+ TsBlock currentGroup = tsBlock.getRegion(currentGroupKey.rowIndex, length);
+ super.updateCachedData(currentGroup);
+ if (isFirstGroupOfCurrentTsBlock) {
+ boolean isNewGroup = isNewGroup(currentGroupKey);
+ // if it's new group, update noMoreTsBlockFor previous group in previous TsBlock if there
+ // exists
+ if (isNewGroup && !noMoreTsBlockForCurrentGroup.isEmpty()) {
+ noMoreTsBlockForCurrentGroup.set(noMoreTsBlockForCurrentGroup.size() - 1, true);
+ }
+ groupSplitter.add(isNewGroup);
+ } else {
+ groupSplitter.add(true);
+ }
+ noMoreTsBlockForCurrentGroup.add(false);
+ lastRow = currentGroupKey;
+ }
+
+ // judge whether the first group of current TsBlock belongs to the same group of last row of
+ // previous TsBlock
+ private boolean isNewGroup(SortKey currentGroupKey) {
+ return lastRow == null || groupKeyComparator.compare(lastRow, currentGroupKey) != 0;
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableMergeSortOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableMergeSortOperator.java
new file mode 100644
index 00000000000..136747151a7
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableMergeSortOperator.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.plan.planner.CommonOperatorUtils;
+import org.apache.iotdb.calc.utils.datastructure.SortKey;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
+import org.apache.tsfile.read.common.block.column.TimeColumnBuilder;
+
+import java.util.Comparator;
+import java.util.List;
+
+public class TableMergeSortOperator extends MergeSortOperator {
+ public TableMergeSortOperator(
+ CommonOperatorContext operatorContext,
+ List<Operator> inputOperators,
+ List<TSDataType> dataTypes,
+ Comparator<SortKey> comparator) {
+ super(operatorContext, inputOperators, dataTypes, comparator);
+ }
+
+ @Override
+ protected void appendTime(TimeColumnBuilder timeBuilder, long time) {
+ // do nothing for table related operator
+ }
+
+ @Override
+ protected TsBlock buildResult(TsBlockBuilder resultBuilder) {
+ return resultBuilder.build(
+ new RunLengthEncodedColumn(
+ CommonOperatorUtils.TIME_COLUMN_TEMPLATE, resultBuilder.getPositionCount()));
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableSortOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableSortOperator.java
new file mode 100644
index 00000000000..b09b3cb5b56
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableSortOperator.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.plan.planner.CommonOperatorUtils;
+import org.apache.iotdb.calc.utils.datastructure.SortKey;
+import org.apache.iotdb.calc.utils.sort.TableDiskSpiller;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
+import org.apache.tsfile.read.common.block.column.TimeColumnBuilder;
+
+import java.util.Comparator;
+import java.util.List;
+
+public class TableSortOperator extends SortOperator {
+ public TableSortOperator(
+ CommonOperatorContext operatorContext,
+ Operator inputOperator,
+ List<TSDataType> dataTypes,
+ String folderPath,
+ Comparator<SortKey> comparator) {
+ super(
+ operatorContext,
+ inputOperator,
+ dataTypes,
+ new TableDiskSpiller(folderPath, folderPath + operatorContext.getOperatorId(), dataTypes),
+ comparator);
+ }
+
+ @Override
+ protected void appendTime(TimeColumnBuilder timeBuilder, long time) {
+ // do nothing for table related operator
+ }
+
+ @Override
+ protected TsBlock buildFinalResult(TsBlockBuilder resultBuilder) {
+ return resultBuilder.build(
+ new RunLengthEncodedColumn(
+ CommonOperatorUtils.TIME_COLUMN_TEMPLATE, resultBuilder.getPositionCount()));
+ }
+}
diff --git a/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableStreamSortOperator.java b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableStreamSortOperator.java
new file mode 100644
index 00000000000..a1cb2c73216
--- /dev/null
+++ b/iotdb-core/calc-commons/src/main/java/org/apache/iotdb/calc/execution/operator/process/TableStreamSortOperator.java
@@ -0,0 +1,220 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.calc.execution.operator.process;
+
+import org.apache.iotdb.calc.execution.operator.CommonOperatorContext;
+import org.apache.iotdb.calc.execution.operator.Operator;
+import org.apache.iotdb.calc.plan.planner.CommonOperatorUtils;
+import org.apache.iotdb.calc.utils.datastructure.SortKey;
+import org.apache.iotdb.calc.utils.sort.TableDiskSpiller;
+import org.apache.iotdb.commons.exception.IoTDBException;
+import org.apache.iotdb.commons.queryengine.execution.MemoryEstimationHelper;
+
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.column.RunLengthEncodedColumn;
+import org.apache.tsfile.read.common.block.column.TimeColumnBuilder;
+import org.apache.tsfile.utils.RamUsageEstimator;
+
+import java.util.Comparator;
+import java.util.List;
+
+public class TableStreamSortOperator extends AbstractSortOperator {
+
+ private static final long INSTANCE_SIZE =
+ RamUsageEstimator.shallowSizeOfInstance(TableStreamSortOperator.class);
+
+ private final Comparator<SortKey> streamSortComparator;
+
+ private final int minLinesToOutput;
+
+ // accumulated unprinted line count
+ private long remainingCount = 0;
+
+ // child operator has no more data
+ private boolean noMoreDataFromChild = false;
+
+ // unprocessed data from the previous iteration
+ private TsBlock currentTsBlock = null;
+
+ // be able to start stream outputting partial data
+ private boolean canStreamOutput = false;
+
+ private SortKey lastRow = null;
+
+ public TableStreamSortOperator(
+ CommonOperatorContext operatorContext,
+ Operator inputOperator,
+ List<TSDataType> dataTypes,
+ String folderPath,
+ Comparator<SortKey> comparator,
+ Comparator<SortKey> streamSortComparator,
+ int minLinesToOutput) {
+ super(
+ operatorContext,
+ inputOperator,
+ dataTypes,
+ new TableDiskSpiller(folderPath, folderPath + operatorContext.getOperatorId(), dataTypes),
+ comparator);
+ this.streamSortComparator = streamSortComparator;
+ this.minLinesToOutput = minLinesToOutput;
+ }
+
+ @Override
+ public TsBlock next() throws Exception {
+ if (canStreamOutput || !tsBlockBuilder.isEmpty()) {
+
+ buildResult();
+
+ // this time stream output data has been consumed up
+ if (!hasMoreSortedData()) {
+ canStreamOutput = false;
+ // clear spilled disk space and memory data structure
+ resetSortRelatedResource();
+ }
+
+ if (tsBlockBuilder.isFull() || consumedUp()) {
+ int rowCount = tsBlockBuilder.getPositionCount();
+ TsBlock res =
+ tsBlockBuilder.build(
+ new RunLengthEncodedColumn(CommonOperatorUtils.TIME_COLUMN_TEMPLATE, rowCount));
+ remainingCount -= rowCount;
+ tsBlockBuilder.reset();
+ return res;
+ }
+ }
+
+ if (currentTsBlock != null) {
+ cacheTsBlock(currentTsBlock);
+ currentTsBlock = null;
+ }
+
+ long startTime = System.nanoTime();
+ if (!inputOperator.hasNextWithTimer()) {
+ noMoreDataFromChild = true;
+ canStreamOutput = true;
+ } else {
+ try {
+ // init currentTsBlock from child operator
+ currentTsBlock = inputOperator.nextWithTimer();
+ if (currentTsBlock == null || currentTsBlock.isEmpty()) {
+ currentTsBlock = null;
+ return null;
+ }
+ // record total sorted data size
+ dataSize += currentTsBlock.getSizeInBytes();
+
+ // if currentTsBlock line count + remainingCount is still less than minLinesToOutput, just
+ // cache it
+ if (currentTsBlock.getPositionCount() + remainingCount < minLinesToOutput) {
+ cacheTsBlock(currentTsBlock);
+ remainingCount += currentTsBlock.getPositionCount();
+ currentTsBlock = null;
+ } else {
+ // if stream compare key of the last row of currentTsBlock is same as the last row of
+ // previous TsBlock, we cannot stream output, just cache it
+ if (isStreamCompareKeySame()) {
+ cacheTsBlock(currentTsBlock);
+ remainingCount += currentTsBlock.getPositionCount();
+ currentTsBlock = null;
+ } else {
+ // traverse the current TsBlock backward until encountering a row with a StreamCompKey
+ // different from the last row, and return the index of that row
+ int endIndex = getEndIndexFromCurrentTsBlock();
+ // if total count of `canOutput` lines is less than minLinesToOutput, we won't output
+ // them, we just cache the whole currentTsBlock
+ if (endIndex == -1 || endIndex + remainingCount + 1 < minLinesToOutput) {
+ cacheTsBlock(currentTsBlock);
+ remainingCount += currentTsBlock.getPositionCount();
+ currentTsBlock = null;
+ } else {
+ // `canOutput` lines count is larger than minLinesToOutput, so we can stream output
+ cacheTsBlock(currentTsBlock.getRegion(0, endIndex + 1));
+ remainingCount += currentTsBlock.getPositionCount();
+ canStreamOutput = true;
+ currentTsBlock = currentTsBlock.subTsBlock(endIndex + 1);
+ }
+ }
+ }
+ } catch (IoTDBException e) {
+ clear();
+ throw e;
+ } finally {
+ prepareUntilReadyCost += System.nanoTime() - startTime;
+ }
+ }
+ return null;
+ }
+
+ private boolean consumedUp() {
+ return remainingCount == tsBlockBuilder.getPositionCount() && noMoreDataFromChild;
+ }
+
+ // return -1, if not found
+ private int getEndIndexFromCurrentTsBlock() {
+ SortKey sortKeyOfLastRow = new SortKey(currentTsBlock, currentTsBlock.getPositionCount() - 1);
+ SortKey sortKeyOfFoundRow = new SortKey(currentTsBlock, currentTsBlock.getPositionCount() - 2);
+ for (int index = currentTsBlock.getPositionCount() - 2; index >= 0; index--) {
+ sortKeyOfFoundRow.rowIndex = index;
+ if (streamSortComparator.compare(sortKeyOfFoundRow, sortKeyOfLastRow) != 0) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ private boolean isStreamCompareKeySame() {
+ return lastRow == null
+ || streamSortComparator.compare(
+ lastRow, new SortKey(currentTsBlock, currentTsBlock.getPositionCount() - 1))
+ == 0;
+ }
+
+ protected void cacheTsBlock(TsBlock tsBlock) throws IoTDBException {
+ super.cacheTsBlock(tsBlock);
... 253002 lines suppressed ...