pond-ts 0.9.1 → 0.10.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.
@@ -3,7 +3,7 @@ import type { BoundedSequence } from './BoundedSequence.js';
3
3
  import type { Sequence } from './Sequence.js';
4
4
  import type { DurationInput } from './utils/duration.js';
5
5
  import type { TemporalLike } from './temporal.js';
6
- import type { AggregateMap, AggregateOutputMap, AggregateSchema, AlignSchema, BaselineSchema, DedupeKeep, DiffSchema, EventDataForSchema, FillMapping, FillStrategy, NumericColumnNameForSchema, RollingAlignment, RollingSchema, SeriesSchema, SmoothAppendSchema, SmoothMethod, SmoothSchema } from './types.js';
6
+ import type { AggregateMap, AggregateOutputMap, AggregateSchema, AlignSchema, BaselineSchema, DedupeKeep, DiffSchema, EventDataForSchema, FillMapping, FillStrategy, MaterializeSchema, NumericColumnNameForSchema, RollingAlignment, RollingSchema, SeriesSchema, SmoothAppendSchema, SmoothMethod, SmoothSchema } from './types.js';
7
7
  import type { AggregateOutputMapResultSchema, RollingOutputMapSchema } from './types-aggregate.js';
8
8
  type SequenceLike = Sequence | BoundedSequence;
9
9
  type AlignMethod = 'hold' | 'linear';
@@ -51,10 +51,21 @@ type AlignSample = 'begin' | 'center' | 'end';
51
51
  * );
52
52
  * ```
53
53
  */
54
- export declare class PartitionedTimeSeries<S extends SeriesSchema> {
54
+ export declare class PartitionedTimeSeries<S extends SeriesSchema, K extends string = string> {
55
+ #private;
55
56
  readonly source: TimeSeries<S>;
56
57
  readonly by: ReadonlyArray<keyof EventDataForSchema<S> & string>;
57
- constructor(source: TimeSeries<S>, by: (keyof EventDataForSchema<S> & string) | ReadonlyArray<keyof EventDataForSchema<S> & string>);
58
+ /**
59
+ * Declared partition values when `partitionBy(col, { groups })` was
60
+ * used. When set, `toMap` iterates in declared order (not insertion
61
+ * order), empty declared groups still appear as empty `TimeSeries`
62
+ * entries, and unknown partition values throw at construction time.
63
+ */
64
+ readonly groups?: ReadonlyArray<K>;
65
+ constructor(source: TimeSeries<S>, by: (keyof EventDataForSchema<S> & string) | ReadonlyArray<keyof EventDataForSchema<S> & string>, options?: {
66
+ groups?: ReadonlyArray<K>;
67
+ });
68
+ private validateGroupMembership;
58
69
  /**
59
70
  * Materialize the partitioned view back into a regular `TimeSeries`.
60
71
  * Terminal operation — call this at the end of a chain to "collect"
@@ -90,13 +101,85 @@ export declare class PartitionedTimeSeries<S extends SeriesSchema> {
90
101
  * ```
91
102
  */
92
103
  apply<R extends SeriesSchema>(fn: (group: TimeSeries<S>) => TimeSeries<R>): TimeSeries<R>;
