)]}'
{
  "log": [
    {
      "commit": "0ae3e7526138794b6243b44d50777e2bb5579ec0",
      "tree": "e586038c8b25e8d7b9e3b3fe2f0dc5961d4e6dae",
      "parents": [
        "4b72bd04cb470e497189bf8e54001304b20a986f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 14:28:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 14:28:17 2026 +0800"
      },
      "message": "Bump pnpm/action-setup from 4 to 6 (#852)\n\nBumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4 to 6.\n- [Release notes](https://github.com/pnpm/action-setup/releases)\n- [Commits](https://github.com/pnpm/action-setup/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: pnpm/action-setup\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "4b72bd04cb470e497189bf8e54001304b20a986f",
      "tree": "016cca4b5f1d5ba753a4d0517609acaa327070c8",
      "parents": [
        "2a33490343b0b7a0e39f100dcff44506a314e6b9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 14:27:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 14:27:29 2026 +0800"
      },
      "message": "Bump actions/checkout from 4 to 7 (#856)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 4 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "2a33490343b0b7a0e39f100dcff44506a314e6b9",
      "tree": "002e6b0d6e8942b60a252965f36069e4d60a4d07",
      "parents": [
        "51fe8bb8f39d8c62852a89605818a74da961aac9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 10:36:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 10:36:00 2026 +0800"
      },
      "message": "Bump com.fasterxml.jackson.core:jackson-databind in /java (#865)\n\nBumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.18.6 to 2.18.9.\n- [Commits](https://github.com/FasterXML/jackson/commits)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson.core:jackson-databind\n  dependency-version: 2.18.9\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": "51fe8bb8f39d8c62852a89605818a74da961aac9",
      "tree": "49e9824aa4f2caa0ffa488780806b7b4fdd68fed",
      "parents": [
        "d34ac0015ad71bd11083b68d58bd8d3a8c76052b"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 09:53:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 09:53:45 2026 +0800"
      },
      "message": "Bump codecov/codecov-action from 6 to 7 (#853)\n\nBumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6 to 7.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "d34ac0015ad71bd11083b68d58bd8d3a8c76052b",
      "tree": "3f0fbe8a29df0908d7448b3eb03b743b2ca93d30",
      "parents": [
        "1f38d11c92e57ba01c969189ac278ceb98726393"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 09:53:00 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 09:53:00 2026 +0800"
      },
      "message": "Bump actions/setup-node from 4 to 6 (#854)\n\nBumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.\n- [Release notes](https://github.com/actions/setup-node/releases)\n- [Commits](https://github.com/actions/setup-node/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-node\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "1f38d11c92e57ba01c969189ac278ceb98726393",
      "tree": "7edf9090a3adce5db7c216ab3b043d4238ca885a",
      "parents": [
        "b4646b62a29c2731272d9985186d1e184fa47892"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue Jul 14 09:52:02 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jul 14 09:52:02 2026 +0800"
      },
      "message": "Bump actions/cache from 5 to 6 (#855)\n\nBumps [actions/cache](https://github.com/actions/cache) from 5 to 6.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "b4646b62a29c2731272d9985186d1e184fa47892",
      "tree": "723102c005e5bd2b82af9e65caa3ef76cc3093fb",
      "parents": [
        "86252e512e2ce1003ae5c38ac3c1218172638274"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Mon Jul 13 14:35:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jul 13 14:35:40 2026 +0800"
      },
      "message": "fix invalid datatype. (#864)"
    },
    {
      "commit": "86252e512e2ce1003ae5c38ac3c1218172638274",
      "tree": "953810d5835423d15326ad37789182d0ffa2e04d",
      "parents": [
        "3010c3de84b3ac1271a06e9f3b59882184cfd848"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Jul 03 10:39:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jul 03 10:39:18 2026 +0800"
      },
      "message": "C++: optimize batch read/write paths and aligned table null handling (#823)\n\n* TsFile C++: batch + SIMD + parallel read/write optimization\n\nBatch decode/encode APIs (PLAIN / TS2DIFF / Gorilla) with single-pass\nTsBlock decode, AVX2/NEON SIMD paths, a single process-wide worker pool\nfor chunk-level parallel read and column-parallel write, and batched\nNEON statistics. On-disk format unchanged; interoperable with Java/Python.\n\n* fix memory leak.\n\n* fix err.\n\n* fix comment.\n\n* format.\n\n* fix some ut err.\n\n* fix heap-use-after-free in multi-value aligned reader tests\n\nMultiValueAlignedSkipsBatchPreservesValueAlignment and\nMultiValueAlignedWideChunkParallelDecode constructed ColIterator locals\ninside the read loop and called ssi-\u003erevert_tsblock() (which frees the\nTsBlock and its column vectors) while those iterators were still in\nscope. ~ColIterator() calls vec_-\u003ereset_offset(), writing back into the\njust-freed vector at the closing brace of the loop body — a real\nuse-after-free that Linux Release+ASan flags and whose heap corruption\nthen cascaded into spurious SprintzCodec/CRelease failures later in the\nsame single-process run.\n\nScope the ColIterators in a nested block so they are destroyed before\nrevert_tsblock(). Verified on Linux x86_64 Release+ASan+UBSan: full\nsuite 701/701 pass, 0 ASan/UBSan reports.\n\n* fix device-node cache aliasing null tag with literal string \"null\"\n\nTsFileIOReader::get_cached_device_node keyed device_node_cache_ by\nIDeviceID::get_device_name(), which renders a null tag segment as the\nliteral text \"null\".  A device with a real null tag (e.g. tags\n(null, b, c)) and a device whose tag value is the string \"null\"\n((\"null\", b, c)) therefore produce the identical name \"a.null.b.c\" and\ncollide in the cache: whichever device is queried first populates the\nentry, and every later query for the other device on the same reused\nreader gets the first device\u0027s cached MetaIndexNode and silently reads\nits chunks.\n\nThis surfaced through the Python dataset API, where one long-lived\nTsFileReader answers many per-device queries: the pytest\ntest_dataset_null_tag_positions_and_string_null_are_distinct read\n(null,b,c)\u0027s data for the (\"null\",b,c) device.  The device metadata\nbinary search (DeviceIDComparable, segment-based) was always correct;\nonly the string cache key was lossy.\n\nKey the cache by a collision-free, length-prefixed encoding of the\nsegment vector that flags null segments explicitly, so a null tag can\nnever alias the string \"null\".  Add a device_id unit test pinning the\ninvariant (names collide, segment equality distinguishes them).\n\nVerified: C++ suite 707/707 (Release+ASan+UBSan), Python suite 150/150.\n\n* build: don\u0027t use -march\u003dnative by default; gate it behind an option\n\nRelease builds unconditionally added -march\u003dnative on Linux/macOS. Two\nproblems for artifacts that leave the build host:\n\n1. Portability: a wheel/binary built on a newer CPU can fault with an\n   illegal instruction on an older target machine.\n2. On virtualized macOS arm64 CI runners, -march\u003dnative mis-detects the\n   feature set and drops +crc, while snappy\u0027s CRC32 feature probe (run\n   without -march) still reports crc available and defines\n   SNAPPY_HAVE_NEON_CRC32\u003d1.  snappy.cc then calls the always_inline\n   __crc32cw intrinsic in a TU compiled without crc support:\n     error: always_inline function \u0027__crc32cw\u0027 requires target feature\n     \u0027crc\u0027, but would be inlined into a function compiled without \u0027crc\u0027\n   The default (portable) target for macOS arm64 keeps +crc, so snappy\u0027s\n   fast path stays available while the binary stays portable.\n\nDefault Release flags are now -O3 -flto (LTO stays off on MinGW/Windows\nas before). -march\u003dnative is opt-in via -DTSFILE_ENABLE_NATIVE_ARCH\u003dON\nfor local-only builds that never ship. Applies uniformly to CI, wheels,\nand manual local builds.\n\nVerified: non-ASan Release (CI config) builds snappy cleanly and passes\n705/705; -DTSFILE_ENABLE_NATIVE_ARCH\u003dON restores -march\u003dnative.\n\n* fix comment.\n\n* fix simde.\n\n* fix memory leaks in TsFileSeriesScanIterator teardown\n\nThe SSI is placement-new\u0027d into mem_alloc\u0027d memory and torn down with\ndestroy() + mem_free() (TsFileIOReader::revert_ssi / alloc_ssi /\nalloc_multi_ssi), so ~TsFileSeriesScanIterator() never runs. Every\nheap-owning member therefore leaked its backing storage on each query;\ndestroy() only released some of them (itimeseries_index_, chunk_reader_,\ntsblock_). LeakSanitizer on Linux (Debug+ASan and Release+ASan) reported\nhundreds of Direct/Indirect leaks routed through the multi-value read\npath; macOS ASan has no LSan so it stayed hidden locally.\n\nRelease the remaining members explicitly in destroy():\n- tuple_desc_ (std::vector\u003cColumnSchema\u003e) — add TupleDesc::release()\n  since reset() only clear()s and keeps capacity\n- value_chunk_meta_cursors_ (std::vector\u003c...::Iterator\u003e)\n- device_id_ (shared_ptr\u003cIDeviceID\u003e) — the leaked StringArrayDeviceID\n- measurement_name_ (std::string)\n\nVerified on Linux: Debug+ASan and Release+ASan both 705/705 with\n0 Direct / 0 Indirect leaks and 0 UBSan reports.\n\n* refine tablet."
    },
    {
      "commit": "3010c3de84b3ac1271a06e9f3b59882184cfd848",
      "tree": "5354f7ae1b9af1ff9b764d570c513d871715fee1",
      "parents": [
        "4f26e925fe447a6dc991a02dc57e11acf944c00e"
      ],
      "author": {
        "name": "Le Yang",
        "email": "562593859@qq.com",
        "time": "Thu Jul 02 10:06:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jul 02 10:06:04 2026 +0800"
      },
      "message": "[Python] Support tree-model TsFiles in TsFileDataFrame (#816)\n\n* [Python] Support tree-model TsFiles in TsFileDataFrame\n\nSquash of the tsdf-tree branch: tree-model support plus dataset catalog memory and indexing improvements.\n\n- support tree-model TsFiles in TsFileDataFrame\n- shrink the dataframe catalog memory footprint\n- drop table-model phantom cells\n- inline iter_owned_series_refs\n- rename _LogicalIndex to _DataFrameCatalog\n- dedup repeated series specifiers in tsdf.loc\n\n* Fix tree-model metadata segments\n\n* [Python] Dedupe dataset model constants and harden tree-model reads\n\n- metadata: define MODEL_TABLE/MODEL_TREE once and import them in reader\n  and dataframe instead of redefining the same literals in both modules,\n  removing the drift risk between duplicate definitions.\n- metadata: MetadataCatalog.series_count now returns the count of\n  physically-present series (len(series_stats_by_ref)) instead of the\n  device x declared-field cross-product, so it matches len(tsdf) and the\n  reader property for sparse schemas; TsFileSeriesReader.series_count\n  delegates to it as the single source of truth.\n- reader: document why _metadata_field_stats gates on the value\n  statistic\u0027s non-null row_count (not the timeline) and why the\n  timeline_statistic reads below cannot raise.\n- reader: mark the tree-model full-scan reads as O(total_rows) per device\n  (cwrapper per-device pushdown limitation) so the hot path is easy to\n  locate when profiling.\n- reader: fail fast with an assertion if the cwrapper stale col_ leak\n  pattern changes, instead of silently slicing the wrong path columns and\n  returning wrong-device data.\n- tests: add a sparse-schema regression assertion locking series_count to\n  the physically-present count.\n\n* [Python] Support unioning multiple tree-model TsFiles in TsFileDataFrame\n\n- Tree TsFiles synthesize their schema per file, so loading several into one\n  TsFileDataFrame previously raised \"Incompatible schema\" whenever the files\n  differed in measurement subset or device depth. Widen the dataframe-level\n  synthetic table to the union instead: _merge_tree_table_entries unions the\n  field columns (existing order first) and grows the tag columns to the\n  deepest file\u0027s depth so shallower devices pad with nulls.\n- Key each logical series by the global field index resolved by measurement\n  name against the merged table, while each shard keeps its reader-local\n  field index for the read path. This keeps per-(device, field) ownership\n  exact and avoids mis-mapping measurements across files. For table model the\n  global and local indices always coincide, so behavior is unchanged\n  (incompatible table schemas are still rejected).\n- tests: add multi-file tree coverage -- identical-structure merge (shards and\n  time bounds), field union across files, and differing-depth union with tag\n  padding.\n\n* [Python] Filter non-numeric measurements in tree-model TsFileDataFrame\n\nThe dataset surface is numeric (values are read as float64), and table mode\nalready drops non-numeric (STRING/TEXT) fields from its schema. Tree mode did\nnot, so a string/text measurement was surfaced as a series that then crashed on\nread (float() on a string). Apply the numeric-type filter once in\n_metadata_field_stats so both models behave consistently -- this also makes the\nexisting tree-model \"measurements that pass the numeric filter\" comment accurate.\n\n- reader: skip measurements whose data_type is not numeric in\n  _metadata_field_stats (shared by table and tree paths); table mode is\n  unaffected since it already filters at the schema level.\n- tests: add a tree-model regression test asserting a STRING measurement is\n  dropped (not listed, raises KeyError) while the numeric one reads back."
    },
    {
      "commit": "4f26e925fe447a6dc991a02dc57e11acf944c00e",
      "tree": "03e98901142bc3ef94f12fe372034985d1935ad5",
      "parents": [
        "9e929f0f0a72e4ed8fc91970efbbfb9e683d4dbc"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Jun 25 16:10:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 25 16:10:03 2026 +0800"
      },
      "message": "fix tag null segsegv. (#848)\n\n* fix tag null segsegv.\n\n* Python: represent null tags with SeriesPath and position-preserving paths\n\nThe dataset layer flattened a table device into a \"table.tag.field\" string and\ndropped null tags entirely, which lost the tag position and made two devices\nwith nulls in different positions collide (e.g. a.\u003cnull\u003e.b.c vs a.b.\u003cnull\u003e.c),\nso they became unaddressable. Reading them by the auto-generated name also could\nnot distinguish a real null tag from the literal string \"null\".\n\nIntroduce a SeriesPath (str subclass): its string value is the escaped path\nform with a collision-proof \\N marker for null tags, and it also exposes the\nstructured table / tags / field components (a None entry in tags \u003d null). A real\nvalue can never escape to \\N because escaping doubles backslashes, so \\N is\nunambiguous against the literal string \"null\".\n\n- metadata.py: add SeriesPath; build/split/resolve now keep every tag position\n  and mark null with \\N / None. Every device maps to a unique path, so the\n  sparse/compressed lookup and the \"ambiguous path\" fallback are removed in\n  favor of a single direct lookup.\n- dataframe.py: list_timeseries() returns SeriesPath; loc[...] and resolution\n  accept a SeriesPath or a path string (with \\N); drop the sparse-tag index.\n- tsfile_py_cpp.pyx: key the timeseries-metadata map by the device segment tuple\n  instead of the device-name string. The name renders null as \"null\", so keying\n  by it collided a real null tag with the literal \"null\" and silently dropped\n  one device.\n- Export SeriesPath from the package; update/extend tests (null position\n  preservation, real-null vs string \"null\", SeriesPath round-trip and escaping).\n\n* fix parse null.\n\n* fix tag parser.\n\n* fix some comment."
    },
    {
      "commit": "9e929f0f0a72e4ed8fc91970efbbfb9e683d4dbc",
      "tree": "6fb0f0056da33b4329e5f9049a75b0c3edd46a37",
      "parents": [
        "c1dae0e093b7600a4b76ffb548eaf4f62483d15b"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Tue Jun 16 17:19:15 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 17:19:15 2026 +0800"
      },
      "message": "Fix C++ TsFile writer flush offsets for multi-GB files. (#839)\n\n* Fix C++ TsFile writer flush offsets for multi-GB files.\n\nSync file_base_offset after flush, reset the write stream and consumer,\nand add tree/table 4GB regression tests.\n\n* Add Python 4GB large-file tests and fix MSVC test includes.\n\nMirror C++ tree/table ~4GB regression coverage in pytest and drop POSIX-only headers from large-file gtests.\n\n* Merge large-file test helpers into conftest.py.\n\nKeep shared constants and utilities in one pytest entry point for tree/table 4GB tests.\n\n* Fix Windows large-file truncate and stat handling in C++.\n\n* fix msvc compilation\n\n* removed unused test"
    },
    {
      "commit": "c1dae0e093b7600a4b76ffb548eaf4f62483d15b",
      "tree": "86190478c3f54c8d9d89f846d7fc8cf2e688802b",
      "parents": [
        "dfd328469213197cdd6d44644a904088e56cb532"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Jun 16 15:33:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 15:33:26 2026 +0800"
      },
      "message": "add cli readme (#844)"
    },
    {
      "commit": "dfd328469213197cdd6d44644a904088e56cb532",
      "tree": "5171941a7617cff304090541abaf0e1ac9f3156e",
      "parents": [
        "719f80a6bcb251a3e13525696c62311a76d93f42"
      ],
      "author": {
        "name": "shuwenwei",
        "email": "55970239+shuwenwei@users.noreply.github.com",
        "time": "Tue Jun 16 14:58:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 14:58:52 2026 +0800"
      },
      "message": "Optimize timeseries metadata read and fix table size accounting (#840)"
    },
    {
      "commit": "719f80a6bcb251a3e13525696c62311a76d93f42",
      "tree": "ea29c6e63557d102c506fefb34ae25d2bb422dd7",
      "parents": [
        "0963453456c41b5d5b118359176fef6565011053"
      ],
      "author": {
        "name": "Zeyu Zhang",
        "email": "111627783+Alchuang22-dev@users.noreply.github.com",
        "time": "Thu Jun 11 11:37:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 11:37:13 2026 +0800"
      },
      "message": "Fix several bugs in tsfile-cli and add tag filter commands (#837)\n\n* fix(tsfile-cli): fix the case inconsistency in TABLE names\n\n* fix(tsfile-cli): fix `build.sh` command\n\n* fix(tsfile-cli): add `reader.queryByRow(...)` to `head/cat` cammand\n\n* fix(tsfile-cli): add `TagFilterBuilder` predicate variable\n\n* fix(tsfile-cli): format code\n\n* fix(tsfile-cli): rename `table_filter` as `target_table_name`"
    },
    {
      "commit": "0963453456c41b5d5b118359176fef6565011053",
      "tree": "9efb8f4f1f441b2d1ce5b8600490ff53be662342",
      "parents": [
        "5123d6e30e1cb8f8fa80116f2df4d1defa9c4772"
      ],
      "author": {
        "name": "ZhangHongYin",
        "email": "46039728+SpriCoder@users.noreply.github.com",
        "time": "Wed Jun 10 18:47:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 18:47:10 2026 +0800"
      },
      "message": "Fix tsfile-cli clean-build race and harden CLI validation (#836)\n\nBuild: tsfile_cli_obj compiled against the staged include tree without\ndepending on the copy_* targets that populate it, so a clean parallel\nbuild could fail with \"\u0027common/db_common.h\u0027 file not found\"\n(deterministic via `make tsfile_cli_obj` in a fresh build dir). Add the\nmissing add_dependencies edge.\n\nCLI hardening:\n- reject --offset on non-row commands and --model on write; name each\n  read-only flag rejected by write instead of a lumped message\n- error when -d/-t does not match the file\u0027s data model in\n  head/cat/sample/schema instead of silently ignoring the filter\n- include the storage error code in open/create failure messages\n- detect numeric flag overflow (ERANGE) in -n/--offset/--start/--end/--seed\n- cap the sample reservoir pre-allocation so a huge -n cannot abort via\n  std::length_error; add a last-resort exception handler in main\n- emit null for non-finite FLOAT/DOUBLE cells in JSON output (bare\n  nan/inf is not valid JSON)\n- docs: -m also applies to stats/count, count covers all tables, note\n  that the table format buffers rows in memory"
    },
    {
      "commit": "5123d6e30e1cb8f8fa80116f2df4d1defa9c4772",
      "tree": "6fcf9089d042fc67e19ddd6ff0901d6e69131815",
      "parents": [
        "594a68f356b0d6d1c69fb053993a261e97f0dae2"
      ],
      "author": {
        "name": "ZhangHongYin",
        "email": "46039728+SpriCoder@users.noreply.github.com",
        "time": "Wed Jun 10 18:41:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 18:41:33 2026 +0800"
      },
      "message": "update CMakeFile (#835)"
    },
    {
      "commit": "594a68f356b0d6d1c69fb053993a261e97f0dae2",
      "tree": "c856f720c60d813ebf081770e5a44232221df05d",
      "parents": [
        "be3c5bf31bb2488d99079339d75ea5b335aabdf8"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Wed Jun 10 12:27:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 10 12:27:39 2026 +0800"
      },
      "message": "Fix/windows ci python wheel build (#833)\n\n* Fix Windows CI failures for the Python wheel build. (#831)\n\n* fix(cpp): remove FORCE_INLINE from AndFilter/OrFilter for MinGW build\n\nGCC on Windows CI fails when always_inline virtual methods exceed the max-inline-insns-single limit during expression.cc compilation.\n\n* fix(python): preload MinGW runtime DLLs on Windows wheel import\n\nRestore MinGW runtime preloading in __init__.py removed during MSVC support. Improve setup.py to locate MinGW DLLs via MSYSTEM_PREFIX and harden wheels.yml Windows build/verify steps.\n\n* fix(python): fix MinGW .pyd linking and skip tests during wheel build\n\nLink gcc_s/stdc++ before libtsfile on MinGW so _Unwind_Resume is not imported from libtsfile.dll (WinError 127). Honor -DskipTests in exec-maven-plugin for pytest, and add -Dmaven.test.skip\u003dtrue in wheels CI.\n\n* Fix Windows wheel MinGW runtime packaging\n\n* Remove unrelated setup.py version bump\n\n* Fix cpp formatting and sync Python version\n\n* Fix MinGW filter inlining for rc build\n\n* Avoid forced inline for nested time filters\n\n* Avoid forced inline for nested statistic filters\n\n* Sync C++/Python version to 2.3.2.dev with Maven 2.3.2-SNAPSHOT\n\n* Fix C example string duplication for Linux wheels"
    },
    {
      "commit": "be3c5bf31bb2488d99079339d75ea5b335aabdf8",
      "tree": "35d8705450cb7902db54059755936f70ff0be3e1",
      "parents": [
        "9a78cda867c92eb83c4ee095096638a08646f397"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Tue Jun 09 19:46:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 19:46:03 2026 +0800"
      },
      "message": "Add GitHub Actions workflow for site build and deploy"
    },
    {
      "commit": "9a78cda867c92eb83c4ee095096638a08646f397",
      "tree": "9f1b9590f35c67f765c423329d7693f33521e736",
      "parents": [
        "d78fd5154718b8931c1f022d6f4731df4ab248c6"
      ],
      "author": {
        "name": "CritasWang",
        "email": "critas@outlook.com",
        "time": "Tue Jun 09 19:40:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 19:40:20 2026 +0800"
      },
      "message": "Remove GitHub Actions workflow configuration to remove document build (#834)"
    },
    {
      "commit": "d78fd5154718b8931c1f022d6f4731df4ab248c6",
      "tree": "6914b2b7961a511ef1bd28bd54927d8b8d5debad",
      "parents": [
        "3c60194c6bfd0d8ec6129e98dadbd3e28d57408f"
      ],
      "author": {
        "name": "ZhangHongYin",
        "email": "46039728+SpriCoder@users.noreply.github.com",
        "time": "Tue Jun 09 18:43:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 09 18:43:11 2026 +0800"
      },
      "message": "Add tsfile-cli: inspect and import .tsfile from the command line (#829)\n\n* docs: add design spec for TsFile Unix-philosophy C++ CLI\n\nRead-only inspect/export verbs (ls/schema/stats/head/cat/select) as a\nsingle multi-call `tsfile` binary, backed by the existing C++ reader API.\n\n* docs: add implementation plan for TsFile Unix CLI; refine spec\n\n9 TDD tasks (CMake scaffold -\u003e arg parser -\u003e formatters -\u003e ResultSet pump\n-\u003e ls/schema/stats/head/cat/select -\u003e install/verify). Spec tweaked to\nmatch confirmed C++ APIs (table-model schema blanks encoding/compression;\nstats \u003d count + time range).\n\n* Update TsFile CLI redesign spec\n\n* Add TsFile CLI redesign implementation plan\n\n* Update tsfile CLI command surface\n\n* Route ReadFile::open errors to stderr\n\n* Add tsfile CLI commands, formatters, build, and tests\n\n* Consolidate TsFile CLI spec and plan\n\n* Extend tsfile stats with value summaries and shared stat helpers\n\n* Add tsfile meta command\n\n* Add tsfile count command\n\n* Add deterministic tsfile sample command\n\n* Format tsfile CLI sources with clang-format\n\n* Document CMake 4.x/ANTLR4 build constraint in CLI plan\n\n* Simplify sampled writer: trust caller-normalized limit\n\n* Add tsfile-cli usage skill for inspecting .tsfile from the CLI\n\n* Rename CLI binary from tsfile to tsfile-cli\n\n* Add tsfile CLI write (CSV/TSV import) design spec\n\n* Refine write spec: silent-by-default (-v summary) and opt-in --header-match\n\n* Add tsfile CLI write implementation plan\n\n* Add tsfile CLI input_format parsing layer\n\n* Add tsfile CLI write argument parsing\n\n* Add tsfile CLI write command (CSV/TSV import)\n\n* Treat \u0027-\u0027 as stdin positional, not an unknown flag\n\n* Format tsfile CLI write sources with clang-format\n\n* Update tsfile-cli skill to document the write command\n\n* Condense tsfile-cli skill with formal notation\n\n* Ignore .codegraph and cpp/root test-run artifacts\n\n* Add QA learning log for tsfile CLI work\n\n* Move tsfile-cli skill to cpp/tools/skills; stop tracking .claude\n\n* Stop tracking docs/superpowers and QA_Log.md (keep local, out of PR)\n\n* Add Apache license header to tsfile-cli skill doc (fix RAT check)\n\n* Fix CLI test race: unique per-process temp filenames for parallel ctest\n\n* Simplify CLI test fixture: drop unused path param and atomic counter\n\n* Add tsfile-cli tool README\n\n* Expand tsfile-cli README: build-from-source and skill install\n\n* Address PR #829 review feedback for tsfile-cli\n\n- row_query/sample: translate storage error codes to readable phrases\n  instead of emitting a bare numeric code\n- read_file: drop the always -1 fd_ value from open() diagnostic; keep\n  strerror(errno)\n- run_cli: honor --help even with a positional file; correct the stats\n  usage text (min/max/first/last/sum)\n- meta: remove the always-empty version/bloom_filter columns (the public\n  reader API exposes neither); update README and SKILL accordingly\n- write: stream rows into fixed 1024-row Tablet batches so memory stays\n  bounded regardless of input size\n- write: reject numeric overflow (ERANGE for int/float/double, plus an\n  INT32 range check)\n- tools CMake: remove the noisy unconditional configure message\n- test CMake: drop the no-op SYSTEM target property and force the vendored\n  GTest headers ahead on TsFile_Test where header resolution matters\n\n* Harden tsfile-cli writes, errors, and input validation\n\nStrict-review follow-up to PR #829:\n- write: reject non-strictly-increasing timestamps per device (tag tuple)\n  with a located message; refuse --output equal to the input file; remove\n  the partial output on any failure so no corrupt .tsfile is left behind\n- write/query/sample failures now print a human-readable cause via\n  error_code_message() instead of a bare numeric code; the helper lives in\n  the output_format layer so read and write share it\n- schema: report real encoding/compression for table-model columns instead\n  of always-empty cells\n- columns spec: reject duplicate column names\n- reject flags that do not apply to a command (write-only flags on read\n  commands, row/range flags on metadata commands, --header-match with\n  --no-header), and give a clear error when an option precedes the command\n- rename the read-output helpers to emit_result_set* and the JSON predicate\n  to emits_json_bare so the names match what they do\n- docs: document the per-device timestamp ordering rule and drop the\n  unimplemented \"help \u003ccommand\u003e\" form\n\n* Rename tsfile-cli stat_table.{h,cc} to statistics.{h,cc}\n\nThe file holds generic statistics helpers (collect_series_stats,\ncollect_file_summary, statistic_value_cells) used by stats/count/meta for\nboth the tree and table models. \"table\" wrongly implied the table model;\n\"statistics\" describes what it actually provides.\n\n* Add tests for tsfile-cli review hardening\n\nCovers per-device timestamp-order rejection (including across batch\nflushes), --output anti-alias and unlink-on-failure, large streaming\nround-trip, numeric overflow detection, duplicate-column rejection,\nflag-applicability errors, the leading-option error, error_code_message\nmapping, --help with a positional file, and table-model schema\nencoding/compression.\n\n* Simplify scoped-command check in tsfile-cli flag validation\n\nDerive the scoped flag from is_row instead of re-listing the\nhead/cat/sample command names, so the row-command set lives in one place.\n\n* Address PR #829 round 2 review feedback for tsfile-cli\n\n- write: support quoted CSV fields that span multiple physical lines by\n  joining continuation lines until the opening double-quote closes, via a\n  new read_record() helper shared by the header and data read paths\n- read: print FLOAT/DOUBLE with max_digits10 precision so values\n  round-trip losslessly through a pipe instead of the default 6 sig digits\n- tools CMake: include library headers from the staged LIBRARY_INCLUDE_DIR\n  and THIRD_PARTY_INCLUDE instead of reaching into ${PROJECT_SOURCE_DIR}/src,\n  matching the convention the test target already uses\n- tests: cover read_record (multi-line quoted, CR strip, TSV, unterminated\n  quote) and add e2e float/double lossless and embedded-newline import cases\n\n* Address PR #829 round 3 review feedback for tsfile-cli\n\nImplements jt2594838\u0027s review on develop\u0027s tsfile-cli:\n\n- write: accept TIMESTAMP/DATE/BLOB columns and store each column with the\n  engine\u0027s default encoding/compression for its type (via get_value_encoder /\n  get_default_compressor) instead of hard-coded PLAIN/UNCOMPRESSED.\n- sample/row_query: when no device is given, build query paths from one\n  whole-file get_timeseries_metadata() call via a shared collect_tree_query_paths\n  helper instead of a per-device schema loop.\n- Sink CSV split/escape into common/csv_utils.{h,cc} and the datatype-name parser\n  into common::parse_data_type_name; the CLI now delegates to them.\n- write: case-insensitive column category, verbose echo of the resolved config,\n  header-match errors that name the offending column/position, error codes\n  appended to writer failures, and result_code naming.\n- Documented the table-model \"first table only\" caveat and the extended write\n  types in README/SKILL; added struct comments and clearer usage text.\n- Tests: extended-type/category parsing, TIMESTAMP/DATE/BLOB round-trip, verbose\n  echo, header-match position, and common csv/type-name helpers.\n\n* Show short-flag aliases in tsfile-cli write/validation error messages\n\nError strings for flags that have a short form now mention it, matching the\nusage text: -t/--table, -d/--device, -n/--limit. Flags without a short alias\n(--columns, --offset, --seed, --start/--end, --header-match) stay long-only.\n\n* Clarify intent of RowWriter::emits_json_bare predicate\n\nAdd a comment explaining that BOOLEAN is grouped with the numeric types because\ntrue/false are bare JSON literals (not because BOOLEAN is numeric); strings,\nblobs, and dates are quoted. The misleadingly-named is_numeric was already\nrenamed to emits_json_bare in a prior round.\n\n* Avoid per-cell copies in tsfile-cli write import hot loop\n\n- Move (not copy) each fully-built DataRow into the batch vector; the row owns a\n  vector\u003cstring\u003e of cells, so the lvalue push_back copied every cell per row.\n- Add values to the Tablet by column index instead of by name. The by-name\n  add_value lowercases the measurement name and does a map lookup per cell;\n  the column-\u003eindex order is fixed at schema-build time, so the index is known.\n  String/text/blob use the c-string by-index overload to keep the same path.\n\n* Strengthen tsfile-cli write tests; reject impossible DATE cells\n\nNew e2e tests:\n- per-column value mapping via JSON output (guards the by-index add_value path:\n  any cross-column write would surface as a wrong key/value pair)\n- multi-type import across \u003e2 batches, spot-checking a last-batch row\n- RFC 4180 round-trip of a quoted STRING with comma + embedded quotes\n- TIMESTAMP overflow / non-numeric, empty-cell-as-null\n- DATE boundary (leap day) and impossible-date rejection\n\nThe impossible-date test exposed a bug: parse_date_cell only checked the\nYYYY-MM-DD shape, and the writer silently drops an invalid std::tm rather than\nerroring, so e.g. 2024-13-40 imported as success. parse_date_cell now validates\nvia DateConverter::date_to_int and reports \"bad DATE\".\n\n* Filter single-device tree query paths through the device schema\n\nResolve the device\u0027s real series and build query paths directly from\nthem, keeping only measurements that match the projection. A provided\nmeasurement that doesn\u0027t exist on the device is now dropped instead of\nqueried blindly, matching the no-device path.\n\n* Use set::find for the known-command membership check\n\nExpresses the existence test directly instead of counting; equivalent\nfor a std::set and C++11-compatible (no contains())."
    },
    {
      "commit": "3c60194c6bfd0d8ec6129e98dadbd3e28d57408f",
      "tree": "2d44b6111e2911b17019f54899175a9c5d7fcd34",
      "parents": [
        "2a864c58740e99f35be037f0548f84231a928b6a"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Mon Jun 08 14:24:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 14:24:48 2026 +0800"
      },
      "message": "Upgrade minimum JDK to 17 and refresh dependencies (#830)\n\n* Upgrade minimum JDK to 17\n\n* Address Dependabot Maven alerts"
    },
    {
      "commit": "2a864c58740e99f35be037f0548f84231a928b6a",
      "tree": "8c85d8e50cedd029fc90cb58236e57ca8518bf3d",
      "parents": [
        "324acba9b9f4c844577a5c8d9ef20f9ee24bf654"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Thu Jun 04 16:47:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 04 16:47:06 2026 +0800"
      },
      "message": "Fix TS_2DIFF float/double page compatibility (#796)\n\n* Fix TS_2DIFF float/double page compatibility and harden gtest zip validation.\n\nAlign C++ float/double TS_2DIFF flush/read behavior with Java overflow-page layout, and prevent 0-byte/corrupt googletest archives from being treated as successful downloads during test configuration.\n\n* Make tsfile-cpp optimization flags inherit from caller by default.\n\nAdd optional TSFILE_OPTIMIZATION_FLAGS overrides in project/examples CMake while removing hardcoded optimization settings so library builds follow common CMake integration behavior.\n\n* Align C++ float/double TS_2DIFF default semantics with Java.\n\nUse Java-compatible default maxPoint handling for float/double TS_2DIFF encode/decode while preserving legacy raw-block compatibility, and add a byte-level regression test for the documented float/NaN hex sequence.\n\n* Fix table time decoder selection for chunk readers.\n\nUse the actual time chunk encoding instead of global default when building time decoders in table read paths, preventing wrong TS_2DIFF decoding on PLAIN time chunks.\n\n* Trim redundant comments and remove dead time decoder field.\n\nDrop nonessential explanatory comments in TS_2DIFF codec changes and remove unused defaultTimeDecoder from AbstractChunkReader to keep the PR focused for review.\n\n* Add Java baseline hex test for double TS_2DIFF encoding.\n\nMirror TestFloatJavaDefaultHexCompatibility with the same overflow-page\ninputs so C++ double encoder output stays byte-for-byte compatible with Java.\n\n* Rename TS_2DIFF Java overflow flags and align bitmap naming.\n\nApply review feedback: FLAG_SCALED_VALUE_OVERFLOW /\nFLAG_ORIGINAL_VALUE_OVERFLOW, and consistent underflow/overflow bitmap\nnames in encoder and decoder."
    },
    {
      "commit": "324acba9b9f4c844577a5c8d9ef20f9ee24bf654",
      "tree": "c1543145231f20fcaf850086ec928c288e534651",
      "parents": [
        "86ec4b992b8b14e73daed915b90c8da8528a9213"
      ],
      "author": {
        "name": "Jackie Tien",
        "email": "jackietien97@gmail.com",
        "time": "Wed Jun 03 17:10:56 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 17:10:56 2026 +0800"
      },
      "message": "Optimize get_timeseries_metadata() to eliminate N+1 I/O (~94x speedup) (#815)\n\n* optimize get_timeseries_metadata() to eliminate N+1 I/O\n\n- Add get_device_timeseries_meta_by_offset() that accepts pre-resolved\n  offsets, skipping redundant load_device_index_entry() tree search and\n  reusing the deserialized measurement index node via get_all_leaf()\n  instead of re-reading the same bytes through\n  load_all_measurement_index_entry()\n- Add get_all_device_entries() to collect device IDs with their\n  (start_offset, end_offset) in a single index tree traversal\n- Rewrite get_timeseries_metadata() to use the above two methods\n- Remove redundant PageArena::init() call in get_timeseries_metadata_impl\n\n* fix int64_t truncation and error handling in get_all_device_entries\n\n* optimize queryByRow with exact tag filter via B-tree direct lookup\n\nWhen DeviceMetaIterator receives a single TagEq filter (exact match on\none tag column), construct the target device ID and use\nload_device_index_entry() for O(log N) B-tree binary search instead of\ntraversing all internal nodes and scanning all leaf devices.\n\nFor ecg_dataset (53040 devices), this reduces queryByRow\u0027s\nDeviceTaskIterator::next() from ~117ms to ~0.5ms per query (~230x).\n\nAlso adds bench_read.cpp for standalone C++ read path benchmarking\nand makes load_device_index_entry() public for reuse.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* style: clang-format\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* Updae C++ CLAUDE.md to persist format way\n\n* fix direct lookup for multi-tag-column devices\n\nThe TagEq direct B-tree lookup constructed a device ID with only\ncol_idx_+1 segments, but devices with multiple tag columns have more.\nThe segment count mismatch caused operator\u003d\u003d to always return false,\nso queries returned 0 rows. Guard the optimization to only activate\nwhen the filter fully specifies the device ID (single tag column).\n\n* add unit tests for timeseries metadata and direct B-tree lookup\n\n- GetTimeseriesMetadataTableModel: test get_timeseries_metadata()\n  with table model, covering get_all_device_entries (LEAF_DEVICE\n  path) and get_device_timeseries_meta_by_offset\n- GetTimeseriesMetadataMultiTable: test with two tables, covering\n  the multi-table iteration in get_timeseries_metadata\n- DirectLookupSingleTagColumn: test the TagEq direct B-tree lookup\n  optimization with a single-tag-column table, covering\n  try_setup_direct_lookup and load_results_direct\n- DirectLookupNonExistDevice: test direct lookup returns 0 rows\n  when the device does not exist\n\n* delete examples/bench_read.cpp\n\n* fix direct lookup guard for multi-tag-column tables\n\nThe previous guard (actual_segment_count !\u003d eq-\u003ecol_idx_ + 1) still\nallowed direct lookup when filtering on the last tag column in a\nmulti-tag table (e.g., 2 tags: segment_count\u003d3, col_idx\u003d2, 2+1\u003d3).\nThe constructed device ID had empty segments for unfiltered tags,\ncausing B-tree lookup to find nothing. Restrict direct lookup to\nsingle-tag tables only (segment_count \u003d\u003d 2).\n\n* style: clang-format\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "86ec4b992b8b14e73daed915b90c8da8528a9213",
      "tree": "ef0e303812e94510fab886416095a3a82ca0c976",
      "parents": [
        "e7b0d695738c6ec0446c1c004ff017dfe1295d4c"
      ],
      "author": {
        "name": "Zhenyu Luo",
        "email": "zhenyu@apache.org",
        "time": "Wed Jun 03 15:17:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 15:17:43 2026 +0800"
      },
      "message": "Add Tablet.serializedSize() and comprehensive size validation tests. (#824)\n\n* Add Tablet.serializedSize() and comprehensive size validation tests.\n\nPre-allocate serialization buffer using exact size estimation, support OBJECT\ntype in tablet serialize/deserialize path, and consolidate serializedSize tests.\n\n* Fix serialized size charset and overflow handling\n\n* Avoid bitmap copy when sizing tablet serialization"
    },
    {
      "commit": "e7b0d695738c6ec0446c1c004ff017dfe1295d4c",
      "tree": "63911b394edaa2e0bb85cafe3042ea56d32c28aa",
      "parents": [
        "aacd0d7f42aa17a9335c9a29295e5a1421c1156c"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Jun 01 10:42:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 10:42:26 2026 +0800"
      },
      "message": "Update RELEASE_NOTES.md for version 2.3.1\n\nAdded new features and bug fixes for version 2.3.1."
    },
    {
      "commit": "aacd0d7f42aa17a9335c9a29295e5a1421c1156c",
      "tree": "cb3608985a64d1dcc34ddf109f2b4eeee44f1479",
      "parents": [
        "21988e7365cb274ffe8283551939e3f1055a1dc6"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Jun 01 10:40:48 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 01 10:40:48 2026 +0800"
      },
      "message": "Add new release version 2.3.1 for Apache TsFile"
    },
    {
      "commit": "21988e7365cb274ffe8283551939e3f1055a1dc6",
      "tree": "aa2d30898cfdde86c2cf7662c47a18067d062970",
      "parents": [
        "3436b4f93fb05e511d95293ab543014d45bfbe15"
      ],
      "author": {
        "name": "ZhangHongYin",
        "email": "46039728+SpriCoder@users.noreply.github.com",
        "time": "Sun May 31 14:27:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 31 14:27:10 2026 +0800"
      },
      "message": "Fix typos in comments, docs, build scripts, and i18n messages (#826)\n\n* fix(cpp): correct typos in comments, build scripts, and debug output\n\nSpelling fixes only; no behavioral change. Touches code comments,\nCMake/`build.sh` messages, the `increament` local parameter in\nbyte_stream.h, a debug `std::cout` string, and grammar-file comments\n(Arithmetics-\u003eArithmetic, Comparation-\u003eComparison).\n\n* fix(java): correct typos in comments, javadoc, and i18n log messages\n\nSpelling fixes only. Includes code comments and Javadoc across the\nencoding, file, and read packages, and the English i18n message values\n(occured-\u003eoccurred, and a duplicated \"with with\"). Message keys are\nunchanged, so the en/zh key-set alignment enforced by MessagesTest is\npreserved. The intentionally-preserved \"supproted\"/\"greather\" strings\n(documented inline for backward compatibility) are left untouched.\n\n* fix(docs): correct typos in documentation\n\nSpelling fixes in README/QuickStart/release notes (aquisition-\u003eacquisition,\nseverval-\u003eseveral, Paritial-\u003ePartial, wirh-\u003ewith, memroy-\u003ememory). In the\nChinese committers doc, \"Committe\" is corrected to \"Committer\" (the Apache\nrole), which also repairs a broken anchor: it now points to About.md#committer\nto match the existing \"### Committer\" heading.\n\n* fix(build): correct typos in pom.xml coverage-check comments\n\nSpelling fixes in JaCoCo limit comments (methodes-\u003emethods, swtich-\u003eswitch).\nComment-only change; no build behavior affected."
    },
    {
      "commit": "3436b4f93fb05e511d95293ab543014d45bfbe15",
      "tree": "f35b49fbc2cb6c05c31d7f6b1da83b49b8699493",
      "parents": [
        "ce011faeaed11ffc3f1d7e97df092cfe361004d1"
      ],
      "author": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Thu May 28 18:15:11 2026 +0800"
      },
      "committer": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Thu May 28 18:15:11 2026 +0800"
      },
      "message": "[maven-release-plugin] prepare for next development iteration\n"
    },
    {
      "commit": "ce011faeaed11ffc3f1d7e97df092cfe361004d1",
      "tree": "028700f012943bcbbae18a9bdc887f9cb4fc3f37",
      "parents": [
        "e3cdf879c907e3fbe351e1bf278c5d2ce3963dda"
      ],
      "author": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Thu May 28 18:15:02 2026 +0800"
      },
      "committer": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Thu May 28 18:15:02 2026 +0800"
      },
      "message": "[maven-release-plugin] prepare release v2.3.1\n"
    },
    {
      "commit": "e3cdf879c907e3fbe351e1bf278c5d2ce3963dda",
      "tree": "ba8353e8482fd94e619f769d1c84ba239c284319",
      "parents": [
        "543c4440cf2c31a8c385ee756081b2cd0ee43a90"
      ],
      "author": {
        "name": "耿紫颜",
        "email": "3415667974@qq.com",
        "time": "Thu May 28 14:34:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 14:34:55 2026 +0800"
      },
      "message": "fix(tools): unbreak bat for paren paths and silence library INFO noise (#825)\n\n* Fix tools import edge cases\n\n* fix(tools): tighten Parquet/Arrow schema validation and tag column handling\n\n- Parquet/Arrow schema mode: validate source_columns against the source file by count and name; reject unnamed SKIP (name-based matching cannot resolve it). Previously mismatches silently produced all-null columns.\n\n- TabletBuilder: lowercase the keys of tagDefaults and sourceColumnIndex to match the lowercase names returned by TableSchema.getColumnSchemas, match the time column case-insensitively, and use STRING (not TEXT) for tag MeasurementSchema.\n\n- Document the new validation rules and clarify auto-mode time-column requirements, type-promotion conditions, and table-name sanitization in both README versions; add a note above the Schema Example that duplicate (device, timestamp) rows are not supported.\n\n- Add SchemaValidationTest covering positive case plus column-count mismatches, unknown column name, and unnamed SKIP for both formats.\n\n- Add four regression tests in TabletBuilderTest for mixed-case tag / source / time columns, mixed-case tag default values, and virtual tag DEFAULT values landing in the device id.\n\n* fix(tools): read import.schema as UTF-8 instead of platform default\n\nImportSchemaParser.parse used FileReader, which decodes with the JVM default charset. On Chinese Windows running JDK \u003c18 the  default is GBK (Java 18+ defaults to UTF-8 per JEP 400), so a UTF-8 import.schema containing Chinese table or column names was  mis-decoded and the garbled text propagated into the resulting TsFile.\n\nReplace FileReader with InputStreamReader explicitly bound to StandardCharsets.UTF_8 so the file is read correctly regardless   of JDK version or platform locale, mirroring how CsvSourceReader already opens its input.\n\n* fix(tools): unbreak bat for paren paths and silence library INFO noise\n\nDrop the start /B /WAIT wrapper in csv/arrow/parquet bats so paths like events(1).csv no longer get truncated by cmd parenthesis grouping; pass Java exit code through explicitly.\n\nSilence Arrow allocator and Parquet/Hadoop CodecPool INFO logs in logback-cvs2tsfile.xml.\n\nAdd BatScriptTest covering normal filename, paren filename, and absence of suppressed INFO noise.\n\n---------\n\nCo-authored-by: ziyangeng \u003cziyan.geng@intern.timecho.com\u003e"
    },
    {
      "commit": "543c4440cf2c31a8c385ee756081b2cd0ee43a90",
      "tree": "4f43cb9d78e70be245d67cccca44f8e5787624d2",
      "parents": [
        "6ccc9d7e69e816cc7babb40a9b924fc6151a6c55"
      ],
      "author": {
        "name": "耿紫颜",
        "email": "3415667974@qq.com",
        "time": "Mon May 25 09:50:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 09:50:19 2026 +0800"
      },
      "message": "Fix import edge cases for DATE/TIMESTAMP, INT96, CSV quotes and format filtering (#819)\n\n* Fix tools import edge cases\n\n* fix(tools): tighten Parquet/Arrow schema validation and tag column handling\n\n- Parquet/Arrow schema mode: validate source_columns against the source file by count and name; reject unnamed SKIP (name-based matching cannot resolve it). Previously mismatches silently produced all-null columns.\n\n- TabletBuilder: lowercase the keys of tagDefaults and sourceColumnIndex to match the lowercase names returned by TableSchema.getColumnSchemas, match the time column case-insensitively, and use STRING (not TEXT) for tag MeasurementSchema.\n\n- Document the new validation rules and clarify auto-mode time-column requirements, type-promotion conditions, and table-name sanitization in both README versions; add a note above the Schema Example that duplicate (device, timestamp) rows are not supported.\n\n- Add SchemaValidationTest covering positive case plus column-count mismatches, unknown column name, and unnamed SKIP for both formats.\n\n- Add four regression tests in TabletBuilderTest for mixed-case tag / source / time columns, mixed-case tag default values, and virtual tag DEFAULT values landing in the device id.\n\n* fix(tools): read import.schema as UTF-8 instead of platform default\n\nImportSchemaParser.parse used FileReader, which decodes with the JVM default charset. On Chinese Windows running JDK \u003c18 the  default is GBK (Java 18+ defaults to UTF-8 per JEP 400), so a UTF-8 import.schema containing Chinese table or column names was  mis-decoded and the garbled text propagated into the resulting TsFile.\n\nReplace FileReader with InputStreamReader explicitly bound to StandardCharsets.UTF_8 so the file is read correctly regardless   of JDK version or platform locale, mirroring how CsvSourceReader already opens its input.\n\n---------\n\nCo-authored-by: ziyangeng \u003cziyan.geng@intern.timecho.com\u003e"
    },
    {
      "commit": "6ccc9d7e69e816cc7babb40a9b924fc6151a6c55",
      "tree": "44753375f4585fd420203720aaf45f0318996532",
      "parents": [
        "edbef480090b1900aee5e6d474003d16015c9668"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu May 21 19:19:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 19:19:39 2026 +0800"
      },
      "message": "support msvc 2017. (#817)"
    },
    {
      "commit": "edbef480090b1900aee5e6d474003d16015c9668",
      "tree": "e45c63fc847f2d018edd5aa5808bf411c91bfe88",
      "parents": [
        "d666d0198c800bad3e95fe2f5cd34c6d88589d2b"
      ],
      "author": {
        "name": "Jiang Tian",
        "email": "jt2594838@163.com",
        "time": "Thu May 21 14:25:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 14:25:06 2026 +0800"
      },
      "message": "exclude AGENTS.md from rat (#822)"
    },
    {
      "commit": "d666d0198c800bad3e95fe2f5cd34c6d88589d2b",
      "tree": "6372d4c01b6e2c503df5b7cf20c8d96fe301f1cc",
      "parents": [
        "8fced479ed20c505b12c619ff735d6bfbdf13c95"
      ],
      "author": {
        "name": "Zhenyu Luo",
        "email": "zhenyu@apache.org",
        "time": "Wed May 20 18:48:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 18:48:41 2026 +0800"
      },
      "message": "Fix OBJECT last-point fallback in TsFileLastReader (#821)"
    },
    {
      "commit": "8fced479ed20c505b12c619ff735d6bfbdf13c95",
      "tree": "0dfec7f0f1a1dc08a243cd783b70937aa1562139",
      "parents": [
        "1c0efe4db8d8333ac01ddadd013c0a1e899664c3"
      ],
      "author": {
        "name": "Jackie Tien",
        "email": "jackietien97@gmail.com",
        "time": "Tue May 19 14:29:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 14:29:20 2026 +0800"
      },
      "message": "feat: i18n support for log and exception messages (#820)"
    },
    {
      "commit": "1c0efe4db8d8333ac01ddadd013c0a1e899664c3",
      "tree": "b68933acb25630fbd9baaa3d0fcef23915e83081",
      "parents": [
        "f7041d8221c802f4842431eb4d453fcb66c4a6be"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Mon May 18 14:44:53 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 14:44:53 2026 +0800"
      },
      "message": "Add AGENTS.md symlinks (#818)"
    },
    {
      "commit": "f7041d8221c802f4842431eb4d453fcb66c4a6be",
      "tree": "0319c2d4476d98b2e1ecddbe8dc23db4b98ff2c6",
      "parents": [
        "8923b11888d74eb53c0963c2cb271d561dea9e0c"
      ],
      "author": {
        "name": "耿紫颜",
        "email": "3415667974@qq.com",
        "time": "Thu May 07 11:11:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 07 11:11:22 2026 +0800"
      },
      "message": "feat(tools): support Parquet and Arrow import with schema/auto modes (#793)"
    },
    {
      "commit": "8923b11888d74eb53c0963c2cb271d561dea9e0c",
      "tree": "51d96e43043f6bb9487d5d807d1f0ee56b0e8dfc",
      "parents": [
        "03abc3e87e673e4d62e0c342df9088e4f7b63134"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Tue May 05 10:46:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 05 10:46:25 2026 +0800"
      },
      "message": "Bump actions/checkout from 4 to 6 (#800)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "03abc3e87e673e4d62e0c342df9088e4f7b63134",
      "tree": "3fda63f23d40331c878f9a97f275fb6a9e5dcf56",
      "parents": [
        "f46c7a9e02b25e7623c97131a2e6726f7f60730e"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 04 21:05:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 21:05:01 2026 +0800"
      },
      "message": "Bump actions/github-script from 8.0.0 to 9.0.0 (#802)\n\nBumps [actions/github-script](https://github.com/actions/github-script) from 8.0.0 to 9.0.0.\n- [Release notes](https://github.com/actions/github-script/releases)\n- [Commits](https://github.com/actions/github-script/compare/v8.0.0...v9.0.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/github-script\n  dependency-version: 9.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "f46c7a9e02b25e7623c97131a2e6726f7f60730e",
      "tree": "45bcc91920580ea60933250e1802a6913f38da75",
      "parents": [
        "d5628a1c06ea57494b1837ea5c0d67d2b4f878f5"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 04 21:04:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 21:04:37 2026 +0800"
      },
      "message": "Bump pnpm/action-setup from 4 to 6 (#801)\n\nBumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 4 to 6.\n- [Release notes](https://github.com/pnpm/action-setup/releases)\n- [Commits](https://github.com/pnpm/action-setup/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: pnpm/action-setup\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "d5628a1c06ea57494b1837ea5c0d67d2b4f878f5",
      "tree": "3a4cd1c054b9bb511dd020ddec5f76c9f89f52d1",
      "parents": [
        "659196beca8170280653b91f12045635a14782e4"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 04 21:04:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 21:04:08 2026 +0800"
      },
      "message": "Bump actions/download-artifact from 4 to 8 (#804)\n\nBumps [actions/download-artifact](https://github.com/actions/download-artifact) from 4 to 8.\n- [Release notes](https://github.com/actions/download-artifact/releases)\n- [Commits](https://github.com/actions/download-artifact/compare/v4...v8)\n\n---\nupdated-dependencies:\n- dependency-name: actions/download-artifact\n  dependency-version: \u00278\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "659196beca8170280653b91f12045635a14782e4",
      "tree": "661919d0ed1285a4cbd25c2177b1b8c0ebe7fce3",
      "parents": [
        "5e2130f7b715f422edf504ccb9c6380a415aa891"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon May 04 21:03:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 04 21:03:52 2026 +0800"
      },
      "message": "Bump codecov/codecov-action from 5 to 6 (#803)\n\nBumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5 to 6.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: codecov/codecov-action\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "5e2130f7b715f422edf504ccb9c6380a415aa891",
      "tree": "cfb84b97d702e9f8b3f9ce23a4d45b50122b9dba",
      "parents": [
        "781f8094ddba6094aa06871e0f9a1df0e0360f93"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Apr 27 10:28:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 27 10:28:27 2026 +0800"
      },
      "message": "Add release information for version 2.3.0"
    },
    {
      "commit": "781f8094ddba6094aa06871e0f9a1df0e0360f93",
      "tree": "81f2120dafa342393cf845b59d16de6c57958d45",
      "parents": [
        "3557b81dc47a71d72c3e72093f3fc18e1faf0a17"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Sun Apr 26 17:40:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 26 17:40:17 2026 +0800"
      },
      "message": "RELEASE_NOTES for Apache TsFile 2.3.0"
    },
    {
      "commit": "3557b81dc47a71d72c3e72093f3fc18e1faf0a17",
      "tree": "a2d77660d628cfafa9fb7074540c3a5f5c11b630",
      "parents": [
        "3fa28f52b5cfd372ee8caea8062a97b57f35f9cc"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Apr 23 10:04:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 23 10:04:24 2026 +0800"
      },
      "message": "Bump actions/setup-node from 4 to 6 (#622)\n\nBumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 6.\n- [Release notes](https://github.com/actions/setup-node/releases)\n- [Commits](https://github.com/actions/setup-node/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-node\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "3fa28f52b5cfd372ee8caea8062a97b57f35f9cc",
      "tree": "9bab5adafc7ca9ff8138d3ceb82ea7d4d686ef9b",
      "parents": [
        "56adf773d4d1fbe09b5c58e12b3af1f789828ba7"
      ],
      "author": {
        "name": "Caideyipi",
        "email": "87789683+Caideyipi@users.noreply.github.com",
        "time": "Wed Apr 22 17:15:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 22 17:15:10 2026 +0800"
      },
      "message": "Implemented NONE value"
    },
    {
      "commit": "56adf773d4d1fbe09b5c58e12b3af1f789828ba7",
      "tree": "3d05311e3b884fbf337f5b9e0d989fcdcaf61120",
      "parents": [
        "1c6fa3c2493dacc403486b8e8138b927b11e36b6"
      ],
      "author": {
        "name": "Yongzao",
        "email": "532741407@qq.com",
        "time": "Tue Apr 21 21:39:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 21:39:17 2026 +0800"
      },
      "message": "finish (#791)"
    },
    {
      "commit": "1c6fa3c2493dacc403486b8e8138b927b11e36b6",
      "tree": "c23da0fd26edffe12f0a7b1a6aa22f8f1faf9e95",
      "parents": [
        "865d75fb79ee7c6ea21efbbdb4e757cf4194b733"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Tue Apr 21 19:14:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 19:14:58 2026 +0800"
      },
      "message": "[CI] Expand Python unit-test matrix to 3.9/3.11/3.14 (#790)"
    },
    {
      "commit": "865d75fb79ee7c6ea21efbbdb4e757cf4194b733",
      "tree": "05523b4917ce0d0d6da73fe16ebd9615b19e1e99",
      "parents": [
        "5e8a38ae97896765854a3188926c91b15f63c5f4"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Tue Apr 21 18:04:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 21 18:04:23 2026 +0800"
      },
      "message": "[Python] Fix Linux Py3.14 wheel CI and dataframe edge cases (#789)\n\n* fix py3.9 black\n\n* ci wheel python 3.14\n\n* ci fix\n\n* ci fix\n\n* fix ci\n\n* ci fix\n\n* ci fix"
    },
    {
      "commit": "5e8a38ae97896765854a3188926c91b15f63c5f4",
      "tree": "355cbbd23cf2f729dab612db6d87665483ac1c68",
      "parents": [
        "c934f78e52aa35388050ac241bc2c9391f4eddc6"
      ],
      "author": {
        "name": "Jackie Tien",
        "email": "jackietien97@gmail.com",
        "time": "Mon Apr 20 17:52:19 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 17:52:19 2026 +0800"
      },
      "message": "Add CLAUDE.md files and update .gitignore (#788)"
    },
    {
      "commit": "c934f78e52aa35388050ac241bc2c9391f4eddc6",
      "tree": "3fa98069acb5e429369c0cc10afa9d0d2a692393",
      "parents": [
        "eaf903093076f8e646f44fa68d02370a9d923fec"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Mon Apr 20 14:30:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 14:30:12 2026 +0800"
      },
      "message": "Update README with clang-format install notes (#786)"
    },
    {
      "commit": "eaf903093076f8e646f44fa68d02370a9d923fec",
      "tree": "2a531189a11ce08bb8f34e2602c5260b1b610a51",
      "parents": [
        "2ab087b64a62784f03f77ed2a08d09b74266b958"
      ],
      "author": {
        "name": "Jackie Tien",
        "email": "jackietien97@gmail.com",
        "time": "Mon Apr 20 14:05:52 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 14:05:52 2026 +0800"
      },
      "message": "Add test file cleanup and fix .gitignore for Python tests (#787)\n\n- Wrap test_lower_case_name and test_tsfile_config in try/finally\n  blocks to ensure generated .tsfile files are cleaned up\n- Fix test_tree_all_datatype_query_to_dataframe_variants to clean up\n  the correct file (record_write_and_read.tsfile instead of\n  tablet_write_and_read.tsfile)\n- Add python/tsfile/dataset/__pycache__ to .gitignore\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "2ab087b64a62784f03f77ed2a08d09b74266b958",
      "tree": "1f27032fa08fd44272684caf052852e97db45144",
      "parents": [
        "a58a073e1b855662561beecd340e3274fdb7bcbc"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Mon Apr 20 11:47:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 11:47:24 2026 +0800"
      },
      "message": "Enable Python Spotless check in CI (#785)\n\n* Enable python spotless check\n\n* Enable python spotless check\n\n* Enable python spotless check\n\n* Enable python spotless check"
    },
    {
      "commit": "a58a073e1b855662561beecd340e3274fdb7bcbc",
      "tree": "2b2e98805f871cc72e77bd672ed86a1750057c3b",
      "parents": [
        "651007d96265dd35150ad137b4cb1fbdd8afcf4a"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Apr 20 09:50:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 20 09:50:37 2026 +0800"
      },
      "message": "fix cpp restore statistic (#784)\n\n* fix cpp restore statistic\n\n* fix cpp restore device last_time\n\n* fix ci\n\n* removed unused aligned value  column count"
    },
    {
      "commit": "651007d96265dd35150ad137b4cb1fbdd8afcf4a",
      "tree": "19a862e86f0c0a56cb9bc4e51dfdd0babeba046d",
      "parents": [
        "3de49f7fc0348964a962173cbdcd37cac598f071"
      ],
      "author": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Fri Apr 17 12:38:20 2026 +0800"
      },
      "committer": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Fri Apr 17 12:38:20 2026 +0800"
      },
      "message": "fix restorable_tsfile_io_writer memory leak and unstop loop\n"
    },
    {
      "commit": "3de49f7fc0348964a962173cbdcd37cac598f071",
      "tree": "82a61f66e3a3742d25480bb84f405c575f801c82",
      "parents": [
        "34833e7a59d4aea406adc2cb4809246a28e53fd9"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Thu Apr 16 11:51:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 16 11:51:16 2026 +0800"
      },
      "message": "Fix multi-recovery metadata indexing and add regression coverage. (#783)\n\nUse value-based device keys in TSMIterator and merge recovered chunk metadata by device/measurement so repeated recovery writes do not trigger duplicate-device index failures; add a multi-round recovery test and relax a filesystem error assertion for environment consistency."
    },
    {
      "commit": "34833e7a59d4aea406adc2cb4809246a28e53fd9",
      "tree": "0a505989ee6387ea360af1619229b0842e47ac0f",
      "parents": [
        "a55f058d916ea729c65e43556ffc3334030f03c6"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Wed Apr 15 15:36:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 15:36:04 2026 +0800"
      },
      "message": "Add PyPI badge to README and README-zh.md (#782)"
    },
    {
      "commit": "a55f058d916ea729c65e43556ffc3334030f03c6",
      "tree": "4db84fb3f1aaa0972ecf9a219bacac6cdc22c0dd",
      "parents": [
        "12bd435ecc361369a67ec6c52d5c4f7bccf928a5"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Wed Apr 15 10:31:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 15 10:31:04 2026 +0800"
      },
      "message": "fix get_metadata datatype (#781)\n\n* fix get_metadata datatype\n\n* add it"
    },
    {
      "commit": "12bd435ecc361369a67ec6c52d5c4f7bccf928a5",
      "tree": "ffc7f09c7c8920e9b09ebe5dd1ae07e34634c4df",
      "parents": [
        "2a4fa502c981365e23fa55a7cea4bc1a4183223b"
      ],
      "author": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Tue Apr 14 15:31:58 2026 +0800"
      },
      "committer": {
        "name": "761417898",
        "email": "761417898@qq.com",
        "time": "Tue Apr 14 15:35:31 2026 +0800"
      },
      "message": "fix query-by-row unexist path\n"
    },
    {
      "commit": "2a4fa502c981365e23fa55a7cea4bc1a4183223b",
      "tree": "9017216a595248408bfc949fe811efcdbe803e05",
      "parents": [
        "d14d01ba1c1695dec899fb37efc96ad0e00bd78b"
      ],
      "author": {
        "name": "Haonan",
        "email": "hhaonan@outlook.com",
        "time": "Tue Apr 14 14:51:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 14:51:46 2026 +0800"
      },
      "message": "Format Python code with Spotless and Black (#770)"
    },
    {
      "commit": "d14d01ba1c1695dec899fb37efc96ad0e00bd78b",
      "tree": "ffd778ad1e344b8c2993b945bbf19c94298169f6",
      "parents": [
        "3c809d5f63aa64b2a96f6d21ceda53bad0a0d559"
      ],
      "author": {
        "name": "Zhenyu Luo",
        "email": "zhenyu@apache.org",
        "time": "Tue Apr 14 10:15:30 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 14 10:15:30 2026 +0800"
      },
      "message": "Add dedicated Tablet API for object path writes. (#780)"
    },
    {
      "commit": "3c809d5f63aa64b2a96f6d21ceda53bad0a0d559",
      "tree": "2cb113b9942b2cd3ad6f834e3050027396195dec",
      "parents": [
        "cb59543280364df451660400a80498f12667953e"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Apr 13 10:20:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 10:20:23 2026 +0800"
      },
      "message": "Fix tree queryByRow device ID parsing for multi-segment paths (#776)\n\nPath splitting now joins device nodes and parses via StringArrayDeviceID(string)\nto match write-time normalization. Add C++ and Python regression tests."
    },
    {
      "commit": "cb59543280364df451660400a80498f12667953e",
      "tree": "745a5b249a18d567275881b87d26a6d75e04cb69",
      "parents": [
        "fa3e01f1895dd2d498a63c552f50bf27eb85b797"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Apr 13 09:44:04 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Apr 13 09:44:04 2026 +0800"
      },
      "message": "fix(cpp): skip missing device/measurement in tree queryByRow (#777)\n\nAlign QDSWithoutTimeGenerator with Java: treat E_DEVICE_NOT_EXIST and\nE_MEASUREMENT_NOT_EXIST as skippable paths and fix column index mapping\nwhen some paths are omitted. Add C++ and Python regression tests.\n\nMade-with: Cursor"
    },
    {
      "commit": "fa3e01f1895dd2d498a63c552f50bf27eb85b797",
      "tree": "00dfebeb7089440921ea51b5e074b30483bd9c09",
      "parents": [
        "b8885ae149606b37995e7c5bf0e4385ac7e0fb6d"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Sun Apr 12 15:57:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 12 15:57:11 2026 +0800"
      },
      "message": "fix(cpp): aligned VECTOR row-offset skip only when time/value counts match (#778)\n\nWhole-chunk and whole-page skips by statistic count previously used only the\nvalue side for aligned series, which could desynchronize row_offset from\ndecoded rows when ChunkMeta or page header counts differed.\n\nRequire both time and value statistics to be present, positive, and equal\nbefore applying count-based skip; otherwise decode and rely on page/row\nhandling.\n\nMade-with: Cursor"
    },
    {
      "commit": "b8885ae149606b37995e7c5bf0e4385ac7e0fb6d",
      "tree": "2de74fe0b7de2edec412f429a11eda366d021909",
      "parents": [
        "87f66d999fc3e220caf8d4546f249dc187bedaf2"
      ],
      "author": {
        "name": "YangCaiyin",
        "email": "ycycse@gmail.com",
        "time": "Sun Apr 12 10:40:17 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Apr 12 10:40:17 2026 +0800"
      },
      "message": "Optimize and Fix some bugs in TsFileDataFrame (#773)\n\n* optmize preview performance\n\n* fix loc with more data we need\n\n* fix loading problem\n\n* fix query by row problem (temporal)\n\n* support sparse tags\n\n* Fix local build_ext by using opaque tag filter pointers in Cython API\n\n* fix by review"
    },
    {
      "commit": "87f66d999fc3e220caf8d4546f249dc187bedaf2",
      "tree": "5fc15baaeaf385ace2eab297502bb15458e3589a",
      "parents": [
        "e2fba469368d0847af7292b5d40a0d1e910ff07e"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Apr 10 18:23:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 10 18:23:58 2026 +0800"
      },
      "message": "Write with parallel (#772)\n\n* support write parallel.\n\n* fix format.\n\n* fix seg segv.\n\n* fix comment.\n\n* add readme.\n\n* use global write thread pool."
    },
    {
      "commit": "e2fba469368d0847af7292b5d40a0d1e910ff07e",
      "tree": "15a29a2665998cc345bf8eac1c164abc323abfb9",
      "parents": [
        "9374f72709d6225598ff7517d0106351c35d647b"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Apr 09 18:03:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 09 18:03:26 2026 +0800"
      },
      "message": "Fix data loss (#771)\n\n* fix data loss.\n\n* fix format."
    },
    {
      "commit": "9374f72709d6225598ff7517d0106351c35d647b",
      "tree": "1dbeebb720c9a5415b007790f069b9587ab9dee3",
      "parents": [
        "7d308fe254dd10f7ae217553700b34b3f75ad186"
      ],
      "author": {
        "name": "YangCaiyin",
        "email": "ycycse@gmail.com",
        "time": "Thu Apr 09 17:52:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 09 17:52:18 2026 +0800"
      },
      "message": "Remove timestamps cache to optmize init phase (#769)\n\n* remove timestamps cache to optmize init phase\n\n* add timeline statistics\n\n* add timeline statistics\n\n* fix CI\n\n* spotless\n\n* spotless\n\n* fix by review\n\n* change timeline statistics type"
    },
    {
      "commit": "7d308fe254dd10f7ae217553700b34b3f75ad186",
      "tree": "9fdbfabac62a215730ae40f86a22a4e1c29a4388",
      "parents": [
        "21d70d65764386548ed6fd9fd4c428346db8003e"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Wed Apr 08 16:55:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 16:55:10 2026 +0800"
      },
      "message": "support tag filter. (#768)"
    },
    {
      "commit": "21d70d65764386548ed6fd9fd4c428346db8003e",
      "tree": "efbf6336bb1abcbb788089b2c7b436b54b8241d7",
      "parents": [
        "56756d2639ecf9a51da8ad4a82c7759b90ef1ac1"
      ],
      "author": {
        "name": "YangCaiyin",
        "email": "ycycse@gmail.com",
        "time": "Wed Apr 08 12:04:54 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 12:04:54 2026 +0800"
      },
      "message": "Support TsfileDataFrame (#765)\n\n* support tsfileDataFrame\n\n* make tsfileDataFrame a module\n\n* support metadata management and optmize implementation\n\n* support show() method in tsdf\n\n* fix typo and address close problem"
    },
    {
      "commit": "56756d2639ecf9a51da8ad4a82c7759b90ef1ac1",
      "tree": "8c3827a0ecb2875551ef47eb7147869bf6cb5c7f",
      "parents": [
        "af35aeeca40a0b818562b1caa4dfcb2ca752ab9d"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Apr 08 11:53:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Apr 08 11:53:40 2026 +0800"
      },
      "message": "Bump actions/github-script from 7.0.1 to 8.0.0 (#594)\n\nBumps [actions/github-script](https://github.com/actions/github-script) from 7.0.1 to 8.0.0.\n- [Release notes](https://github.com/actions/github-script/releases)\n- [Commits](https://github.com/actions/github-script/compare/v7.0.1...v8.0.0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/github-script\n  dependency-version: 8.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "af35aeeca40a0b818562b1caa4dfcb2ca752ab9d",
      "tree": "ec2734b26662a41651d7f28add41bc21ff163cce",
      "parents": [
        "b6249d9b9697aceee11e933e79f89c7d96ae9999"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Tue Apr 07 14:49:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Apr 07 14:49:33 2026 +0800"
      },
      "message": "Feat/c python timeseries metadata (#767)\n\n* c and python get_metadata interface wrapper\n\n* python c metadata interface\n\n* spotless apply\n\n* fix DeviceTimeseriesMetadataEntry details\n\n* replace DeviceID to TsDeviceDetails\n\n* fix c/python statistic\n\n* mvn spotless:apply"
    },
    {
      "commit": "b6249d9b9697aceee11e933e79f89c7d96ae9999",
      "tree": "baa4c4dd21d6deff51575b26e446f4f953903327",
      "parents": [
        "6073785a40fdabec7d14c019bdbf815219ffda57"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Apr 03 13:47:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Apr 03 13:47:26 2026 +0800"
      },
      "message": "fix pyarrow version. (#766)"
    },
    {
      "commit": "6073785a40fdabec7d14c019bdbf815219ffda57",
      "tree": "3a4d1d4cb5e84adadf1fa31994c92eed3ed1ab95",
      "parents": [
        "8c8198a89cbd4c2142b2e06b74abbb31946080a8"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Thu Apr 02 16:16:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 16:16:33 2026 +0800"
      },
      "message": "Fix/tree query and rle decoder (#764)"
    },
    {
      "commit": "8c8198a89cbd4c2142b2e06b74abbb31946080a8",
      "tree": "62b15b6c4ed0811896b623ecfa8123923cc8620a",
      "parents": [
        "9c50155b184d645bd43b05fc1310ab7c03637dc9"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Apr 02 09:26:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 09:26:09 2026 +0800"
      },
      "message": "Bump actions/setup-python from 4 to 6 (#763)\n\nBumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 6.\n- [Release notes](https://github.com/actions/setup-python/releases)\n- [Commits](https://github.com/actions/setup-python/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-python\n  dependency-version: \u00276\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "9c50155b184d645bd43b05fc1310ab7c03637dc9",
      "tree": "7ae56328d9b5cd6e141b6620db491755155203a7",
      "parents": [
        "37d2d6df1347f2e7eb3cf0d2f219f53ad844716f"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Apr 02 09:25:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 09:25:47 2026 +0800"
      },
      "message": "Bump actions/setup-java from 4 to 5 (#762)\n\nBumps [actions/setup-java](https://github.com/actions/setup-java) from 4 to 5.\n- [Release notes](https://github.com/actions/setup-java/releases)\n- [Commits](https://github.com/actions/setup-java/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-java\n  dependency-version: \u00275\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "37d2d6df1347f2e7eb3cf0d2f219f53ad844716f",
      "tree": "62e402d9107b029bed0d8435ea57e5452b7e50d6",
      "parents": [
        "75e0664c081c1661243ed034d963824b386cdf63"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Thu Apr 02 09:25:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Apr 02 09:25:31 2026 +0800"
      },
      "message": "Bump actions/upload-artifact from 4 to 7 (#761)\n\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 7.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v4...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "75e0664c081c1661243ed034d963824b386cdf63",
      "tree": "47ac2255f13230424786fabcdd52950cefdb0b53",
      "parents": [
        "f621373ba9d2a177f0f0752bd88c849e804bfdea"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Mar 31 21:28:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 21:28:10 2026 +0800"
      },
      "message": "Perf: optimize Tablet write with columnar string storage and lazy DeviceID construction (~10x throughput) (#748)"
    },
    {
      "commit": "f621373ba9d2a177f0f0752bd88c849e804bfdea",
      "tree": "e55c57db82a5d61721c2ad8239d9fa3a61a5460c",
      "parents": [
        "c67a1994615c43f6583f4621b6cdfde05abb45a0"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Tue Mar 31 11:32:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 11:32:08 2026 +0800"
      },
      "message": "fix cpp device_id parser (#759)"
    },
    {
      "commit": "c67a1994615c43f6583f4621b6cdfde05abb45a0",
      "tree": "68a7c4f8afe039efb1d2f5da8027b268ca2e92f7",
      "parents": [
        "229f69e4934c1c66b5e372248cbe79efac411bf8"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Mar 31 09:42:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 31 09:42:07 2026 +0800"
      },
      "message": "introduce simde as third-party dependency. (#755)"
    },
    {
      "commit": "229f69e4934c1c66b5e372248cbe79efac411bf8",
      "tree": "4e2521cdf29aab1e509f49345c3846ecf6e36b24",
      "parents": [
        "55d5932ed5330252f73cf68f1a98060eccbf3673"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Mar 30 14:39:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 14:39:36 2026 +0800"
      },
      "message": "fix disable QueryByRowFasterThanManualNext tests (#757)\n\nMade-with: Cursor"
    },
    {
      "commit": "55d5932ed5330252f73cf68f1a98060eccbf3673",
      "tree": "b1b311c8c25b97ba497c5a9f2bed3262761133aa",
      "parents": [
        "aa77798fd40fa7ddf87b06d9a500c892b83795d0"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "hongzhigao@apache.org",
        "time": "Mon Mar 30 13:10:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 30 13:10:51 2026 +0800"
      },
      "message": "Fix/aligned tv page seal (#734)\n\n* fix readme logo\n\n* fix readme logo\n\n* fix readme badge\n\n* tmp\n\n* add ut\n\n* mvn spotless:apply\n\n* tmp\n\n* try to fix ut\n\n* Align C++ aligned-model page sealing with the Java behavior and fix reader handling of null-only value pages so that Debug builds pass.\n\n* fix ut\n\n* Add strict_page_size switch to optimize aligned tablet writing.\nIn non-strict mode, disable per-write auto page sealing and seal value pages at time-page boundaries to reduce overhead while preserving aligned page semantics.\n\n* fix QueryByRowFasterThanManualNext tolerance\n\n* fix time_page_row_ends.reserve"
    },
    {
      "commit": "aa77798fd40fa7ddf87b06d9a500c892b83795d0",
      "tree": "a7e591027598f0d0e1add813134f27162944fc03",
      "parents": [
        "27af4062824c81164cbf0c7701b1f758e5a8e8eb"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Sun Mar 29 16:10:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Mar 29 16:10:36 2026 +0800"
      },
      "message": "add pyarrow requirement. (#756)"
    },
    {
      "commit": "27af4062824c81164cbf0c7701b1f758e5a8e8eb",
      "tree": "4da8eb25e3297753691c9382f6cdce8e4480ee01",
      "parents": [
        "ed91d2a5d7f8506889ab20e83b7f013faef14051"
      ],
      "author": {
        "name": "shuwenwei",
        "email": "55970239+shuwenwei@users.noreply.github.com",
        "time": "Fri Mar 27 11:27:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 27 11:27:16 2026 +0800"
      },
      "message": "Add tsblock tsfile writer (#753)"
    },
    {
      "commit": "ed91d2a5d7f8506889ab20e83b7f013faef14051",
      "tree": "522e746ea8a5c1be2a3ff4bece68d36297f396b3",
      "parents": [
        "ce16cb226c643da6f08ae99825952956d9709d05"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "761417898@qq.com",
        "time": "Thu Mar 26 11:38:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 26 11:38:32 2026 +0800"
      },
      "message": "Feature/query by row (#745)\n\n* cpp tree query by row\n\n* cpp table query by row\n\n* QueryByRowFasterThanManualNext\n\n* mvn spotless apply\n\n* fix ci\n\n* fix compute_dense_row_count\n\n* query by row c/python wrapper\n\n* add license\n\n* fix some issues\n\n* fix ci\n\n* fix ci mem leak"
    },
    {
      "commit": "ce16cb226c643da6f08ae99825952956d9709d05",
      "tree": "4f7d054225f1c9cf48a9c50d6a54813f7930689c",
      "parents": [
        "1b38b7d7a908e3ad5d54b837bf39d51d15dca657"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "761417898@qq.com",
        "time": "Tue Mar 24 17:05:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 17:05:31 2026 +0800"
      },
      "message": "remove extra cpp zlib (#751)"
    },
    {
      "commit": "1b38b7d7a908e3ad5d54b837bf39d51d15dca657",
      "tree": "e04b10ce8192f4ea3f04e7f98aa06e64c82d17ad",
      "parents": [
        "2b0c0bfa2c6808df7cffac4fd4f2560a7793cd45"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Tue Mar 24 14:21:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Mar 24 14:21:46 2026 +0800"
      },
      "message": "enable memory detect. (#746)\n\n* enable memory detect.\n\n* fix format.\n\n* fix memory loss.\n\n* fix memory loss.\n\n* fix memory leak."
    },
    {
      "commit": "2b0c0bfa2c6808df7cffac4fd4f2560a7793cd45",
      "tree": "885d08593198a31b4b8a9fd62e75cd004b69eab5",
      "parents": [
        "5e9f8c20aa3fb211aff8f32221f34d2a68badb56"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Mon Mar 23 22:11:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 23 22:11:42 2026 +0800"
      },
      "message": "Support arrow struct (#739)"
    },
    {
      "commit": "5e9f8c20aa3fb211aff8f32221f34d2a68badb56",
      "tree": "20d49d19d385b328559e67c38e5706e90f007b65",
      "parents": [
        "7d32823a41dc3474a4d2eb8d595f829d55be523d"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Mon Mar 23 11:38:42 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 23 11:38:42 2026 +0800"
      },
      "message": "update release info of v2.2.1. (#750)"
    },
    {
      "commit": "7d32823a41dc3474a4d2eb8d595f829d55be523d",
      "tree": "a8c6f98e39e8c2e4a3e66f58475a28d4e1ff53ba",
      "parents": [
        "b90f6760f619126f9c1a570705daa5c2f42192b5"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Fri Mar 20 11:27:28 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 20 11:27:28 2026 +0800"
      },
      "message": "support python release. (#743)\n\n* support release python by ci.\n\n* fix format.\n\n* fix comment."
    },
    {
      "commit": "b90f6760f619126f9c1a570705daa5c2f42192b5",
      "tree": "6d96c2062830193a26d5c8399161aa81290f7d1c",
      "parents": [
        "b171c5edb6bd58c79347256f9eeed8d157921d5a"
      ],
      "author": {
        "name": "alpass163",
        "email": "alpass163@163.com",
        "time": "Wed Mar 18 19:23:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 18 19:23:34 2026 +0800"
      },
      "message": "support accurate filter rows recording during query execution (#744)"
    },
    {
      "commit": "b171c5edb6bd58c79347256f9eeed8d157921d5a",
      "tree": "bae20cbe6ee81fdd01b51d11f2eaabdb736ecff3",
      "parents": [
        "dd27faf7a7077dc68f8f161f8181df81f3e9117b"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "761417898@qq.com",
        "time": "Wed Mar 11 10:36:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 11 10:36:23 2026 +0800"
      },
      "message": "Feature/get-sensor-statistic-and-restorable-writer (#731)\n\n* Implement interface get_all_timeseries_metadata for Retrieve metadata for all timeseries in the file\n\n* mvn spotless apply\n\n* Implement RestorableTsFileIOWriter\n\n* Support continued writing to restored files in the tree model \u0026 table model interfaces.\n\n* fix readme logo\n\n* fix readme logo\n\n* fix readme badge\n\n* fix recovery tsfile statistic\n\n* fix recovery tsfile append and reader\n\n* Refactor RestorableTsFileIOWriterTest\n\n* Refactor get_timeseries_metadata\n\n* Refactor get_timeseries_metadata \u0026 restorable_tsfile_io_writer.cc\n\n* mvn spotless apply\n\n* fix mem leak and overflow warning\n\n* mvn spotless:apply\n\n* try fix ci\n\n* try fix ci\n\n* try fix ci\n\n* removed the replay loop and added a recovery API to restore the logical write_stream position directly from recovered file size\n\n* spotless apply\n\n* fix restore_recovered_file_position\n\n* fix TsFileWriter::init(RestorableTsFileIOWriter* rw)\n\n* fix RestorableTsFileIOWriter ut"
    },
    {
      "commit": "dd27faf7a7077dc68f8f161f8181df81f3e9117b",
      "tree": "fe47ae78c20825bab82e0f299fe34f813568aca5",
      "parents": [
        "7c01e4f003e188af0aac38ca0d9bc4fd1e6204e5"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "761417898@qq.com",
        "time": "Fri Mar 06 11:34:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Mar 06 11:34:07 2026 +0800"
      },
      "message": "Fix/table model date query read (#738)\n\n* fix readme logo\n\n* fix readme logo\n\n* fix readme badge\n\n* fix table-model DATE query in Java reader\n\nHandle DATE columns in SingleDeviceTsBlockReader projection paths and add a regression test to prevent table query failures when reading DATE values.\n\n* fix support TIMESTAMP STRING BLOB in table read path\n\nExtend table-model query projection to handle TIMESTAMP/STRING/BLOB (and aligned aliases) and update TsFileSequenceRead example decoding with matching type coverage; add regression test for timestamp/string/blob query.\n\n* mvn spotless:apply\n\n* docs narrow TsFileSequenceRead type coverage\n\nRemove OBJECT from the TsFileSequenceRead example switch so the sample only demonstrates documented primitive and binary-like types."
    },
    {
      "commit": "7c01e4f003e188af0aac38ca0d9bc4fd1e6204e5",
      "tree": "32064fe009c034a4eacc9c231a44ef89bcbda91d",
      "parents": [
        "27b1051b8c6a894c3737d8968ac20979ff6a86a2"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "761417898@qq.com",
        "time": "Thu Mar 05 12:31:38 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Mar 05 12:31:38 2026 +0800"
      },
      "message": "Fix/infer object column type bool (#737)\n\n* support bool type in infer_object_column_type\n\n* infer_object_column_type ut"
    },
    {
      "commit": "27b1051b8c6a894c3737d8968ac20979ff6a86a2",
      "tree": "2bae6ba8ab7e87db446bb660c14801ecaef54cc0",
      "parents": [
        "bd810610d5de674ccc2853da9ca36b98aa73fee9"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "761417898@qq.com",
        "time": "Wed Mar 04 18:49:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 04 18:49:14 2026 +0800"
      },
      "message": "Fix validation for DataFrame with only time column in `dataframe_to_tsfile` (#736)\n\n* fix readme logo\n\n* fix readme logo\n\n* fix readme badge\n\n* Fix validation for DataFrame with only time column in"
    },
    {
      "commit": "bd810610d5de674ccc2853da9ca36b98aa73fee9",
      "tree": "c076d960f2808dbdfbe4e827aef33fd9f455bdfe",
      "parents": [
        "d899d167e359bc71c594498c24b0ca15b5dfc6ea"
      ],
      "author": {
        "name": "Hongzhi Gao",
        "email": "761417898@qq.com",
        "time": "Wed Mar 04 09:36:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Mar 04 09:36:55 2026 +0800"
      },
      "message": "Fix invalid DataFrame column name validation before lowercasing. (#735)\n\n* fix readme logo\n\n* fix readme logo\n\n* fix readme badge\n\n* Fix invalid DataFrame column name validation before lowercasing"
    },
    {
      "commit": "d899d167e359bc71c594498c24b0ca15b5dfc6ea",
      "tree": "ccd77cb916b78fb08c498869cafb5063d462e0f8",
      "parents": [
        "d2ed46413a0df5ad4fb08421dd3470438f0b04ba"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Mar 02 12:44:32 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 02 12:44:32 2026 +0800"
      },
      "message": "Bump actions/upload-artifact from 5 to 7 (#733)\n\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 5 to 7.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v5...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n  dependency-version: \u00277\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "d2ed46413a0df5ad4fb08421dd3470438f0b04ba",
      "tree": "4551a824d6ba932c337e4d6763707bbd779bd26f",
      "parents": [
        "9d7d47f155a8f3a27044a9931539cc0532c3d4ad"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Mar 02 12:44:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 02 12:44:09 2026 +0800"
      },
      "message": "Bump github/codeql-action from 3 to 4 (#623)\n\nBumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v3...v4)\n\n---\nupdated-dependencies:\n- dependency-name: github/codeql-action\n  dependency-version: \u00274\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "9d7d47f155a8f3a27044a9931539cc0532c3d4ad",
      "tree": "e882244ae2537d399088dd546a838898735a601a",
      "parents": [
        "ebb4d97477dcb408518fe24bf01b5769ee37e7a3"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Mon Mar 02 12:10:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Mar 02 12:10:08 2026 +0800"
      },
      "message": "Bump actions/cache from 4 to 5 (#732)\n\nBumps [actions/cache](https://github.com/actions/cache) from 4 to 5.\n- [Release notes](https://github.com/actions/cache/releases)\n- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)\n- [Commits](https://github.com/actions/cache/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: actions/cache\n  dependency-version: \u00275\u0027\n  dependency-type: direct:production\n  update-type: version-update:semver-major\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": "ebb4d97477dcb408518fe24bf01b5769ee37e7a3",
      "tree": "0c67b95f080a98dbf1183ff6459374ad077cddc7",
      "parents": [
        "5feb69d521aadecbf6443c5f5a00898d1f0cd216"
      ],
      "author": {
        "name": "Colin Lee",
        "email": "105656576+ColinLeeo@users.noreply.github.com",
        "time": "Wed Feb 25 17:59:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Feb 25 17:59:44 2026 +0800"
      },
      "message": "Fix empty TAG column result in to_dataframe when querying table model. (#730)\n\n"
    }
  ],
  "next": "5feb69d521aadecbf6443c5f5a00898d1f0cd216"
}
