)]}'
{
  "log": [
    {
      "commit": "c4d83063872433c23dfbcf668d0e55f7376c5837",
      "tree": "9bf494d6b506136054e898a9653864b9c8c3eb57",
      "parents": [
        "eb995f259a5c5c5c62cbe4c99c3a33a124d8c6e7"
      ],
      "author": {
        "name": "Wuhen- Li",
        "email": "43287097+liwuhen@users.noreply.github.com",
        "time": "Fri Aug 21 16:47:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 16:47:58 2026 +0800"
      },
      "message": "[core] Fix Clippy byte char slice warning (#74)"
    },
    {
      "commit": "eb995f259a5c5c5c62cbe4c99c3a33a124d8c6e7",
      "tree": "9bf494d6b506136054e898a9653864b9c8c3eb57",
      "parents": [
        "1efb60b8cb9cec6858300b8b7bd43b63f1fd67fe"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Fri Aug 21 11:56:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Aug 21 11:56:44 2026 +0800"
      },
      "message": "build(release): add ASF legal and package metadata foundation (#78)\n\nCo-authored-by: Codex Review \u003ccodex-review@example.invalid\u003e"
    },
    {
      "commit": "1efb60b8cb9cec6858300b8b7bd43b63f1fd67fe",
      "tree": "8235d36b3bf5299073e583094a1204996584b4fd",
      "parents": [
        "b36d1a9300d8dabe17db22e28690f88c92d65a82"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Thu Aug 20 20:35:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 20:35:43 2026 +0800"
      },
      "message": "fix(jni): propagate InputFile exceptions from native reader threads (#77)"
    },
    {
      "commit": "b36d1a9300d8dabe17db22e28690f88c92d65a82",
      "tree": "c933d66a83dfe5e1d5b98cbe3175c1146f6edc47",
      "parents": [
        "a8817f311de51ac8e2f0b88d68395cabccf878aa"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Thu Aug 20 15:06:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 15:06:03 2026 +0800"
      },
      "message": "perf(core): read non-nested columns without creating Arrow arrays (#76)"
    },
    {
      "commit": "a8817f311de51ac8e2f0b88d68395cabccf878aa",
      "tree": "37af9667bf7c17fb62bac67faf5786871006bfe9",
      "parents": [
        "b613dd25eba45afbc860171e109df19495ba0e3c"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Wed Aug 19 19:35:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Aug 19 19:35:06 2026 +0800"
      },
      "message": "perf(core): speed up reading nullable fixed-width CONST columns (#75)"
    },
    {
      "commit": "b613dd25eba45afbc860171e109df19495ba0e3c",
      "tree": "c156472029982716c0062daf06a4fe50b06398bd",
      "parents": [
        "9605afd4756555acba08ff62138f505e1eec1b40"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Sun Aug 16 09:41:03 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 16 09:41:03 2026 +0800"
      },
      "message": "[java] Support Arrow batch writes across allocator roots (#73)"
    },
    {
      "commit": "9605afd4756555acba08ff62138f505e1eec1b40",
      "tree": "be80b1c6960f0b976dfac578b9182461ee5f819b",
      "parents": [
        "f6aa318940168752348ea59cb739224a701c291a"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Tue Jun 30 10:54:49 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 30 10:54:49 2026 +0800"
      },
      "message": "[cli] Add mosaic command-line tool (#66)\n\n* feat(cli): add mosaic inspector CLI (schema/meta/cat/pages)\n\nMosaic previously shipped no viewer tooling — inspecting a file meant\nwriting Rust against the library API. Add a `mosaic` binary (a new `cli`\nworkspace crate) mirroring parquet-cli:\n\n- schema: column names, Arrow types, nullability, bucket assignment\n- meta:   row groups, rows, per-column stats (null_count/min/max)\n- cat:    first N rows as a table, with -n and --columns projection\n- pages:  per-column encoding (plain/const/dict/all_null) + slot size\n\nAll commands support --json. The reader is driven over a new file-backed\nInputFile (pread). Core gains three small read-only accessors used by\n`pages`: BucketReader::encodings(), ColumnPageReader::encoding(), and\nMosaicReader::page_infos(). No format/behavior change; 199 core tests pass.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* test: cover page_infos encodings and CLI formatters\n\nAdd a core regression test for MosaicReader::page_infos asserting\nplain/dict/const detection on a paged-bucket file, and CLI unit tests\nfor the fmt helpers (json escaping, value/encoding rendering, ndjson\nnull handling, table truncation).\n\n* test: add zero-dep end-to-end tests for mosaic CLI\n\nDrive the mosaic binary against a fixture file (via CARGO_BIN_EXE) and\nassert stdout for schema/meta/pages/cat, --json output, projection,\nrow truncation and missing-file failure. No external dev-deps.\n\n* docs: add CLI page + parquet-cli comparison\n\nAdds docs/cli.html documenting the mosaic inspector (schema/meta/pages/cat,\ntext + JSON) with a parquet-cli command mapping and design-difference table,\naddressing the review asks on #66. Adds CLI to the nav across doc pages.\n\n* docs: expand CLI page with meta example and parquet-cli design table\n\n* feat(cli): add head, footer, column-size, dictionary commands\n\nAlign the viewer command set with parquet-cli/arrow-rs: head (alias of\ncat), footer (magic/version/buckets/compression), column-size (on-disk\nbytes per column), dictionary (dump dict-encoded entries). Core gains\ncompression()/dict_values()/dictionary() read-only accessors. e2e tests\ncover the new commands.\n\n* feat(cli): add buckets command for mosaic bucket layout\n\nMosaic\u0027s column-bucket grouping has no parquet equivalent. Add a\nbuckets command printing, per row group, each bucket\u0027s kind\n(empty/monolithic/paged), on-disk size and member columns. Core gains\nMosaicReader::bucket_infos(). e2e covered.\n\n* feat(cli): dictionary takes -c/--column to match parquet-cli\n\nAlign dictionary column selection with parquet-cli\u0027s -c flag instead of\na positional argument; update e2e.\n\n* feat(cli): add --json to dictionary\n\nCompletes JSON output across all 9 commands; dict columns emit an array,\nnon-dict row groups emit null. e2e extended.\n\n* docs: document all 9 commands; remove parquet comparison\n\nExpand docs/cli.html and cli/README.md to cover every command\n(schema/meta/footer/buckets/pages/dictionary/column-size/cat/head) with\nusage and example output. Drop all comparison content per maintainer\npreference.\n\n* test: drop trivial encoding_names unit; assert footer/buckets --json\n\nRemove the near-trivial encoding_names mapping test; extend footer and\nbuckets e2e to cover their --json output, improving CLI feature coverage.\n\n* chore(cli): drop redundant gen.rs example\n\nThe e2e tests carry their own fixture writer; the standalone gen.rs\nexample duplicated it and was unreferenced.\n\n* fix(cli): column-size counts monolithic buckets; bare Date32 JSON\n\ncolumn-size summed PageInfo.slot_size, which is 0 for monolithic buckets\n(the default for small files), so every column reported 0 B. Attribute each\nbucket\u0027s on-disk size to its columns via bucket_infos instead; add a\ndefault-threshold e2e so monolithic files are covered. Also emit Date32 as a\nbare epoch-day integer in cat --json for consistency with other numerics.\n\n* feat(cli): show compression ratio in column-size and buckets\n\nBucketInfo now carries uncompressed size (exact for monolithic, unknown for\npaged). column-size prints a total with uncompressed bytes + ratio; buckets\nshows per-bucket ratio when known. Tests + docs updated.\n\n* feat(cli): add count, cat --all and cat --where row filter\n\ncount prints total rows; --all drops the -n cap; --where applies one\ncolumn/op/value condition (\u003d,!\u003d,\u003e,\u003e\u003d,\u003c,\u003c\u003d), numeric or string. Tests + docs.\n\n* feat(cli): add convert (CSV import) and stats-based where pushdown\n\nconvert imports a CSV into a new Mosaic file (schema inferred, --stats picks\nmin/max columns). cat --where now skips row groups whose min/max provably\nexclude the predicate, conservative (any missing stat keeps the group).\nTests + docs.\n\n* feat(cli): convert also imports JSON lines\n\nconvert dispatches on extension: .json/.ndjson/.jsonl read one object per line\nvia arrow-json (CSV path unchanged). Test + docs.\n\n* docs(cli): restructure README into Install/Inspect/Query/Convert sections\n\n* fix(cli): harden page_infos bounds, where ordering, NaN JSON, convert atomicity\n\n- page_infos validates paged slot sizes sum to total (rejects forged sizes\n  that could drive a ~4GiB read, matching the projected reader)\n- cat --where: ordering ops on a non-numeric column/value error instead of\n  silently dropping all rows\n- cat --json: NaN/Infinity emit null (was invalid JSON)\n- convert writes a temp file and renames on success (no truncated output)\n\n* fix(cli): column-size omits total ratio when uncompressed size is partial\n\nPaged buckets don\u0027t record uncompressed size, so summing across a mixed file\ngave a misleading total ratio (e.g. 0.01x). Only report the total ratio when\nevery non-empty bucket\u0027s uncompressed size is known.\n\n* fix(cli): address review — valid JSON, type-driven where, exact paged column-size\n\n- cat --json renders via Arrow JSON writer: all reader types valid, NaN-\u003enull\n- where: numeric cols compare numerically, others exact string; ordering numeric-only\n- column-size: paged uses exact slot sizes, monolithic multi-col marked (approx)\n- README: scope --json to inspection/query commands (convert writes a file)\n\n* refactor(cli): merge head into cat alias, fix Date pushdown, harden edges\n\n- Cat/Head: single variant with visible_alias\u003dhead (no duplicated fields)\n- stats_exclude reads Value numerically (to_f64) — Date/Time pushdown no longer\n  silently disabled by the (epoch-day) string suffix\n- pretty_table/ndjson guard empty input; cell shows \u003cType\u003e not ? for unhandled\n- page_infos slot-sum uses checked_add; docs --json scope fixed\n\n* fix(cli): exact integer where/pushdown, ndjson returns Result\n\n- where and stats_exclude compare integers in i128 (full i64 range exact);\n  large ids (Snowflake) no longer mis-skip or mis-match via lossy f64\n- ndjson returns io::Result instead of .expect, keeping the CLI error contract\n\n* docs(cli): note where compares numbers exactly (\u003d0.3 matches only stored 0.3)\n\n* chore(cli): use arrow umbrella crate instead of 5 split crates\n\nReplace arrow-array/schema/select/csv/json with arrow \u003d {features\u003dcsv,json};\none version to bump, paths via arrow::{array,datatypes,error,compute,csv,json}.\n\n* fix(cli): convert pluralizes row/column count (no \u00271 rows\u0027)\n\n* fix(cli): --where works on a column excluded by -c\n\nRead the filter column even when projected out, then drop it before printing,\nso cat -c id,name --where score\u003e440 filters instead of erroring.\n\n* review: cat/head split, convert --overwrite, pages/-c, typed inspect API, CI\n\n- head split from cat: cat prints all rows, head defaults 10 (shared handler)\n- convert refuses existing output unless --overwrite (no silent clobber)\n- pages/column-size take -c to inspect chosen columns\n- core inspect API: Encoding/BucketKind enums, #[non_exhaustive] structs\n- fmt + clippy clean so CI check job passes; docs synced\n\n* review: typed/bool where filter, reader refactor, bench dedup\n\n- where: compare typed Arrow values; bool columns require true/false; tighten numeric guards\n- reader: rework column/page info path\n- bench_wide_table: share bench_common.hpp, drop duplicated generators\n- tests/docs: cover bool where + new cases\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* perf(cli): column-size reads slot dir only, no slot decode\n\nAdd Reader::slot_sizes (directory-only paged slot sizes); column-size used\npage_infos which decompressed/parsed every slot just for encodings it discards.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix(core): column-size/pages handle ARRAY paged buckets\n\nAfter the ARRAY merge, paged directories carry a child header plus one slot\nper physical column; page_infos/slot_sizes parsed it as N logical u32s and\nmis-read or failed validation. Add paged_dir() to skip the header and read\nphysical slots; attribute child bytes to the parent. Test over a List column.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* style: apply rustfmt to where filter, inspect, tests\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix(cli): --where compares Float32 at f32 precision\n\nA Float32 cell widened to f64 never equals the f64-parsed RHS (stored 0.1f32\n!\u003d 0.1f64), so price\u003d0.1 dropped every row. Parse the RHS as f32 for Float32\ncolumns. Test added.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix(cli): where pushdown rounds Float32 RHS to f32 like the row filter\n\nAfter the f32 where fix, stats_exclude still parsed the RHS as f64 while\napply_where used f32, so a Float32 group with a matching row could be pruned\n(\u0027no rows\u0027). Round the RHS to f32 when stats are Float; test now uses stats.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix(cli): strip control chars from table cells (no ANSI injection)\n\ncat/head printed Utf8 cells verbatim, so a crafted file\u0027s ANSI escapes\nmanipulated the inspector terminal (CWE-150); the JSON path was already\nescaped. Replace control chars with U+FFFD; test added.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix(cli): strip control chars from all file-derived text output\n\nA crafted file\u0027s strings reach the terminal raw, so attacker-controlled\nbytes could inject ANSI escapes. Add fmt::safe() and route every text-mode\nsink through it: stats min/max (render_value), table cells, dict entries,\nand schema column names in inspect/meta/pages/column-size/buckets/headers.\nJSON output stays escaped by json_str/the writer.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix(core): cap zstd pre-alloc at 512 MiB absolute (not just ratio)\n\nThe 65536x ratio let a ~1 MiB compressed block legally request 64 GiB\nbefore reading a byte. Clamp the cap to a 512 MiB absolute ceiling so a\ntiny file can\u0027t drive a giant pre-alloc; a real slot/page is far below it.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix(cli): --where f32 RHS reuses parsed value, drops dead NaN branch\n\nThe Float32 path re-parsed the RHS and unwrap_or(NaN) was unreachable (any\nf64-parseable literal also f32-parses, saturating to inf). Reuse the\nalready-parsed rhs rounded to f32 width; symmetric with stats_exclude.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix(cli): emit machine-parseable stats in --json; propagate count errors\n\nmeta/dictionary --json wrapped render_value(), leaking human suffixes like\n\"18627 (epoch-day)\" / \"5 (ms)\" into JSON — unparseable downstream. Add\nrender_json() that strips units (nanos collapse to a count); text keeps them.\nAlso sum row-group counts via ? so meta/count fail loud instead of unwrap_or(0)\nsilently undercounting a corrupt file.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* perf(cli): pretty_table downcasts each column once, not per cell\n\ncell() re-ran the data_type match + downcast for every (row,col); cat\nrenders all rows by default. Replace with col_formatter() built once per\ncolumn per batch, mirroring apply_where. Same output, no per-cell downcast.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* perf(core): paged_dir returns children so slot_sizes drops recompute\n\nslot_sizes re-ran expand_col_types just to map ARRAY child slots to parents\nright after paged_dir already computed it. Return children from paged_dir and\nreuse them — one expand per paged bucket, one fewer reach into bucket_writer.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* refactor: share FileSink output sink between CLI and tests\n\nFileOut was implemented twice (convert path + e2e tests) with subtly\ndifferent pos accounting. Move it to core::writer as FileSink (where the\nOutputFile trait lives); both reuse it, so tests now cover the real sink.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* refactor(cli): typed Op enum for --where, not magic \u0026str\n\nThe comparison operator was a stringly-typed \u0026\u0027static str threaded through\ncmp_op/excl/apply_where with _ \u003d\u003e false fallthrough. Replace with an Op enum;\ncmp_op/excl are now exhaustive, so a new operator must be handled everywhere.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* perf(cli): cat --json streams row groups instead of buffering all\n\ncat collected every row group\u0027s batch before printing; cat --json on a big\nfile held the whole result in memory. Stream each group out as ndjson; the\ntable path still buffers (column widths need all rows first).\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* refactor(cli): split row filtering out of fmt into filter module\n\nfmt.rs mixed presentation (render/table/json) with query filtering (Where,\nOp, apply_where, stats_exclude). Move the filter half to filter.rs verbatim;\npure relocation, no behavior change.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* refactor(cli): model command JSON with serde, drop hand-rolled json_str\n\nEight commands hand-assembled JSON via format!/json_str; a missed comma or\nescape was silent. Add jsonout models (#[derive(Serialize)]) and serialize\neach; output byte-identical (verified across all 8). serde was already in the\ntree via arrow. Removes json_str.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* docs(cli): safe() comment points to serde, not removed json_str\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* refactor(cli): unify column-select check, dedup convert opens, align name helpers\n\n- arch-2: pages/column_size repeated the -c membership check three ways; one\n  selected() helper now backs all of them.\n- arch-3: bucket_kind returns String like encoding_name, so callers handle one type.\n- arch-4: convert\u0027s two passes share one open() closure instead of four File::open.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* style: rustfmt the cli/core refactors (CI fmt gate)\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix: address PR 66 review feedback\n\n* fix(cli): unique convert temp file + reject nested dict columns\n\nconvert: use a process-unique sibling temp name instead of fixed\nout.mosaic.tmp, so a stray user file is never clobbered/removed.\ndictionary: reject List/LargeList/Map columns (first physical slot is\nthe length column) instead of printing misleading junk, matching\nparquet-cli\u0027s primitive-leaf rule.\n\nCo-Authored-By: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\n\n* fix(cli): keep cat unbounded by default\n\n* fix: harden paged dir and file sink writes\n\n* fix(cli): drop redundant cat all flag\n\n---------\n\nCo-authored-by: mingfeng \u003ctjg281622@antgroup.com\u003e\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e\nCo-authored-by: jianguotian \u003cjianguotian2010@gmail.com\u003e\nCo-authored-by: JingsongLi \u003cjingsonglee0@gmail.com\u003e"
    },
    {
      "commit": "f6aa318940168752348ea59cb739224a701c291a",
      "tree": "034a8fbb464d92d08bc1f866480ffe3d96da552f",
      "parents": [
        "9dcdff6cae5681a32060fb1cc894b9d6ea283edc"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Sat Jun 20 15:38:59 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 20 15:38:59 2026 +0800"
      },
      "message": "build: exclude native libs from sources jar (#68)"
    },
    {
      "commit": "9dcdff6cae5681a32060fb1cc894b9d6ea283edc",
      "tree": "553b59684c565a2b28e1e5a868f526919379aae1",
      "parents": [
        "562d1670cfe53c91583acb04451c1478a0b8ee05"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Wed Jun 17 17:32:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 17 17:32:57 2026 +0800"
      },
      "message": "docs: add 0.2.0 to releases page (#67)"
    },
    {
      "commit": "562d1670cfe53c91583acb04451c1478a0b8ee05",
      "tree": "5120fcb623f606cd4c6bb8064a43be2f744c6660",
      "parents": [
        "96cfc49611709c9adc5950c8b0716492ad9be622"
      ],
      "author": {
        "name": "XiaoHongbo",
        "email": "1346652787@qq.com",
        "time": "Tue Jun 16 16:57:16 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 16 16:57:16 2026 +0800"
      },
      "message": "ci: deploy Java staging only for RC tags (#63)"
    },
    {
      "commit": "96cfc49611709c9adc5950c8b0716492ad9be622",
      "tree": "c48e59c9a5eca9e63b1053ba03fbc91c8992639a",
      "parents": [
        "3ed9f956252fca39fea5483233ab0860168f272a"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Mon Jun 15 20:17:47 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 15 20:17:47 2026 +0800"
      },
      "message": "ci: bump cibuildwheel to v4.1.0 (allowlisted SHA) (#65)\n\nThe pinned v3.3.1 SHA fell off the ASF Actions allowlist, causing Release\nstartup_failure on tags. Bump to v4.1.0 to stay on a current, allowlisted SHA.\n\nCo-authored-by: mingfeng \u003ctjg281622@antgroup.com\u003e\nCo-authored-by: Claude Opus 4.8 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "3ed9f956252fca39fea5483233ab0860168f272a",
      "tree": "4cc0195d67b47defa344c0f4fce00e9bb4ad34b4",
      "parents": [
        "af5c21e15d5cbf573997fc8e15562669194688cf"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Fri Jun 12 19:38:09 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 19:38:09 2026 +0800"
      },
      "message": "ci: gate PyPI publish on rust+java success (#62)"
    },
    {
      "commit": "af5c21e15d5cbf573997fc8e15562669194688cf",
      "tree": "3375e80ddb81d9900cc536065224f236a1b5e52d",
      "parents": [
        "4d40dedc16a37dfc321b56a985ff7ef84920ca4e"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Fri Jun 12 19:38:01 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri Jun 12 19:38:01 2026 +0800"
      },
      "message": "ci: fix update_branch_version.sh skipping Cargo.toml on snapshot bumps (#57)"
    },
    {
      "commit": "4d40dedc16a37dfc321b56a985ff7ef84920ca4e",
      "tree": "36d749fc6300e70a93ae421006c715a5dbc50867",
      "parents": [
        "f6ab479ea066d4dd27256dddfb6080bfefb620cb"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Thu Jun 11 21:22:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 21:22:25 2026 +0800"
      },
      "message": "ci: set staging repo description for Java release (#61)\n\nCo-authored-by: jianguotian \u003cjianguotian2010@gmail.com\u003e"
    },
    {
      "commit": "f6ab479ea066d4dd27256dddfb6080bfefb620cb",
      "tree": "4ff9469ee3533d2e0b09a8f4955175d45a3f21af",
      "parents": [
        "29b3139b477252d3b5fea89c081a60f78bcfd294"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Thu Jun 11 19:31:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 19:31:31 2026 +0800"
      },
      "message": "chore: bump main version to 0.3.0 (#60)\n\nCo-authored-by: mingfeng \u003ctjg281622@antgroup.com\u003e"
    },
    {
      "commit": "29b3139b477252d3b5fea89c081a60f78bcfd294",
      "tree": "fbe022fe3ca3f07125c02c0059dd2654f96fa01e",
      "parents": [
        "445507c532ff712b80b66d80cda4b2009b39676e"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Thu Jun 11 18:00:08 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 18:00:08 2026 +0800"
      },
      "message": "chore: update dependency list for release 0.2.0 (#58)\n\nCo-authored-by: mingfeng \u003ctjg281622@antgroup.com\u003e"
    },
    {
      "commit": "445507c532ff712b80b66d80cda4b2009b39676e",
      "tree": "9e85da391263616e946ca377b65512e7850b402e",
      "parents": [
        "961e74fe128dbd800a30c80cd9681180d57966a1"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Thu Jun 11 15:55:23 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Jun 11 15:55:23 2026 +0800"
      },
      "message": "ci: switch Java release deploy to nexus-staging-maven-plugin (#56)\n\nEvery release.yml run for 0.1.0 (rc1, rc2 ×5 retries, rc3, and the v0.1.0 final tag — 7 total) failed in the same step with HTTP 502 from repository.apache.org on the jar PUT, including the v0.1.0 final tag run on 2026-06-03. The jar on Maven Central had to be uploaded out of band. The retry added in #44 walks all 10 attempts and every one returns 502, so the failure is not transient.\n\nThe underlying maven-deploy-plugin 2.8.2 from Apache Parent POM v23 uses the Maven Wagon HTTP transport, whose PUT for the jar artifact is rejected by the Apache Nexus reverse proxy. Replacing the deploy execution with nexus-staging-maven-plugin 1.7.0 (extensions\u003dtrue) routes the upload through Sonatype\u0027s own HttpClient-based transport and gathers artifacts into a local staging directory before pushing them atomically. The same plugin is used by other Apache projects against repository.apache.org without 502s.\n\nautoReleaseAfterClose\u003dfalse preserves the existing manual gate: the release manager still closes and releases the staging repository via the Nexus UI after the vote passes. Drops -DretryFailedDeploymentCount and -Daether.connector.basic.parallelPut from the workflow as both only apply to the vanilla deploy plugin.\n\nCo-authored-by: mingfeng \u003ctjg281622@antgroup.com\u003e"
    },
    {
      "commit": "961e74fe128dbd800a30c80cd9681180d57966a1",
      "tree": "41a754ebc12b988902e28c49851bee48947d4245",
      "parents": [
        "bf823e1dcf5b7e1aff0333803e52b1843f629836"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon Jun 08 17:31:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Jun 08 17:31:11 2026 +0800"
      },
      "message": "Refactor complex child column layout metadata (#55)"
    },
    {
      "commit": "bf823e1dcf5b7e1aff0333803e52b1843f629836",
      "tree": "ea4c25e084dde9b9150f8aa740e0a0a7382e7343",
      "parents": [
        "c54f3241294640b02bf5791885ac558d2f4a0b28"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Sun Jun 07 09:53:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Jun 07 09:53:26 2026 +0800"
      },
      "message": "support MAP type with flattened columnar storage (#53)\n\nMAP\u003cK, V\u003e columns are decomposed into three physical columns within\nthe same bucket: lengths (INT32), keys (type K), and values (type V).\nAll three independently benefit from DICT/CONST/PLAIN encoding.\n\nRecursive nesting is fully supported:\n- ARRAY\u003cMAP\u003cK,V\u003e\u003e, MAP\u003cK, ARRAY\u003cV\u003e\u003e, MAP\u003cK, MAP\u003cK2,V2\u003e\u003e\n- Arbitrary depth like MAP\u003cSTRING, MAP\u003cSTRING, ARRAY\u003cMAP\u003cSTRING, STRING\u003e\u003e\u003e\u003e\n\nSchema metadata roundtrip preserves all MAP field names (entries, keys,\nvalues). Sorted MAP is rejected at validation (not supported).\n\nThe format is fully backward compatible — no version bump needed.\nMAP uses type byte 19. Older readers reject at schema validation."
    },
    {
      "commit": "c54f3241294640b02bf5791885ac558d2f4a0b28",
      "tree": "aaf22036ea48106a66cfb394bb5900e2073923ba",
      "parents": [
        "ae6f651cc3748e43759288a3ae799139d776d5b1"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Sat Jun 06 22:22:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 22:22:25 2026 +0800"
      },
      "message": "docs: update 0.1.0 release links (#51)"
    },
    {
      "commit": "ae6f651cc3748e43759288a3ae799139d776d5b1",
      "tree": "4edcf5297d41ef0276f6d229af7eb523abe7e821",
      "parents": [
        "5d5bf180b7380a74ced8f08d689ab04ef41c8016"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Sat Jun 06 22:17:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Jun 06 22:17:37 2026 +0800"
      },
      "message": "Support ARRAY type with ORC-style flattened columnar storage (#52)\n\nARRAY\u003cT\u003e columns are stored as two independent streams:\n- Lengths column (INT32): number of elements per row, benefits from DICT/CONST encoding\n- Values sub-bucket (type T): all elements flattened across all rows, benefits from DICT/CONST encoding\n\nNested arrays (ARRAY\u003cARRAY\u003cINT\u003e\u003e) are supported via recursive decomposition.\nAll leaf element values share a single dictionary across all arrays in the column."
    },
    {
      "commit": "5d5bf180b7380a74ced8f08d689ab04ef41c8016",
      "tree": "cb2c344f6ae3f9af035b2fb1aa6daac8a8890da5",
      "parents": [
        "20139401cd3aba43d90f865a112950cabf2a7368"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed Jun 03 14:04:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jun 03 14:04:37 2026 +0800"
      },
      "message": "release: decouple Python publish from Rust and Java release jobs (#50)\n\nPython wheels have no runtime dependency on Rust or Java artifacts,\nso the publish step only needs to wait for the wheel build to finish.\n\nCo-authored-by: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"
    },
    {
      "commit": "20139401cd3aba43d90f865a112950cabf2a7368",
      "tree": "5365f3aa9e62804fc22cfbc4629ba838e42e7af9",
      "parents": [
        "3b45db9db719cf183626ab8bb49d5e8da8db148d"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Tue Jun 02 15:12:26 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 15:12:26 2026 +0800"
      },
      "message": "release: fix Java NOTICE year (#49)"
    },
    {
      "commit": "3b45db9db719cf183626ab8bb49d5e8da8db148d",
      "tree": "81cde864f17f1a9c791b35c222bf1873bc47c320",
      "parents": [
        "b9e27989310c5474a30d47e30b1c1483ca78be5b"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Fri May 29 15:16:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 29 15:16:58 2026 +0800"
      },
      "message": "release: fix source tarball and Java verification paths (#48)\n\n* release: avoid macOS metadata in source tarball\n\n* release: fix Java verification native paths\n\n* docs: clarify release verification steps"
    },
    {
      "commit": "b9e27989310c5474a30d47e30b1c1483ca78be5b",
      "tree": "cb8c1b19a036ea1fe5eb3b7668c18b81a0f2e781",
      "parents": [
        "b5cdbd89f1341bfbb989c8e40b459db0c3323ad4"
      ],
      "author": {
        "name": "jianguotian",
        "email": "841604084@qq.com",
        "time": "Tue May 26 13:49:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 26 13:49:22 2026 +0800"
      },
      "message": "ci: print line coverage summary in CI logs (#46)\n\nReplace `cargo test` with `cargo llvm-cov --summary-only` so each run\nshows a per-file line/region/function coverage table in the Actions log.\nNo external service dependency."
    },
    {
      "commit": "b5cdbd89f1341bfbb989c8e40b459db0c3323ad4",
      "tree": "373c7bc707aaa195ad67ca855b6c5befdbc84b52",
      "parents": [
        "83acb460572f385444f87729569897e0cffc0d54"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Mon May 25 14:05:39 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 14:05:39 2026 +0800"
      },
      "message": "ci: make Java release deploy more stable (#44)"
    },
    {
      "commit": "83acb460572f385444f87729569897e0cffc0d54",
      "tree": "05cdab984262e7104c16533b185279cb7eeed7f1",
      "parents": [
        "d7c8c3e42b073eea0f7798713486005cc923e8b5"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 25 14:05:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 14:05:12 2026 +0800"
      },
      "message": "Fix BPE non-determinism and add comprehensive test suite (#45)\n\nFix a non-determinism bug in BPE vocabulary builder where HashMap\niteration order caused different byte output for identical input data\nwhen column names share common substrings. The fix uses the pair key\nas a deterministic tie-breaker when multiple pairs have equal frequency.\n\nAdd 150+ new tests across Rust, Java, and Python covering:\n- Massive data volumes (up to 10M rows, 1000 columns)\n- 20 data pattern varieties (sawtooth, fibonacci, unicode, sparse, etc.)\n- Encoding/compression/projection interactions (30 tests)\n- Determinism and re-roundtrip stability (18 tests)\n- Concurrent multi-threaded reading (5 tests)\n- Binary format byte-level verification (10 tests)\n- Statistics min/max/null_count accuracy (11 tests)\n- Cross-language Rust/Java/Python interoperability (25 tests)"
    },
    {
      "commit": "d7c8c3e42b073eea0f7798713486005cc923e8b5",
      "tree": "f66e0b8cbf0df4c1dffb275161b161c7b1bba119",
      "parents": [
        "2824a434b5602a8394a1e0a15afaf71bdae9132b"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Mon May 25 10:51:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 25 10:51:31 2026 +0800"
      },
      "message": "Fix Java Linux native glibc baseline (#43)\n\nSigned-off-by: QuakeWang \u003cwangfuzheng0814@foxmail.com\u003e"
    },
    {
      "commit": "2824a434b5602a8394a1e0a15afaf71bdae9132b",
      "tree": "4e66c060a734a788fdd6ab8fc022b27e300e954c",
      "parents": [
        "6386dd48183f629814ef0a5ca05c5857b10866c7"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Sun May 24 16:14:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 16:14:34 2026 +0800"
      },
      "message": "ci: publish Python release after Rust and Java (#42)\n\nSigned-off-by: QuakeWang \u003cwangfuzheng0814@foxmail.com\u003e"
    },
    {
      "commit": "6386dd48183f629814ef0a5ca05c5857b10866c7",
      "tree": "b4ca3c0d73b83b0978c71d723f0ed411e0fdf87f",
      "parents": [
        "64d0b46684e56f437628c2a9a2226cf82e8c912e"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Sun May 24 13:22:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun May 24 13:22:29 2026 +0800"
      },
      "message": "ci: attach Java release source and javadoc jars (#41)"
    },
    {
      "commit": "64d0b46684e56f437628c2a9a2226cf82e8c912e",
      "tree": "5210ad776f0d9fd831cd0be628bfd330766b0df0",
      "parents": [
        "3ebdf3a51b46692140717a8e6b673be4234678ae"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Sat May 23 23:31:34 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 23 23:31:34 2026 +0800"
      },
      "message": "ci: fix Java release GPG signing (#40)\n\nSigned-off-by: QuakeWang \u003cwangfuzheng0814@foxmail.com\u003e"
    },
    {
      "commit": "3ebdf3a51b46692140717a8e6b673be4234678ae",
      "tree": "463d58f8de7d6f825afdaffd222b32e1b0c24018",
      "parents": [
        "3c9156683937184b5057d2564bb6b22e5c604b0c"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Sat May 23 22:31:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 23 22:31:37 2026 +0800"
      },
      "message": "chore: bump main version to 0.2.0 (#36)"
    },
    {
      "commit": "3c9156683937184b5057d2564bb6b22e5c604b0c",
      "tree": "760f1cbd3770f4d401381eff63d880ddca44e647",
      "parents": [
        "43e66248d0aa3fc8802c1f703e5657e4c1c5046f"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Sat May 23 21:51:24 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 23 21:51:24 2026 +0800"
      },
      "message": "ci: fix macOS Python wheel platform tag (#39)\n\nSigned-off-by: QuakeWang \u003cwangfuzheng0814@foxmail.com\u003e"
    },
    {
      "commit": "43e66248d0aa3fc8802c1f703e5657e4c1c5046f",
      "tree": "ea038d831d8f73c55f7eab5b6cdb2d1463c68264",
      "parents": [
        "1258980028f22727370161ab8a1a5dc2216c824c"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Sat May 23 19:48:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 23 19:48:06 2026 +0800"
      },
      "message": "ci: fix release signing and macOS wheel repair (#38)\n\nSigned-off-by: QuakeWang \u003cwangfuzheng0814@foxmail.com\u003e"
    },
    {
      "commit": "1258980028f22727370161ab8a1a5dc2216c824c",
      "tree": "b2979f118ba812e62a6c7ce8da8c07a8b0c2ae1b",
      "parents": [
        "5fc0466ebce26d785ff9fe8afd3b51cfbaab35c9"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Sat May 23 17:45:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat May 23 17:45:40 2026 +0800"
      },
      "message": "ci: pin Python release actions to approved SHAs (#37)\n\nSigned-off-by: QuakeWang \u003cwangfuzheng0814@foxmail.com\u003e"
    },
    {
      "commit": "5fc0466ebce26d785ff9fe8afd3b51cfbaab35c9",
      "tree": "32f81bddec5787a65cef1617d8f9f6391a1eb07b",
      "parents": [
        "23a6cfb12a91b7cd5111f25a494ea65720c2a7f0"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Fri May 22 17:38:07 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 17:38:07 2026 +0800"
      },
      "message": "chore: update dependency list for release 0.1.0 (#34)"
    },
    {
      "commit": "23a6cfb12a91b7cd5111f25a494ea65720c2a7f0",
      "tree": "c803c0fed140450d0a1a9963616154c8d299aab0",
      "parents": [
        "713e88c8ae0642540830e8ae224e0d95e2d74719"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Fri May 22 16:36:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 16:36:22 2026 +0800"
      },
      "message": "docs: align release process with RC tags (#32)\n\nSigned-off-by: QuakeWang \u003cwangfuzheng0814@foxmail.com\u003e"
    },
    {
      "commit": "713e88c8ae0642540830e8ae224e0d95e2d74719",
      "tree": "868dec41980f4e3bfbdab6d184d791cf658bb695",
      "parents": [
        "652c397c1c04270c4a8e07ffb02f4245452a2323"
      ],
      "author": {
        "name": "Jiwen liu",
        "email": "61498169+liujiwen-up@users.noreply.github.com",
        "time": "Fri May 22 13:06:46 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 13:06:46 2026 +0800"
      },
      "message": "Fix README crates.io badge link (#29)"
    },
    {
      "commit": "652c397c1c04270c4a8e07ffb02f4245452a2323",
      "tree": "13aba37e972bf01eff5a17979de20cf903a55ab7",
      "parents": [
        "78532fd27b48f8b9f0304e0ccca83765c4472962"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Fri May 22 12:17:25 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 12:17:25 2026 +0800"
      },
      "message": "ci: check Rust dependency licenses (#31)\n\nSigned-off-by: QuakeWang \u003cwangfuzheng0814@foxmail.com\u003e"
    },
    {
      "commit": "78532fd27b48f8b9f0304e0ccca83765c4472962",
      "tree": "bb4aa4c815a5904895d09b4740f5f77199896ec2",
      "parents": [
        "1794ef25915708f4828162fd07210cb36bb9cfb1"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Fri May 22 10:16:06 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 10:16:06 2026 +0800"
      },
      "message": "ci: trigger CI for release branch pushes and PRs (#30)\n\nSigned-off-by: QuakeWang \u003cwangfuzheng0814@foxmail.com\u003e"
    },
    {
      "commit": "1794ef25915708f4828162fd07210cb36bb9cfb1",
      "tree": "7b6c6509ea03afed6920661f0e4e999a56dacb18",
      "parents": [
        "178fdd9261d81de260987f34b31b35866bebdeae"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Thu May 21 15:24:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 15:24:11 2026 +0800"
      },
      "message": "fix: preserve Python projection schema for empty reads (#28)"
    },
    {
      "commit": "178fdd9261d81de260987f34b31b35866bebdeae",
      "tree": "3afa4cd436ec2c72c87e92775d00df79f97b7648",
      "parents": [
        "1abf5b5e8b3eaf5a315945a3049820848ca14dd8"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Thu May 21 14:20:44 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 14:20:44 2026 +0800"
      },
      "message": "Add release tooling scripts and unify CI infrastructure (#27)\n\n- Flatten tools/releasing/ into tools/ for simpler layout\n- Add tools/validate_asf_yaml.py for .asf.yaml schema validation\n- Add tools/dependencies.py for cargo-deny license check and DEPENDENCIES.rust.tsv generation\n- Upgrade GitHub Actions versions to latest (checkout@v6, cache@v5, artifact@v5)\n- Add .asf.yaml validation step to CI check job\n- Update docs/creating-a-release.html with new script paths and dependency license step"
    },
    {
      "commit": "1abf5b5e8b3eaf5a315945a3049820848ca14dd8",
      "tree": "fc78a3bd5d07930a058d25932bdd0aedadcca96e",
      "parents": [
        "09908ca29c0da12e553d55d6cd7688be9c682505"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Thu May 21 13:41:31 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 13:41:31 2026 +0800"
      },
      "message": "Add release documentation and rename crates/packages with paimon prefix (#26)\n\n- Add release docs as HTML pages (creating-a-release, verifying-a-release-candidate, releases)\n- Rename crates: mosaic-core -\u003e paimon-mosaic-core, mosaic-ffi -\u003e paimon-mosaic-ffi, mosaic-jni -\u003e paimon-mosaic-jni\n- Rename Python package: mosaic-format -\u003e paimon-mosaic\n- Update all workflows, docs, source code, and .gitignore for new library names\n- Improve create_source_release.sh with usage header, trap fix, and verification steps\n- Update doc titles from \"Mosaic\" to \"Paimon Mosaic\""
    },
    {
      "commit": "09908ca29c0da12e553d55d6cd7688be9c682505",
      "tree": "f14d1bd09c5c299f4129abfed900c8fc3f4c72a9",
      "parents": [
        "63ed4383b2da4e6eaf4f933a7732e70f9810f979"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Thu May 21 12:52:58 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 12:52:58 2026 +0800"
      },
      "message": "fix: preserve empty projection in read_table (#25)"
    },
    {
      "commit": "63ed4383b2da4e6eaf4f933a7732e70f9810f979",
      "tree": "d608738a7058aa55810391753e26962499765391",
      "parents": [
        "243405dfb86855cdbe666392d0a7b70b9268fb39"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Thu May 21 09:15:13 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 09:15:13 2026 +0800"
      },
      "message": "feat: expose timestamp nanos as Arrow timestamp(ns) (#21)"
    },
    {
      "commit": "243405dfb86855cdbe666392d0a7b70b9268fb39",
      "tree": "e25a567018ca82df10a09911f2095484d12ddc9f",
      "parents": [
        "1b811b9ab73a6f38ee16518bb980bac14a409184"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Thu May 21 06:30:51 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 06:30:51 2026 +0800"
      },
      "message": "Preserve original column order in reader and fix stats for empty strings (#23)\n\n- Store original column order as delta+zigzag encoded permutation in schema block\n- Reader returns columns in original input order by default (not name-sorted)\n- Add project() API to select and reorder output columns\n- Fix empty string min/max statistics handling across all language bindings\n- Add stats_columns writer option and per-row-group statistics API\n- Update docs and add tests for all languages\n- Fix clippy warnings (type_complexity, needless_borrows, iter_cloned_collect)"
    },
    {
      "commit": "1b811b9ab73a6f38ee16518bb980bac14a409184",
      "tree": "ee4aa864515e7f5d30b112a60de18215e0ac070b",
      "parents": [
        "2fc6da63fd6fc124d762e901af5c4f6a83733204"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 21:48:40 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 21:48:40 2026 +0800"
      },
      "message": "Reject unsupported types in stats_columns at writer creation time (#20)\n\nPreviously unsupported types were silently filtered, making the returned\nstatistics list not correspond positionally to the input stats_columns.\nNow the writer returns an error if any stats_columns index is out of\nrange or refers to a type that does not support statistics. Also adds\nJavadoc/docstring comments clarifying that getRowGroupStatistics returns\nentries in the same order as stats_columns."
    },
    {
      "commit": "2fc6da63fd6fc124d762e901af5c4f6a83733204",
      "tree": "d7ff403e830c2f9d6aac4ab85e65ffb95dc183d7",
      "parents": [
        "b159590d0d257a5b30e9c1ae1ce8b5b4e59e4e4f"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Wed May 20 21:08:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 21:08:57 2026 +0800"
      },
      "message": "fix: preserve row count for empty projection (#19)"
    },
    {
      "commit": "b159590d0d257a5b30e9c1ae1ce8b5b4e59e4e4f",
      "tree": "55f5c1cc0e27dc93f217d0c306b14ad3f71af92f",
      "parents": [
        "005374d585e2456206ffe12bc70e27a5e9e77c98"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 20:38:39 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 20:38:39 2026 +0800"
      },
      "message": "Maven modified to org.apache.paimon and mosaic\n"
    },
    {
      "commit": "005374d585e2456206ffe12bc70e27a5e9e77c98",
      "tree": "30db5731acf4bcec73eb5a848e40df444ccffd16",
      "parents": [
        "1f886941a0f160d3cd64ff20e55d02e10ce2e2b5"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 20:27:50 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 20:27:50 2026 +0800"
      },
      "message": "Remove push build to public_snapshot\n"
    },
    {
      "commit": "1f886941a0f160d3cd64ff20e55d02e10ce2e2b5",
      "tree": "e2d0c17eb6dba82a68df57b5860b890b7be76f90",
      "parents": [
        "89266468d561a5d1706f6ceb6de3dddf5a729c3c"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 20:25:59 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 20:25:59 2026 +0800"
      },
      "message": "Remove support to macos-x86_64 because no resource to build\n"
    },
    {
      "commit": "89266468d561a5d1706f6ceb6de3dddf5a729c3c",
      "tree": "52428f4360bcf867a9f1075f2018182ae03ae6ef",
      "parents": [
        "5f7410e6e7390878bedd29fe60b93517b593ce93"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Wed May 20 19:10:55 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 19:10:55 2026 +0800"
      },
      "message": "fix: honor projection for monolithic buckets (#18)"
    },
    {
      "commit": "5f7410e6e7390878bedd29fe60b93517b593ce93",
      "tree": "19c6def8b996480fea65a2eeb1ab73e765758a7c",
      "parents": [
        "3f50e0b9d6f6398ff299fb2fd0557e05e8090c67"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 18:12:00 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 18:12:03 2026 +0800"
      },
      "message": "Add schedule and workflow_dispatch triggers to publish_snapshot\n"
    },
    {
      "commit": "3f50e0b9d6f6398ff299fb2fd0557e05e8090c67",
      "tree": "7874c713c2aa8f24c2ba81899623d20eae7e4275",
      "parents": [
        "775f0a75e3490b4b4c8ea6eae7a4d95213203167"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 18:08:10 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 18:08:10 2026 +0800"
      },
      "message": "Expose row_group_num_rows from MosaicReader for all language bindings (#17)\n\nAdd a lightweight API to get the row count of a specific row group\ndirectly from file metadata without opening a full RowGroupReader."
    },
    {
      "commit": "775f0a75e3490b4b4c8ea6eae7a4d95213203167",
      "tree": "d9e4782d37ed890e81ee33cc88d60dd0c7011ba8",
      "parents": [
        "624a39a89054c68289e62358701aabbe09084a41"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 16:10:57 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 16:10:57 2026 +0800"
      },
      "message": "Expose ColumnStatistics from MosaicWriter for all language bindings (#16)\n\nAfter close(), writer stats are available without re-reading the file.\nThis is useful for Paimon to obtain min/max statistics immediately\nafter writing for indexing and metadata purposes.\n\nChanges across all layers:\n- Rust core: add num_row_groups() and row_group_stats() to MosaicWriter\n- JNI: add 6 native functions for writer stats access\n- FFI: add C API functions for writer stats (used by Python and C++)\n- Java: MosaicWriter caches stats on close(), exposes via\n  numRowGroups() and getRowGroupStatistics(rg)\n- Python: MosaicWriter collects stats on close(), exposes via\n  num_row_groups property and get_row_group_statistics(rg)\n- Docs: updated all 4 language API docs (Rust, Java, Python, C++)"
    },
    {
      "commit": "624a39a89054c68289e62358701aabbe09084a41",
      "tree": "967fe59cb0d234160ca48cc14562bda9a44e4bc0",
      "parents": [
        "c18484713e9b3cca7ed5c4b437b009d270b9fb7c"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Wed May 20 14:23:22 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 14:23:22 2026 +0800"
      },
      "message": "Fix Java reader handle leak on constructor failure (#14)"
    },
    {
      "commit": "c18484713e9b3cca7ed5c4b437b009d270b9fb7c",
      "tree": "e1567789388c1684431461194d0565becdb07e85",
      "parents": [
        "d481ff1628ce97894b02b637314e2e13354b2c21"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 14:21:12 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 14:21:12 2026 +0800"
      },
      "message": "Remove release-cpp.yml (#15)"
    },
    {
      "commit": "d481ff1628ce97894b02b637314e2e13354b2c21",
      "tree": "9bc41f0a1e39d08ef3952e108f71154e6b688147",
      "parents": [
        "dba937be4876c2018f925d61eb7683c26496d47f"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 13:54:18 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 13:54:18 2026 +0800"
      },
      "message": "Prepare release yml and tools (#11)"
    },
    {
      "commit": "dba937be4876c2018f925d61eb7683c26496d47f",
      "tree": "7ee70213a1ca12df0f1dd6a99de65bf6eed8d938",
      "parents": [
        "741d3f2e92207d8ccc4e599691c3f7308b05f114"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Wed May 20 13:16:36 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 13:16:36 2026 +0800"
      },
      "message": "Fix JNI Arrow C Data ownership (#10)"
    },
    {
      "commit": "741d3f2e92207d8ccc4e599691c3f7308b05f114",
      "tree": "4d895439ae99a618cde44f109e88d72322d4b959",
      "parents": [
        "78263ef2e661119c92ebb51378a92b42ed073404"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 13:09:11 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 13:09:11 2026 +0800"
      },
      "message": "Add Java snapshot publishing workflow and deploy settings (#13)"
    },
    {
      "commit": "78263ef2e661119c92ebb51378a92b42ed073404",
      "tree": "aae13ee71a3a45356c35ee3217d88a7a3ac35d45",
      "parents": [
        "6b5ef187358cc5d68520b3db1332e4c6e04dbefe"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Wed May 20 11:57:20 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 11:57:20 2026 +0800"
      },
      "message": "Rename Java package to org.apache.paimon.mosaic and update pom.xml (#12)\n\n- Rename package from io.mosaic to org.apache.paimon.mosaic\n- Update groupId to org.apache.paimon.mosaic with Apache parent pom\n- Downgrade to Java 1.8 source/target and Arrow 15.0.0\n- Add enhanced NativeLib with JAR-embedded native library loading\n- Add release profile with GPG signing and enforcer plugin\n- Update JNI function names to match new package path"
    },
    {
      "commit": "6b5ef187358cc5d68520b3db1332e4c6e04dbefe",
      "tree": "35112a146faac3eb219316f8b6c4cfb3e702e36c",
      "parents": [
        "0df16acb520104cb36b7e882b09248b3473d02a8"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Tue May 19 19:42:29 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 19:42:29 2026 +0800"
      },
      "message": "Add docs: design, rust-api, cpp-api, java-api and python-api (#9)"
    },
    {
      "commit": "0df16acb520104cb36b7e882b09248b3473d02a8",
      "tree": "dbb40ddb611b08326a206df9557c2c2cad71de96",
      "parents": [
        "fa792b70e6589985d0882ec983c234c8d1cef96d"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Tue May 19 16:24:14 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 16:24:14 2026 +0800"
      },
      "message": "Add Python bindings and CI test job (#8)"
    },
    {
      "commit": "fa792b70e6589985d0882ec983c234c8d1cef96d",
      "tree": "845c84dc32a0f87ba916170c79de053103dad87f",
      "parents": [
        "35b5bfbec6d6bcf05cbf63721187a0af49610a55"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Tue May 19 15:41:27 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 15:41:27 2026 +0800"
      },
      "message": "fix: preserve paged all-null projections (#7)"
    },
    {
      "commit": "35b5bfbec6d6bcf05cbf63721187a0af49610a55",
      "tree": "0a4271bdc799f6db11a1cb91f7864e52934f92c8",
      "parents": [
        "eba2108971f3e91749c36c441b8b7deb49963488"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Tue May 19 11:06:37 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 11:06:37 2026 +0800"
      },
      "message": "Add Java/JNI bindings and CI test job (#6)\n\nEnabling Java applications to use MosaicWriter/MosaicReader via Arrow C Data Interface over JNI."
    },
    {
      "commit": "eba2108971f3e91749c36c441b8b7deb49963488",
      "tree": "ee4fa2a9357cc983387ca49430fbcfaaec627101",
      "parents": [
        "c838f628dbf90d30a7f559f81739e5dac750bf95"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Tue May 19 10:25:41 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 10:25:41 2026 +0800"
      },
      "message": "Add ffi and cpp (#4)\n\n- ffi crate: C API via Arrow C Data Interface for writer and reader,\n  with cbindgen-generated header\n- include/mosaic.hpp: C++ RAII wrapper (Writer, Reader, statistics)\n- cpp/: CMake project with integration tests covering roundtrip,\n  nulls, all types, projection, statistics, compression, schema\n  export, and multiple row groups"
    },
    {
      "commit": "c838f628dbf90d30a7f559f81739e5dac750bf95",
      "tree": "39586688c922ae33be08d870a957400d270e3048",
      "parents": [
        "daf40d6bc9d72e687924e126fdb72bc8598eb332"
      ],
      "author": {
        "name": "QuakeWang",
        "email": "45645138+QuakeWang@users.noreply.github.com",
        "time": "Tue May 19 10:14:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 19 10:14:33 2026 +0800"
      },
      "message": "Optimize projected read buffer copies (#5)"
    },
    {
      "commit": "daf40d6bc9d72e687924e126fdb72bc8598eb332",
      "tree": "5409d73ddc0edd7669637112949e1b1674c547cb",
      "parents": [
        "ee12acc5603003b2f8c547064be49a0e8e188ce5"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 16:57:08 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 16:57:30 2026 +0800"
      },
      "message": "update .asf.yaml\n"
    },
    {
      "commit": "ee12acc5603003b2f8c547064be49a0e8e188ce5",
      "tree": "42e1a2c3a1c0429829cc8b1ee8d9aab4c83f2cf2",
      "parents": [
        "3067a7aec893a5ad811803a8f27e1908accd6b59",
        "b653ee9755fd9e14afeab2fa1ca364952f33e980"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 16:55:45 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 16:55:45 2026 +0800"
      },
      "message": "[core] Add column statistics and tests"
    },
    {
      "commit": "b653ee9755fd9e14afeab2fa1ca364952f33e980",
      "tree": "42e1a2c3a1c0429829cc8b1ee8d9aab4c83f2cf2",
      "parents": [
        "c716e846cb4d9fe8fc8579b68fbaf4334e23e7b0"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 16:19:48 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 16:19:48 2026 +0800"
      },
      "message": "Fix comments\n"
    },
    {
      "commit": "c716e846cb4d9fe8fc8579b68fbaf4334e23e7b0",
      "tree": "49ced5a3c5e12f606c1796df918d77332a9166ce",
      "parents": [
        "4ce3b8155ad1b3e5a4f199e43e078da9c00726df"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 15:57:06 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 15:57:06 2026 +0800"
      },
      "message": "fix\n"
    },
    {
      "commit": "4ce3b8155ad1b3e5a4f199e43e078da9c00726df",
      "tree": "8a1f43f7daf9df02d0e2c7f5a9f02548a47fb54e",
      "parents": [
        "3067a7aec893a5ad811803a8f27e1908accd6b59"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 14:47:08 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 15:44:10 2026 +0800"
      },
      "message": "[core] Add column statistics and tests\n\n- stats.rs: per-column min/max/null-count statistics with\n  serialization/deserialization support\n- Wire stats into writer (collection + serialization) and\n  reader (deserialization + row_group_stats API)\n- reader_tests.rs: unit tests for reader functionality\n- robustness_test.rs: edge-case and corruption tests\n- stress_test.rs: large-scale and performance tests\n"
    },
    {
      "commit": "3067a7aec893a5ad811803a8f27e1908accd6b59",
      "tree": "29732ffc4981693239d1c71f04718dc6520b34c8",
      "parents": [
        "f7dc71a6b9f6c55900da1e3f5d88f8c4b92a3500",
        "c82bab19c6f8c25e47e9424bc425137f559e4d8f"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 15:38:43 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 15:38:43 2026 +0800"
      },
      "message": "fix: fix github ci"
    },
    {
      "commit": "c82bab19c6f8c25e47e9424bc425137f559e4d8f",
      "tree": "29732ffc4981693239d1c71f04718dc6520b34c8",
      "parents": [
        "600b08f76670a43c028aef41267de972766af5bc"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 15:22:37 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 15:22:37 2026 +0800"
      },
      "message": "fix\n"
    },
    {
      "commit": "600b08f76670a43c028aef41267de972766af5bc",
      "tree": "bfb063968dd6efc3a6854c6489fc5e055694d24b",
      "parents": [
        "f7dc71a6b9f6c55900da1e3f5d88f8c4b92a3500"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 15:16:22 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 15:16:22 2026 +0800"
      },
      "message": "fix: fix github ci\n"
    },
    {
      "commit": "f7dc71a6b9f6c55900da1e3f5d88f8c4b92a3500",
      "tree": "a9bf84979e121e2900c60db49b57a36e2d5a5f33",
      "parents": [
        "4109d2d2249df5f3759d92fc428b0e89b2d7db0b",
        "6cb483a3442ae77abffe73f5e1a63ab8ffb80ed6"
      ],
      "author": {
        "name": "Jingsong Lee",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 14:38:33 2026 +0800"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon May 18 14:38:33 2026 +0800"
      },
      "message": "[core] Add mosaic-core crate with format spec, reader, and writer"
    },
    {
      "commit": "6cb483a3442ae77abffe73f5e1a63ab8ffb80ed6",
      "tree": "a9bf84979e121e2900c60db49b57a36e2d5a5f33",
      "parents": [
        "448e02cdb2ffc316434078abac2446ad8141e8c8"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 14:13:06 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 14:13:06 2026 +0800"
      },
      "message": "Fix comments\n"
    },
    {
      "commit": "448e02cdb2ffc316434078abac2446ad8141e8c8",
      "tree": "ef25f325a4ed369d9744d580334f7f6a702e8523",
      "parents": [
        "b68cf6abd23497a371b83f572e92fa0e64ab8154"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 13:58:48 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 13:59:16 2026 +0800"
      },
      "message": "[ci] Add GitHub Actions workflow for build, test, clippy, and fmt\n"
    },
    {
      "commit": "b68cf6abd23497a371b83f572e92fa0e64ab8154",
      "tree": "e5931c0f3228cc3c96d93695080f70a7efab6513",
      "parents": [
        "4109d2d2249df5f3759d92fc428b0e89b2d7db0b"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 13:44:33 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 13:53:27 2026 +0800"
      },
      "message": "[core] Add mosaic-core crate with format spec, reader, and writer\n\nInitial contribution of the Mosaic file format core library:\n- Format specification (spec.rs): magic bytes, version, footer layout,\n  bucket layouts (monolithic and paged), encoding types\n- Schema (schema.rs): column metadata, bucket assignment, serialization\n- Writer (writer.rs, bucket_writer.rs): row-group-based writer with\n  automatic encoding selection (const, dict, plain), zstd compression,\n  and paged bucket support for wide tables\n- Reader (reader.rs, bucket_reader.rs): two-round IO strategy with\n  range coalescing, column projection, paged bucket optimization\n- Types (types.rs, values.rs): type system mapping to Arrow types\n- Utilities (varint.rs, bpe.rs): variable-length integer encoding,\n  byte-pair encoding for string compression\n"
    },
    {
      "commit": "4109d2d2249df5f3759d92fc428b0e89b2d7db0b",
      "tree": "010c767bdcb1c528e3eee2facd4be1a24f31195f",
      "parents": [
        "45383b5039e3ebbc57f7391abf12891c72eeb33f"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 13:25:14 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 13:25:14 2026 +0800"
      },
      "message": "Update README.md\n"
    },
    {
      "commit": "45383b5039e3ebbc57f7391abf12891c72eeb33f",
      "tree": "c693f320185e8643963fc163da6ec77088db042b",
      "parents": [
        "8efef0dd8ab91d1af8c29abcaca90cb52182d25e"
      ],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 13:22:48 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 13:22:48 2026 +0800"
      },
      "message": "Add project basic files\n"
    },
    {
      "commit": "8efef0dd8ab91d1af8c29abcaca90cb52182d25e",
      "tree": "bbf99220d6bfe348cdc6c4f6360df33f4ba99252",
      "parents": [],
      "author": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 13:14:12 2026 +0800"
      },
      "committer": {
        "name": "JingsongLi",
        "email": "jingsonglee0@gmail.com",
        "time": "Mon May 18 13:14:12 2026 +0800"
      },
      "message": "first commit\n"
    }
  ]
}
