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

CritasWang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb-extras.git


The following commit(s) were added to refs/heads/master by this push:
     new 49035fc  Correct the date_bin timezone statement in 
IoTDBTableTimeseriesDao's Javadoc (#124)
49035fc is described below

commit 49035fcc01f485d9047b713b45dca85b95dc581c
Author: ZIHAN DAI <[email protected]>
AuthorDate: Mon Aug 17 17:44:24 2026 +1000

    Correct the date_bin timezone statement in IoTDBTableTimeseriesDao's 
Javadoc (#124)
    
    The Javadoc said date_bin "computes in the server's UTC zone only". That is
    wrong: DateBinFunctionColumnTransformer does its calendar arithmetic in a
    ZoneId, and ColumnTransformerBuilder passes context.sessionInfo.getZoneId()
    identically at v2.0.8 and on master. It was never UTC-only.
    
    The surrounding design decision is unchanged, but its reason is different 
and
    this is the accurate one: the zone is session-scoped and fixed when the 
session
    pool is built, so a pooled session cannot rebind it per query, while each
    ReadTsKvQuery carries its own tzId. Walking the calendar boundaries in Java
    remains necessary.
    
    Comment-only change.
    
    Co-authored-by: Zihan Dai <[email protected]>
---
 .../thingsboard/table/IoTDBTableTimeseriesDao.java     | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git 
a/iotdb-thingsboard-table/src/main/java/org/apache/iotdb/extras/thingsboard/table/IoTDBTableTimeseriesDao.java
 
b/iotdb-thingsboard-table/src/main/java/org/apache/iotdb/extras/thingsboard/table/IoTDBTableTimeseriesDao.java
index 96387db..f7c9a27 100644
--- 
a/iotdb-thingsboard-table/src/main/java/org/apache/iotdb/extras/thingsboard/table/IoTDBTableTimeseriesDao.java
+++ 
b/iotdb-thingsboard-table/src/main/java/org/apache/iotdb/extras/thingsboard/table/IoTDBTableTimeseriesDao.java
@@ -389,14 +389,16 @@ public class IoTDBTableTimeseriesDao extends 
IoTDBTableBaseDao
    * <p>IoTDB 2.0.8's native {@code date_bin} calendar primitive cannot 
reproduce ThingsBoard's
    * boundaries: it anchors each calendar bucket on the <em>origin's 
day-of-month</em> (so {@code
    * date_bin(1mo, time, startTs)} from a mid-month {@code startTs} steps 
day-15 → day-15, not to
-   * the 1st of each month) and it exposes <em>no timezone argument</em> (it 
computes in the
-   * server's UTC zone only). ThingsBoard instead advances {@code startTs} to 
the start of the next
-   * calendar unit in {@code tzId} via {@link TimeUtils#calculateIntervalEnd}, 
so the first bucket
-   * is the partial {@code [startTs, nextCalendarBoundary)} and later buckets 
are full calendar
-   * units. This path therefore reproduces ThingsBoard exactly the way 
ThingsBoard itself does: it
-   * walks the calendar boundaries in Java and issues one bounded aggregate 
query per bucket
-   * (ThingsBoard issues one future per bucket), reusing the very same 
projection, row mapper and
-   * typed-COUNT logic as the {@code MILLISECONDS} path.
+   * the 1st of each month) and it exposes <em>no timezone argument</em> — its 
calendar arithmetic
+   * runs in the <em>session's</em> zone, which is fixed when the session pool 
is built and cannot
+   * be rebound per query, while each {@link ReadTsKvQuery} carries its own 
{@code tzId}.
+   * ThingsBoard instead advances {@code startTs} to the start of the next 
calendar unit in {@code
+   * tzId} via {@link TimeUtils#calculateIntervalEnd}, so the first bucket is 
the partial {@code
+   * [startTs, nextCalendarBoundary)} and later buckets are full calendar 
units. This path therefore
+   * reproduces ThingsBoard exactly the way ThingsBoard itself does: it walks 
the calendar
+   * boundaries in Java and issues one bounded aggregate query per bucket 
(ThingsBoard issues one
+   * future per bucket), reusing the very same projection, row mapper and 
typed-COUNT logic as the
+   * {@code MILLISECONDS} path.
    *
    * <p>Walking {@code [startTs, endPeriod)} where {@code endPeriod = 
max(startTs + 1, endTs)}: each
    * iteration takes {@code bucketStart = startPeriod}, {@code bucketEnd = 
min(calculateIntervalEnd(

Reply via email to