Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ Next.js website (`dashboard/`) and benchmarks (`bench/`).
- **Keep things in sync:** a change in behaviour updates the docs, the tests and `CHANGELOG.md` (under `Unreleased`) in
the same commit. A change to the Python bindings updates `_timelake.pyi`. A change to `timelake-wasm` or
`timelake-format` gets a rebuilt WASM bundle (`bun run build:wasm` in `packages/timelake-client`).
The Iceberg layer under `timelake-format` and `timelake-wasm` (manifests, metadata, commits) is lakekit
(`github.com/polythings/lakekit`): change it there, then here.
A change to a spec changes its status, versions (`unreleased` until a release) and history in the same commit,
and its milestone's status when that changes; a change to the plan changes the milestones. Then
`uv run python scripts/spec_index.py` updates the indexes, the roadmap and the website's lists.
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ version is a [tag on GitHub](https://github.com/polythings/timelake/tags), so it

### Fixed

- A commit from JavaScript by a writer whose clock is behind the table's last update is dated at that update, so the
snapshot log stays in time order; iceberg-rust refused to load such a table.
- The CLI prints a failed query's error once: DataFusion's errors repeat their cause, and each was printed again.
- `time_weighted_mean` over a span of several files per scan partition, such as a month of daily files grouped by
tag, failed with "runs that overlap in time": each partition now reads a stretch of time, kept to its files. Files
Expand Down Expand Up @@ -110,6 +112,11 @@ version is a [tag on GitHub](https://github.com/polythings/timelake/tags), so it

### Changed

- The WASM reader and the writer for JavaScript runtimes read and write Iceberg manifests, manifest lists and table
metadata through [lakekit](https://github.com/polythings/lakekit), a separate project for table formats without
I/O of their own. The files they write are the same as before. The writer takes the time and random numbers from
[loko](https://github.com/polythings/loko)'s JavaScript implementations; a host without `crypto.getRandomValues` is
now an error instead of falling back to `Math.random`.
- Appends convert a column to the table's type only where no value is lost. A value that doesn't fit (an integer out
of range, text that doesn't parse, a fraction for an integer column, an integer above 2^53 for a double) is an error
naming the column; it used to be written as NULL or truncated without a word. Conversions that are never exact, such
Expand Down
174 changes: 165 additions & 9 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ homepage = "https://timelake.dev"
# The published crates depend on each other by version too; scripts/release.py keeps these in step.
timelake = { path = "crates/timelake", version = "0.7.0" }
timelake-format = { path = "crates/timelake-format", version = "0.7.0" }
# Iceberg metadata, manifests and commits without I/O of their own (github.com/polythings/lakekit), shared with the
# WASM reader and writer.
lakekit-core = "0.1"
lakekit-iceberg = { version = "0.1", default-features = false }
# iceberg 0.10.1 is on Arrow 58, so DataFusion 54.x (Arrow 58, object_store 0.13) is the newest matching engine.
iceberg = "=0.10.1"
datafusion = "54.1"
Expand Down
1 change: 1 addition & 0 deletions PRIOR_ART.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Timelake is built on these. Their licenses ship with our packages through the no
|---|---|---|
| [Apache Iceberg](https://iceberg.apache.org) | Apache-2.0 | The table format: metadata, snapshots, manifests, column bounds |
| [iceberg-rust](https://github.com/apache/iceberg-rust) | Apache-2.0 | Iceberg types and metadata. Our commit layer is our own code on its public types (D13) |
| [lakekit](https://github.com/polythings/lakekit) | Apache-2.0 | Iceberg manifests, metadata and commits without I/O, for the WASM reader and writer (D24); a sibling project |
| [Apache Parquet](https://parquet.apache.org), [arrow-rs](https://github.com/apache/arrow-rs) | Apache-2.0 | Data files, the last-value index, footers; Arrow in memory and as the head codec |
| [Apache DataFusion](https://datafusion.apache.org) | Apache-2.0 | The embedded query engine (`time_bucket` is its `date_bin`) |
| [object_store](https://github.com/apache/arrow-rs-object-store) | Apache-2.0 | Every read and write to S3, GCS, Azure and local disk |
Expand Down
6 changes: 4 additions & 2 deletions crates/timelake-format/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ write = [
"dep:arrow-schema",
"dep:arrow-select",
"dep:parquet",
"dep:apache-avro",
"dep:lakekit-core",
"dep:lakekit-iceberg",
"dep:serde_json",
"dep:bytes",
"dep:futures-util",
Expand All @@ -34,7 +35,8 @@ write = [
[dependencies]
bytes = { version = "1", optional = true }
futures-util = { version = "0.3", default-features = false, features = ["alloc"], optional = true }
apache-avro = { version = "0.21", default-features = false, optional = true }
lakekit-core = { workspace = true, optional = true }
lakekit-iceberg = { workspace = true, features = ["write", "arrow", "parquet-stats"], optional = true }
chrono = { version = "0.4", default-features = false, features = ["alloc"] }
arrow-arith = { version = "58", optional = true }
arrow-array = { version = "58", optional = true }
Expand Down
Loading
Loading