pond-ts 0.17.0 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +179 -1
- package/README.md +142 -382
- package/dist/{aggregate-columns.d.ts → batch/aggregate-columns.d.ts} +1 -1
- package/dist/batch/aggregate-columns.d.ts.map +1 -0
- package/dist/{aggregate-columns.js → batch/aggregate-columns.js} +1 -1
- package/dist/batch/aggregate-columns.js.map +1 -0
- package/dist/batch/index.d.ts +3 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/batch/index.js +3 -0
- package/dist/batch/index.js.map +1 -0
- package/dist/{json.d.ts → batch/json.d.ts} +3 -3
- package/dist/batch/json.d.ts.map +1 -0
- package/dist/{json.js → batch/json.js} +4 -4
- package/dist/batch/json.js.map +1 -0
- package/dist/{PartitionedTimeSeries.d.ts → batch/partitioned-time-series.d.ts} +9 -9
- package/dist/batch/partitioned-time-series.d.ts.map +1 -0
- package/dist/{PartitionedTimeSeries.js → batch/partitioned-time-series.js} +4 -4
- package/dist/batch/partitioned-time-series.js.map +1 -0
- package/dist/{TimeSeries.d.ts → batch/time-series.d.ts} +171 -41
- package/dist/batch/time-series.d.ts.map +1 -0
- package/dist/{TimeSeries.js → batch/time-series.js} +311 -50
- package/dist/batch/time-series.js.map +1 -0
- package/dist/batch/validate.d.ts +44 -0
- package/dist/batch/validate.d.ts.map +1 -0
- package/dist/batch/validate.js +435 -0
- package/dist/batch/validate.js.map +1 -0
- package/dist/column.d.ts +396 -0
- package/dist/column.d.ts.map +1 -0
- package/dist/column.js +767 -0
- package/dist/column.js.map +1 -0
- package/dist/columnar/array-column.d.ts +68 -0
- package/dist/columnar/array-column.d.ts.map +1 -0
- package/dist/columnar/array-column.js +233 -0
- package/dist/columnar/array-column.js.map +1 -0
- package/dist/columnar/builder.d.ts +126 -0
- package/dist/columnar/builder.d.ts.map +1 -0
- package/dist/columnar/builder.js +516 -0
- package/dist/columnar/builder.js.map +1 -0
- package/dist/columnar/chunked-column.d.ts +235 -0
- package/dist/columnar/chunked-column.d.ts.map +1 -0
- package/dist/columnar/chunked-column.js +738 -0
- package/dist/columnar/chunked-column.js.map +1 -0
- package/dist/columnar/column.d.ts +175 -0
- package/dist/columnar/column.d.ts.map +1 -0
- package/dist/columnar/column.js +231 -0
- package/dist/columnar/column.js.map +1 -0
- package/dist/columnar/concat.d.ts +47 -0
- package/dist/columnar/concat.d.ts.map +1 -0
- package/dist/columnar/concat.js +418 -0
- package/dist/columnar/concat.js.map +1 -0
- package/dist/columnar/index.d.ts +41 -0
- package/dist/columnar/index.d.ts.map +1 -0
- package/dist/columnar/index.js +40 -0
- package/dist/columnar/index.js.map +1 -0
- package/dist/columnar/key-column.d.ts +235 -0
- package/dist/columnar/key-column.d.ts.map +1 -0
- package/dist/columnar/key-column.js +477 -0
- package/dist/columnar/key-column.js.map +1 -0
- package/dist/columnar/ring-buffer.d.ts +112 -0
- package/dist/columnar/ring-buffer.d.ts.map +1 -0
- package/dist/columnar/ring-buffer.js +943 -0
- package/dist/columnar/ring-buffer.js.map +1 -0
- package/dist/columnar/scatter.d.ts +78 -0
- package/dist/columnar/scatter.d.ts.map +1 -0
- package/dist/columnar/scatter.js +126 -0
- package/dist/columnar/scatter.js.map +1 -0
- package/dist/columnar/store.d.ts +80 -0
- package/dist/columnar/store.d.ts.map +1 -0
- package/dist/columnar/store.js +167 -0
- package/dist/columnar/store.js.map +1 -0
- package/dist/columnar/string-column.d.ts +200 -0
- package/dist/columnar/string-column.d.ts.map +1 -0
- package/dist/columnar/string-column.js +500 -0
- package/dist/columnar/string-column.js.map +1 -0
- package/dist/columnar/types.d.ts +51 -0
- package/dist/columnar/types.d.ts.map +1 -0
- package/dist/columnar/types.js +14 -0
- package/dist/columnar/types.js.map +1 -0
- package/dist/columnar/validity.d.ts +121 -0
- package/dist/columnar/validity.d.ts.map +1 -0
- package/dist/columnar/validity.js +358 -0
- package/dist/columnar/validity.js.map +1 -0
- package/dist/columnar/view.d.ts +97 -0
- package/dist/columnar/view.d.ts.map +1 -0
- package/dist/columnar/view.js +300 -0
- package/dist/columnar/view.js.map +1 -0
- package/dist/core/calendar.d.ts.map +1 -0
- package/dist/core/calendar.js.map +1 -0
- package/dist/core/duration.d.ts.map +1 -0
- package/dist/core/duration.js.map +1 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/{Event.d.ts → core/event.d.ts} +5 -5
- package/dist/core/event.d.ts.map +1 -0
- package/dist/{Event.js → core/event.js} +5 -5
- package/dist/core/event.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +6 -0
- package/dist/core/index.js.map +1 -0
- package/dist/{Interval.d.ts → core/interval.d.ts} +2 -2
- package/dist/core/interval.d.ts.map +1 -0
- package/dist/{Interval.js → core/interval.js} +2 -2
- package/dist/core/interval.js.map +1 -0
- package/dist/{temporal.d.ts → core/temporal.d.ts} +3 -3
- package/dist/core/temporal.d.ts.map +1 -0
- package/dist/core/temporal.js.map +1 -0
- package/dist/{TimeRange.d.ts → core/time-range.d.ts} +1 -1
- package/dist/core/time-range.d.ts.map +1 -0
- package/dist/{TimeRange.js → core/time-range.js} +1 -1
- package/dist/core/time-range.js.map +1 -0
- package/dist/{Time.d.ts → core/time.d.ts} +2 -2
- package/dist/core/time.d.ts.map +1 -0
- package/dist/{Time.js → core/time.js} +2 -2
- package/dist/core/time.js.map +1 -0
- package/dist/index.d.ts +38 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +55 -18
- package/dist/index.js.map +1 -1
- package/dist/live/index.d.ts +20 -0
- package/dist/live/index.d.ts.map +1 -0
- package/dist/live/index.js +12 -0
- package/dist/live/index.js.map +1 -0
- package/dist/{LiveAggregation.d.ts → live/live-aggregation.d.ts} +10 -10
- package/dist/live/live-aggregation.d.ts.map +1 -0
- package/dist/{LiveAggregation.js → live/live-aggregation.js} +9 -9
- package/dist/live/live-aggregation.js.map +1 -0
- package/dist/live/live-chunked-storage.d.ts +78 -0
- package/dist/live/live-chunked-storage.d.ts.map +1 -0
- package/dist/live/live-chunked-storage.js +274 -0
- package/dist/live/live-chunked-storage.js.map +1 -0
- package/dist/{LiveFusedRolling.d.ts → live/live-fused-rolling.d.ts} +4 -4
- package/dist/live/live-fused-rolling.d.ts.map +1 -0
- package/dist/{LiveFusedRolling.js → live/live-fused-rolling.js} +6 -6
- package/dist/live/live-fused-rolling.js.map +1 -0
- package/dist/{live-history.d.ts → live/live-history.d.ts} +1 -1
- package/dist/live/live-history.d.ts.map +1 -0
- package/dist/{live-history.js → live/live-history.js} +1 -1
- package/dist/live/live-history.js.map +1 -0
- package/dist/{LivePartitionedFusedRolling.d.ts → live/live-partitioned-fused-rolling.d.ts} +3 -3
- package/dist/live/live-partitioned-fused-rolling.d.ts.map +1 -0
- package/dist/{LivePartitionedFusedRolling.js → live/live-partitioned-fused-rolling.js} +6 -6
- package/dist/live/live-partitioned-fused-rolling.js.map +1 -0
- package/dist/{LivePartitionedSeries.d.ts → live/live-partitioned-series.d.ts} +48 -23
- package/dist/live/live-partitioned-series.d.ts.map +1 -0
- package/dist/{LivePartitionedSeries.js → live/live-partitioned-series.js} +78 -24
- package/dist/live/live-partitioned-series.js.map +1 -0
- package/dist/{LivePartitionedSyncRolling.d.ts → live/live-partitioned-sync-rolling.d.ts} +3 -3
- package/dist/live/live-partitioned-sync-rolling.d.ts.map +1 -0
- package/dist/{LivePartitionedSyncRolling.js → live/live-partitioned-sync-rolling.js} +6 -6
- package/dist/live/live-partitioned-sync-rolling.js.map +1 -0
- package/dist/{LiveReduce.d.ts → live/live-reduce.d.ts} +22 -9
- package/dist/live/live-reduce.d.ts.map +1 -0
- package/dist/{LiveReduce.js → live/live-reduce.js} +89 -21
- package/dist/live/live-reduce.js.map +1 -0
- package/dist/{LiveRollingAggregation.d.ts → live/live-rolling-aggregation.d.ts} +8 -8
- package/dist/live/live-rolling-aggregation.d.ts.map +1 -0
- package/dist/{LiveRollingAggregation.js → live/live-rolling-aggregation.js} +8 -8
- package/dist/live/live-rolling-aggregation.js.map +1 -0
- package/dist/{LiveSeries.d.ts → live/live-series.d.ts} +51 -15
- package/dist/live/live-series.d.ts.map +1 -0
- package/dist/{LiveSeries.js → live/live-series.js} +331 -104
- package/dist/live/live-series.js.map +1 -0
- package/dist/live/live-storage.d.ts +155 -0
- package/dist/live/live-storage.d.ts.map +1 -0
- package/dist/live/live-storage.js +142 -0
- package/dist/live/live-storage.js.map +1 -0
- package/dist/{LiveView.d.ts → live/live-view.d.ts} +11 -11
- package/dist/live/live-view.d.ts.map +1 -0
- package/dist/{LiveView.js → live/live-view.js} +10 -10
- package/dist/live/live-view.js.map +1 -0
- package/dist/live/series-store.d.ts +212 -0
- package/dist/live/series-store.d.ts.map +1 -0
- package/dist/live/series-store.js +539 -0
- package/dist/live/series-store.js.map +1 -0
- package/dist/{triggers.d.ts → live/triggers.d.ts} +3 -3
- package/dist/live/triggers.d.ts.map +1 -0
- package/dist/{triggers.js → live/triggers.js} +1 -1
- package/dist/live/triggers.js.map +1 -0
- package/dist/reducers/avg.d.ts.map +1 -1
- package/dist/reducers/avg.js +22 -0
- package/dist/reducers/avg.js.map +1 -1
- package/dist/reducers/count.d.ts.map +1 -1
- package/dist/reducers/count.js +6 -0
- package/dist/reducers/count.js.map +1 -1
- package/dist/reducers/index.d.ts +1 -1
- package/dist/reducers/index.d.ts.map +1 -1
- package/dist/reducers/max.d.ts.map +1 -1
- package/dist/reducers/max.js +27 -0
- package/dist/reducers/max.js.map +1 -1
- package/dist/reducers/median.d.ts.map +1 -1
- package/dist/reducers/median.js +4 -1
- package/dist/reducers/median.js.map +1 -1
- package/dist/reducers/min.d.ts.map +1 -1
- package/dist/reducers/min.js +40 -0
- package/dist/reducers/min.js.map +1 -1
- package/dist/reducers/percentile.d.ts +36 -0
- package/dist/reducers/percentile.d.ts.map +1 -1
- package/dist/reducers/percentile.js +91 -0
- package/dist/reducers/percentile.js.map +1 -1
- package/dist/reducers/rolling.d.ts +1 -1
- package/dist/reducers/rolling.d.ts.map +1 -1
- package/dist/reducers/stdev.d.ts.map +1 -1
- package/dist/reducers/stdev.js +57 -0
- package/dist/reducers/stdev.js.map +1 -1
- package/dist/reducers/sum.d.ts.map +1 -1
- package/dist/reducers/sum.js +19 -0
- package/dist/reducers/sum.js.map +1 -1
- package/dist/reducers/types.d.ts +35 -1
- package/dist/reducers/types.d.ts.map +1 -1
- package/dist/schema/aggregate.d.ts +150 -0
- package/dist/schema/aggregate.d.ts.map +1 -0
- package/dist/schema/aggregate.js +2 -0
- package/dist/schema/aggregate.js.map +1 -0
- package/dist/schema/diff.d.ts +29 -0
- package/dist/schema/diff.d.ts.map +1 -0
- package/dist/schema/diff.js +2 -0
- package/dist/schema/diff.js.map +1 -0
- package/dist/schema/events.d.ts +65 -0
- package/dist/schema/events.d.ts.map +1 -0
- package/dist/schema/events.js +2 -0
- package/dist/schema/events.js.map +1 -0
- package/dist/schema/index.d.ts +11 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/join.d.ts +39 -0
- package/dist/schema/join.d.ts.map +1 -0
- package/dist/schema/join.js +2 -0
- package/dist/schema/join.js.map +1 -0
- package/dist/schema/json.d.ts +47 -0
- package/dist/schema/json.d.ts.map +1 -0
- package/dist/schema/json.js +2 -0
- package/dist/schema/json.js.map +1 -0
- package/dist/{types-public.d.ts → schema/public.d.ts} +2 -2
- package/dist/schema/public.d.ts.map +1 -0
- package/dist/schema/public.js +2 -0
- package/dist/schema/public.js.map +1 -0
- package/dist/{types-reduce.d.ts → schema/reduce.d.ts} +4 -3
- package/dist/schema/reduce.d.ts.map +1 -0
- package/dist/schema/reduce.js +2 -0
- package/dist/schema/reduce.js.map +1 -0
- package/dist/schema/reshape.d.ts +89 -0
- package/dist/schema/reshape.d.ts.map +1 -0
- package/dist/schema/reshape.js +2 -0
- package/dist/schema/reshape.js.map +1 -0
- package/dist/{types-fused-rolling.d.ts → schema/rolling.d.ts} +10 -4
- package/dist/schema/rolling.d.ts.map +1 -0
- package/dist/schema/rolling.js +2 -0
- package/dist/schema/rolling.js.map +1 -0
- package/dist/schema/series.d.ts +79 -0
- package/dist/schema/series.d.ts.map +1 -0
- package/dist/{types.js → schema/series.js} +1 -1
- package/dist/schema/series.js.map +1 -0
- package/dist/{BoundedSequence.d.ts → sequence/bounded-sequence.d.ts} +3 -3
- package/dist/sequence/bounded-sequence.d.ts.map +1 -0
- package/dist/{BoundedSequence.js → sequence/bounded-sequence.js} +2 -2
- package/dist/sequence/bounded-sequence.js.map +1 -0
- package/dist/sequence/index.d.ts +6 -0
- package/dist/sequence/index.d.ts.map +1 -0
- package/dist/sequence/index.js +3 -0
- package/dist/sequence/index.js.map +1 -0
- package/dist/sequence/sample.d.ts.map +1 -0
- package/dist/sequence/sample.js.map +1 -0
- package/dist/{Sequence.d.ts → sequence/sequence.d.ts} +5 -5
- package/dist/sequence/sequence.d.ts.map +1 -0
- package/dist/{Sequence.js → sequence/sequence.js} +7 -7
- package/dist/sequence/sequence.js.map +1 -0
- package/package.json +6 -3
- package/dist/BoundedSequence.d.ts.map +0 -1
- package/dist/BoundedSequence.js.map +0 -1
- package/dist/Event.d.ts.map +0 -1
- package/dist/Event.js.map +0 -1
- package/dist/Interval.d.ts.map +0 -1
- package/dist/Interval.js.map +0 -1
- package/dist/LiveAggregation.d.ts.map +0 -1
- package/dist/LiveAggregation.js.map +0 -1
- package/dist/LiveFusedRolling.d.ts.map +0 -1
- package/dist/LiveFusedRolling.js.map +0 -1
- package/dist/LivePartitionedFusedRolling.d.ts.map +0 -1
- package/dist/LivePartitionedFusedRolling.js.map +0 -1
- package/dist/LivePartitionedSeries.d.ts.map +0 -1
- package/dist/LivePartitionedSeries.js.map +0 -1
- package/dist/LivePartitionedSyncRolling.d.ts.map +0 -1
- package/dist/LivePartitionedSyncRolling.js.map +0 -1
- package/dist/LiveReduce.d.ts.map +0 -1
- package/dist/LiveReduce.js.map +0 -1
- package/dist/LiveRollingAggregation.d.ts.map +0 -1
- package/dist/LiveRollingAggregation.js.map +0 -1
- package/dist/LiveSeries.d.ts.map +0 -1
- package/dist/LiveSeries.js.map +0 -1
- package/dist/LiveView.d.ts.map +0 -1
- package/dist/LiveView.js.map +0 -1
- package/dist/PartitionedTimeSeries.d.ts.map +0 -1
- package/dist/PartitionedTimeSeries.js.map +0 -1
- package/dist/Sequence.d.ts.map +0 -1
- package/dist/Sequence.js.map +0 -1
- package/dist/Time.d.ts.map +0 -1
- package/dist/Time.js.map +0 -1
- package/dist/TimeRange.d.ts.map +0 -1
- package/dist/TimeRange.js.map +0 -1
- package/dist/TimeSeries.d.ts.map +0 -1
- package/dist/TimeSeries.js.map +0 -1
- package/dist/aggregate-columns.d.ts.map +0 -1
- package/dist/aggregate-columns.js.map +0 -1
- package/dist/calendar.d.ts.map +0 -1
- package/dist/calendar.js.map +0 -1
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/json.d.ts.map +0 -1
- package/dist/json.js.map +0 -1
- package/dist/live-history.d.ts.map +0 -1
- package/dist/live-history.js.map +0 -1
- package/dist/sample.d.ts.map +0 -1
- package/dist/sample.js.map +0 -1
- package/dist/temporal.d.ts.map +0 -1
- package/dist/temporal.js.map +0 -1
- package/dist/triggers.d.ts.map +0 -1
- package/dist/triggers.js.map +0 -1
- package/dist/types-aggregate.d.ts +0 -61
- package/dist/types-aggregate.d.ts.map +0 -1
- package/dist/types-aggregate.js +0 -2
- package/dist/types-aggregate.js.map +0 -1
- package/dist/types-fused-rolling.d.ts.map +0 -1
- package/dist/types-fused-rolling.js +0 -2
- package/dist/types-fused-rolling.js.map +0 -1
- package/dist/types-public.d.ts.map +0 -1
- package/dist/types-public.js +0 -2
- package/dist/types-public.js.map +0 -1
- package/dist/types-reduce.d.ts.map +0 -1
- package/dist/types-reduce.js +0 -2
- package/dist/types-reduce.js.map +0 -1
- package/dist/types.d.ts +0 -416
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils/duration.d.ts.map +0 -1
- package/dist/utils/duration.js.map +0 -1
- package/dist/validate.d.ts +0 -3
- package/dist/validate.d.ts.map +0 -1
- package/dist/validate.js +0 -171
- package/dist/validate.js.map +0 -1
- /package/dist/{calendar.d.ts → core/calendar.d.ts} +0 -0
- /package/dist/{calendar.js → core/calendar.js} +0 -0
- /package/dist/{utils → core}/duration.d.ts +0 -0
- /package/dist/{utils → core}/duration.js +0 -0
- /package/dist/{errors.d.ts → core/errors.d.ts} +0 -0
- /package/dist/{errors.js → core/errors.js} +0 -0
- /package/dist/{temporal.js → core/temporal.js} +0 -0
- /package/dist/{sample.d.ts → sequence/sample.d.ts} +0 -0
- /package/dist/{sample.js → sequence/sample.js} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,10 +7,187 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
|
7
7
|
file covers both packages. Pre-1.0: minor bumps may include new features and
|
|
8
8
|
type-level changes; patch bumps are strictly additive.
|
|
9
9
|
|
|
10
|
-
[Unreleased]: https://github.com/pjm17971/pond-ts/compare/v0.
|
|
10
|
+
[Unreleased]: https://github.com/pjm17971/pond-ts/compare/v0.18.0...HEAD
|
|
11
|
+
[0.18.0]: https://github.com/pjm17971/pond-ts/compare/v0.17.1...v0.18.0
|
|
11
12
|
|
|
12
13
|
## [Unreleased]
|
|
13
14
|
|
|
15
|
+
## [0.18.0] — 2026-05-30
|
|
16
|
+
|
|
17
|
+
This release graduates the **Phase 4.7 columnar substrate** from
|
|
18
|
+
framework-internal (shipped piecemeal to `main` since v0.17.1) to a
|
|
19
|
+
user-visible **public column API**, plus a column-native live buffer that
|
|
20
|
+
fixes a high-partition-count OOM. Everything is additive except one
|
|
21
|
+
documented breaking change (interval label kinds) and one documented
|
|
22
|
+
behavior change (chunked-backed `pushMany` commit semantics). Pre-1.0: the
|
|
23
|
+
column API is expected to keep moving toward its eventual shape.
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- **Public column API (Phase 4.7 step 8).** A column-centric extraction
|
|
28
|
+
surface on `TimeSeries`, for high-throughput and charting consumers that
|
|
29
|
+
want typed-array access instead of per-`Event` iteration. Additive — every
|
|
30
|
+
existing row / `Event` API is unchanged.
|
|
31
|
+
- `series.column(name)` returns a schema-narrowed typed column view, with
|
|
32
|
+
public re-exports of the `Float64Column` / `BooleanColumn` /
|
|
33
|
+
`StringColumn` / `KeyColumn` (time / timeRange / interval) variants
|
|
34
|
+
([#154](https://github.com/pjm17971/pond-ts/pull/154),
|
|
35
|
+
[#155](https://github.com/pjm17971/pond-ts/pull/155)).
|
|
36
|
+
- `Float64Column`: scalar reductions (`min` / `max` / `sum` / `mean` /
|
|
37
|
+
`count` / …) and `scan`
|
|
38
|
+
([#155](https://github.com/pjm17971/pond-ts/pull/155)); `bin(...)` for
|
|
39
|
+
histogram / downsample bucketing
|
|
40
|
+
([#156](https://github.com/pjm17971/pond-ts/pull/156)); and
|
|
41
|
+
`toFloat64Array()` for a storage-agnostic gather into a dense array
|
|
42
|
+
([#165](https://github.com/pjm17971/pond-ts/pull/165)).
|
|
43
|
+
- `KeyColumn.at(i)` and `.slice(start, end)`
|
|
44
|
+
([#159](https://github.com/pjm17971/pond-ts/pull/159)).
|
|
45
|
+
- **Columnar substrate (Phase 4.7 step 1, framework layer).** All
|
|
46
|
+
eight sub-steps (1a–1h) shipped to main as PRs #132 / #133 /
|
|
47
|
+
#134 / #135 / #136 / #147 / #148 / #149. See `PLAN.md` and
|
|
48
|
+
[`packages/core/src/columnar/README.md`](packages/core/src/columnar/README.md)
|
|
49
|
+
for the full inventory. Framework-internal — surfaced behind the existing
|
|
50
|
+
`TimeSeries` API at step 2 (below) and the public column API at step 8
|
|
51
|
+
(above).
|
|
52
|
+
|
|
53
|
+
### Changed
|
|
54
|
+
|
|
55
|
+
- **Chunked columnar live backing for strict time-keyed `LiveSeries`**
|
|
56
|
+
([#170](https://github.com/pjm17971/pond-ts/pull/170)). A top-level
|
|
57
|
+
`LiveSeries` with `ordering: 'strict'` and a time key now backs its
|
|
58
|
+
retained window with batch-granular columnar chunks instead of an
|
|
59
|
+
`Event[]` window — each `pushMany` validates straight into typed columns,
|
|
60
|
+
retaining **zero `Event` objects** (~4.7× less retained heap in-pond; the
|
|
61
|
+
high-partition-count OOM fix). Two consequences:
|
|
62
|
+
- **`pushMany` commit semantics** on the chunked path: the batch is
|
|
63
|
+
appended atomically _before_ any `'event'` fires, so a listener observes
|
|
64
|
+
the full post-batch `length` (not a row-by-row `1, 2, 3`), and a listener
|
|
65
|
+
that throws mid-batch leaves the whole batch committed. The per-row
|
|
66
|
+
`Event[]` backing (`reorder` / `drop` / interval-keyed /
|
|
67
|
+
internally-created series) keeps per-row commit. Listener _values_ and
|
|
68
|
+
`event → batch → evict` ordering are unchanged.
|
|
69
|
+
- **`LiveReduce` eviction** resolves by event identity (primary) with a
|
|
70
|
+
FIFO-frontier fallback for the chunked backing's materialized evictions —
|
|
71
|
+
correct for both `reorder` and the chunked backing. `min` / `max` /
|
|
72
|
+
`first` / `last` / `samples` over a `reorder` source **with retention**
|
|
73
|
+
remain a documented limitation (see `LiveReduce` JSDoc and PLAN
|
|
74
|
+
"Deferred") — pre-existing, not introduced here.
|
|
75
|
+
- **Internal, behavior-preserving performance work.** Column-native intake
|
|
76
|
+
bypasses per-row `Event` allocation at `TimeSeries` construction
|
|
77
|
+
([#151](https://github.com/pjm17971/pond-ts/pull/151)); numeric reducers
|
|
78
|
+
(`min` / `max` / `sum` / `avg` / …) compute over typed-array columns where
|
|
79
|
+
available, with NaN parity preserved
|
|
80
|
+
([#153](https://github.com/pjm17971/pond-ts/pull/153)); the live storage
|
|
81
|
+
strategy was extracted behind an internal interface
|
|
82
|
+
([#168](https://github.com/pjm17971/pond-ts/pull/168)).
|
|
83
|
+
|
|
84
|
+
### Changed (BREAKING)
|
|
85
|
+
|
|
86
|
+
- **Interval-keyed series must use one label type throughout**
|
|
87
|
+
([#150](https://github.com/pjm17971/pond-ts/pull/150)). Pre-2a,
|
|
88
|
+
TimeSeries silently tolerated mixed-kind interval labels —
|
|
89
|
+
rows with `value: 'row-1'` (string) and `value: 2` (number) could
|
|
90
|
+
coexist in a single series because events were stored as a raw
|
|
91
|
+
array with no per-column type alignment. The columnar substrate
|
|
92
|
+
introduced at Phase 4.7 enforces one label kind per column via
|
|
93
|
+
`IntervalKeyColumn`, so mixed-kind labels now throw at series
|
|
94
|
+
construction with a row-pointed error message.
|
|
95
|
+
- **Affected:** Any series built via `new TimeSeries(...)`,
|
|
96
|
+
`TimeSeries.fromJSON(...)`, `TimeSeries.fromEvents(...)`, or
|
|
97
|
+
any transform that produces interval-keyed events, where the
|
|
98
|
+
`value` field of `IntervalInput` rows or `Interval` keys
|
|
99
|
+
mixes `string` and `number` types.
|
|
100
|
+
- **Migration:** Choose one label kind for the whole series.
|
|
101
|
+
Numeric labels can be stringified at intake (`String(label)`)
|
|
102
|
+
if the downstream consumer accepts string equality; string
|
|
103
|
+
labels parseable as integers can be converted to numbers at
|
|
104
|
+
intake. The error message names the first offending row so
|
|
105
|
+
the offending data is easy to find.
|
|
106
|
+
- **Rationale:** Aligns the row-API contract with the columnar
|
|
107
|
+
substrate's per-column kind discipline (matching Polars /
|
|
108
|
+
Arrow / Parquet). The previous behavior produced type-broken
|
|
109
|
+
events that worked only because TimeSeries didn't enforce
|
|
110
|
+
per-column alignment; downstream columnar operators (the
|
|
111
|
+
upcoming reducer adaptation in steps 3+) require it.
|
|
112
|
+
- **Affected types:** `IntervalValue` remains `string | number`
|
|
113
|
+
per the `Interval` class contract. The runtime restriction
|
|
114
|
+
is at the **series** level (all intervals within one series
|
|
115
|
+
must share a kind), not the per-interval level. Type-level
|
|
116
|
+
narrowing of `IntervalKeyedSchema<S>` over label kind is a
|
|
117
|
+
follow-up deferred to a later sub-step.
|
|
118
|
+
|
|
119
|
+
## [0.17.1] — 2026-05-11
|
|
120
|
+
|
|
121
|
+
Bug fix: `live.partitionBy()` now default-inherits `ordering`,
|
|
122
|
+
`graceWindow`, and `retention` from the source `LiveSeries`. Surfaced
|
|
123
|
+
by the gRPC experiment's
|
|
124
|
+
[M4 late-data friction note](https://github.com/pjm17971/pond-grpc-experiment/blob/main/friction-notes/M4.md),
|
|
125
|
+
which measured `99.5%` of late events crashing the partition router
|
|
126
|
+
under `source = LiveSeries({ ordering: 'reorder', graceWindow })`
|
|
127
|
+
followed by bare `partitionBy('host')`.
|
|
128
|
+
|
|
129
|
+
### Fixed
|
|
130
|
+
|
|
131
|
+
- **`LiveSeries.partitionBy(by)` default-inherits source config**
|
|
132
|
+
([#TBD](https://github.com/pjm17971/pond-ts/pull/TBD)). Pre-fix,
|
|
133
|
+
per-partition sub-series were constructed with default
|
|
134
|
+
`ordering: 'strict'` regardless of source mode. Under a `'reorder'`
|
|
135
|
+
source, late events that the source accepted via its reorder path
|
|
136
|
+
were routed into the partition's `#insert` and threw with a
|
|
137
|
+
strict-mode error; the throw propagated back through the source's
|
|
138
|
+
listener fan-out into `live.push()`.
|
|
139
|
+
|
|
140
|
+
Post-fix, `partitionBy(by)` defaults each per-partition sub-series'
|
|
141
|
+
`ordering`, `graceWindow`, and `retention` to the source's values.
|
|
142
|
+
Explicit options on `partitionBy(by, { ordering, ... })` override
|
|
143
|
+
per-field. `graceWindow` inheritance is gated on effective ordering
|
|
144
|
+
being `'reorder'` (LiveSeries rejects strict + graceWindow combos).
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
// Pre-0.17.1: crashed the partition router
|
|
148
|
+
const live = new LiveSeries({
|
|
149
|
+
name: 'metrics',
|
|
150
|
+
schema,
|
|
151
|
+
ordering: 'reorder',
|
|
152
|
+
graceWindow: '30s',
|
|
153
|
+
});
|
|
154
|
+
live.partitionBy('host'); // ← partition was strict regardless
|
|
155
|
+
|
|
156
|
+
// Post-0.17.1: partitions inherit reorder + 30s grace; late events
|
|
157
|
+
// accept correctly via the reorder path.
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Existing callers with explicit `partitionBy(by, { ordering, ... })`:
|
|
161
|
+
unchanged. Existing callers on `'strict'` sources: unchanged.
|
|
162
|
+
Existing callers on `'reorder'` sources with bare `partitionBy`:
|
|
163
|
+
the previously-thrown late events now accept correctly — bug fix,
|
|
164
|
+
not a behavior change anyone could rely on.
|
|
165
|
+
|
|
166
|
+
- **`collect()` and `apply()` on `LivePartitionedSeries` default-
|
|
167
|
+
inherit `ordering` and `graceWindow`** from the partitioned series
|
|
168
|
+
(which inherits from source). Pre-fix, the unified buffer defaulted
|
|
169
|
+
to `'strict'`, so partition fan-in on a `'reorder'` source could
|
|
170
|
+
deliver events out-of-order to a strict unified buffer and throw.
|
|
171
|
+
Retention stays caller-explicit on these per the existing append-
|
|
172
|
+
only fan-in semantics.
|
|
173
|
+
|
|
174
|
+
### Notes
|
|
175
|
+
|
|
176
|
+
- **Six regression tests pin the new defaults** in
|
|
177
|
+
`LivePartitionedSeries.test.ts`: inherited ordering, inherited
|
|
178
|
+
graceWindow within reorder, inherited retention on partitions,
|
|
179
|
+
explicit override of inheritance, strict-source no-change, and the
|
|
180
|
+
edge case where overriding ordering to strict suppresses graceWindow
|
|
181
|
+
inheritance. `collect()` inheritance pinned separately.
|
|
182
|
+
- The gRPC experiment's M4 friction note also surfaced milestone B
|
|
183
|
+
(capability-based late repair) as **driver-light by empirical test**
|
|
184
|
+
after Codex's adversarial pass caught simulator RNG leakage across
|
|
185
|
+
A/B legs. Drift signal collapsed to within noise on every host once
|
|
186
|
+
all randomness sources were seeded — milestone B's library design
|
|
187
|
+
stays sound, but the gRPC experiment's measurement style (last-tick
|
|
188
|
+
`.value()` reads) doesn't surface its payoff. Milestone B sequencing
|
|
189
|
+
updated in PLAN.md to reflect this finding.
|
|
190
|
+
|
|
14
191
|
## [0.17.0] — 2026-05-08
|
|
15
192
|
|
|
16
193
|
`sample({...})` operator wave: bounded-memory stream thinning, surfaced
|
|
@@ -385,6 +562,7 @@ compaction); any downstream code reading `#entries` directly would
|
|
|
385
562
|
break, but those fields are private. Public APIs and types are
|
|
386
563
|
unchanged.
|
|
387
564
|
|
|
565
|
+
[0.17.1]: https://github.com/pjm17971/pond-ts/compare/v0.17.0...v0.17.1
|
|
388
566
|
[0.17.0]: https://github.com/pjm17971/pond-ts/compare/v0.16.1...v0.17.0
|
|
389
567
|
[0.16.1]: https://github.com/pjm17971/pond-ts/compare/v0.16.0...v0.16.1
|
|
390
568
|
[0.16.0]: https://github.com/pjm17971/pond-ts/compare/v0.15.2...v0.16.0
|