)]}'
{
  "log": [
    {
      "commit": "1ce4f9e408705c65a1e8446a32742dedcc30acdd",
      "tree": "4fd8547ac90f4f9109386ee33cac167c31053ea0",
      "parents": [
        "a6e25445a021ecaa29d0989ae097af59339037df"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Thu Oct 22 16:53:47 2026 +0800"
      },
      "committer": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Thu Oct 22 16:53:47 2026 +0800"
      },
      "message": "Bump version to 2.0.12-SNAPSHOT\n\nSigned-off-by: CritasWang \u003ccritas@outlook.com\u003e\n"
    },
    {
      "commit": "a6e25445a021ecaa29d0989ae097af59339037df",
      "tree": "51a75c38123b56acf10f56deabb19bd9618c2162",
      "parents": [
        "4f7faa02982f4f2353a08e25c41fb8be2a6f0fd9"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Mon Oct 19 11:50:27 2026 +0800"
      },
      "committer": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Mon Oct 19 11:50:27 2026 +0800"
      },
      "message": "Apply spotless formatting to IoTDBSink\n\nThe STRING data-type check added in #99 does not match the google-java-format\nlayout, so the reactor fails at spotless:check before any module builds.\n\nSigned-off-by: CritasWang \u003ccritas@outlook.com\u003e\n"
    },
    {
      "commit": "4f7faa02982f4f2353a08e25c41fb8be2a6f0fd9",
      "tree": "12eb1058051b144c482e428c391c5f4be607c6f8",
      "parents": [
        "77bf7268d5ce0ff982d7bd3dd657879d485a5b2b"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Mon Oct 19 11:49:30 2026 +0800"
      },
      "committer": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Mon Oct 19 11:49:30 2026 +0800"
      },
      "message": "Bump version to 2.0.11\n\nSigned-off-by: CritasWang \u003ccritas@outlook.com\u003e\n"
    },
    {
      "commit": "77bf7268d5ce0ff982d7bd3dd657879d485a5b2b",
      "tree": "4acfacdad51aab2980106ac970da853a60c7b1e0",
      "parents": [
        "1339e4b04c3111d537593f87743b59a73eaca172"
      ],
      "author": {
        "name": "lixiaobao",
        "email": "lixiaobao0202@gmail.com",
        "time": "Mon Oct 19 11:45:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 11:45:53 2026 +0800"
      },
      "message": "Add support for STRING type (#99)\n\nCo-authored-by: lixiaobao \u003cxiaobao.li@litmustech.com\u003e"
    },
    {
      "commit": "1339e4b04c3111d537593f87743b59a73eaca172",
      "tree": "eeb52e6911635d286d7fedd3397d53fcd811b8c9",
      "parents": [
        "3b6c0e6383d26b3c610a7fbba1dde81f9d255558"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Mon Oct 19 14:44:47 2026 +1100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Oct 19 11:44:47 2026 +0800"
      },
      "message": "Give each binary distribution its own execution ids (#139)\n\nThe with-spark, with-mybatis and with-flink profiles of the distributions\nmodule all name their assembly execution all-bin and their checksum\nexecution sign-source-release. When more than one of the profiles is\nactive, Maven merges executions that share an id, so only the last\nprofile\u0027s configuration survives: building with all three produces the\nFlink zip and nothing else, and still succeeds.\n\nName the executions after the archive each one builds.\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e"
    },
    {
      "commit": "3b6c0e6383d26b3c610a7fbba1dde81f9d255558",
      "tree": "268685819974d6a7d97122fe520222b772c92dee",
      "parents": [
        "2bd53be3ad8a09cc1ea5219ade48a4f478756eff"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Tue Oct 13 21:46:52 2026 +1100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Oct 13 18:46:52 2026 +0800"
      },
      "message": "Add release notes for 2.0.11 (#138)\n\n* Add release notes for 2.0.11\n\nCover the changes merged since v2.0.3 (#82 to #137). The version bump (#80) and the repository settings changes (#86, #107) are left out.\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e\n\n* Address review of the release notes\n\nHead the notes as Extras 2.0.4 with IoTDB 2.0.11 as the dependency\nbaseline, cite #132 alone for the starter auto-configuration and #82 for\nthe README, reference the Zeppelin commits, and point the us/ns DELETE\nlimitation at the example READMEs that describe it. Add the Spring Boot 4\nprofile and the MyBatis interceptor registration under Compatibility,\nstate the baseline, link every PR, and point the Grafana plugin CHANGELOG\nat ../../RELEASE_NOTES.md.\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e\n\n* Head the release notes as 2.0.11\n\nThe next Extras release is 2.0.11, following the IoTDB version.\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e\n\n---------\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e"
    },
    {
      "commit": "2bd53be3ad8a09cc1ea5219ade48a4f478756eff",
      "tree": "f163568b31c185ee6b4166d1c7203914db68fdc7",
      "parents": [
        "1c60314e9126d71a38217513a2343eb02f191cae"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Sat Oct 10 19:37:55 2026 +1100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 16:37:55 2026 +0800"
      },
      "message": "Fix the Flink SQL lookup join for missing timestamps and null values (#135)\n\n* Return null instead of failing when a looked-up IoTDB row has a null value\n\nIoTDBLookupFunction.eval checked each declared column\u0027s type against the\nper-row Field. When the series has no value at the looked-up timestamp,\nIoTDB returns a Field with no data type, Utils.isTypeEqual looks up null in\nits type map, and the lookup join fails with a NullPointerException. Rows\nwith a missing value are normal for non-aligned tree-model series.\n\nEmit null for such a field before the type check, the same way\nUtils.getValue already treats a field with no data type. Add unit tests for\nthe null and fully populated cases.\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e\n\n* Emit no row when the looked-up timestamp has no data\n\nWhen the lookup query returned no row, IoTDBLookupFunction.eval still\ncollected a row holding the looked-up timestamp and nulls. A lookup join\ntherefore treated every missing key as a match: an inner join returned\nit with a Time_ that IoTDB does not have, and a left join could not tell\nit apart from a real row.\n\nReturn without collecting anything, so the join itself decides: an inner\njoin drops the key and a left join pads it with nulls.\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e\n\n---------\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e"
    },
    {
      "commit": "1c60314e9126d71a38217513a2343eb02f191cae",
      "tree": "0931beddcdaffbee33bed765e2ed796fd928a47e",
      "parents": [
        "8e32ec43f82c4f8f7787f8f2f9f62aa92a066c2f"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Sat Oct 10 19:05:22 2026 +1100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 16:05:22 2026 +0800"
      },
      "message": "Add the required ts_latest cluster mode to the ThingsBoard migration guide (#137)\n\nThe latest-value route fails at startup unless iotdb.ts_latest.cluster_mode\nis set to sticky-routing or disabled (IoTDBTableLatestDao checks it when it\nis constructed), but the selector table and the step 3 example in the\nmigration guide leave it out. Following the example as written stops\nThingsBoard with an IllegalStateException.\n\nAdd the property to the table and the example, and say what the two values\nmean. Also drop the note that the attributes route needs a ThingsBoard\nbuild exposing an attribute selector: the module supplies that selector\nand withdraws JpaAttributeDao itself on ThingsBoard 4.3.1.2, as the README\nand user guide already say.\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e"
    },
    {
      "commit": "8e32ec43f82c4f8f7787f8f2f9f62aa92a066c2f",
      "tree": "40c42db1c414e459cbc0627a3b75b0865b44ff60",
      "parents": [
        "57aa0d99ff13f2da3db055323ad57e501a18495b"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Sat Oct 10 18:45:16 2026 +1100"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 15:45:16 2026 +0800"
      },
      "message": "Add database, table and column pickers to the Grafana table-model editor (#134)\n\n* Add database, table and column pickers to the Grafana table-model editor\n\nThe table-model query editor asked for the database name as free text and\ngave no view of the server\u0027s tables or columns. It now lists them:\n\n- Three resource endpoints on the plugin backend run SHOW DATABASES,\n  SHOW TABLES and DESC on the pooled native session. The table name only\n  reaches the server as a quoted identifier.\n- DATABASE and TABLE become pickers filled from those endpoints. They still\n  accept a typed name, such as a $database template variable, and the editor\n  stays usable if metadata cannot be read.\n- Picking a table lists its columns by category (TAG, FIELD, ATTRIBUTE).\n  \"Use starter query\" writes a query that selects the time, TAG and FIELD\n  columns within the dashboard time range. Names are always quoted, so\n  reserved words such as \"order\" and names with spaces stay valid, and a\n  table without a time column gets no time filter.\n\nThe SQL is still what runs; the picked table is only a helper.\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e\n\n* Address review of the table-model pickers\n\n- Keep the option objects stable and pass the matching option as the\n  value, so that opening a picker focuses the current entry and Tab or\n  Enter keeps it. A typed or variable name is added to the options.\n- Commit a typed name when the picker loses focus, and allow typing while\n  the list is still loading.\n- Key the lookups on the resolved names, expanded with the panel\u0027s scoped\n  variables, so that a variable change fetches the new database\u0027s tables\n  and columns.\n- Do not raise a global alert for a failed lookup; the editor already\n  shows it inline. Show every failed lookup, not only the first.\n- Select only numeric FIELD columns in the starter query, or every FIELD\n  when none is numeric.\n- Clear the table only when the database actually changes, refresh the\n  database list when it is opened, derive element ids from the query\u0027s\n  refId, and trim names once, when they are entered.\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e\n\n* Keep the database picker\u0027s option objects stable across refreshes\n\nOpening the DATABASE picker re-runs SHOW DATABASES, and the new array\nproduced new option objects. react-select finds the focused option by\nidentity, so focus moved to the first database and Tab or Enter switched\nto it. Hand out one option object per name for the picker\u0027s lifetime,\nand add the reviewer\u0027s reproduction, for both Tab and Enter, as a\ncomponent test.\n\n---------\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e"
    },
    {
      "commit": "57aa0d99ff13f2da3db055323ad57e501a18495b",
      "tree": "6a3def173636a3486db33d77ec03430bfad4eae5",
      "parents": [
        "404a4bff2b5903cfdd845be86732015fc72a9bda"
      ],
      "author": {
        "name": "Sylwester Lachiewicz",
        "email": "slachiewicz@apache.org",
        "time": "Sat Oct 10 05:12:32 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Oct 10 11:12:32 2026 +0800"
      },
      "message": "Update extra-enforcer-rules to 1.12.1 and drop its maven-dependency-tree pin (#136)\n\nextra-enforcer-rules 1.7.0 needed maven-dependency-tree on the enforcer classpath; 1.8.0 and later do not use it."
    },
    {
      "commit": "404a4bff2b5903cfdd845be86732015fc72a9bda",
      "tree": "f1cd1b0f3dd19ea052bd35aab757665470d7a5f5",
      "parents": [
        "9a83e64eee64c93367efec9709e31c3f2f7e47c7"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Fri Oct 09 17:19:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 17:19:26 2026 +0800"
      },
      "message": "feat!: align integrations with IoTDB 2.0.11 and JDK 17 (#132)\n\n* feat!: align integrations with IoTDB 2.0.11 and JDK 17\n\nAlign client dependencies and connector APIs with the released IoTDB\n2.0.11 baseline. Add Spring Boot 4 compatibility and audit starter pool\nconfiguration, including the default fetch size of 5000.\n\nAdd MyBatis query and type adapters, bounded batch generation, nullable\ncomposite keys, and IoTDB-specific MyBatis-Plus operations and templates.\nUpdate English documentation and the existing Chinese counterparts.\n\nValidation: the full JDK 17 reactor, MyBatis offline and live ms suites,\nand Spring Boot 3/4 compatibility checks on JDK 17/21 passed. Document\nthe upstream us/ns time-filtered DELETE issue without weakening tests.\n\nBREAKING CHANGE: Java modules require JDK 17. Regenerate MyBatis mapper\ninterfaces and XML together; TIME/TIMESTAMP fields use Long, and the\nMyBatis-Plus example exposes only IoTDB-supported mapper operations.\n\n* ci: make the MyBatis integration job reach the IoTDB service\n\nThe service container only listened on its loopback because the image\ndefaults dn_rpc_address to 127.0.0.1, so the published port accepted the\nTCP handshake and the JDBC session was reset. Bind it to all interfaces,\nas the Testcontainers ITs already do, and replace the TCP probe with a\nreal client round trip through start-cli: the port is reachable several\nseconds before the DataNode can open a session.\n\n* build: run the reactor quality gates on the Spring Boot examples\n\nThe MyBatis-Plus example had no parent since the Spring Boot starter\nparent was dropped, so Spotless ran from a hand-copied configuration and\nCheckstyle, RAT and the reactor\u0027s plugin management never touched it.\nInherit the examples parent and re-point the inherited Spring, Jackson\nand Mockito management at the selected Boot line for both the default\nBoot 3.5.1 build and the spring-boot4 profile; surefire moves to a\nJUnit Platform 6 capable version for Boot 4.\n\nThe Spring Boot starter example now uses the reactor\u0027s google-java-format\n1.28.0 / Spotless 2.44.5 instead of the pins the reactor moved away from.\n\n* mybatis: drop unsupported UPDATE statements and ship the runtime jar\n\nIoTDB 2.0.11 UPDATE rejects time in its predicate and FIELD columns in\nSET, so MBG\u0027s key-based UPDATE statements can never run. IoTDBKeyPlugin\nnow disables them with a generator warning instead of emitting SQL that\nfails at runtime, and gains unit coverage for the nullable-TAG predicate\nrewrite it already performed.\n\nThe mybatis-support runtime jar is required by every generated mapper\nbut was only reachable through mvn install; the new with-mybatis\ndistribution profile packages it next to the generator plugin.\n\n* collector: fail task creation when the IoTDB source cannot consume\n\nThe IoTDB push source opened its subscription on the worker thread, so a\nmissing topic, a tsfile-format topic, an unreachable broker or a server\nwithout subscription support only produced one log line while the task\nstayed registered and silently never delivered. Validate the topic\nformat and subscribe on the calling thread so start() reports the cause,\nand let PushSourceTask/PullSourceTask propagate a start failure even\nwhen closing the source succeeds, matching SinkTask and ProcessorTask.\n\n* thingsboard: drop per-test databases and refresh 2.0.11 notes\n\nThe container ITs provisioned a fresh database per test and never\ndropped it; on an 8 GB Docker host the DataNode ran out of region memory\nafter about a dozen databases and later tests timed out on their first\nwrite. Track the databases each test creates and drop them afterwards.\n\napache/iotdb#18300 (grouped MAX of non-positive floats) ships in 2.0.11,\nso the DAO comment no longer claims it is unreleased; the -MIN(-x)\nprojection stays for older servers. Remaining 2.0.8 references in the\nREADME and migration guide now name the verified 2.0.11 behavior.\n\n* chore: document the starter timeout default and drop unused properties\n\nThe starter README notes that connection-timeout-in-ms now defaults to 0\ninstead of failing startup with a NullPointerException when unset. The\ncompile.version property in the Flink and Hive connector poms had no\nconsumer.\n\n* collector: release every stage when task creation fails\n\nTask creation now fails when a source cannot start, so the task is never\nregistered and nothing drops it later. Sources started before the one\nthat failed kept their subscriptions, pull loops kept polling, and the\nsink and processor kept their workers; their executors stayed in the\nper-task-id registry, so a retry under the same id reused executors\nwhose threads still ran the failed attempt\u0027s workers and delivered\nnothing. TaskCombiner.create() now drops all three stages on failure,\nand drop is the single cleanup path: the per-plugin close in each\ncreateInternal is gone and dropInternal skips slots that were never\nconstructed.\n\nStopping a disruptor needed more than one halt: Disruptor 3.x discards a\nhalt that reaches a worker before it enters run(), and that worker then\nparks forever, which a quick creation failure hits reliably. Sink and\nprocessor stages now drain their backlog for a bounded time and halt\nuntil their executor has terminated, before closing their plugins; the\npull source waits for its loops before closing its sources. A normal\ndrop marks every stage dropped before draining any, because a paused\nsink did not consume what the processor drained and each drain waited\nfor its timeout.\n\nThe IoTDB source looks up the topic through SubscriptionTreeSessionBuilder\ninstead of the deprecated SubscriptionTreeSession constructor.\n\n* mybatis: map FLOAT to Float in the default generator config\n\nThe generator\u0027s own generatorConfig.xml still generated Double fields for\nFLOAT columns while the README and the example configurations use the\nnew Float contract. The plugin tests parse mappers through the\nInputStream XMLMapperBuilder constructor; the Reader one is deprecated.\n\n* Potential fix for pull request finding \u0027CodeQL / Confusing overloading of methods\u0027\n\nCo-authored-by: Copilot Autofix powered by AI \u003c62310815+github-advanced-security[bot]@users.noreply.github.com\u003e\n\n* Potential fix for pull request finding \u0027CodeQL / Confusing overloading of methods\u0027\n\nCo-authored-by: Copilot Autofix powered by AI \u003c62310815+github-advanced-security[bot]@users.noreply.github.com\u003e\n\n* collector: restore the PipeConnector overload in TaskCombinerTest\n\nThe CodeQL autofix for java/confusing-method-signature deleted\nFakeSink.customize(PipeParameters, PipeConnectorRuntimeConfiguration),\nbut PipeSink leaves that PipeConnector overload abstract, so the\ncollector-core tests no longer compiled and every Java job of the PR\nfailed. The overload is back. The PipeSinkRuntimeConfiguration\noverload forwards to it and the tablet and TsFile transfer overloads\nforward to transfer(Event), each through an upcast, which is the\ndelegation the query accepts; transfer(TsFileInsertionEvent) is\noverridden only for that reason. The forwarding transfer overloads\ndeclare InterruptedException instead of wrapping it in a\nRuntimeException.\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI \u003c62310815+github-advanced-security[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "9a83e64eee64c93367efec9709e31c3f2f7e47c7",
      "tree": "acd6c8bed0ed40b31693fc2d19cebe20e7957887",
      "parents": [
        "d477023528239a5da784d96d9c97d256afef749f"
      ],
      "author": {
        "name": "Clay Johnson",
        "email": "cjohnson@gradle.com",
        "time": "Thu Oct 08 23:20:42 2026 -0500"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Oct 09 12:20:42 2026 +0800"
      },
      "message": "Point the build at develocity.apache.org and update the Develocity extensions (#133)\n\n* build: migrate Develocity config to develocity.apache.org\n\nThe build publishes to https://ge.apache.org, which no longer serves TLS\nfor that hostname: the handshake is reset, so every build fails to contact\nthe server. No build scan has arrived since 2024-12-18.\n\nPoint the build at https://develocity.apache.org, rename the extension to\ndevelocity-maven-extension 2.5.0, bump common-custom-user-data-maven-extension\nto 2.4.0, and translate the configuration to .mvn/develocity.xml under the\nDevelocity schema, which renamed two elements:\n\n  goalInputFiles                    -\u003e capture/fileFingerprints\n  publish + publishIfAuthenticated  -\u003e publishing/onlyIf \u003d authenticated\n\nBoth workflows already export DEVELOCITY_ACCESS_KEY, which only the\nDevelocity extension reads, so CI authentication could not have worked\nbefore this change either.\n\n* Update extensions.xml\n\n---------\n\nCo-authored-by: Haonan \u003chhaonan@outlook.com\u003e"
    },
    {
      "commit": "d477023528239a5da784d96d9c97d256afef749f",
      "tree": "49a1da4211318f3808b5b72587b092b7a072a277",
      "parents": [
        "81d9137b12d6ee3c0f9dee2615c334806d35956c"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Wed Sep 23 15:37:14 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 13:37:14 2026 +0800"
      },
      "message": "Fix the seventeen broken screenshots in the Grafana plugin README (#131)\n\nAll seventeen \u003cimg\u003e tags pointed at apache/iotdb-bin-resources under\ndocs/UserGuide/Ecosystem Integration/Grafana-plugin/, and every one of them\nreturns 404: that tree no longer exists in the repository, whose docs/ directory\nnow holds only IOTDB.png.\n\nThe same screenshots are still published with the Grafana plugin user guide on\nthe website, so this repoints each src at iotdb.apache.org rather than dropping\nthe images. Sixteen keep their filename; add%20empty%20panel.png is served as\nadd-empty-panel.png there.\n\nVerified by fetching every URL in the file after the change and checking the\nContent-Type: all seventeen return image/png. Note that the site answers unknown\npaths with 200 and an HTML error page, so the status code alone does not\ndistinguish a live image from a missing one.\n\nSigned-off-by: Zihan Dai \u003c1436286758@qq.com\u003e"
    },
    {
      "commit": "81d9137b12d6ee3c0f9dee2615c334806d35956c",
      "tree": "8ad02303ad5ca91d74a60de26309dee604e1f6ba",
      "parents": [
        "28f3032fee1e3b8a6c3f41400ca7bb28e68307aa"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Wed Sep 23 15:36:44 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Sep 23 13:36:44 2026 +0800"
      },
      "message": "Upgrade the Grafana plugin\u0027s IoTDB Go client to v2.0.10 (#130)\n\nv2.0.8 accepts a columnIndex equal to the number of measurement schemas in\nclient/tablet.go, at both of the sites that check it. v2.0.10 rejects it.\n\nv2.0.10 declares go 1.25 where v2.0.8 declared go 1.13, so the module\u0027s go\ndirective moves with it, and the three setup-go steps in grafana-plugin.yml\nhave to move as well for the workflow to build the backend at all.\ngithub.com/apache/thrift moves from v0.17.0 to v0.24.0 as an indirect\nconsequence."
    },
    {
      "commit": "28f3032fee1e3b8a6c3f41400ca7bb28e68307aa",
      "tree": "60f4960659bbef9f73e5e549db94da0fd1442821",
      "parents": [
        "ca2d615f767cd619bfa6e3f8ce326a9a89dd72fd"
      ],
      "author": {
        "name": "Zhao Xinqi",
        "email": "134049262+CoollZzz@users.noreply.github.com",
        "time": "Fri Aug 28 09:14:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 28 09:14:38 2026 +0800"
      },
      "message": "feat: add support for query type options in IoTDB queries (#129)"
    },
    {
      "commit": "ca2d615f767cd619bfa6e3f8ce326a9a89dd72fd",
      "tree": "2465eed3e24311b9fa261a34c4c46eb826bfff3a",
      "parents": [
        "8b8df0353a4f03fbd4136234a8c06377c6ad6242"
      ],
      "author": {
        "name": "Zhao Xinqi",
        "email": "134049262+CoollZzz@users.noreply.github.com",
        "time": "Tue Aug 25 17:06:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 17:06:11 2026 +0800"
      },
      "message": "support object-form template variable queries (#128)"
    },
    {
      "commit": "8b8df0353a4f03fbd4136234a8c06377c6ad6242",
      "tree": "c35beeed96f6b1e43e3d0309a61435191765959d",
      "parents": [
        "275043ed3a470d2b570fe548827d3e59dab3f5f0"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Tue Aug 25 18:32:56 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 16:32:56 2026 +0800"
      },
      "message": "test: keep real ThingsBoard verification isolated (#127)"
    },
    {
      "commit": "275043ed3a470d2b570fe548827d3e59dab3f5f0",
      "tree": "316df9232d912db04cc12afac02641f92441257e",
      "parents": [
        "d11e1c03d4a28dfcd90732bc3a47a0b3cbd38fe9"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Tue Aug 25 11:44:21 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 25 09:44:21 2026 +0800"
      },
      "message": "Make the attributes selector usable and correct a runtime dependency\u0027s scope (#125)\n\n* Make the attributes selector usable and correct a runtime dependency\u0027s\nscope\n\nDeploying the module into a live ThingsBoard for the first time surfaced\ntwo defects that the existing tests could not: the module had never been\nrun inside a running ThingsBoard, only compiled and integration-tested\nagainst its types. The two were seen on different deployment attempts,\nand each is attributed to its own below.\n\nThe attributes selector could never take effect. This one is from the\nend-to-end run on thingsboard/tb-node:4.3.1.2 against\napache/iotdb:2.0.8-standalone. ThingsBoard gates its timeseries DAOs on\ndatabase.ts.type, so for ts and ts_latest it steps aside by itself, but\nit offers no equivalent for attributes: at v4.3.1.2, JpaAttributeDao is\na bare @Component and so registers unconditionally.\nAttributesDaoConflictGuard therefore always found a competing bean and\nfailed startup, and its own advice -- remove the bean or unset the\nselector -- could not be followed, because a @Component cannot be\nun-registered from a properties file. So on that build the documented\nattributes opt-in was not an option a deployment could take: setting the\nselector produced a startup failure, every time. I have checked 4.3.1.2\nand have not surveyed the release history, so this is stated for\nv4.3.1.2 and no wider.\n\nThe guard now withdraws ThingsBoard\u0027s bean instead of refusing to start,\nand the withdrawal is narrow. Candidates are sorted into three classes,\nand nothing is mutated until every reason to stop has been evaluated:\n\n  - ours, found by looking up the bean name this configuration registers\n    rather than by filtering the type scan, so a bean that took the name while\n    implementing something else is caught too;\n  - ThingsBoard\u0027s own, matched on BOTH the bean name jpaAttributeDao and the\n    resolved type\n    org.thingsboard.server.dao.sql.attributes.JpaAttributeDao -- this one is\n    withdrawn, with a WARN naming it, its class and the property that\n    caused it;\n  - anything else implementing AttributesDao -- a third-party backend, a\n    decorator, a subclass of our own DAO under another name -- which fails\n    startup untouched.\n\nThe third class is the point. A bean the operator registered\ndeliberately is not this module\u0027s to delete, so the guard refuses rather\nthan guesses, and unlike the old message \"remove it or unset the\nselector\" is now advice that can actually be followed. Matching on the\nclass name rather than on assignability also means an upstream rename\nfails closed: the bean becomes unrecognised and startup stops naming it,\ninstead of the guard withdrawing something it should not have.\n\nWhat the guard guarantees is bounded by what it can see. Candidates come\nfrom one getBeanNamesForType(type, true, false) snapshot, which does not\ninitialise FactoryBeans and does not consult a parent factory, so a\ndefinition registered by a later post-processor, produced by an opaque\nFactoryBean, or inherited from an ancestor context is outside it. The\njavadoc says so rather than claiming more.\n\nOur own DAO bean also had to lose\n@ConditionalOnMissingBean(type \u003d ATTRIBUTES_DAO_CLASS_NAME) -- the string\nform, chosen so that evaluating the condition does not load ThingsBoard\nclasses. It is evaluated while\nconfiguration classes are parsed, strictly before the post-processor\nruns, so on a stock 4.3.1.2 it skipped our bean on every deployment.\n\nThe second defect is in the POM. iotdb-thrift-commons was declared at\ntest scope with a comment calling it \"a transitive runtime dependency of\niotdb-session\" -- which is exactly what the declaration broke, since a\ndirect declaration wins under Maven\u0027s nearest-definition rule. It\ncarries TEndPoint, which the session pool needs at runtime, so the\nruntime dependency set produced from the POM omitted it and the deployed\nmodule could not create a session -- observed as a TEndPoint load\nfailure during an earlier tb-postgres:4.2.1.1 deployment attempt, not\nduring the 4.3.1.2 run above. That container\u0027s log was not preserved, so\nthis is the observation rather than a quotation. It is now declared at\nruntime scope, which is what it is: no main source references it, the\nunit tests do, and the session pool needs it at runtime. That also\nretires the dependency:analyze suppression -- analyze-only no longer\nreports the artifact, so the correct scope replaces the suppression\nrather than sitting alongside it.\n\nOne new compile-only file,\nsrc/provided/java/org/thingsboard/server/dao/sql/\nattributes/JpaAttributeDao.java, joins the existing Strategy F surface.\nThingsBoard\u0027s dao artifact is not on Maven Central, so without a class\nof that exact fully-qualified name on the test classpath the conjunctive\nmatch above could not be exercised at all. It is excluded from the\npackaged jar by the existing org/thingsboard/** rule and cannot shadow\nthe real class; verified by building the jar and listing its entries. No\ntest establishes that the name is correct -- that comes from\nThingsBoard\u0027s source at v4.3.1.2, and a rename fails closed.\n\nThree in-repo documents and two production javadoc blocks change with\nit, because the behaviour they describe changed. IoTDBTableAttributesDao\nand IoTDBTableAttributesEnabledCondition each argued that no real\nPhase-1 deployment sets database.attributes.type -- the rationale this\nchange overturns -- and now describe it as a selector this module\nsupplies, pointing at the guard for what setting it does.\ndocs/user-guide.md and docs/migration-guide.md both described a single\nfail-fast conflict guard for all three routes; that is still true of\ntimeseries and latest and is no longer true of attributes, so each now\ndescribes the two behaviours separately, with the withdrawal\u0027s matching\nrule and its visibility boundary. README.md is included for a different\nreason: its attributes section argued that no shipped ThingsBoard\nrelease exposes the selector, \"so a real Phase-1 deployment never sets\nit\" -- a rationale this change overturns, since the selector is one this\nmodule supplies. Its statement that the attributes selector is\nindependent of database.ts.type / database.ts_latest.type is retained:\nthat is independence among this module\u0027s own routes and it remains\ncorrect.\n\nTwo constants in IoTDBTableAttributesEnabledCondition widen from private\nto package-private so the guard\u0027s WARN can name the property and value\nfrom their single definition; the class is itself package-private, so\nnothing a consumer can see changes.\n\nTests: AttributesDaoConflictGuardTest now carries 14 cases, covering the\nwithdrawal, the zero-replacement refusal, an IoTDB peer under another\nname, a third-party DAO alongside a removable ThingsBoard one,\nright-name/wrong-type and right-type/wrong-name, a pre-built singleton\nwith no definition to withdraw, the WARN\u0027s four fields, the no-op path\nand the ordering. Each of the three guarantees was mutation-checked:\nreverting the class-name half of the match, identifying our bean by\nassignability, and moving the unknown-bean check after the removal each\nreddened exactly one test, with an unrelated test green throughout as a\ncontamination control. IoTDBTableTimeseriesAggregationIT gains non-UTC\ncalendar coverage with a boundary-straddling sample -- 2023-01-31T20:00Z\nis January under UTC and February under Asia/Shanghai -- so an\nimplementation that drops the query timezone changes the bucket count\nand fails; confirmed by forcing the zone to UTC and watching it go red.\n\n204 unit tests and 58 integration tests pass. The full unit suite is\nalso green against Spring 6.2.18 / Spring Boot 3.5.14, the line\nThingsBoard 4.3.1.2 runs.\n\n* Prevent JDK 17 test JVM attach hangs"
    },
    {
      "commit": "d11e1c03d4a28dfcd90732bc3a47a0b3cbd38fe9",
      "tree": "ce628bbb6713216bc8390b91cb43cc84141859e0",
      "parents": [
        "49035fcc01f485d9047b713b45dca85b95dc581c"
      ],
      "author": {
        "name": "Zhao Xinqi",
        "email": "134049262+CoollZzz@users.noreply.github.com",
        "time": "Fri Aug 21 17:43:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 17:43:09 2026 +0800"
      },
      "message": "support dynamic IoTDB table-model variables (#126)"
    },
    {
      "commit": "49035fcc01f485d9047b713b45dca85b95dc581c",
      "tree": "d0ef7c57b270292c7c96199e4396439f57ec8cdf",
      "parents": [
        "608ec36bae0bc39b2b829dd8d6a8640d71453fcb"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Mon Aug 17 17:44:24 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 15:44:24 2026 +0800"
      },
      "message": "Correct the date_bin timezone statement in IoTDBTableTimeseriesDao\u0027s Javadoc (#124)\n\nThe Javadoc said date_bin \"computes in the server\u0027s UTC zone only\". That is\nwrong: DateBinFunctionColumnTransformer does its calendar arithmetic in a\nZoneId, and ColumnTransformerBuilder passes context.sessionInfo.getZoneId()\nidentically at v2.0.8 and on master. It was never UTC-only.\n\nThe surrounding design decision is unchanged, but its reason is different and\nthis is the accurate one: the zone is session-scoped and fixed when the session\npool is built, so a pooled session cannot rebind it per query, while each\nReadTsKvQuery carries its own tzId. Walking the calendar boundaries in Java\nremains necessary.\n\nComment-only change.\n\nCo-authored-by: Zihan Dai \u003cdzh1436286758@gmail.com\u003e"
    },
    {
      "commit": "608ec36bae0bc39b2b829dd8d6a8640d71453fcb",
      "tree": "f8d1dd1236c0632f4c509d809757f483f1003a51",
      "parents": [
        "a811f627b7bced2cbfb1d142a7af4cf84d007dc2"
      ],
      "author": {
        "name": "Zhao Xinqi",
        "email": "134049262+CoollZzz@users.noreply.github.com",
        "time": "Fri Aug 14 15:44:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 14 15:44:15 2026 +0800"
      },
      "message": " support legendFormat and show \"No data\" on empty results (#123)"
    },
    {
      "commit": "a811f627b7bced2cbfb1d142a7af4cf84d007dc2",
      "tree": "066837c2723ae0adf2b9ae0f3eda03d3e89b4576",
      "parents": [
        "b325abebcdcf368c5ec8e2a37a59cc43e8288c75"
      ],
      "author": {
        "name": "Zhao Xinqi",
        "email": "134049262+CoollZzz@users.noreply.github.com",
        "time": "Wed Aug 12 16:10:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 12 16:10:47 2026 +0800"
      },
      "message": "Add backend expansion for Grafana $__interval and $__interval_ms macros (#122)"
    },
    {
      "commit": "b325abebcdcf368c5ec8e2a37a59cc43e8288c75",
      "tree": "04b986b992cf532b2672e038f01131e3bda29787",
      "parents": [
        "1f8ae5b819eda2813f1a5198588ab372b0b68af3"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Tue Aug 11 18:29:24 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 16:29:24 2026 +0800"
      },
      "message": "Document how to verify the ThingsBoard compile-only surface (#121)\n\nThe iotdb-thingsboard-table module implements ThingsBoard storage SPIs but\ncannot depend on ThingsBoard at build time: neither org.thingsboard.common:data\nnor org.thingsboard:dao is published to Maven Central. src/provided/java\ntherefore carries a compile-only surface of the types the module touches,\nexcluded from the built jar so the real classpath supplies them at runtime.\n\nThat keeps the module buildable for everyone, at the cost that the surface can\ndrift from the real interfaces with nothing in the default build noticing. This\nadds the procedure for checking that it has not: build the two ThingsBoard\nmodules locally, swap the compile-only surface for the real artifacts, and run\nthe suite.\n\nThe procedure is deliberately not wired into the default build, since that would\nrequire every contributor and every CI run to clone and build ThingsBoard first.\n\nIncludes a control for confirming the surface was actually removed -- a green\nbuild proves nothing if the compile-only sources are still on the source path --\nand records the result against ThingsBoard 4.3.1.2: 190 unit tests and 57\ncontainer integration tests green, no drift.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e"
    },
    {
      "commit": "1f8ae5b819eda2813f1a5198588ab372b0b68af3",
      "tree": "6dd7b4c2d2deab11b9c0fba3adf5bff7d4acee8a",
      "parents": [
        "40d0889f5ee74ac1fb2c324d3f5be5a86e547637"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Tue Aug 11 18:28:01 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 11 16:28:01 2026 +0800"
      },
      "message": "Migrate the Grafana plugin build from grafana-toolkit to create-plugin (#118)\n\n* Migrate the Grafana plugin build from grafana-toolkit to create-plugin\n\n@grafana/toolkit was archived by Grafana and no longer receives updates,\nso the plugin could not be built with a supported toolchain. This moves\nthe frontend build to @grafana/create-plugin: webpack, SWC/Jest, the flat\nESLint config, Playwright for e2e, and a package-lock.json replacing the\nyarn.lock. The generated .config directory is checked in as create-plugin\nintends and is not hand-edited; it can be refreshed with\n\u0027npx @grafana/create-plugin update\u0027.\n\nThe plugin\u0027s own CI workflow is updated in the same change, because it is\nwhat the migration breaks: it pinned Node 14, installed with\n\u0027yarn install --frozen-lockfile\u0027 and keyed both caches on yarn.lock, which\nthis change removes. It now reads the Node version from the plugin\u0027s\n.nvmrc, caches on package-lock.json and runs \u0027npm ci \u0026\u0026 npm run build\u0027.\nThe Go backend step is untouched.\n\ngrafanaDependency moves from \u003e\u003d9.3.0 to \u003e\u003d12.3.0. The plugin builds and is\ntested against the @grafana/data, @grafana/ui and @grafana/runtime 13.1.0\npackages the new toolchain pulls in. Those are webpack externals resolved\nfrom the host Grafana at runtime, so an API present in the 13.1.0 types\nbut absent on an older host fails at runtime rather than at build time,\nwhich is exactly why the declared floor should be the one we build and\ntest against.\n\nThe stricter ESLint config reports two errors in the tree-model query\neditors, where an array is mutated in place and the same reference is then\nhanded to onChange. Both are changed to pass a new array instead. The same\nappend, and two splice-based removals, remain a few lines away where the\nrule does not flag them; those are left for a separate change with tests\nrather than altering untested UI behaviour here.\n\ndocker-compose.yaml also starts a standalone IoTDB alongside Grafana and\n./provisioning wires the datasource to it, so \u0027npm run server\u0027 brings up a\nworking plugin against a real server rather than an empty Grafana.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Move the Maven frontend build to npm and cover it in CI\n\nThe migration removed yarn.lock and moved the plugin to Node 22 and a webpack\nconfig loaded through ts-node, but connectors/grafana-plugin/pom.xml still drove\nfrontend-maven-plugin with install-node-and-yarn, Node 16.13.1 and Yarn 1.22.17.\nThat is a second consumer of the toolchain this change replaces, alongside the\nworkflow already updated here, so mvn -Pwith-grafana-plugin package would have\nbroken on master straight after the merge.\n\nThe Maven executions now install Node from the same version the plugin declares\nand run npm ci and npm run build. ci rather than install so the lockfile stays\nauthoritative and a drifted dependency set fails the build instead of resolving\nsilently. Note that .npmrc sets ignore-scripts\u003dtrue, which applies to the\nMaven-driven install as well.\n\nThe reason this was not caught is that no CI job builds this module through\nMaven at all: grafana-plugin is not part of the with-all-connectors profile that\ncompile-check.yml uses, and the Jenkinsfile\u0027s plain mvn clean install does not\nactivate with-grafana-plugin either. The green build check is this workflow,\nwhich exercises the npm path directly, so it was verifying its own new path. A\nsecond job now runs the Maven entrypoint, which also covers the antrun execution\nbound to the package phase that invokes backend-compile.sh -- that one is not\nskipped by -DskipTests despite its execution id.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Address the dev@ decisions on the create-plugin migration\n\nImplements the three outcomes of the mailing-list thread, plus the licence\ncoverage point raised in review.\n\nAgent-instruction files. @grafana/create-plugin emits a .config/AGENTS/ tree\n(four files, 316 lines). Removed, and gitignored so a regeneration cannot\nreintroduce them. Nothing in the build depends on them.\n\nRAT coverage. connectors/pom.xml excluded the whole grafana-plugin tree from\napache-rat, so the one module in this repository carrying its own LICENSE was\nalso the one nothing checked. The blanket exclusion is replaced by a list\ncovering only generated output, binaries, and files that cannot carry a header:\nnode/, node_modules/, dist/, coverage/, playwright-report/, test-results/,\npackage-lock.json, CHANGELOG.md, LICENSE, .nvmrc, src/img/, an empty-directory\nmarker, and the local lint cache. .config/ stays excluded because the scaffold\nregenerates it and marks it do-not-edit, so a header added there is lost on the\nnext run. Eight hand-written files gained the standard header; RAT now passes\nwith the tree in scope rather than exempt from it.\n\nMinimum-version smoke test. plugin.json declares a grafanaDependency floor, but\nthe @grafana/* packages are webpack externals resolved from the host at runtime,\nso a plugin built against a newer Grafana compiles cleanly and then fails inside\nan older one. A declared floor is therefore only meaningful if something boots\nit. The new job parses the floor out of plugin.json -- failing loudly if it\ncannot -- boots that Grafana release alongside IoTDB, and checks two different\nfailure modes: that the plugin frontend renders its own config fields, which is\nwhere an unresolved external surfaces, and that a table-model query returns data\nthrough the backend and the native client. Raising or lowering the declared\nfloor changes what is tested, with no second place to keep in step.\n\nDocumentation. The README claimed support for Grafana 9.3.0 and above; it now\nstates the 12.3.0 floor, why the externals model makes an untested floor\nmeaningless, and how CI holds it. CHANGELOG.md records the compatibility break.\nNote that its existing pointer to ../RELEASE_NOTES.md is a scaffold artifact --\nno such file exists in this repository.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n---------\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e"
    },
    {
      "commit": "40d0889f5ee74ac1fb2c324d3f5be5a86e547637",
      "tree": "144bb0fdf23239f0ab0c6bf5f19c4af441a50e7a",
      "parents": [
        "de991c4ec8e7230ccece2fc15c033dc541adfda1"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Mon Aug 10 11:57:10 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 10 09:57:10 2026 +0800"
      },
      "message": "Add the TC-1 ingestion-throughput benchmark for the Table Mode write path (#120)\n\nAdds a JUnit-driven smoke benchmark that drives the real save path -- bounded\nqueue, single flush worker, multi-row Tablet insert -- against the same\napache/iotdb:2.0.8-standalone Testcontainer the functional integration tests\nuse, and reports records/sec, error rate and writer statistics.\n\nThe test asserts a deliberately conservative floor of 1,000 rows/sec plus\nstrict correctness: zero failures, zero rejects, flushed equal to rows written,\nand sampled rows readable back from IoTDB. Its job is to catch a gross\nthroughput regression and to prove real end-to-end ingestion, not to certify a\nheadline number -- 50 saver threads drive only 50 distinct devices, entity_id\nis a TAG column so device cardinality materially changes the workload, and\n30,000 rows fit entirely in the 50,000-row queue, so the run exercises no\nback-pressure. It carries the benchmark tag and is not part of the default\ntest run.\n\ndocs/benchmarks records the case definition, the two profiles, and the measured\nresult with its provenance: a shared developer laptop under Docker Desktop\nrather than a dedicated benchmark host. Two back-to-back runs on that host\nmeasured 54,292 and 61,936 rows/sec with a zero error rate; the report anchors\non the conservative figure and states explicitly that this does not constitute\na pass of the sustained full-profile target, which is defined for 1,000 devices\non dedicated hardware and remains deferred.\n\ndocker-compose.bench.yml provides the equivalent stack for running the case\noutside JUnit.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e"
    },
    {
      "commit": "de991c4ec8e7230ccece2fc15c033dc541adfda1",
      "tree": "2afd2eda6873c57bc446a4f6da97adb6145cb977",
      "parents": [
        "d6245f325304a45543eb4c64e58fc341a388c960"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Mon Aug 03 12:02:43 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 10:02:43 2026 +0800"
      },
      "message": "Add the user and migration guides and correct two stale API descriptions (#119)\n\nAdd docs/user-guide.md and docs/migration-guide.md for the IoTDB Table Mode\nThingsBoard backend: how each of the three storage paths is activated, the\nconfiguration reference, schema and bootstrap behaviour, retention, and what\na migration from an existing ThingsBoard backend does and does not carry over.\n\nWriting them surfaced two descriptions that no longer match the code.\n\nThe experimentalRawOnly javadoc still said time-bucketed aggregation was\noutside the module\u0027s scope. Aggregation has been implemented since the\ndate_bin and calendar-bucket read paths landed, so the flag now describes what\nit actually gates, why the name predates that support, and why it is still\nmarked experimental.\n\nThe user guide\u0027s unsupported-operations section said the batch latest read\nthrows UnsupportedOperationException. It does not: findLatestByEntityIds and\nits async twin return empty, deliberately, because they back the includeSamples\nbranch of the entity-query keys endpoint where a synchronous throw would\nsurface as an HTTP 500 -- the same choice CassandraBaseTimeseriesLatestDao\nmakes. findNextBatch is the only method in the module that throws, and that\nhalf of the sentence was correct.\n\nAlso drops a comment reference to a document outside this repository from\nIoTDBTableTimeseriesDao.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e"
    },
    {
      "commit": "d6245f325304a45543eb4c64e58fc341a388c960",
      "tree": "8e9c895facd7028bcd3d3df15af143c9a176c4f3",
      "parents": [
        "e46e63b4226d59b778b37191097176eeaace4376"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Mon Aug 03 12:02:16 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 10:02:16 2026 +0800"
      },
      "message": "Document table-level retention and refresh the README for the merged DAOs (#117)\n\nAdd a Retention / TTL section describing how physical retention is set on\nthe IoTDB side: it is a table property in milliseconds, declared as\nWITH (TTL\u003dDEFAULT) in the shipped schema and changed with ALTER TABLE ...\nSET PROPERTIES TTL\u003d\u003cms\u003e, readable back from information_schema.tables. It\nalso records the Phase-1 limitation that ThingsBoard\u0027s per-save ttl\nargument cannot be a physical-retention directive, because IoTDB\nretention is table-wide, so the module uses it only for storage\ndata-point accounting.\n\nIoTDBTableTtlIT pins both the schema-default and the runtime-ALTER paths\nagainst a real IoTDB 2.0.8 container. It asserts the TTL property\nmechanism only, not physical row eviction, which is asynchronous and\ncompaction-driven and therefore not deterministic in a test.\n\nWhile writing that section the surrounding README turned out to describe\nthe module as it was several changes ago, so this also brings it back in\nline with the code: time-bucketed aggregation, latest telemetry and the\nattribute DAO are implemented rather than out of scope, and key discovery\nnow reads DISTINCT keys from both telemetry and the telemetry_latest\noverlay instead of returning an empty list. The batch findLatestByEntityIds\ndeferral is unchanged and stays documented.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e"
    },
    {
      "commit": "e46e63b4226d59b778b37191097176eeaace4376",
      "tree": "b6125d297b58ee044e3bdfef856704d37c5b2f39",
      "parents": [
        "f3a0fe3bcca2770d9b0c830f988d18374bb5e10e"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Mon Aug 03 12:00:19 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 03 10:00:19 2026 +0800"
      },
      "message": "Keep MAX buckets whose values are all non-positive (#116)\n\nThe milliseconds aggregation path projected MAX over the numeric COALESCE\nexpression. IoTDB\u0027s grouped max accumulator seeds FLOAT/DOUBLE state with\nFloat/Double.MIN_VALUE -- the smallest positive value, not the most\nnegative one -- and only marks a group initialized when value \u003e\u003d state, so\na bucket whose numeric maximum is zero or negative comes back NULL. This\nDAO reads a NULL aggregate as an empty bucket and skips it, so a MAX\ndownsampling query over, for example, a sub-zero sensor silently lost\nwhole buckets instead of failing.\n\nProject -MIN(-x) instead: the grouped min accumulator seeds with MAX_VALUE\nand is not affected, and IEEE-754 negation is exact, so the result is\nidentical over finite values on servers with and without the upstream fix.\nThe projection is shared with the calendar path, whose non-grouped\naccumulators track an explicit initialized flag rather than a sentinel, so\nthe substitution is exact there too and an empty bucket still yields NULL.\nThe long and string channels are already correct and keep using MAX.\n\nVerified against apache/iotdb 2.0.8 and 2.0.10 containers. See\napache/iotdb#18300, fixed on master but not yet in a released version.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e"
    },
    {
      "commit": "f3a0fe3bcca2770d9b0c830f988d18374bb5e10e",
      "tree": "3f8796d80c755df14d1812505b0f5dc32b30b39b",
      "parents": [
        "0541572d7c56a992fc93902291fd57b23f2ebad4"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Fri Jul 24 19:21:44 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 17:21:44 2026 +0800"
      },
      "message": "Add date_bin aggregation and telemetry key discovery to the Table Mode DAOs (#115)\n\n* Add date_bin aggregation and telemetry key discovery to the Table Mode DAOs\n\nImplements the aggregation and key-discovery parts of the ThingsBoard\nTable Mode integration on top of the merged BaseDao / TimeseriesDao /\nLatestDao:\n\n- IoTDBTableTimeseriesDao: date_bin bucketed aggregation for the\n  aggregated read path, covering fixed-width (millisecond) buckets and\n  calendar buckets (WEEK / MONTH / QUARTER) with time-zone-aware\n  boundaries computed on the Java side to avoid time-zone drift.\n- IoTDBTableLatestDao: telemetry key discovery\n  (findAllKeysByEntityIds / findAllKeysByTenant) now unions the telemetry\n  and telemetry_latest sources so latest-only keys are also discovered.\n\nAdds unit tests and container integration tests.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Re-sum long-only SUM buckets on a separate pooled session\n\nexactLongSum re-queried the bucket\u0027s raw long_v values on the same\nITableSession that was iterating the outer aggregate result set. IoTDB\nTable Mode does not guarantee two concurrently open result sets on one\nsession, so the re-sum fallback now checks out its own pooled session\nand SumReSumContext no longer carries the session.\n\nAddresses review feedback on #115.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n---------\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e"
    },
    {
      "commit": "0541572d7c56a992fc93902291fd57b23f2ebad4",
      "tree": "ec82ee7bdf9996bbf63414f0b86e942c3c7de0e4",
      "parents": [
        "85c87a4d5e3747541808b5759d50602e41c44809"
      ],
      "author": {
        "name": "The Apache Software Foundation",
        "email": "root-asf-gitbox-commits@apache.org",
        "time": "Fri Jul 24 05:20:03 2026 +0200"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 24 11:20:03 2026 +0800"
      },
      "message": "Set up default protection ruleset for default and release branches (#107)"
    },
    {
      "commit": "85c87a4d5e3747541808b5759d50602e41c44809",
      "tree": "b864957f061be76633e8b2a052852b8604842411",
      "parents": [
        "b478305d072bf7cb4b9a0f3f4e1b5cc86c1bd23e"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Thu Jul 23 16:17:33 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 23 14:17:33 2026 +0800"
      },
      "message": "Add table-model query support to the Grafana data source plugin (#114)\n\n* Add table-model query support to the Grafana data source plugin\n\nThe Grafana data source plugin only understood the tree model: both\nQueryEditor modes build root.* paths and the backend calls\n/grafana/v1/query/expression, which has no table-model equivalent, so\ntable-model users could not visualize their data through the plugin.\n\nThis adds a third QueryEditor mode, \"SQL: Table Model\", that runs standard\nSQL against a database and renders the result. It reuses IoTDB\u0027s existing\ntable REST endpoint (POST /rest/table/v1/query) rather than adding a new\nserver API: the backend sends {database, sql} and turns the row-major\nQueryDataSet into a Grafana frame with one typed, nullable field per\ncolumn, driven by the response\u0027s data_types so column types are exact\ninstead of guessed. The body is decoded with UseNumber so INT64 values\nbeyond 2^53 keep their precision.\n\nIn the default Time series format, rows are sorted by the first TIMESTAMP\ncolumn and a long-shaped result (time + tag columns + value columns) is\npivoted into one labeled series per tag combination, so a multi-device\nquery renders as separate lines; the Table format preserves the server\u0027s\nrow order. A $__timeFilter(col) / $__timeFrom / $__timeTo macro set\nexpands to the panel\u0027s range, accepting the $__timeFrom() / $__timeTo()\nfunction forms as well. Because the table REST endpoint returns TIMESTAMP\nvalues (and compares integer time literals) in the server\u0027s configured\ntimestamp_precision -- unlike the tree-model /grafana/v1 endpoints, which\nnormalize to milliseconds server-side -- a new data source \"time\nprecision\" option (ms default / us / ns) scales both the macro bounds and\nthe TIMESTAMP rendering, so the mode also works on us/ns servers.\n\nFollow-up work for the same issue: a database -\u003e table -\u003e column browser,\na visual query builder, a default row limit to bound large SELECTs, and\nthe Grafana plugin SDK / Go backend modernization.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Switch the table-model backend from REST to the native Go client\n\nPer review: query table-model data through apache/iotdb-client-go\n(v2.0.8, TableSession) on the RPC port instead of POST\n/rest/table/v1/query.\n\n- A lazily created, per-datasource TableSessionPool serves the queries;\n  a new \"rpc address\" datasource option sets the endpoint, defaulting to\n  the URL\u0027s host with the default RPC port 6667. Tree-model queries and\n  the health check keep using the REST service for now.\n- Values arrive as typed Go values instead of JSON, removing the\n  UseNumber/json.Number coercion layer; INT64 precision is inherent, and\n  the client converts TIMESTAMP/DATE values with the server-reported\n  timestamp precision, so the short-lived \"time precision\" datasource\n  option is removed again.\n- The time macros now expand to ISO 8601 UTC timestamp literals\n  (e.g. 2020-09-13T12:26:40.000+00:00) rather than epoch-ms integers,\n  which the server parses correctly under any configured\n  timestamp_precision.\n- The per-query database is applied with USE on the pooled session;\n  DATE renders as yyyy-MM-dd and BLOB as 0x-prefixed hex, matching the\n  REST transport\u0027s output.\n- The server-side REST row cap (rest_query_default_row_size_limit) no\n  longer applies; the README now recommends a LIMIT clause for wide\n  scans.\n- Frame building, the Time series/Table formats, the long-to-wide pivot\n  and the row sorting are unchanged; the fetch path sits behind a narrow\n  result-set interface so it stays unit-testable. 13 unit tests, go vet\n  and tsc --noEmit pass.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Require the database field in table-model mode\n\nPer review: queryTableModel runs USE \u003cdatabase\u003e on a pooled session, and\nPooledTableSession.Close() only restores the database when the pool has\none configured — which this pool does not — so a session\u0027s USE state\nsurvived release. A query with an empty database field could then\nnondeterministically inherit whichever database a previous panel had\nselected on that session.\n\nMake the database required for the table-model mode: verifyQuery rejects\nan empty database, the editor marks the field required, and the README\ndocuments it. Every query therefore always runs USE for its own database\non the session it checked out, so leftover session state can never\ninfluence a result regardless of pool scheduling. Fully-qualified\ndatabase.table references keep working and take precedence over the\nsession database.\n\nVerified against a live IoTDB 2.0.8: alternating panels on two databases\nsharing one session pool each saw exactly their own data across\nrepeated rounds.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n---------\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e"
    },
    {
      "commit": "b478305d072bf7cb4b9a0f3f4e1b5cc86c1bd23e",
      "tree": "f6d3d50093708203e12513240d9ade40ba15d09b",
      "parents": [
        "80adb01aa1bb3878c39025166c4bc8e39d0e449f"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Wed Jul 22 09:25:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 22 09:25:24 2026 +0800"
      },
      "message": "Add metric scrape module (#111)"
    },
    {
      "commit": "80adb01aa1bb3878c39025166c4bc8e39d0e449f",
      "tree": "ba68d69afb543da72446e68a67ddf9558c7339aa",
      "parents": [
        "5108d2840a2df8902862faa8ab64bead4bb854ce"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Mon Jul 20 12:46:59 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 20 10:46:59 2026 +0800"
      },
      "message": "Add ThingsBoard latest-telemetry and attributes DAOs on IoTDB Table Mode (#113)\n\n* Add IoTDBTableAttributesDao for ThingsBoard attributes on IoTDB Table Mode (GSOC-304 Wk 5)\n\nImplements the ThingsBoard AttributesDao SPI (v4.3.1.2, 14 methods) on IoTDB\nTable Mode against the entity_attributes table, as a Path-3 stretch artifact\nthat stays inert by default.\n\n- 13/14 methods implemented; findNextBatch is a relational keyset-pagination\n  migration helper with no IoTDB equivalent, so it throws\n  UnsupportedOperationException. The three v4.3.1.2 additions\n  (findAllKeysByEntityIdsAndScopeAsync, findLatestByEntityIdsAndScope and its\n  async form) are implemented.\n- save is a tag-only delete-then-insert under an entity read lock plus a\n  per-identity lock; find takes the same identity lock so the gap is invisible.\n- Inert by default: no @Repository on the DAO; an independent\n  database.attributes.type selector decoupled from the timeseries selectors; an\n  AttributesDaoConflictGuard fail-fast; and a constructor cluster-mode\n  acknowledgement gate (iotdb.attributes.cluster_mode).\n- Strategy F: eight compile-only ThingsBoard/commons stubs, excluded from the\n  built jar.\n- Documented Phase-1 limitations: null version (IoTDB has no sequence), empty\n  non-null-profile key lookup, best-effort bulk reads.\n- 114 unit tests and 11 Testcontainers integration tests against\n  apache/iotdb:2.0.8-standalone.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Add IoTDBTableLatestDao derived-latest read path to PR-2 base (GSOC-304 Wk 4)\n\nAdapts the Wk4 IoTDBTableLatestDao (single-table derived-latest, no shadow\ntable) onto the merged PR-1 base so it coexists with the timeseries and\nattributes DAOs. No latest overlay yet — that is a follow-up.\n\n- LatestDao: findLatest (ORDER BY time DESC LIMIT 1), findAllLatest\n  (LAST_BY(col,time) + MAX(time) GROUP BY key); saveLatest no-op and\n  removeLatest half-open-window are documented derived-latest gaps.\n- Coherent opt-in activation via IoTDBTableLatestEnabledCondition\n  (database.ts.type\u003diotdb-table AND database.ts_latest.type\u003diotdb-table +\n  experimental flag), reusing the shared named session pool; a\n  TimeseriesLatestDaoConflictGuard fails startup on a conflicting host DAO.\n- v4.3.1.2 TimeseriesLatestDao SPI stub (10 methods incl. findLatestByEntityIds\n  /+Async) verified byte-for-byte against the real ThingsBoard source; pinned by\n  StrategyFContractTest with a getDeclaredMethods length guard.\n- All three DAOs share one session pool via @ConditionalOnMissingBean(name).\n- 131 unit tests + 24 Testcontainers ITs (Latest 4 + Timeseries 9 +\n  Attributes 11) against apache/iotdb:2.0.8-standalone.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Add minimal latest-overlay to IoTDBTableLatestDao (GSOC-304 PR-2)\n\nCloses the saveLatest/removeLatest gaps the single-table derived-latest cannot\nsatisfy (mentor-confirmed: add a minimal latest overlay rather than document the\nlatest-only paths as unsupported).\n\n- New telemetry_latest overlay table (telemetry shape, TTL\u003d\u0027INF\u0027), created only\n  under the latest selector via a second schema-bootstrap bean.\n- saveLatest does a tag-only delete-then-insert into the overlay under a\n  per-identity lock; the async batch writer prevents distinguishing latest-only\n  from full-save, so the overlay is written on every saveLatest (it is therefore\n  a per-key latest store, written once per latest update). version stays null.\n- findLatest/findAllLatest merge the derived latest (telemetry) with the overlay\n  by max timestamp per key (overlay wins ties); the merge is max-by-ts, never\n  additive, so latest-only keys surface and stale overlay rows are shadowed.\n- removeLatest snapshots the merged latest under the per-identity lock, deletes\n  the in-window overlay row, and on rewriteLatestIfDeleted resurrects the\n  next-older telemetry value into the overlay.\n- Documented Phase-1 residuals (flagged for review): version always null\n  (Cassandra parity), a telemetry-derived removeLatest race for full-save values,\n  overlay TTL\u003d\u0027INF\u0027 growth, and the same-ts overlay-wins tie-break.\n- 141 unit tests + 31 Testcontainers ITs (Latest 11) against\n  apache/iotdb:2.0.8-standalone.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Document the findAllKeysByDeviceProfileId empty-list rationale (GSOC-304 PR-2)\n\nMake the non-null deviceProfileId degradation rationale precise in the DAO\njavadoc + the module README: it mirrors the official non-relational backend\n(CassandraBaseTimeseriesLatestDao.findAllKeysByDeviceProfileId also returns\nCollections.emptyList()), entity_attributes has no device_profile_id tag, and the\nsole upstream caller is DeviceProfileController\nGET /api/deviceProfile/devices/keys/attributes (TENANT_ADMIN, a config-time UI key\nenumeration) which tolerates an empty result. Failing loud would 500 under IoTDB\nwhile Cassandra returns empty -- an avoidable backend inconsistency. A real\ndevice-\u003eprofile lookup remains a Phase-2 optional enhancement.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Address latest-DAO review: max-ts-wins overlay, locked point reads, graceful key discovery\n\n- saveLatest skips a backdated write so an out-of-order saveLatest never regresses\n  an overlay-only latest below a newer stored value (max-ts-wins; an exact-ts tie\n  still overwrites, preserving the documented overlay-wins-on-tie behaviour)\n- findLatest/findLatestOpt take the per-identity lock so a concurrent overlay\n  delete-then-insert is never observed mid-window (findAllLatest stays unlocked)\n- findAllKeysByDeviceProfileId returns an empty list instead of throwing, so the\n  TENANT_ADMIN config-UI key endpoint degrades gracefully instead of returning 500\n  (matching the non-relational backends; full tenant-wide discovery is deferred)\n- document the single-JVM overlay convergence limitation\n- add unit + Testcontainers regression tests for the out-of-order saveLatest case\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Harden latest + attributes DAOs and key-discovery per review\n\n- Key-discovery / batch SPI methods (findAllKeysByEntityIds / findLatestByEntityIds\n  and their async forms) return an empty result instead of throwing\n  UnsupportedOperationException, matching CassandraBaseTimeseriesLatestDao: they back\n  reachable endpoints (the dashboard telemetry-key lookup and entity-delete\n  housekeeping) where a throw would surface as an HTTP 500 / a failed cleanup task.\n- IoTDBTableAttributesDao.save returns a non-null version (the attribute lastUpdateTs)\n  so BaseAttributesService#doSave never unboxes null; the write is a failure-safe\n  insert-then-delete-older and point reads use ORDER BY time DESC LIMIT 1.\n- removeLatest deletes the overlay row only when the overlay row\u0027s own timestamp is\n  inside the delete window, so an out-of-window overlay value survives as the next\n  latest; the rewrite-resurrect path reads both telemetry and the overlay (max-ts-wins).\n- The saveLatest max-ts guard and the removeLatest snapshot read the derived and\n  overlay latest B1-tolerantly (a same-timestamp two-type row is treated as absent so\n  it never wedges a write or delete and self-heals on the next overwrite); the strict\n  read paths still surface it.\n- Regression tests added for each; 153 unit + 37 Testcontainers IT green (cache off).\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Extract shared DAO base and add per-DAO executor config + latest cluster gate\n\nAddresses the five review comments on this PR:\n\n- Lift the bounded read/task executor (init/submit/shutdown-drain, bounded\n  ArrayBlockingQueue + AbortPolicy, task tracking) out of the three DAOs into\n  IoTDBTableBaseDao so a future shutdown-race fix lives in one place; the DAOs\n  now delegate. No behavior change.\n- Lift the small per-DAO utilities into the base too: sqlString (the single\n  SQL single-quote escape point), kvEntry type mapping, requireTelemetryKey /\n  requireKey blank checks, and entityPredicate.\n- Give the attributes DAO its own executor config (iotdb.attributes.executor\n  .threads / .queue-capacity, defaults equal to iotdb.ts.read) instead of\n  borrowing the timeseries read-executor settings, so the attributes path can\n  be tuned independently of the telemetry selector.\n- Document that the latest overlay write path (saveLatest / removeLatest)\n  shares the read-configured executor/queue and enrich the queue-full message\n  so a write-burst rejection of a concurrent findLatest is not mistaken for a\n  read misconfiguration.\n- Add a symmetric cluster-mode acknowledgement (iotdb.ts_latest.cluster_mode)\n  to the latest overlay, mirroring the existing attributes gate, so the\n  in-JVM Striped-lock cluster caveat is opt-in the same way on both paths.\n\n155 unit + 37 Testcontainers IT green (cache off); checkstyle, spotless,\napache-rat, and enforcer clean.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Document iotdb.ts_latest.cluster_mode and attributes executor config in README\n\nAdd the README configuration-table rows the review flagged as missing after the\nexecutor / cluster-gate changes: iotdb.ts_latest.cluster_mode (required and\nfail-fast when the latest overlay DAO is active, mirroring\niotdb.attributes.cluster_mode) and the iotdb.attributes.executor.threads /\n.queue-capacity tuning knobs. Also note the ts_latest.cluster_mode requirement in\nthe latest-telemetry activation section, so an operator activating the overlay has\ndocumentation to consult rather than only the exception message and javadoc.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Pin ThingsBoard value-object constructors in the Strategy-F contract test\n\nThe Strategy-F guard test pins the ThingsBoard SPI method signatures and the\nvalue-object getters the DAOs consume, but not the value-object constructors\nthey invoke. A compile-only stub whose constructor arg order or shape drifts\nfrom ThingsBoard 4.3.1.2 would still compile against the stub, pass every\nstub-backed unit test and Docker integration test, and only surface as a\nNoSuchMethodError against the real ThingsBoard runtime.\n\nAdd valueObjectConstructorsUsedByDaoExist to reflectively pin the exact\nconstructor parameter types each DAO call site depends on -- BasicTsKvEntry,\nBaseAttributeKvEntry, the five *DataEntry types, the three\nTsKvLatestRemovingResult shapes and ReadTsKvQueryResult -- plus the TbPair.of\nand Pair.of factory signatures, and couple ReadTsKvQueryResult\u0027s int query-id\nparameter to TsKvQuery.getId(). Verified against ThingsBoard v4.3.1.2\n(commit c37fb509).\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n---------\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e"
    },
    {
      "commit": "5108d2840a2df8902862faa8ab64bead4bb854ce",
      "tree": "48e604bb3a0d6fa2b5e25553a1e95c5dbf1e1ff0",
      "parents": [
        "c94db39edfc8fdfd754c5a40481c11642c787e6a"
      ],
      "author": {
        "name": "ZIHAN DAI",
        "email": "99155080+PDGGK@users.noreply.github.com",
        "time": "Fri Jun 26 21:46:16 2026 +1000"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 26 19:46:16 2026 +0800"
      },
      "message": "Add iotdb-thingsboard-table module for ThingsBoard on IoTDB Table Mode (#110)\n\n* Add iotdb-thingsboard-table module for ThingsBoard on IoTDB Table Mode\n\nImplements ThingsBoard\u0027s historical telemetry TimeseriesDao SPI on Apache\nIoTDB 2.0.8 Table Mode (ITableSession SQL + Tablet writes). This first PR\ndelivers the write + raw-read foundation: IoTDBTableBaseDao, an async\nbounded-queue batch writer, and the raw findAllAsync/remove read-delete\npath. Aggregation, latest telemetry and attributes land in later PRs.\n\nThe module is inert by default: the live DAO/pool/writer/schema-bootstrap\nactivate only on an explicit database.ts.type\u003diotdb-table plus\niotdb.ts.experimental-raw-only\u003dtrue opt-in, the auto-configuration is\nclasspath-isolated from a non-ThingsBoard runtime, and ThingsBoard SPI\ntypes are a compile-only source surface excluded from the built jar\n(Strategy F). It is added to the reactor through a JDK-17 profile and\noverrides tsfile only within its own module pom, so the rest of the\nreactor is unaffected.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n* Address review feedback on iotdb-thingsboard-table\n\nResolves the review on #110.\n\n- Version strategy: drop the module-local iotdb / tsfile / guava overrides.\n  The module now inherits the parent reactor\u0027s iotdb-session 2.0.5, tsfile\n  2.1.1 and guava 32.1.2-jre (a single tsfile across the reactor) and uses the\n  2.0.5 enableCompression builder API. jakarta.validation-api stays at 3.0.2\n  (the ThingsBoard 4.3.x Spring Boot 3 / jakarta runtime namespace), now made\n  explicit at the dependency and documented.\n- Reactor wiring: replace the \u003cjdk\u003e[17,)\u003c/jdk\u003e auto-activated profile with a\n  named with-thingsboard opt-in profile; build and test it on the JDK 17+ CI\n  jobs via -P with-thingsboard.\n- Writer: retry only transient StatementExecutionException status codes; fail\n  fast on permanent ones.\n- Schema bootstrap: use CREATE TABLE IF NOT EXISTS and detect already-exists\n  via the structured IoTDB status code (message-substring match as fallback).\n- Auto-configuration: state ThingsBoard\u0027s Spring Boot 3.5.x version in the\n  docs; keep the spring.factories entry only for Boot 2.7 portability.\n- Tests: add a no-ThingsBoard-classpath startup test, retry classification\n  tests, a status-code idempotency test, and a @Validated-through-Spring test.\n- Minor: saturate dataPointDays; clear flushThreads validation message; align\n  the defaultTtlMs log key; remove a useless null check.\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e\n\n---------\n\nSigned-off-by: Zihan Dai \u003c99155080+PDGGK@users.noreply.github.com\u003e"
    },
    {
      "commit": "c94db39edfc8fdfd754c5a40481c11642c787e6a",
      "tree": "d2cb2bf12f6768d895cadbe17ba96bc6c2879d7b",
      "parents": [
        "827cceac0d9f2cfe2ebb752959b8975577a2734d"
      ],
      "author": {
        "name": "HUANG Xiangdong",
        "email": "hxd@apache.org",
        "time": "Mon Jun 01 11:06:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 11:06:49 2026 +0800"
      },
      "message": "Fix: Expand multi-value template variables in prefixPath into multiple paths (#109)\n\n* Expand multi-value template variables in prefixPath into multiple paths\n\nFix two issues with variable expansion in Grafana 11.4 (Scenes architecture):\n\n1. Replace templateSrv.containsTemplate() with regex-based detection.\n   In Grafana 11.4\u0027s Scenes mode, containsTemplate() returns false for\n   ${var} syntax even when the variable exists. Using a regex pattern\n   ensures reliable detection regardless of Grafana version.\n\n2. Process prefixPath expansion for queries without sqlType field.\n   Previously only queries with sqlType \u003d\u003d\u003d \u0027SQL: Full Customized\u0027 were\n   processed. Queries provisioned via JSON (without explicit sqlType)\n   were silently skipped.\n\nThe expansion logic now:\n- Detects variables via regex pattern /\\$\\{(\\w+)(?::[^}]*)?\\}|\\\\b/\n- Resolves values from scopedVars first, then falls back to getVariables()\n- Handles $__all by expanding to all non-$__all options\n- Supports both single-value and multi-value (array) variables\n- Fully backward-compatible: literal paths pass through unchanged\n\nCloses #108\n\n* Address review: handle $__all in scopedVars and safer fallback\n\n- When scopedVars provides $__all, expand using options list instead of\n  treating it as a literal path segment\n- When variable cannot be resolved, fallback to replace() on the whole\n  path (preserving prior behavior) instead of only replacing the token\n- Add tests for both cases\n\n---------\n\nCo-authored-by: xiangdong huang \u003chxd@timecho.com\u003e"
    },
    {
      "commit": "827cceac0d9f2cfe2ebb752959b8975577a2734d",
      "tree": "340db84bc081f694fb94cef59cb627b67da5b26e",
      "parents": [
        "166d75d9afa81edf0bcbfa8a56d1845292ba71b3"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Wed Sep 24 16:26:02 2025 +0800"
      },
      "committer": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Wed Sep 24 16:26:02 2025 +0800"
      },
      "message": "zeppelin defalut jar-with-dependencies\n"
    },
    {
      "commit": "166d75d9afa81edf0bcbfa8a56d1845292ba71b3",
      "tree": "c26b1202666fe974e44b80ce84dbcb76000d4e64",
      "parents": [
        "ccc0aa8dc21ec20ba4902859108a8cc3434e4411"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Tue Sep 23 18:53:28 2025 +0800"
      },
      "committer": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Tue Sep 23 18:53:28 2025 +0800"
      },
      "message": "zeppelin defalut jar-with-dependencies\n"
    },
    {
      "commit": "ccc0aa8dc21ec20ba4902859108a8cc3434e4411",
      "tree": "d06d1659245850465000659f7ec4be21af8b7aa4",
      "parents": [
        "bf06d2e525d3e6e223034dd2898d4f4f11213795"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Tue Sep 23 17:29:13 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 23 17:29:13 2025 +0800"
      },
      "message": "Bump tsfile version to 2.1.1 (#94)\n\n* Bump tsfile version to 2.1.1\n\n* fix\n\n* fix build\n\n* fix build\n\n* fix build\n\n* fix build\n\n* fix build\n\n* fix build"
    },
    {
      "commit": "bf06d2e525d3e6e223034dd2898d4f4f11213795",
      "tree": "f8e1e6c03cd582506398a185506a423162eccbb5",
      "parents": [
        "b056464a6bff21fb097d93ef21b05c7789108855"
      ],
      "author": {
        "name": "LimJiaWenBrenda",
        "email": "88846228+LJW21-02@users.noreply.github.com",
        "time": "Tue Sep 23 16:09:20 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Sep 23 16:09:20 2025 +0800"
      },
      "message": "Added Kafka, RocketMQ, RabbitMQ examples for IoTDB-table (#93)\n\n* Added Kafka examples for IoTDB-table\n\n* Added license header\n\n* Added RocketMQ examples for IoTDB-table\n\n* Added RabbitMQ examples for IoTDB-table + Fixed RabbitMQ examples for IoTDB-tree\n\n* Added constants in RabbitMQ Constant.java\n\n* Update package name\n\n* Updated readme documents for Kafka, RocketMQ and RabbitMQ + Upgraded iotdb-session to 2.0.5\n\n* Renew IoTDB quick start link"
    },
    {
      "commit": "b056464a6bff21fb097d93ef21b05c7789108855",
      "tree": "9f9c432bb42ba94c4c889cac178bbd9c1bcad37b",
      "parents": [
        "d859bb6d3de39f23f6a11a6a9a7e0d22b92ed9b5"
      ],
      "author": {
        "name": "Summer",
        "email": "43237967+2b3c511@users.noreply.github.com",
        "time": "Mon Jul 14 11:54:27 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 14 11:54:27 2025 +0800"
      },
      "message": "Remove unnecessary configurations in confignode-cm.yaml (#89)\n\nCo-authored-by: 2b3c511 \u003crong.li@timecho.com\u003e"
    },
    {
      "commit": "d859bb6d3de39f23f6a11a6a9a7e0d22b92ed9b5",
      "tree": "63415ceac0856c1f3053e0a8ee68f61f5757177b",
      "parents": [
        "54ca77d47bad1b0462a59bfe594210a9669a4f52"
      ],
      "author": {
        "name": "ChaoWang",
        "email": "66939405+wangchao316@users.noreply.github.com",
        "time": "Sat Jun 28 10:13:16 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 28 10:13:16 2025 +0800"
      },
      "message": "support nodeurls to multi ip (#84)\n\nsupport nodeurls to multi ip (#84)"
    },
    {
      "commit": "54ca77d47bad1b0462a59bfe594210a9669a4f52",
      "tree": "eb4e4c7459370fbba7b647ef199fd884dfc29b95",
      "parents": [
        "63151511e171fce49e83c68c6fcc90f231083c82"
      ],
      "author": {
        "name": "张正明",
        "email": "876670773@qq.com",
        "time": "Thu Jun 26 12:18:38 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 26 12:18:38 2025 +0800"
      },
      "message": "Fix dependence (#85)\n\n* fix version dependence\n\n* optimized code\n\n* fix readme\n\n* rm .vscode\n\n* Update pom.xml\n\n* Apply suggestions from code review\n\nCo-authored-by: Copilot \u003c175728472+Copilot@users.noreply.github.com\u003e\n\n* Update pom.xml\n\n---------\n\nCo-authored-by: CritasWang \u003ccritas@outlook.com\u003e\nCo-authored-by: Copilot \u003c175728472+Copilot@users.noreply.github.com\u003e"
    },
    {
      "commit": "63151511e171fce49e83c68c6fcc90f231083c82",
      "tree": "35c7d4d94a6c9a49ef854568c8391d04e9661a7b",
      "parents": [
        "a39eefa95f0de121645db935a932a58413faa1cc"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Thu Jun 26 12:06:16 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 26 12:06:16 2025 +0800"
      },
      "message": "Redirect email notifications (#86)\n\n"
    },
    {
      "commit": "a39eefa95f0de121645db935a932a58413faa1cc",
      "tree": "bdc483aed34757a9bb415e8d9d2c0d47739bfbb4",
      "parents": [
        "e0dfd37e1c2dc9e2b56b91e36f8f20aca79edd04"
      ],
      "author": {
        "name": "张正明",
        "email": "876670773@qq.com",
        "time": "Wed Jun 25 11:49:29 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 25 11:49:29 2025 +0800"
      },
      "message": "Update mybatisplus (#83)\n\n* update mybatisplus\n\n* update mybatis-plus\n\n* uncomment parent\n\n* add licenses"
    },
    {
      "commit": "e0dfd37e1c2dc9e2b56b91e36f8f20aca79edd04",
      "tree": "ada19b3eb52e6ce3479b5c541eeb7aad66fcdbcc",
      "parents": [
        "ed45c3f5ffa59c57add0047d34dbb317549779ce"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Fri Jun 20 15:49:44 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 20 15:49:44 2025 +0800"
      },
      "message": "add readme (#82)\n\n"
    },
    {
      "commit": "ed45c3f5ffa59c57add0047d34dbb317549779ce",
      "tree": "4ac420c476d58cacf66be5f4098e25e60f73a727",
      "parents": [
        "f8c9de82538847f8682fda92ff4d98e3580e6787"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Thu Jun 19 19:07:31 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 19 19:07:31 2025 +0800"
      },
      "message": "Bump version to 2.0.4-SNAPSHOT (#80)\n\n"
    },
    {
      "commit": "f8c9de82538847f8682fda92ff4d98e3580e6787",
      "tree": "8b40d45d331b9102546775f7e00dbee6dde38263",
      "parents": [
        "253faa0274c57ab6c536a2e843732ae363bac7ea"
      ],
      "author": {
        "name": "Summer",
        "email": "43237967+2b3c511@users.noreply.github.com",
        "time": "Mon Jun 09 10:04:13 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 09 10:04:13 2025 +0800"
      },
      "message": "format time type to long (#79)\n\nCo-authored-by: 2b3c511 \u003crong.li@timecho.com\u003e"
    },
    {
      "commit": "253faa0274c57ab6c536a2e843732ae363bac7ea",
      "tree": "b1e57a8715e3b03dd4e1c3bb4fcf2a6b7080eee5",
      "parents": [
        "8623a5c44b7b415dd5e194369a716fd35cfc488c"
      ],
      "author": {
        "name": "张正明",
        "email": "876670773@qq.com",
        "time": "Wed Jun 04 18:27:12 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 04 18:27:12 2025 +0800"
      },
      "message": "add a example for mybatis, format markdown (#78)\n\n* add a example for mybatis, format markdown\n\n* add default param (#77)\n\n* add default param\n\n* Update readme.md\n\n---------\n\nCo-authored-by: 2b3c511 \u003crong.li@timecho.com\u003e\nCo-authored-by: CritasWang \u003ccritas@outlook.com\u003e\n\n* add the code generated by mybatis\n\n* add a example for mybatis, format markdown\n\n* add the code generated by mybatis\n\n* fix compile\n\n* Update README.md\n\n---------\n\nCo-authored-by: Summer \u003c43237967+2b3c511@users.noreply.github.com\u003e\nCo-authored-by: 2b3c511 \u003crong.li@timecho.com\u003e\nCo-authored-by: CritasWang \u003ccritas@outlook.com\u003e"
    },
    {
      "commit": "8623a5c44b7b415dd5e194369a716fd35cfc488c",
      "tree": "0ddfc9893f95ae39a324c4a173cc40da6f42e7ef",
      "parents": [
        "0d1a4999db088f0f057a82c1c135553908853bb0"
      ],
      "author": {
        "name": "Summer",
        "email": "43237967+2b3c511@users.noreply.github.com",
        "time": "Wed Jun 04 15:21:23 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 04 15:21:23 2025 +0800"
      },
      "message": "add default param (#77)\n\n* add default param\n\n* Update readme.md\n\n---------\n\nCo-authored-by: 2b3c511 \u003crong.li@timecho.com\u003e\nCo-authored-by: CritasWang \u003ccritas@outlook.com\u003e"
    },
    {
      "commit": "0d1a4999db088f0f057a82c1c135553908853bb0",
      "tree": "bfbb441204f2a02f7ac700b277c85c4738cb8a62",
      "parents": [
        "a2614f7a2ca91a30aa0d0688f910e3839b6454de"
      ],
      "author": {
        "name": "张正明",
        "email": "876670773@qq.com",
        "time": "Thu May 29 17:48:23 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 29 17:48:23 2025 +0800"
      },
      "message": "Update readme.md (#75)\n\n"
    },
    {
      "commit": "a2614f7a2ca91a30aa0d0688f910e3839b6454de",
      "tree": "0b204eaf3f2cb8815189b2965935d199e28dfbfc",
      "parents": [
        "3e48d26f65883c1d147010f11228310bdfa1e512"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Fri May 16 10:53:06 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 16 10:53:06 2025 +0800"
      },
      "message": "Collector: Add show task api \u0026 Improve the built-in Kafka Source plugin (#71)\n\n"
    },
    {
      "commit": "3e48d26f65883c1d147010f11228310bdfa1e512",
      "tree": "d3f52542f5bc423bd8fcf487a753b867b9a4d957",
      "parents": [
        "45cdf6c8ace6353f2608c968b11561fedbf1b05c"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Fri May 09 10:59:55 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 09 10:59:55 2025 +0800"
      },
      "message": "style: change spotless like iotdb (#70)\n\n"
    },
    {
      "commit": "45cdf6c8ace6353f2608c968b11561fedbf1b05c",
      "tree": "56e5161a8e174f7161acbb4800b1b4e43c087913",
      "parents": [
        "c2c0e83811c4ef1e08e36d6a53d20c357d577040"
      ],
      "author": {
        "name": "Summer",
        "email": "43237967+2b3c511@users.noreply.github.com",
        "time": "Fri May 09 10:32:07 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 09 10:32:07 2025 +0800"
      },
      "message": "Add more params in Session (#67)\n\n* Add more params in Session\n\n* update name\n\n* spotless:apply\n\n---------\n\nCo-authored-by: 2b3c511 \u003crong.li@timecho.com\u003e"
    },
    {
      "commit": "c2c0e83811c4ef1e08e36d6a53d20c357d577040",
      "tree": "dd698cd42e3090ce87a3161a858941e41a6b5311",
      "parents": [
        "ad09ad86dd51e9958051cec2fae8b7717186d0a6"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Thu May 08 17:11:18 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 08 17:11:18 2025 +0800"
      },
      "message": "Collector: Added task progress saving \u0026 Modified push source pause logic \u0026 Refactored the scheduled task module (#68)\n\n"
    },
    {
      "commit": "ad09ad86dd51e9958051cec2fae8b7717186d0a6",
      "tree": "0694f3dacf2a2b24a9461a7bfeeb6adb4c4808cc",
      "parents": [
        "3ba69342575fe261e53cd2154861b3e3d68936e6"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Sun Apr 27 18:15:18 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 27 18:15:18 2025 +0800"
      },
      "message": "perf: update spring pom (#66)\n\n"
    },
    {
      "commit": "3ba69342575fe261e53cd2154861b3e3d68936e6",
      "tree": "5a0ef339d3fa57762638b5e5188baad132e9e4f8",
      "parents": [
        "0e76f821363ab31c94b73a12ef44d7a49f450861"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Sun Apr 27 16:11:01 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 27 16:11:01 2025 +0800"
      },
      "message": "Update spring pom.xml"
    },
    {
      "commit": "0e76f821363ab31c94b73a12ef44d7a49f450861",
      "tree": "17591199fe3463a98470f422eae98e2d26d23516",
      "parents": [
        "886bb287c85592569df548be3364436464fda4be"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Sun Apr 27 15:49:03 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 27 15:49:03 2025 +0800"
      },
      "message": "Update spring pom.xml"
    },
    {
      "commit": "886bb287c85592569df548be3364436464fda4be",
      "tree": "4b4ba1966f7f0d645f8fc3f481a0fd05ed2d984b",
      "parents": [
        "22de2600ab22272dda23aceec1362940e7adfae4"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Thu Apr 24 18:40:57 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 24 18:40:57 2025 +0800"
      },
      "message": "Collector: Remove iotdb-tsfile dependence \u0026 Upgrade tsfile version \u0026 Modify compile-check from package to verify. (#65)\n\n"
    },
    {
      "commit": "22de2600ab22272dda23aceec1362940e7adfae4",
      "tree": "005017abb2b163c6b694279487cc85d168a8b814",
      "parents": [
        "4501dbc0597f747080a29a2351885785ad5cf8bf"
      ],
      "author": {
        "name": "shuwenwei",
        "email": "55970239+shuwenwei@users.noreply.github.com",
        "time": "Thu Apr 24 16:30:58 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 24 16:30:58 2025 +0800"
      },
      "message": "fix data type conversion for spark iotdb table connector\n\n"
    },
    {
      "commit": "4501dbc0597f747080a29a2351885785ad5cf8bf",
      "tree": "b8f2941b713a1c09c1c88cde0f8be7df3a5ee8ea",
      "parents": [
        "374b5bc548bf1db243da6477743f38560e2a32c0"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Apr 24 16:26:40 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 24 16:26:40 2025 +0800"
      },
      "message": "chore(deps): Bump commons-io:commons-io from 2.13.0 to 2.14.0 (#62)\n\nBumps commons-io:commons-io from 2.13.0 to 2.14.0.\n\n---\nupdated-dependencies:\n- dependency-name: commons-io:commons-io\n  dependency-version: 2.14.0\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "374b5bc548bf1db243da6477743f38560e2a32c0",
      "tree": "a1981c0fb4bea6df36abc128080b30b5b8dbc76f",
      "parents": [
        "85e8b44e8c0129b2c420b34069cfbff2af83d40f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Apr 24 16:26:06 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 24 16:26:06 2025 +0800"
      },
      "message": "chore(deps): Bump ch.qos.logback:logback-core from 1.3.14 to 1.3.15 (#63)\n\nBumps [ch.qos.logback:logback-core](https://github.com/qos-ch/logback) from 1.3.14 to 1.3.15.\n- [Release notes](https://github.com/qos-ch/logback/releases)\n- [Commits](https://github.com/qos-ch/logback/compare/v_1.3.14...v_1.3.15)\n\n---\nupdated-dependencies:\n- dependency-name: ch.qos.logback:logback-core\n  dependency-version: 1.3.15\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "85e8b44e8c0129b2c420b34069cfbff2af83d40f",
      "tree": "a8895ef4cc01fa68eb727dbc39d784aade0c502a",
      "parents": [
        "939ee61e45e54c8abdd94e57c51e5b543d79838c"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Thu Apr 24 12:21:11 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 24 12:21:11 2025 +0800"
      },
      "message": "Collector: Add collector-distribution packaging module \u0026 Migrate IoTDBDataRegionSyncConnector \u0026 Add scheduled triggering for batch accumulation operations \u0026 Add subscribe source demo \u0026 Update iotdb dependence version (#61)\n\n"
    },
    {
      "commit": "939ee61e45e54c8abdd94e57c51e5b543d79838c",
      "tree": "86fca3bbc1acf9760ee2a2d11c260b4dfb1f7bef",
      "parents": [
        "e8c86d719706d7a287f0b3f4e8bf3d6ecbea25d1"
      ],
      "author": {
        "name": "Summer",
        "email": "43237967+2b3c511@users.noreply.github.com",
        "time": "Thu Apr 10 12:24:09 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 10 12:24:09 2025 +0800"
      },
      "message": "update README.md (#59)\n\n(cherry picked from commit e22cf118d10aecdc9440be50cfebde93aeaabb6e)\n\nCo-authored-by: 2b3c511 \u003crong.li@timecho.com\u003e"
    },
    {
      "commit": "e8c86d719706d7a287f0b3f4e8bf3d6ecbea25d1",
      "tree": "cadd22251547348b9c5b77f6fa9233e4a6762929",
      "parents": [
        "75aecc9d5fffb8542f0bbe2b04069d68054103cb"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Mon Apr 07 10:11:49 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 07 10:11:49 2025 +0800"
      },
      "message": "Collector: Fixed task not being able to be dropped when the task is stopped \u0026 Modify PipeParameters \u0026 Supports registration of plugins and reflection usage \u0026 Add SQLite support for persistence of plugin and task meta. (#57)\n\n"
    },
    {
      "commit": "75aecc9d5fffb8542f0bbe2b04069d68054103cb",
      "tree": "4184b3fec3b92da98963ad60cfb2f6db4b475728",
      "parents": [
        "42086d9003b4beb8c2840c6505cb327520c4d4de"
      ],
      "author": {
        "name": "JackieTien97",
        "email": "jackietien97@gmail.com",
        "time": "Wed Apr 02 15:53:24 2025 +0800"
      },
      "committer": {
        "name": "JackieTien97",
        "email": "jackietien97@gmail.com",
        "time": "Wed Apr 02 15:53:24 2025 +0800"
      },
      "message": "remove iotdb-mcp-server\n"
    },
    {
      "commit": "42086d9003b4beb8c2840c6505cb327520c4d4de",
      "tree": "b6ea85f6c61fc5d85d3f7b8d6796c79851ea3de1",
      "parents": [
        "2d96c3cbc7a7601d7e4177f422eeefb4286eb46d"
      ],
      "author": {
        "name": "JackieTien97",
        "email": "jackietien97@gmail.com",
        "time": "Wed Apr 02 15:28:47 2025 +0800"
      },
      "committer": {
        "name": "JackieTien97",
        "email": "jackietien97@gmail.com",
        "time": "Wed Apr 02 15:28:47 2025 +0800"
      },
      "message": "update readme\n"
    },
    {
      "commit": "2d96c3cbc7a7601d7e4177f422eeefb4286eb46d",
      "tree": "e07a823adf0f29c94e8babc4d9ac2331a2f3bbfb",
      "parents": [
        "e00a4cf49871180fd8222ed60999970e6997b61e"
      ],
      "author": {
        "name": "JackieTien97",
        "email": "jackietien97@gmail.com",
        "time": "Wed Apr 02 14:56:49 2025 +0800"
      },
      "committer": {
        "name": "JackieTien97",
        "email": "jackietien97@gmail.com",
        "time": "Wed Apr 02 14:56:49 2025 +0800"
      },
      "message": "update .gitignore\n"
    },
    {
      "commit": "e00a4cf49871180fd8222ed60999970e6997b61e",
      "tree": "d27167d48e9346afa543acfb359a883738a5e73a",
      "parents": [
        "5b4fae10cca21bf01d47ce5e99f08f4ccaac58a4"
      ],
      "author": {
        "name": "JackieTien97",
        "email": "jackietien97@gmail.com",
        "time": "Wed Apr 02 14:56:14 2025 +0800"
      },
      "committer": {
        "name": "JackieTien97",
        "email": "jackietien97@gmail.com",
        "time": "Wed Apr 02 14:56:14 2025 +0800"
      },
      "message": "delete __pycahce__\n"
    },
    {
      "commit": "5b4fae10cca21bf01d47ce5e99f08f4ccaac58a4",
      "tree": "697d92ef505f445d620f537338b043080b9b6872",
      "parents": [
        "700055e1f11347d2419cbc8c79af0d5cb94506a2"
      ],
      "author": {
        "name": "JackieTien97",
        "email": "jackietien97@gmail.com",
        "time": "Wed Apr 02 14:52:52 2025 +0800"
      },
      "committer": {
        "name": "JackieTien97",
        "email": "jackietien97@gmail.com",
        "time": "Wed Apr 02 14:52:52 2025 +0800"
      },
      "message": "Add mcp_server support for IoTDB\n"
    },
    {
      "commit": "700055e1f11347d2419cbc8c79af0d5cb94506a2",
      "tree": "4184b3fec3b92da98963ad60cfb2f6db4b475728",
      "parents": [
        "8c1477da69ee15eaf7c2c1a4ae5ea96abe675a8c"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Mar 17 18:44:29 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 17 18:44:29 2025 +0800"
      },
      "message": "chore(deps): Bump nanoid in /connectors/grafana-plugin (#31)\n\nBumps [nanoid](https://github.com/ai/nanoid) from 3.3.6 to 3.3.8.\n- [Release notes](https://github.com/ai/nanoid/releases)\n- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/ai/nanoid/compare/3.3.6...3.3.8)\n\n---\nupdated-dependencies:\n- dependency-name: nanoid\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "8c1477da69ee15eaf7c2c1a4ae5ea96abe675a8c",
      "tree": "efc5b7d41811bbaed8b41809eea284c7f70393d7",
      "parents": [
        "065ec4dec83403e4191dde35f021cb95717c6eee"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Mar 17 18:11:45 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 17 18:11:45 2025 +0800"
      },
      "message": "chore(deps): Bump serialize-javascript in /connectors/grafana-plugin (#39)\n\nBumps [serialize-javascript](https://github.com/yahoo/serialize-javascript) from 6.0.1 to 6.0.2.\n- [Release notes](https://github.com/yahoo/serialize-javascript/releases)\n- [Commits](https://github.com/yahoo/serialize-javascript/compare/v6.0.1...v6.0.2)\n\n---\nupdated-dependencies:\n- dependency-name: serialize-javascript\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "065ec4dec83403e4191dde35f021cb95717c6eee",
      "tree": "1708639f46cd5574d2bfe94b5abf1b88667dbf0b",
      "parents": [
        "8cdcabb3afabe5db515282646317078be78269c8"
      ],
      "author": {
        "name": "Summer",
        "email": "43237967+2b3c511@users.noreply.github.com",
        "time": "Mon Mar 17 17:07:02 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 17 17:07:02 2025 +0800"
      },
      "message": "Add mybatis-generator-plugin module (#46)\n\n* Add mybatis-generator-plugin module\n\n* add module in pom\n\n* spotless\n\n* add example\n\n* update version\n\n* iotdb-spring-boot-starter\n\n* rat\n\n* rat +1\n\n* rat +1\n\n* remove chinese comment\n\n* update README.md\n\n* update example table name\n\n* alignment IoTDB\n\n* add package in distribution/\n\n---------\n\nCo-authored-by: 2b3c511 \u003crong.li@timecho.com\u003e"
    },
    {
      "commit": "8cdcabb3afabe5db515282646317078be78269c8",
      "tree": "4ea82a3b18e8872986c3098bc292191d5c238e6b",
      "parents": [
        "39dbd2439449dc637148bff23604f799b4413e61"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Mar 14 10:19:17 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 14 10:19:17 2025 +0800"
      },
      "message": "chore(deps): Bump org.springframework:spring-web from 5.3.33 to 5.3.39 (#1)\n\n* chore(deps): Bump org.springframework:spring-web from 5.3.33 to 5.3.39\n\nBumps [org.springframework:spring-web](https://github.com/spring-projects/spring-framework) from 5.3.33 to 5.3.39.\n- [Release notes](https://github.com/spring-projects/spring-framework/releases)\n- [Commits](https://github.com/spring-projects/spring-framework/compare/v5.3.33...5.3.39)\n\n---\nupdated-dependencies:\n- dependency-name: org.springframework:spring-web\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\n\n* Update pom.xml\n\n---------\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\nCo-authored-by: Haonan \u003chhaonan@outlook.com\u003e"
    },
    {
      "commit": "39dbd2439449dc637148bff23604f799b4413e61",
      "tree": "c9a9111d6df374916325d3971720fa17f5e1fee9",
      "parents": [
        "94d5ace7ce50a6e94a48ca4cad3b179aaf7acc61"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Mar 14 09:33:25 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 14 09:33:25 2025 +0800"
      },
      "message": "chore(deps): Bump golang.org/x/net in /iotdb-operator (#54)\n\nBumps [golang.org/x/net](https://github.com/golang/net) from 0.19.0 to 0.36.0.\n- [Commits](https://github.com/golang/net/compare/v0.19.0...v0.36.0)\n\n---\nupdated-dependencies:\n- dependency-name: golang.org/x/net\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "94d5ace7ce50a6e94a48ca4cad3b179aaf7acc61",
      "tree": "07c10174496616c7a9131aa90c8afd528c7fb493",
      "parents": [
        "a5bba813b475846175b1e5a96196cca79dec6d09"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Mar 14 09:32:02 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 14 09:32:02 2025 +0800"
      },
      "message": "chore(deps): Bump @babel/helpers in /connectors/grafana-plugin (#55)\n\nBumps [@babel/helpers](https://github.com/babel/babel/tree/HEAD/packages/babel-helpers) from 7.20.13 to 7.26.10.\n- [Release notes](https://github.com/babel/babel/releases)\n- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-helpers)\n\n---\nupdated-dependencies:\n- dependency-name: \"@babel/helpers\"\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "a5bba813b475846175b1e5a96196cca79dec6d09",
      "tree": "2b2aa18a39f3f94070770bd54a6b449d26d96c11",
      "parents": [
        "4785b88c37447b54eb5f656bb0fb7fc069e1a864"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Mar 14 09:31:48 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 14 09:31:48 2025 +0800"
      },
      "message": "chore(deps): Bump @babel/runtime in /connectors/grafana-plugin (#56)\n\nBumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.20.13 to 7.26.10.\n- [Release notes](https://github.com/babel/babel/releases)\n- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-runtime)\n\n---\nupdated-dependencies:\n- dependency-name: \"@babel/runtime\"\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "4785b88c37447b54eb5f656bb0fb7fc069e1a864",
      "tree": "a0d02fcc2fcef1b2c22e6c86fdbbc241ea96fd1d",
      "parents": [
        "2d9a3f1f6539df07d2eedb5b1c65a51a01185e98"
      ],
      "author": {
        "name": "shuwenwei",
        "email": "55970239+shuwenwei@users.noreply.github.com",
        "time": "Fri Mar 14 09:24:08 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 14 09:24:08 2025 +0800"
      },
      "message": "IoTDB Table Spark Connector\n\n"
    },
    {
      "commit": "2d9a3f1f6539df07d2eedb5b1c65a51a01185e98",
      "tree": "bc7ab11f4f7a606f82b66911b29b848ef91aaab8",
      "parents": [
        "e1877ab14f6c84fd38d4573f04a515734b093812"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Tue Mar 11 18:09:36 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 11 18:09:36 2025 +0800"
      },
      "message": "Bump version to 2.0.2-SNAPSHOT (#53)\n\nupdate iotdb to 2.0.1-beta\nupdate tsfile to 2.0.1"
    },
    {
      "commit": "e1877ab14f6c84fd38d4573f04a515734b093812",
      "tree": "f00bb689e22910d86342bd6da4a06b08adbf9bac",
      "parents": [
        "541e1f57c6b67c9befd68ca7061a94f40e1eed94"
      ],
      "author": {
        "name": "Steve Yurong Su",
        "email": "rong@apache.org",
        "time": "Fri Mar 07 15:21:41 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 07 15:21:41 2025 +0800"
      },
      "message": "Add compile-check for Java 17"
    },
    {
      "commit": "541e1f57c6b67c9befd68ca7061a94f40e1eed94",
      "tree": "afa33c520c1a3d84941b30ba0aae260c55661daa",
      "parents": [
        "25a88f6aabf806d38ffa36c70c8e8b7b1599cd9f"
      ],
      "author": {
        "name": "Steve Yurong Su",
        "email": "rong@apache.org",
        "time": "Wed Mar 05 17:52:30 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 05 17:52:30 2025 +0800"
      },
      "message": "Collector: Refactor package structure and polish code style (#49)\n\n"
    },
    {
      "commit": "25a88f6aabf806d38ffa36c70c8e8b7b1599cd9f",
      "tree": "2f6ae94a351dd62fc701cb6dc712d56541b22794",
      "parents": [
        "a812c4c819a32a1f248515684da3717ce7b86b30"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Tue Mar 04 11:12:32 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 04 11:12:32 2025 +0800"
      },
      "message": "Collector: Refactoring the three phases of data collection tasks using disruptor (#48)\n\n"
    },
    {
      "commit": "a812c4c819a32a1f248515684da3717ce7b86b30",
      "tree": "f9c4b85c5d095b24ea01cf663b2c90459855dc29",
      "parents": [
        "55640cc410845c5926e655a53fc2ac916be41d43"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Fri Feb 21 15:15:13 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Feb 21 15:15:13 2025 +0800"
      },
      "message": "Complete the migration of the collector node project (#43)\n\n* Complete the migration of the collector node project\n\n* fix compile-check fail"
    },
    {
      "commit": "55640cc410845c5926e655a53fc2ac916be41d43",
      "tree": "582ecdc4f294c459027cec709667ba41b55926f3",
      "parents": [
        "eeab6671dbd261a76d71349b6766169eea38e64b"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Wed Feb 19 18:25:53 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 19 18:25:53 2025 +0800"
      },
      "message": "Add compile-check for java8 \u0026 java11 (#42)\n\n"
    },
    {
      "commit": "eeab6671dbd261a76d71349b6766169eea38e64b",
      "tree": "b85e0e729d3898596279fa983da4e53da4349228",
      "parents": [
        "25ef8c7fcf643d03ea2394d6559e446a7ac7c925"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Wed Feb 19 14:49:09 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 19 14:49:09 2025 +0800"
      },
      "message": "Add conde analysis \u0026 remove sonar (#41)\n\n"
    },
    {
      "commit": "25ef8c7fcf643d03ea2394d6559e446a7ac7c925",
      "tree": "6c94657eb3756e89ccda53bd0bd8356d0cc490bb",
      "parents": [
        "a11397e94761ad0ed05e17ddfa5fd484d5dfdeee"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Tue Feb 18 19:36:38 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 18 19:36:38 2025 +0800"
      },
      "message": "Fix sonar could not find project distributions. (#40)\n\n"
    },
    {
      "commit": "a11397e94761ad0ed05e17ddfa5fd484d5dfdeee",
      "tree": "a70a2d3565028d23d1699b12f5042dd564e86bfc",
      "parents": [
        "55c7de7dba60722933ab6c20dc5c3290c86f93a1"
      ],
      "author": {
        "name": "0xB",
        "email": "76414902+YC27@users.noreply.github.com",
        "time": "Tue Feb 18 18:14:53 2025 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Feb 18 18:14:53 2025 +0800"
      },
      "message": "Add sonar \u0026 todos check \u0026 dependency check. (#37)\n\n* Add sonar \u0026 todos check \u0026 dependency check.\r\n\r\n* Add licenses and exclude go.mod \u0026 go.sum submodule\r\n\r\n* Modify version from 1.3.2-SNAPSHOT to 1.3.2"
    },
    {
      "commit": "55c7de7dba60722933ab6c20dc5c3290c86f93a1",
      "tree": "e115a815eb0c68760bf2b4224003179761a0bdc5",
      "parents": [
        "2193e14bad128d0ffd24344f83205f22038a0747"
      ],
      "author": {
        "name": "CloudWise-Lukemiao",
        "email": "282583553@qq.com",
        "time": "Wed Dec 18 15:52:59 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Dec 18 15:52:59 2024 +0800"
      },
      "message": "Fixed the issue of displaying 0 when the number is null (#34)\n\n* Fixed the issue of displaying 0 when the number is null\r\n\r\n* Fixed the issue of displaying 0 when the number is null"
    },
    {
      "commit": "2193e14bad128d0ffd24344f83205f22038a0747",
      "tree": "f5d5055158711333afe7f3920209d4a65d95f4eb",
      "parents": [
        "d5a37e8c790fb8397d0ddd434ad053a8b5ed41f6"
      ],
      "author": {
        "name": "CloudWise-Lukemiao",
        "email": "282583553@qq.com",
        "time": "Tue Dec 10 18:19:08 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 10 18:19:08 2024 +0800"
      },
      "message": "Fixed the issue of displaying 0 when the number is null (#32)\n\n* Fixed the issue of displaying 0 when the number is null\r\n\r\n* Fixed the issue of displaying 0 when the number is null"
    },
    {
      "commit": "d5a37e8c790fb8397d0ddd434ad053a8b5ed41f6",
      "tree": "e52ea6dc6301a10a41323da8b75a38b2f122a8b9",
      "parents": [
        "e000968fa5d3cf0402fecbf00f42c11c2f4e6043"
      ],
      "author": {
        "name": "CloudWise-Lukemiao",
        "email": "282583553@qq.com",
        "time": "Tue Dec 10 16:08:38 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Dec 10 16:08:38 2024 +0800"
      },
      "message": "feature iotdb operator (#23)\n\n* feature add operator\r\n"
    },
    {
      "commit": "e000968fa5d3cf0402fecbf00f42c11c2f4e6043",
      "tree": "3d0f7c20b1496e1cb9893c4688d36d7b1edb83a6",
      "parents": [
        "b792c622312af515a9481dc13bd945df17c1538f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Dec 09 09:40:32 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Dec 09 09:40:32 2024 +0800"
      },
      "message": "chore(deps): Bump cross-spawn in /connectors/grafana-plugin (#29)\n\nBumps [cross-spawn](https://github.com/moxystudio/node-cross-spawn) from 7.0.3 to 7.0.6.\r\n- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.6)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: cross-spawn\r\n  dependency-type: indirect\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\r\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "b792c622312af515a9481dc13bd945df17c1538f",
      "tree": "1de3c7ba26d3c48686f408c83e3047e01753e783",
      "parents": [
        "d67cfc582dfca420c76eaab6d70ba4397a5792aa"
      ],
      "author": {
        "name": "Summer",
        "email": "43237967+2b3c511@users.noreply.github.com",
        "time": "Tue Nov 26 10:27:55 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Nov 26 10:27:55 2024 +0800"
      },
      "message": "Helm README.md (#26)\n\n* helm\r\n\r\n* add license\r\n\r\n* helm add readme.md\r\n\r\n---------\r\n\r\nCo-authored-by: 2b3c511 \u003crong.li@timecho.com\u003e"
    },
    {
      "commit": "d67cfc582dfca420c76eaab6d70ba4397a5792aa",
      "tree": "2b14ab10d93cab67ebcfdd17502d3a985e5e260f",
      "parents": [
        "0c0ffc91b3b8ab97b148836a2cd3a83f843d3230"
      ],
      "author": {
        "name": "Summer",
        "email": "43237967+2b3c511@users.noreply.github.com",
        "time": "Fri Nov 22 17:33:47 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Nov 22 17:33:47 2024 +0800"
      },
      "message": "Add helm module (#25)\n\n* helm\r\n\r\n* add license\r\n\r\n* Update helm/templates/_helpers.tpl\r\n\r\nCo-authored-by: CritasWang \u003ccritas@outlook.com\u003e\r\n\r\n---------\r\n\r\nCo-authored-by: 2b3c511 \u003crong.li@timecho.com\u003e\r\nCo-authored-by: CritasWang \u003ccritas@outlook.com\u003e"
    },
    {
      "commit": "0c0ffc91b3b8ab97b148836a2cd3a83f843d3230",
      "tree": "d4da7259e4f271308604e3bac102b5684b99e9eb",
      "parents": [
        "b82ff2666cdd4d77ad4e91f24af532359867a3a8"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 09 18:56:32 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 09 18:56:32 2024 +0800"
      },
      "message": "chore(deps): Bump webpack in /connectors/grafana-plugin (#22)\n\nBumps [webpack](https://github.com/webpack/webpack) from 5.76.1 to 5.95.0.\r\n- [Release notes](https://github.com/webpack/webpack/releases)\r\n- [Commits](https://github.com/webpack/webpack/compare/v5.76.1...v5.95.0)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: webpack\r\n  dependency-type: indirect\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\r\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "b82ff2666cdd4d77ad4e91f24af532359867a3a8",
      "tree": "dc5685215b009695d72f5e6a309611948fe9aab7",
      "parents": [
        "ce67a8768119c44b586a77daae6834be40518f45"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Oct 09 11:36:16 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Oct 09 11:36:16 2024 +0800"
      },
      "message": "chore(deps): Bump path-to-regexp in /connectors/grafana-plugin (#18)\n\nBumps [path-to-regexp](https://github.com/pillarjs/path-to-regexp) from 1.8.0 to 1.9.0.\r\n- [Release notes](https://github.com/pillarjs/path-to-regexp/releases)\r\n- [Changelog](https://github.com/pillarjs/path-to-regexp/blob/master/History.md)\r\n- [Commits](https://github.com/pillarjs/path-to-regexp/compare/v1.8.0...v1.9.0)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: path-to-regexp\r\n  dependency-type: indirect\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\r\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ce67a8768119c44b586a77daae6834be40518f45",
      "tree": "8760f98cd24229946343c01edf3bcacabcd0a8f2",
      "parents": [
        "ed798633cad0d4e3b640b91b4364c844da4e6e3e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 20 09:57:45 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 20 09:57:45 2024 +0800"
      },
      "message": "chore(deps): Bump micromatch in /connectors/grafana-plugin (#17)\n\nBumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8.\r\n- [Release notes](https://github.com/micromatch/micromatch/releases)\r\n- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: micromatch\r\n  dependency-type: indirect\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\r\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "ed798633cad0d4e3b640b91b4364c844da4e6e3e",
      "tree": "3328d37f8c12bf3c4a975316d296d54766174433",
      "parents": [
        "b4953d1c6b54110d26f3c4c6acca04d046265c5e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Fri Sep 20 09:39:16 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Sep 20 09:39:16 2024 +0800"
      },
      "message": "chore(deps): Bump github.com/grafana/grafana-plugin-sdk-go from 0.193.0 to 0.250.0 in /connectors/grafana-plugin (#20)\n\n* chore(deps): Bump github.com/grafana/grafana-plugin-sdk-go\r\n\r\nBumps [github.com/grafana/grafana-plugin-sdk-go](https://github.com/grafana/grafana-plugin-sdk-go) from 0.193.0 to 0.250.0.\r\n- [Release notes](https://github.com/grafana/grafana-plugin-sdk-go/releases)\r\n- [Commits](https://github.com/grafana/grafana-plugin-sdk-go/compare/v0.193.0...v0.250.0)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: github.com/grafana/grafana-plugin-sdk-go\r\n  dependency-type: direct:production\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\r\n\r\n* Update backend-compile.sh\r\n\r\n* Update backend-compile.bat\r\n\r\n---------\r\n\r\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\r\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e\r\nCo-authored-by: Haonan \u003chhaonan@outlook.com\u003e"
    },
    {
      "commit": "b4953d1c6b54110d26f3c4c6acca04d046265c5e",
      "tree": "8f4bfaca499a9abb3a4d914fe7e1da86f6fb607b",
      "parents": [
        "d0b71a0330149fc21645041e010f4d74c99fbf25"
      ],
      "author": {
        "name": "CloudWise-Lukemiao",
        "email": "luke.miao@yunzhihui.com",
        "time": "Mon Aug 05 11:34:44 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 05 11:34:44 2024 +0800"
      },
      "message": "Fixed the issue where the Grafana plugin does not display data when there is no time value (#13)\n\nCo-authored-by: luke.miao \u003c282583553@qq.com\u003e"
    },
    {
      "commit": "d0b71a0330149fc21645041e010f4d74c99fbf25",
      "tree": "c5f2bf8f6ce648d272a461ee6a03d3b09686f777",
      "parents": [
        "2b6c6578729bee746eabae60637961039e811a99"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 24 18:32:12 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 24 18:32:12 2024 +0800"
      },
      "message": "chore(deps): Bump braces in /connectors/grafana-plugin (#12)\n\nBumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.\r\n- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)\r\n- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: braces\r\n  dependency-type: indirect\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\r\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "2b6c6578729bee746eabae60637961039e811a99",
      "tree": "123ff81fc01f2a145de86bcd38f5f5f2734aaab0",
      "parents": [
        "11d201171086cfc7d28be1a8cf10d60d21903678"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 23 18:17:59 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 23 18:17:59 2024 +0800"
      },
      "message": "chore(deps): Bump golang.org/x/net in /connectors/grafana-plugin (#7)\n\nBumps [golang.org/x/net](https://github.com/golang/net) from 0.17.0 to 0.23.0.\r\n- [Commits](https://github.com/golang/net/compare/v0.17.0...v0.23.0)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: golang.org/x/net\r\n  dependency-type: indirect\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\r\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    },
    {
      "commit": "11d201171086cfc7d28be1a8cf10d60d21903678",
      "tree": "6b5ff86bf602cf036fdf810cb5df813df7b65929",
      "parents": [
        "bfd24d2f876cff89c7e32f402da127d1731ef4f1"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 23 18:17:22 2024 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 23 18:17:22 2024 +0800"
      },
      "message": "chore(deps): Bump ws from 7.5.9 to 7.5.10 in /connectors/grafana-plugin (#9)\n\nBumps [ws](https://github.com/websockets/ws) from 7.5.9 to 7.5.10.\r\n- [Release notes](https://github.com/websockets/ws/releases)\r\n- [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: ws\r\n  dependency-type: indirect\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e\r\nCo-authored-by: dependabot[bot] \u003c49699333+dependabot[bot]@users.noreply.github.com\u003e"
    }
  ],
  "next": "bfd24d2f876cff89c7e32f402da127d1731ef4f1"
}