104
+ /**
105
+ * Materialize the partitioned view as a `Map<key, TimeSeries<S>>`,
106
+ * one entry per partition. Terminal — exits the partition view.
107
+ *
108
+ * Use this when downstream code needs to iterate or look up per
109
+ * partition (typical in dashboards: one chart line per host, one
110
+ * tooltip per region). Without this, the equivalent dance was
111
+ * `.collect().groupBy(col, fn)` — two operators where one would do.
112
+ *
113
+ * The map key is the stringified partition value for single-column
114
+ * partitions, or a `JSON.stringify`'d array of values for composite
115
+ * partitions. The single-column form preserves the value's natural
116
+ * string representation (a `host` column with values `'api-1'`
117
+ * yields keys `'api-1'`); composite keys produce JSON like
118
+ * `'["api-1","eu"]'`. Map iteration order matches the order each
119
+ * partition was first encountered in the source events.
120
+ *
121
+ * `undefined` partition values become the literal `' undefined'`
122
+ * with a **leading space** — this avoids colliding with a string
123
+ * column whose value happens to be the literal text `'undefined'`.
124
+ * The two are distinct buckets:
125
+ *
126
+ * ```ts
127
+ * series // events with host=undefined and host='undefined'
128
+ * .partitionBy('host')
129
+ * .toMap();
130
+ * // → 2 entries: ' undefined' (missing) vs 'undefined' (string literal)
131
+ * ```
132
+ *
133
+ * **Divergence from `series.groupBy(col)`:** `groupBy` uses bare
134
+ * `'undefined'` (no leading space) for missing values, so it
135
+ * collapses these two cases. `toMap`'s leading-space sentinel is
136
+ * an intentional improvement — the older `groupBy` shape silently
137
+ * loses the distinction between "missing" and "the string
138
+ * 'undefined'". Migrating from `groupBy` to `toMap` will produce
139
+ * different keys for partitions with `undefined` values; lookup
140
+ * code that previously did `.get('undefined')` should change to
141
+ * `.get(' undefined')` (note the leading space) to find the
142
+ * missing-value bucket.
143
+ *
144
+ * **Composite encoder.** For composite partitions, `JSON.stringify`
145
+ * with a `?? null` fallback emits both `null` and `undefined` as
146
+ * JSON `null`. In practice this only matters if event data
147
+ * contains explicit `null` values, which the standard
148
+ * validation/ingest paths convert to `undefined` upfront — so the
149
+ * single-column-vs-composite asymmetry is unreachable through the
150
+ * normal API.
151
+ *
152
+ * @example
153
+ * ```ts
154
+ * // Per-host event lookup
155
+ * const byHost = events.partitionBy('host').toMap();
156
+ * const apiEvents = byHost.get('api-1');
157
+ *
158
+ * // With a transform — one-shot per-partition shape change
159
+ * const points = events.partitionBy('host').toMap((g) => g.toPoints());
160
+ * for (const [host, rows] of points) {
161
+ * chart.addSeries(host, rows);
162
+ * }
163
+ *
164
+ * // Composite partition
165
+ * const byHostRegion = events
166
+ * .partitionBy(['host', 'region'])
167
+ * .toMap();
168
+ * const apiEu = byHostRegion.get('["api-1","eu"]');
169
+ * ```
170
+ */
171
+ toMap(): Map<K, TimeSeries<S>>;
172
+ toMap<R extends SeriesSchema>(transform: (group: TimeSeries<S>) => TimeSeries<R>): Map<K, TimeSeries<R>>;
173
+ toMap<R>(transform: (group: TimeSeries<S>) => R): Map<K, R>;
174
+ private static partitionKeyOf;
175
+ private static bucketByPartition;
93
176
  private static applyToSource;
94
177
  private rewrap;
95
178
  /** Per-partition `fill`. See {@link TimeSeries.fill}. */
96
179
  fill(strategy: FillStrategy | FillMapping<S>, options?: {
97
180
  limit?: number;
98
181
  maxGap?: DurationInput;
99
- }): PartitionedTimeSeries<S>;
182
+ }): PartitionedTimeSeries<S, K>;
100
183
  /**
101
184
  * Per-partition `dedupe`. The duplicate key becomes "same partition
102
185
  * columns AND same timestamp" — `partitionBy` provides the partition
@@ -107,30 +190,46 @@ export declare class PartitionedTimeSeries<S extends SeriesSchema> {
107
190
  */
108
191
  dedupe(options?: {
109
192
  keep?: DedupeKeep<S>;
110
- }): PartitionedTimeSeries<S>;
193
+ }): PartitionedTimeSeries<S, K>;
111
194
  /** Per-partition `align`. See {@link TimeSeries.align}. */
