This is an automated email from the ASF dual-hosted git repository.
spricoder pushed a change to branch feature/memory_heap_adapt
in repository https://gitbox.apache.org/repos/asf/iotdb.git
from 96c5bad0345 Add heap memory adaption
add 29d857fa810 remove comment
add 1d139bdbf45 Get correct TTL in tree model (#15256)
add b8bba8ff2c8 Bump version to 2.0.4-SNAPSHOT
add b89318f59db Remove dn_rpc_min_concurrent_client_num to fix minWorker
> maxWorker bugs #15296
add 6145474ac45 Fix the usage of method initOrInvalidateLastCache in table
last query process. (#15300)
add b1a0dee36e7 Add retry for inactivePeer of region migration (#15294)
add 18e55fee245 DAL: Fix deletion channel close exception (#15302)
add 93671e5a0e3 Check database by show databases (#15299)
add a3a0c6193f8 Pipe: Converted source database / table name pattern to
lower case (#15285)
add 4978d3f4dc9 Subscription: poll heartbeat event when there are no
consumers (#15307)
add 40a0e8a0525 Pipe: Fix the inconsistency between the schema registered
by TsFileWriter and the tablet written (#15304)
add 11b38c0eae3 [Fix](query) Fix project order in table distributed plan
generator
add d1d5f7fc6ac Do not add new compaction mod file in deletion (#15281)
add 6c9f956515d add some informations to find overlap bug (#15305)
add 3d5f6606134 Fixed the issue of REST service listing user or role lists
(#15319)
add c78546d27ef IoTV2: Receiver aware of pipe restart & Improve condition
schedule (#15314)
add 7cb9f171d89 IoTV2: Improve file piece transfer log & resource clean
#15315
add 27b3dcbb4d6 IoTV2: Use global singleton ClientManager to avoid too
many thrift threads which leads to Direct Memory OOM. (#15316)
add 7477ab9456b IoTV2: Add zombie tsFile writer checker as watch dog to
prevent sync stuck. (#15317)
add 74a0d306f81 perf: avoid reading tsfile on distinct aggregation on
tag/attribute column
add 5b2aa974ade Fix Greatest's looping logic bug in Boolean types.
add 3b2657300bf Optimized the NPE error log cause by closing of the
dataNode & the 301 error in select into cause by permission
add 75aec475070 Update README.md (#15329)
add c5ce0a3cb55 Fixed the reuse of time column's comment
add 5354dee8f8e Fixed the concurrent modification bug of pathPatternTree
add 5b8e59fd2d7 Get device path from cache (#15290)
add d01fe7db5c5 pref: Set the maximum number of history records in the
history file / memory to 1,000 lines. (#15332)
add db103faa21a Fixed the NPE caused by concurrent alter of SchemaRegion
#15331
add 9d7649d990c IoTV2: Improve receiver closed and clean dir logic (#15313)
add 24c23ce09a8 Support invoke table function without TABLE keyword
add c60a3b83320 Optimized the dual key cache memory computation
add 5ec193bf2f1 Throw exception when wal entry is too large
add 81d12e47353 Separate fully dirty files by partially dirty files task
(#15341)
add 88095bc2e52 [RTO/RPO] Fix: NullPointer in ClusterTopology #15347
add 371bf5c4662 reopen discussion in .asf.yml config (#15335)
add e545bf0cc50 Pipe: aggregate tablets with different measurements under
the same device before write into tsfile (#15193)
add 95ed457dc08 Subscription: detect outdated subscription event for
better consumer exception control (#15326)
add 077c3bcae1a Bump netty version to 4.1.119.Final
add 21b0fb7cea3 Load: check if the DataRegion is Deleted before loading
the new tsfile (#15346)
add 3c2b0670e53 Pipe: Fixed the validation logic of OpcDaConnector &
Optimized the error message when the system is not Windows (#15339)
add a84bee756a5 Pipe: use mem table to batch write tree data into tsfile
(#15276)
add a0497b80cbd Pipe: Fix NPE caused by InsertNodeMemoryEstimator
estimating Binary array length (#15321)
add 9e31c84ff99 Pipe: Fixed the IndexOutOfBound exception & Trimmed the
un-transferred schema region & Refactor for meta transfer (#15337)
add f5124525914 Load: Supports metrics in the Async Analyzer stage (#15312)
add b553a6f3670 Pipe/Load: Remove MD5 check for identically named TSFile
to speed up Active Load (#15311)
add 858c8b8538b [Bug] When using SubscriptionPullConsumer to consume data,
an error is reported when configuring ConsumerConstant.NODE_URLS_KEY as the
cluster address. (#15322)
add 323b21e3674 Make deserialize of AggregationDescriptor AttributesMap
use LinkedHashMap
add 040f3af358c refactor: load max page&chunk configuration in
ReadOnlyMemchunk and M… (#15309)
add edbf08ebccd perf: Adapt to Win11(wmic to powershell and compatibility
adjustment) (#15350)
add efdbb6d0946 Update release info after 2.0.2 and 1.3.4 released
add 1a64ec2a225 Impl visitTreeNonAlignedDeviceViewScan
add e6e37ccf365 update session source when have no permission in
ExportSchemaTable (#15355)
add d16ec65b70a Fix process of last query if intermediate state of last
cache is read when query concurrently
add be92fcd7a60 Fix sort properties process of AggregationNode when
generate distribution plan
add f9195c1e06e Add getBlob and getDate for SessionDataSet.DataIterator
add 427970f46fc fix an encrypt_key_import bug #15365
add 63517523561 Include thrift genarated python code in python client to
support AINode (#15348)
add 66b1997b172 Feature/node supplier (#15230)
add 3f96ada4c8d Tumble & Cumulate Windows TVFs (#15354)
add fcb2ab352fe Pipe: switch to IdentityHashMap backed set to avoid
infinite loop in table tsfile builder (#15371)
add 8fff9f22677 Pipe: fix potential ClassCastException when casting
LocalDate[] in PipeTreeModelTsFileBuilderV2 (#15375)
add 41c55ad7599 Fix python client pom error (#15381)
add d24c6d3b3ad Merge branch 'master' into feature/memory_heap_adapt
No new revisions were added by this update.
Summary of changes:
.asf.yaml | 3 +
.github/workflows/multi-language-client.yml | 6 +-
README.md | 2 +-
README_ZH.md | 2 +-
RELEASE_NOTES.md | 100 ++++
code-coverage/pom.xml | 2 +-
distribution/pom.xml | 12 +-
example/client-cpp-example/pom.xml | 2 +-
example/jdbc/pom.xml | 2 +-
example/mqtt-customize/pom.xml | 2 +-
example/mqtt/pom.xml | 2 +-
example/pipe-count-point-processor/pom.xml | 2 +-
example/pipe-opc-ua-sink/pom.xml | 2 +-
example/pom.xml | 2 +-
example/rest-java-example/pom.xml | 2 +-
example/schema/pom.xml | 2 +-
example/session/pom.xml | 2 +-
example/trigger/pom.xml | 2 +-
example/udf/pom.xml | 2 +-
.../iotdb/udf/table/ExcludeColumnExample.java | 2 +-
.../org/apache/iotdb/udf/table/RepeatExample.java | 2 +-
.../org/apache/iotdb/udf/table/SplitExample.java | 2 +-
integration-test/pom.xml | 32 +-
.../partition/IoTDBPartitionTableAutoCleanIT.java | 102 +++-
.../iotdb/db/it/aggregation/IoTDBCountIfIT.java | 13 +
.../tablemodel/manual/basic/IoTDBPipeAlterIT.java | 6 +-
.../relational/it/db/it/IoTDBWindowTVFIT.java | 123 +++-
.../db/it/udf/IoTDBUserDefinedTableFunctionIT.java | 80 ++-
.../query/old/query/IoTDBGreatestLeastTableIT.java | 6 +-
.../it/query/recent/IoTDBComplexQueryIT.java | 84 +++
.../it/query/recent/IoTDBDistinctTagIT.java | 257 ++++++++
.../relational/it/rest/it/IoTDBRestServiceIT.java | 14 +-
.../iotdb/relational/it/schema/IoTDBTableIT.java | 34 +-
.../iotdb/session/it/IoTDBSessionSimpleIT.java | 73 +++
...TDBConsumer2With1TopicShareProcessTsfileIT.java | 23 +-
.../pattern/IoTDBTSPatternPullConsumeTsfileIT.java | 2 -
...TDBConsumer2With1TopicShareProcessTsfileIT.java | 8 +-
.../IoTDBTSPatternTsfilePushConsumerIT.java | 2 +-
iotdb-api/external-api/pom.xml | 2 +-
iotdb-api/pipe-api/pom.xml | 2 +-
.../api/customizer/parameter/PipeParameters.java | 18 +-
iotdb-api/pom.xml | 2 +-
iotdb-api/trigger-api/pom.xml | 2 +-
iotdb-api/udf-api/pom.xml | 2 +-
iotdb-client/cli/pom.xml | 22 +-
.../cli/src/assembly/resources/sbin/start-cli.bat | 3 +
.../cli/src/assembly/resources/tools/backup.bat | 7 +-
.../org/apache/iotdb/cli/utils/JlineUtils.java | 4 +
.../org/apache/iotdb/tool/common/Constants.java | 3 +
.../org/apache/iotdb/tool/schema/ExportSchema.java | 16 +-
.../iotdb/tool/schema/ExportSchemaTable.java | 117 ++--
iotdb-client/client-cpp/pom.xml | 28 +-
.../client-cpp/src/main/AbstractSessionBuilder.h | 3 +
iotdb-client/client-cpp/src/main/NodesSupplier.cpp | 221 +++++++
iotdb-client/client-cpp/src/main/NodesSupplier.h | 137 +++++
iotdb-client/client-cpp/src/main/Session.cpp | 169 +++++-
iotdb-client/client-cpp/src/main/Session.h | 71 ++-
.../client-cpp/src/main/SessionConnection.cpp | 256 ++++++++
.../client-cpp/src/main/SessionConnection.h | 81 +++
.../client-cpp/src/main/ThriftConnection.cpp | 158 +++++
.../client-cpp/src/main/ThriftConnection.h | 68 +++
iotdb-client/client-py/pom.xml | 19 +-
iotdb-client/isession/pom.xml | 8 +-
.../org/apache/iotdb/isession/SessionDataSet.java | 18 +
iotdb-client/jdbc/pom.xml | 8 +-
iotdb-client/pom.xml | 2 +-
iotdb-client/service-rpc/pom.xml | 6 +-
.../java/org/apache/iotdb/rpc/IoTDBRpcDataSet.java | 17 +-
.../java/org/apache/iotdb/rpc/TSStatusCode.java | 1 +
.../subscription/payload/poll/ErrorPayload.java | 4 +
iotdb-client/session/pom.xml | 10 +-
.../base/AbstractSubscriptionConsumer.java | 21 +-
iotdb-core/ainode/pom.xml | 10 +-
iotdb-core/antlr/pom.xml | 2 +-
iotdb-core/confignode/pom.xml | 26 +-
.../src/assembly/resources/conf/confignode-env.bat | 14 +-
.../assembly/resources/sbin/start-confignode.bat | 2 +-
.../confignode/persistence/schema/ConfigMTree.java | 23 +-
iotdb-core/consensus/pom.xml | 14 +-
.../consensus/config/PipeConsensusConfig.java | 28 -
.../apache/iotdb/consensus/iot/IoTConsensus.java | 4 +-
.../consensus/iot/IoTConsensusServerImpl.java | 44 +-
.../apache/iotdb/consensus/pipe/PipeConsensus.java | 6 +-
iotdb-core/datanode/pom.xml | 40 +-
.../src/assembly/resources/conf/datanode-env.bat | 14 +-
.../src/assembly/resources/sbin/start-datanode.bat | 2 +-
.../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 29 +-
.../org/apache/iotdb/db/conf/IoTDBDescriptor.java | 49 +-
.../db/consensus/DataRegionConsensusImpl.java | 4 -
.../db/exception/runtime/IntoProcessException.java | 17 +-
.../db/pipe/agent/task/PipeDataNodeTaskAgent.java | 16 +-
.../agent/task/builder/PipeDataNodeBuilder.java | 4 +-
.../PipeRealtimePriorityBlockingQueue.java | 9 +
.../batch/PipeTabletEventTsFileBatch.java | 9 +-
.../request/PipeTransferSchemaSnapshotSealReq.java | 5 +-
.../connector/protocol/opcda/OpcDaConnector.java | 8 +-
.../pipeconsensus/PipeConsensusAsyncConnector.java | 5 +-
.../pipeconsensus/PipeConsensusSyncConnector.java | 5 +-
.../PipeConsensusTsFileInsertionEventHandler.java | 27 +-
.../PipeConsensusTransferBatchReqBuilder.java | 1 +
.../thrift/sync/IoTDBSchemaRegionConnector.java | 8 +-
.../util/builder/PipeTableModeTsFileBuilder.java | 68 ++-
.../util/builder/PipeTreeModelTsFileBuilder.java | 68 ++-
.../util/builder/PipeTreeModelTsFileBuilderV2.java | 198 +++++++
.../connector/util/builder/PipeTsFileBuilder.java | 24 +-
.../pipe/consensus/deletion/DeletionResource.java | 6 +
.../deletion/persist/PageCacheDeletionBuffer.java | 22 +-
.../schema/PipeSchemaRegionSnapshotEvent.java | 4 +-
.../schemaregion/SchemaRegionListeningFilter.java | 15 +
.../pipeconsensus/PipeConsensusReceiver.java | 242 +++++---
.../pipeconsensus/PipeConsensusReceiverAgent.java | 36 +-
.../resource/memory/InsertNodeMemoryEstimator.java | 4 +
.../db/protocol/client/DataNodeInternalClient.java | 8 +-
.../table/v1/handler/ExecuteStatementHandler.java | 25 +-
.../table/v1/handler/RequestValidationHandler.java | 8 -
.../rest/table/v1/impl/RestApiServiceImpl.java | 11 +-
.../execution/executor/RegionWriteExecutor.java | 94 ++-
.../operator/process/AbstractIntoOperator.java | 6 +-
.../operator/process/FilterAndProjectOperator.java | 15 +
.../execution/operator/process/LimitOperator.java | 6 +
.../execution/operator/process/OffsetOperator.java | 6 +
.../process/join/LeftOuterTimeJoinOperator.java | 15 +-
.../TableLeftOuterTimeJoinOperator.java} | 38 +-
.../relational/AbstractAggTableScanOperator.java | 11 +-
.../AbstractDefaultAggTableScanOperator.java | 2 +-
.../relational/AbstractTableScanOperator.java | 56 +-
.../relational/DeviceIteratorScanOperator.java | 233 ++++++++
.../relational/LastQueryAggTableScanOperator.java | 12 +-
.../MeasurementToTableViewAdaptorUtils.java | 103 ++++
.../TreeToTableViewAdaptorOperator.java} | 112 ++--
.../iotdb/db/queryengine/plan/ClusterTopology.java | 4 +
.../cache/schema/dualkeycache/IDualKeyCache.java | 28 +-
.../dualkeycache/impl/CacheEntryGroupImpl.java | 57 +-
.../cache/schema/dualkeycache/impl/CacheStats.java | 47 +-
.../schema/dualkeycache/impl/DualKeyCacheImpl.java | 526 ++++++-----------
.../schema/dualkeycache/impl/ICacheEntryGroup.java | 13 +-
.../plan/analyze/load/LoadTsFileAnalyzer.java | 67 ++-
.../execution/config/TableConfigTaskVisitor.java | 50 +-
.../plan/planner/LocalExecutionPlanner.java | 13 +
.../plan/planner/TableOperatorGenerator.java | 595 ++++++++++++++++---
.../planner/plan/node/write/InsertTabletNode.java | 6 +-
.../node/write/RelationalInsertTabletNode.java | 14 +-
.../plan/parameter/AggregationDescriptor.java | 2 +-
.../distribute/TableDistributedPlanGenerator.java | 86 ++-
.../TransformAggregationToStreamable.java | 33 +-
.../plan/relational/sql/parser/AstBuilder.java | 90 ++-
.../multi/BooleanGreatestColumnTransformer.java | 2 +-
.../multi/BooleanLeastColumnTransformer.java | 2 +-
.../iotdb/db/service/metrics/WritingMetrics.java | 4 +
.../db/storageengine/dataregion/DataRegion.java | 19 +-
.../execute/task/AbstractCompactionTask.java | 3 +
.../execute/utils/CompactionPathUtils.java | 20 +-
.../execute/utils/MultiTsFileDeviceIterator.java | 10 +-
.../fast/FastAlignedSeriesCompactionExecutor.java | 8 +-
.../FastNonAlignedSeriesCompactionExecutor.java | 5 +-
.../executor/fast/SeriesCompactionExecutor.java | 7 +-
.../compaction/repair/RepairDataFileScanUtil.java | 6 +-
.../compaction/schedule/CompactionScheduler.java | 16 +-
.../selector/impl/SettleSelectorImpl.java | 106 ++--
.../dataregion/flush/MemTableFlushTask.java | 12 +-
.../memtable/AlignedReadOnlyMemChunk.java | 6 +-
.../memtable/AlignedWritableMemChunk.java | 52 +-
.../dataregion/memtable/ReadOnlyMemChunk.java | 19 +-
.../dataregion/memtable/TsFileProcessor.java | 38 +-
.../dataregion/memtable/WritableMemChunk.java | 19 +-
.../dataregion/modification/TreeDeletionEntry.java | 6 +-
.../wal/utils/MemoryControlledWALEntryQueue.java | 14 +
.../load/metrics/LoadTsFileCostMetricsSet.java | 14 +-
.../agent/SubscriptionBrokerAgent.java | 9 +
.../broker/SubscriptionBlockingPendingQueue.java | 4 +
.../db/subscription/broker/SubscriptionBroker.java | 10 +
.../broker/SubscriptionPrefetchingQueue.java | 49 +-
.../broker/SubscriptionPrefetchingTabletQueue.java | 10 +
.../broker/SubscriptionPrefetchingTsFileQueue.java | 10 +
.../TsFileDeduplicationBlockingPendingQueue.java | 10 +
.../receiver/SubscriptionReceiverV1.java | 29 +-
.../db/utils/datastructure/AlignedTVList.java | 28 +-
.../db/utils/datastructure/BatchEncodeInfo.java | 16 +-
.../datastructure/MemPointIteratorFactory.java | 194 ++++--
.../MergeSortMultiAlignedTVListIterator.java | 27 +-
.../MergeSortMultiTVListIterator.java | 15 +-
.../datastructure/MultiAlignedTVListIterator.java | 14 +-
.../utils/datastructure/MultiTVListIterator.java | 13 +-
.../OrderedMultiAlignedTVListIterator.java | 6 +-
.../datastructure/OrderedMultiTVListIterator.java | 5 +-
.../iotdb/db/utils/datastructure/TVList.java | 39 +-
.../cache/dualkeycache/DualKeyCacheTest.java | 171 ------
.../db/pipe/consensus/DeletionResourceTest.java | 38 +-
.../operator/DeviceIteratorScanOperatorTest.java | 228 ++++++++
...nAlignedTreeDeviceViewScanOperatorTreeTest.java | 650 +++++++++++++++++++++
.../TreeToTableViewAdaptorOperatorTest.java | 237 ++++++++
.../compaction/AbstractCompactionTest.java | 4 +-
...eCrossSpaceCompactionWithFastPerformerTest.java | 14 +-
...sSpaceCompactionWithReadPointPerformerTest.java | 12 -
.../InnerSeqCompactionWithFastPerformerTest.java | 7 +-
...nerSeqCompactionWithReadChunkPerformerTest.java | 7 +-
.../settle/SettleCompactionSelectorTest.java | 20 +-
.../reader/chunk/MemAlignedChunkLoaderTest.java | 5 +-
.../read/reader/chunk/MemChunkLoaderTest.java | 19 +-
iotdb-core/metrics/core/pom.xml | 4 +-
iotdb-core/metrics/interface/pom.xml | 8 +-
iotdb-core/metrics/pom.xml | 2 +-
iotdb-core/node-commons/pom.xml | 24 +-
.../conf/iotdb-system.properties.template | 19 +-
.../src/assembly/resources/sbin/health_check.bat | 33 +-
.../container/PipeConsensusClientMgrContainer.java | 20 +-
.../iotdb/commons/concurrent/ThreadName.java | 8 +-
.../commons/memory/AtomicLongMemoryBlock.java | 1 -
.../apache/iotdb/commons/path/MeasurementPath.java | 4 +
.../apache/iotdb/commons/path/PathPatternTree.java | 20 +-
.../commons/pipe/agent/task/PipeTaskAgent.java | 2 +-
.../task/connection/BlockingPendingQueue.java | 4 +
.../pipe/datastructure/pattern/TablePattern.java | 2 +
.../apache/iotdb/commons/schema/ttl/TTLCache.java | 23 +-
.../service/AbstractThriftServiceThread.java | 20 +-
.../iotdb/commons/service/ThriftServiceThread.java | 2 -
.../relational/TableBuiltinTableFunction.java | 8 +
...bleFunction.java => CumulateTableFunction.java} | 42 +-
...TableFunction.java => TumbleTableFunction.java} | 32 +-
.../org/apache/iotdb/commons/utils/FileUtils.java | 114 +++-
iotdb-core/pom.xml | 2 +-
iotdb-core/relational-grammar/pom.xml | 2 +-
.../db/relational/grammar/sql/RelationalSql.g4 | 9 +-
iotdb-doap.rdf | 16 +
iotdb-protocol/openapi/pom.xml | 2 +-
iotdb-protocol/pom.xml | 2 +-
iotdb-protocol/thrift-ainode/pom.xml | 4 +-
iotdb-protocol/thrift-commons/pom.xml | 2 +-
iotdb-protocol/thrift-confignode/pom.xml | 4 +-
iotdb-protocol/thrift-consensus/pom.xml | 4 +-
.../src/main/thrift/pipeconsensus.thrift | 3 +-
iotdb-protocol/thrift-datanode/pom.xml | 4 +-
library-udf/pom.xml | 4 +-
pom.xml | 4 +-
234 files changed, 6723 insertions(+), 2045 deletions(-)
create mode 100644
integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBComplexQueryIT.java
create mode 100644
integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/IoTDBDistinctTagIT.java
create mode 100644 iotdb-client/client-cpp/src/main/NodesSupplier.cpp
create mode 100644 iotdb-client/client-cpp/src/main/NodesSupplier.h
create mode 100644 iotdb-client/client-cpp/src/main/SessionConnection.cpp
create mode 100644 iotdb-client/client-cpp/src/main/SessionConnection.h
create mode 100644 iotdb-client/client-cpp/src/main/ThriftConnection.cpp
create mode 100644 iotdb-client/client-cpp/src/main/ThriftConnection.h
create mode 100644
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/pipe/connector/util/builder/PipeTreeModelTsFileBuilderV2.java
copy
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/process/{TreeMergeSortOperator.java
=> join/TableLeftOuterTimeJoinOperator.java} (55%)
create mode 100644
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/DeviceIteratorScanOperator.java
create mode 100644
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/source/relational/MeasurementToTableViewAdaptorUtils.java
copy
iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/operator/{process/last/LastQueryTransformOperator.java
=> source/relational/TreeToTableViewAdaptorOperator.java} (56%)
delete mode 100644
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/metadata/cache/dualkeycache/DualKeyCacheTest.java
create mode 100644
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/DeviceIteratorScanOperatorTest.java
create mode 100644
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/NonAlignedTreeDeviceViewScanOperatorTreeTest.java
create mode 100644
iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/operator/TreeToTableViewAdaptorOperatorTest.java
copy
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/relational/tvf/{HOPTableFunction.java
=> CumulateTableFunction.java} (78%)
copy
iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/relational/tvf/{HOPTableFunction.java
=> TumbleTableFunction.java} (81%)