112
195
  align(sequence: SequenceLike, options?: {
113
196
  method?: AlignMethod;
114
197
  sample?: AlignSample;
115
198
  range?: TemporalLike;
116
- }): PartitionedTimeSeries<AlignSchema<S>>;
199
+ }): PartitionedTimeSeries<AlignSchema<S>, K>;
200
+ /**
201
+ * Per-partition `materialize`. See {@link TimeSeries.materialize}.
202
+ *
203
+ * **Bonus over the bare `TimeSeries.materialize` call:** every
204
+ * output row, including empty-bucket rows, gets the partition
205
+ * columns auto-populated from the partition's known key values.
206
+ * Without this, empty buckets would emit rows with `undefined`
207
+ * partition columns — forcing a follow-up
208
+ * `.fill({ host: 'hold' })` step that fails for partitions where
209
+ * every event sits in a long-outage gap.
210
+ */
211
+ materialize(sequence: SequenceLike, options?: {
212
+ sample?: AlignSample;
213
+ select?: 'first' | 'last' | 'nearest';
214
+ range?: TemporalLike;
215
+ }): PartitionedTimeSeries<MaterializeSchema<S>, K>;
117
216
  /** Per-partition `rolling`. See {@link TimeSeries.rolling}. */
118
217
  rolling<const Mapping extends AggregateMap<S>>(window: DurationInput, mapping: Mapping, options?: {
119
218
  alignment?: RollingAlignment;
120
- }): PartitionedTimeSeries<RollingSchema<S, Mapping>>;
219
+ }): PartitionedTimeSeries<RollingSchema<S, Mapping>, K>;
121
220
  rolling<const Mapping extends AggregateOutputMap<S>>(window: DurationInput, mapping: Mapping, options?: {
122
221
  alignment?: RollingAlignment;
123
- }): PartitionedTimeSeries<RollingOutputMapSchema<S, Mapping>>;
222
+ }): PartitionedTimeSeries<RollingOutputMapSchema<S, Mapping>, K>;
124
223
  rolling<const Mapping extends AggregateMap<S>>(sequence: SequenceLike, window: DurationInput, mapping: Mapping, options?: {
125
224
  alignment?: RollingAlignment;
126
225
  sample?: AlignSample;
127
226
  range?: TemporalLike;
128
- }): PartitionedTimeSeries<AggregateSchema<S, Mapping>>;
227
+ }): PartitionedTimeSeries<AggregateSchema<S, Mapping>, K>;
129
228
  rolling<const Mapping extends AggregateOutputMap<S>>(sequence: SequenceLike, window: DurationInput, mapping: Mapping, options?: {
130
229
  alignment?: RollingAlignment;
131
230
  sample?: AlignSample;
132
231
  range?: TemporalLike;
133
- }): PartitionedTimeSeries<AggregateOutputMapResultSchema<S, Mapping>>;
232
+ }): PartitionedTimeSeries<AggregateOutputMapResultSchema<S, Mapping>, K>;
134
233
  /** Per-partition `smooth`. See {@link TimeSeries.smooth}. */
135
234
  smooth<const Target extends NumericColumnNameForSchema<S>, const Output extends string | undefined = undefined>(column: Target, method: SmoothMethod, options: {
136
235
  alpha: number;
@@ -161,32 +260,32 @@ export declare class PartitionedTimeSeries<S extends SeriesSchema> {
161
260
  window: DurationInput;
162
261
  sigma: number;
163
262
  alignment?: RollingAlignment;
164
- }): PartitionedTimeSeries<S>;
263
+ }): PartitionedTimeSeries<S, K>;
165
264
  /** Per-partition `diff`. See {@link TimeSeries.diff}. */
166
265
  diff<const Target extends NumericColumnNameForSchema<S>>(columns: Target | readonly Target[], options?: {
167
266
  drop?: boolean;
168
- }): PartitionedTimeSeries<DiffSchema<S, Target>>;
267
+ }): PartitionedTimeSeries<DiffSchema<S, Target>, K>;
169
268
  /** Per-partition `rate`. See {@link TimeSeries.rate}. */
170
269
  rate<const Target extends NumericColumnNameForSchema<S>>(columns: Target | readonly Target[], options?: {
171
270
  drop?: boolean;
172
- }): PartitionedTimeSeries<DiffSchema<S, Target>>;
271
+ }): PartitionedTimeSeries<DiffSchema<S, Target>, K>;
173
272
  /** Per-partition `pctChange`. See {@link TimeSeries.pctChange}. */
174
273
  pctChange<const Target extends NumericColumnNameForSchema<S>>(columns: Target | readonly Target[], options?: {
175
274
  drop?: boolean;
176
- }): PartitionedTimeSeries<DiffSchema<S, Target>>;
275
+ }): PartitionedTimeSeries<DiffSchema<S, Target>, K>;
177
276
  /** Per-partition `cumulative`. See {@link TimeSeries.cumulative}. */
178
277
  cumulative<const Targets extends NumericColumnNameForSchema<S>>(spec: {
179
278
  [K in Targets]: 'sum' | 'max' | 'min' | 'count' | ((acc: number, value: number) => number);
180
- }): PartitionedTimeSeries<DiffSchema<S, Targets>>;
279
+ }): PartitionedTimeSeries<DiffSchema<S, Targets>, K>;
181
280
  /** Per-partition `shift`. See {@link TimeSeries.shift}. */
182
- shift<const Target extends NumericColumnNameForSchema<S>>(columns: Target | readonly Target[], n: number): PartitionedTimeSeries<DiffSchema<S, Target>>;
281
+ shift<const Target extends NumericColumnNameForSchema<S>>(columns: Target | readonly Target[], n: number): PartitionedTimeSeries<DiffSchema<S, Target>, K>;
183
282
  /** Per-partition `aggregate`. See {@link TimeSeries.aggregate}. */
184
283
  aggregate<const Mapping extends AggregateMap<S>>(sequence: SequenceLike, mapping: Mapping, options?: {
185
284
  range?: TemporalLike;
186
- }): PartitionedTimeSeries<AggregateSchema<S, Mapping>>;
285
+ }): PartitionedTimeSeries<AggregateSchema<S, Mapping>, K>;
187
286
  aggregate<const Mapping extends AggregateOutputMap<S>>(sequence: SequenceLike, mapping: Mapping, options?: {
188
287
  range?: TemporalLike;
189
- }): PartitionedTimeSeries<AggregateOutputMapResultSchema<S, Mapping>>;
288
+ }): PartitionedTimeSeries<AggregateOutputMapResultSchema<S, Mapping>, K>;
190
289
  }
191
290
  export {};
192
291
  //# sourceMappingURL=PartitionedTimeSeries.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PartitionedTimeSeries.d.ts","sourceRoot":"","sources":["../src/PartitionedTimeSeries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PartitionedTimeSeries.d.ts","sourceRoot":"","sources":["../src/PartitionedTimeSeries.ts"],"names":[],"mappings":"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"}
@@ -45,7 +45,14 @@ import { TimeSeries } from './TimeSeries.js';
45
45
  export class PartitionedTimeSeries {
46
46
  source;
47
47
  by;
48
- constructor(source, by) {
48
+ /**
49
+ * Declared partition values when `partitionBy(col, { groups })` was
50
+ * used. When set, `toMap` iterates in declared order (not insertion
51
+ * order), empty declared groups still appear as empty `TimeSeries`
52
+ * entries, and unknown partition values throw at construction time.
53
+ */
54
+ groups;
55
+ constructor(source, by, options) {
49
56
  this.source = source;
50
57
  this.by = (Array.isArray(by) ? by : [by]);
51
58
  if (this.by.length === 0) {
@@ -56,6 +63,65 @@ export class PartitionedTimeSeries {
56
63
  throw new TypeError(`PartitionedTimeSeries: column "${String(col)}" not in schema`);
57
64
  }
58
65
  }
66
+ if (options?.groups !== undefined) {
67
+ if (this.by.length > 1) {
68
+ throw new TypeError('PartitionedTimeSeries: typed `groups` option requires a single ' +
69
+ 'partition column. Drop `groups` for composite partitions, or ' +
70
+ 'narrow to a single column.');
71
+ }
72
+ if (options.groups.length === 0) {
73
+ throw new TypeError('PartitionedTimeSeries: `groups` cannot be empty. Drop the ' +
74
+ 'option to allow any partition value, or list at least one ' +
75
+ 'declared group.');
76
+ }
77
+ const seen = new Set();
78
+ for (const g of options.groups) {
79
+ if (seen.has(g)) {
80
+ throw new TypeError(`PartitionedTimeSeries: duplicate value ${JSON.stringify(g)} ` +
81
+ `in \`groups\`. Each declared group must be unique.`);
82
+ }
83
+ seen.add(g);
84
+ }
85
+ this.groups = options.groups;
86
+ this.validateGroupMembership();
87
+ }
88
+ }
89
+ // Validate that every event's partition value appears in the
90
+ // declared groups. Mirrors the partition encoder so the comparison
91
+ // accepts the same string forms toMap will produce as keys.
92
+ validateGroupMembership() {
93
+ if (!this.groups)
94
+ return;
95
+ const col = this.by[0];
96
+ const declared = new Set(this.groups);
97
+ const keyOf = PartitionedTimeSeries.partitionKeyOf(this.by);
98
+ for (const event of this.source.events) {
99
+ const key = keyOf(event);
100
+ if (!declared.has(key)) {
101
+ // Decode the encoder's leading-space sentinel so the message
102
+ // shows the user-facing concept, not the internal encoding.
103
+ const display = key === ' undefined' ? 'undefined' : JSON.stringify(key);
104
+ throw new TypeError(`PartitionedTimeSeries: encountered partition value ${display} ` +
105
+ `for column "${String(col)}" which is not in declared groups ` +
106
+ `[${this.groups.map((g) => JSON.stringify(g)).join(', ')}].`);
107
+ }
108
+ }
109
+ }
110
+ // Class-private factory used by `rewrap` to construct a
111
+ // partitioned view from a per-partition transform output. Skips
112
+ // groups validation because the events came from this view's
113
+ // pre-validated source — partition values cannot change inside a
114
+ // per-partition transform. JS-private (`static #fromValidated`) so
115
+ // the trusted path is unreachable from outside the class.
116
+ static #fromValidated(source, by, groups) {
117
+ const p = new PartitionedTimeSeries(source, by);
118
+ if (groups !== undefined) {
119
+ // groups was already validated when the user constructed the
120
+ // upstream view; partition values are preserved through any
121
+ // per-partition transform.
122
+ p.groups = groups;
123
+ }
124
+ return p;
59
125
  }
60
126
  /**
61
127
  * Materialize the partitioned view back into a regular `TimeSeries`.
@@ -96,38 +162,70 @@ export class PartitionedTimeSeries {
96
162
  apply(fn) {
97
163
  return PartitionedTimeSeries.applyToSource(this.source, this.by, fn);
98
164
  }
99
- // Internal helper used by both `apply` (terminal) and the sugar
100
- // methods (which re-wrap the result back into a partitioned view).
101
- static applyToSource(source, by, fn) {
102
- // Empty source: apply fn to an empty group so the output schema
103
- // and name come from fn, not from inferring R structurally.
104
- if (source.events.length === 0) {
105
- const empty = TimeSeries.fromEvents([], {
106
- schema: source.schema,
107
- name: source.name,
165
+ toMap(transform) {
166
+ const result = new Map();
167
+ const buckets = this.source.events.length === 0
168
+ ? new Map()
169
+ : PartitionedTimeSeries.bucketByPartition(this.source, this.by);
170
+ if (this.groups) {
171
+ // Declared-order iteration. Empty groups produce empty
172
+ // TimeSeries entries (consistent with pivotByGroup's typed
173
+ // groups behavior, which emits a column for every declared
174
+ // value even when no events match).
175
+ for (const g of this.groups) {
176
+ const events = buckets.get(g) ?? [];
177
+ const sub = TimeSeries.fromEvents(events, {
178
+ schema: this.source.schema,
179
+ name: this.source.name,
180
+ });
181
+ result.set(g, transform ? transform(sub) : sub);
182
+ }
183
+ return result;
184
+ }
185
+ // Insertion-order iteration (matches the order each partition was
186
+ // first encountered in the source events).
187
+ for (const [key, events] of buckets) {
188
+ const sub = TimeSeries.fromEvents(events, {
189
+ schema: this.source.schema,
190
+ name: this.source.name,
108
191
  });
109
- return fn(empty);
192
+ result.set(key, transform ? transform(sub) : sub);
110
193
  }
111
- const compositeKey = (event) => {
112
- const data = event.data();
113
- // Single-column case: avoid the encoding overhead.
114
- if (by.length === 1) {
115
- const v = data[by[0]];
194
+ return result;
195
+ }
196
+ // Build the encoder that produces a string key for an event given
197
+ // the partition columns. Single-column case avoids the JSON encoding
198
+ // overhead. Multi-column uses JSON.stringify to guarantee no key
199
+ // collisions on values containing separators (e.g. region names with
200
+ // spaces) — a naive `parts.join('|')` would collide. `undefined` in a
201
+ // single-column key becomes the literal `' undefined'` (with the
202
+ // leading space ensuring it can never collide with a string column
203
+ // whose value is the literal `'undefined'`).
204
+ static partitionKeyOf(by) {
205
+ if (by.length === 1) {
206
+ const col = by[0];
207
+ return (event) => {
208
+ const v = event.data()[col];
116
209
  return v === undefined ? ' undefined' : `${String(v)}`;
117
- }
118
- // Multi-column case: JSON.stringify guarantees no collision
119
- // because it encodes strings with quotes and escapes. A naive
120
- // separator approach (e.g. join('|')) would collide on values
121
- // containing the separator.
210
+ };
211
+ }
212
+ return (event) => {
213
+ const data = event.data();
122
214
  const parts = new Array(by.length);
123
215
  for (let i = 0; i < by.length; i += 1) {
124
216
  parts[i] = data[by[i]] ?? null;
125
217
  }
126
218
  return JSON.stringify(parts);
127
219
  };
220
+ }
221
+ // Group source events into buckets keyed by partition value. Returned
222
+ // Map iteration order = insertion order, which matches the order
223
+ // partitions were first seen in the source events array.
224
+ static bucketByPartition(source, by) {
225
+ const keyOf = PartitionedTimeSeries.partitionKeyOf(by);
128
226
  const buckets = new Map();
129
227
  for (const event of source.events) {
130
- const key = compositeKey(event);
228
+ const key = keyOf(event);
131
229
  let bucket = buckets.get(key);
132
230
  if (!bucket) {
133
231
  bucket = [];
@@ -135,6 +233,21 @@ export class PartitionedTimeSeries {
135
233
  }
136
234
  bucket.push(event);
137
235
  }
236
+ return buckets;
237
+ }
238
+ // Internal helper used by both `apply` (terminal) and the sugar
239
+ // methods (which re-wrap the result back into a partitioned view).
240
+ static applyToSource(source, by, fn) {
241
+ // Empty source: apply fn to an empty group so the output schema
242
+ // and name come from fn, not from inferring R structurally.
243
+ if (source.events.length === 0) {
244
+ const empty = TimeSeries.fromEvents([], {
245
+ schema: source.schema,
246
+ name: source.name,
247
+ });
248
+ return fn(empty);
249
+ }
250
+ const buckets = PartitionedTimeSeries.bucketByPartition(source, by);
138
251
  const transformed = [];
139
252
  for (const events of buckets.values()) {
140
253
  const sub = TimeSeries.fromEvents(events, {
@@ -146,13 +259,21 @@ export class PartitionedTimeSeries {
146
259
  return TimeSeries.concat(transformed);
147
260
  }
148
261
  // Wrap a transform result back into a PartitionedTimeSeries with the
149
- // same partition columns. Used by the sugar methods to keep the chain
150
- // in partition view. Cast at the boundary because R may not preserve
151
- // the partition columns type-narrowly (e.g. RollingSchema<S, M> may
152
- // drop columns); runtime constructor validates that the partition
153
- // columns are still present in the result schema.
262
+ // same partition columns and groups (if declared). Used by the sugar
263
+ // methods to keep the chain in partition view. Cast at the boundary
264
+ // because R may not preserve the partition columns type-narrowly
265
+ // (e.g. RollingSchema<S, M> may drop columns); runtime constructor
266
+ // validates that the partition columns are still present in the
267
+ // result schema.
268
+ //
269
+ // Routes through the class-private `#fromValidated` factory so the
270
+ // per-event groups validation is skipped on chain steps — the events
271
+ // came from this view's pre-validated source, and stateful
272
+ // per-partition transforms preserve the partition columns by
273
+ // construction. The trusted path is class-private (JS `#`) so it
274
+ // can't be called from outside the class.
154
275
  rewrap(out) {
155
- return new PartitionedTimeSeries(out, this.by);
276
+ return PartitionedTimeSeries.#fromValidated(out, this.by, this.groups);
156
277
  }
157
278
  // ─── Sugar: stateful ops, applied per partition ─────────────────────
158
279
  //
@@ -180,6 +301,63 @@ export class PartitionedTimeSeries {
180
301
  align(sequence, options) {
181
302
  return this.rewrap(PartitionedTimeSeries.applyToSource(this.source, this.by, (g) => g.align(sequence, options)));
182
303
  }
304
+ /**
305
+ * Per-partition `materialize`. See {@link TimeSeries.materialize}.
306
+ *
307
+ * **Bonus over the bare `TimeSeries.materialize` call:** every
308
+ * output row, including empty-bucket rows, gets the partition
309
+ * columns auto-populated from the partition's known key values.
310
+ * Without this, empty buckets would emit rows with `undefined`
311
+ * partition columns — forcing a follow-up
312
+ * `.fill({ host: 'hold' })` step that fails for partitions where
313
+ * every event sits in a long-outage gap.
314
+ */
315
+ materialize(sequence, options) {
316
+ const partitionCols = this.by;
317
+ return this.rewrap(PartitionedTimeSeries.applyToSource(this.source, this.by, (g) => {
318
+ const out = g.materialize(sequence, options);
319
+ if (g.events.length === 0)
320
+ return out;
321
+ // Detect whether any output row needs partition-column patching
322
+ // (i.e., whether any bucket was empty). If the source covered
323
+ // the grid, every row already carries the partition columns
324
+ // from its source event — skip the map() pass entirely. This
325
+ // avoids the per-event closure-call + new event allocation
326
+ // cost when no patching is required.
327
+ const events = out.events;
328
+ let needsPatch = false;
329
+ outer: for (let i = 0; i < events.length; i += 1) {
330
+ const data = events[i].data();
331
+ for (let c = 0; c < partitionCols.length; c += 1) {
332
+ if (data[partitionCols[c]] === undefined) {
333
+ needsPatch = true;
334
+ break outer;
335
+ }
336
+ }
337
+ }
338
+ if (!needsPatch)
339
+ return out;
340
+ // Patch partition columns where undefined (empty-bucket rows).
341
+ // All events in this partition share the partition columns —
342
+ // capture them once from the first source event.
343
+ const firstData = g.events[0].data();
344
+ const partValues = {};
345
+ for (const col of partitionCols) {
346
+ partValues[col] = firstData[col];
347
+ }
348
+ return out.map(out.schema, (event) => {
349
+ const data = event.data();
350
+ let result = event;
351
+ for (const col of partitionCols) {
352
+ if (data[col] === undefined) {
353
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
354
+ result = result.set(col, partValues[col]);
355
+ }
356
+ }
357
+ return result;
358
+ });
359
+ }));
360
+ }
183
361
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
184
362
  rolling(...args) {
185
363
  return this.rewrap(PartitionedTimeSeries.applyToSource(this.source, this.by, (g) =>
@@ -1 +1 @@
1
- {"version":3,"file":"PartitionedTimeSeries.js","sourceRoot":"","sources":["../src/PartitionedTimeSeries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PartitionedTimeSeries.js","sourceRoot":"","sources":["../src/PartitionedTimeSeries.ts"],"names":[],"mappings":"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"}