rowpipe 2.0.0 → 2.1.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.
Files changed (133) hide show
  1. package/README.md +238 -55
  2. package/dist/cli/commands/count.d.ts +12 -0
  3. package/dist/cli/commands/count.d.ts.map +1 -0
  4. package/dist/cli/commands/count.js +49 -0
  5. package/dist/cli/commands/count.js.map +1 -0
  6. package/dist/cli/commands/explain.d.ts +3 -0
  7. package/dist/cli/commands/explain.d.ts.map +1 -0
  8. package/dist/cli/commands/explain.js +11 -0
  9. package/dist/cli/commands/explain.js.map +1 -0
  10. package/dist/cli/commands/files.d.ts +2 -1
  11. package/dist/cli/commands/files.d.ts.map +1 -1
  12. package/dist/cli/commands/files.js +5 -2
  13. package/dist/cli/commands/files.js.map +1 -1
  14. package/dist/cli/commands/group.d.ts +12 -0
  15. package/dist/cli/commands/group.d.ts.map +1 -0
  16. package/dist/cli/commands/group.js +51 -0
  17. package/dist/cli/commands/group.js.map +1 -0
  18. package/dist/cli/commands/head.d.ts +7 -0
  19. package/dist/cli/commands/head.d.ts.map +1 -0
  20. package/dist/cli/commands/head.js +6 -0
  21. package/dist/cli/commands/head.js.map +1 -0
  22. package/dist/cli/commands/limit.d.ts +11 -0
  23. package/dist/cli/commands/limit.d.ts.map +1 -0
  24. package/dist/cli/commands/limit.js +40 -0
  25. package/dist/cli/commands/limit.js.map +1 -0
  26. package/dist/cli/commands/offset.d.ts +11 -0
  27. package/dist/cli/commands/offset.d.ts.map +1 -0
  28. package/dist/cli/commands/offset.js +39 -0
  29. package/dist/cli/commands/offset.js.map +1 -0
  30. package/dist/cli/commands/pipeline.d.ts +43 -0
  31. package/dist/cli/commands/pipeline.d.ts.map +1 -0
  32. package/dist/cli/commands/pipeline.js +198 -0
  33. package/dist/cli/commands/pipeline.js.map +1 -0
  34. package/dist/cli/commands/sort.d.ts +17 -0
  35. package/dist/cli/commands/sort.d.ts.map +1 -0
  36. package/dist/cli/commands/sort.js +55 -0
  37. package/dist/cli/commands/sort.js.map +1 -0
  38. package/dist/cli/commands/tail.d.ts +13 -0
  39. package/dist/cli/commands/tail.d.ts.map +1 -0
  40. package/dist/cli/commands/tail.js +39 -0
  41. package/dist/cli/commands/tail.js.map +1 -0
  42. package/dist/cli/commands/top.d.ts +19 -0
  43. package/dist/cli/commands/top.d.ts.map +1 -0
  44. package/dist/cli/commands/top.js +51 -0
  45. package/dist/cli/commands/top.js.map +1 -0
  46. package/dist/cli/commands/unique.d.ts +15 -0
  47. package/dist/cli/commands/unique.d.ts.map +1 -0
  48. package/dist/cli/commands/unique.js +44 -0
  49. package/dist/cli/commands/unique.js.map +1 -0
  50. package/dist/cli/index.js +252 -3
  51. package/dist/cli/index.js.map +1 -1
  52. package/dist/core/pipeline.d.ts +40 -0
  53. package/dist/core/pipeline.d.ts.map +1 -1
  54. package/dist/core/pipeline.js +65 -0
  55. package/dist/core/pipeline.js.map +1 -1
  56. package/dist/index.d.ts +12 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +13 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/planner/executor.d.ts +8 -0
  61. package/dist/planner/executor.d.ts.map +1 -0
  62. package/dist/planner/executor.js +86 -0
  63. package/dist/planner/executor.js.map +1 -0
  64. package/dist/planner/explain.d.ts +6 -0
  65. package/dist/planner/explain.d.ts.map +1 -0
  66. package/dist/planner/explain.js +91 -0
  67. package/dist/planner/explain.js.map +1 -0
  68. package/dist/planner/index.d.ts +5 -0
  69. package/dist/planner/index.d.ts.map +1 -0
  70. package/dist/planner/index.js +5 -0
  71. package/dist/planner/index.js.map +1 -0
  72. package/dist/planner/optimizer.d.ts +9 -0
  73. package/dist/planner/optimizer.d.ts.map +1 -0
  74. package/dist/planner/optimizer.js +78 -0
  75. package/dist/planner/optimizer.js.map +1 -0
  76. package/dist/planner/types.d.ts +63 -0
  77. package/dist/planner/types.d.ts.map +1 -0
  78. package/dist/planner/types.js +2 -0
  79. package/dist/planner/types.js.map +1 -0
  80. package/dist/transforms/count.d.ts +21 -0
  81. package/dist/transforms/count.d.ts.map +1 -0
  82. package/dist/transforms/count.js +65 -0
  83. package/dist/transforms/count.js.map +1 -0
  84. package/dist/transforms/group.d.ts +25 -0
  85. package/dist/transforms/group.d.ts.map +1 -0
  86. package/dist/transforms/group.js +71 -0
  87. package/dist/transforms/group.js.map +1 -0
  88. package/dist/transforms/limit.d.ts +7 -0
  89. package/dist/transforms/limit.d.ts.map +1 -0
  90. package/dist/transforms/limit.js +40 -0
  91. package/dist/transforms/limit.js.map +1 -0
  92. package/dist/transforms/offset.d.ts +7 -0
  93. package/dist/transforms/offset.d.ts.map +1 -0
  94. package/dist/transforms/offset.js +38 -0
  95. package/dist/transforms/offset.js.map +1 -0
  96. package/dist/transforms/sort/comparator.d.ts +43 -0
  97. package/dist/transforms/sort/comparator.d.ts.map +1 -0
  98. package/dist/transforms/sort/comparator.js +131 -0
  99. package/dist/transforms/sort/comparator.js.map +1 -0
  100. package/dist/transforms/sort/external-sort.d.ts +8 -0
  101. package/dist/transforms/sort/external-sort.d.ts.map +1 -0
  102. package/dist/transforms/sort/external-sort.js +159 -0
  103. package/dist/transforms/sort/external-sort.js.map +1 -0
  104. package/dist/transforms/sort/index.d.ts +10 -0
  105. package/dist/transforms/sort/index.d.ts.map +1 -0
  106. package/dist/transforms/sort/index.js +11 -0
  107. package/dist/transforms/sort/index.js.map +1 -0
  108. package/dist/transforms/tail.d.ts +6 -0
  109. package/dist/transforms/tail.d.ts.map +1 -0
  110. package/dist/transforms/tail.js +27 -0
  111. package/dist/transforms/tail.js.map +1 -0
  112. package/dist/transforms/top.d.ts +17 -0
  113. package/dist/transforms/top.d.ts.map +1 -0
  114. package/dist/transforms/top.js +52 -0
  115. package/dist/transforms/top.js.map +1 -0
  116. package/dist/transforms/unique.d.ts +13 -0
  117. package/dist/transforms/unique.d.ts.map +1 -0
  118. package/dist/transforms/unique.js +91 -0
  119. package/dist/transforms/unique.js.map +1 -0
  120. package/dist/utils/heap.d.ts +25 -0
  121. package/dist/utils/heap.d.ts.map +1 -0
  122. package/dist/utils/heap.js +90 -0
  123. package/dist/utils/heap.js.map +1 -0
  124. package/dist/utils/keystore.d.ts +80 -0
  125. package/dist/utils/keystore.d.ts.map +1 -0
  126. package/dist/utils/keystore.js +217 -0
  127. package/dist/utils/keystore.js.map +1 -0
  128. package/dist/utils/ring-buffer.d.ts +15 -0
  129. package/dist/utils/ring-buffer.d.ts.map +1 -0
  130. package/dist/utils/ring-buffer.js +40 -0
  131. package/dist/utils/ring-buffer.js.map +1 -0
  132. package/package.json +3 -2
  133. package/skills/rowpipe/SKILL.md +9 -0
@@ -0,0 +1,86 @@
1
+ import { reduceRows } from "../analytics/reduce.js";
2
+ import { createPipeline } from "../core/pipeline.js";
3
+ import { castColumns } from "../transforms/cast.js";
4
+ import { filterRows } from "../transforms/filter.js";
5
+ import { limitRows } from "../transforms/limit.js";
6
+ import { mapRows } from "../transforms/map.js";
7
+ import { offsetRows } from "../transforms/offset.js";
8
+ import { renameColumns } from "../transforms/rename.js";
9
+ import { selectColumns } from "../transforms/select.js";
10
+ import { sortRows } from "../transforms/sort/index.js";
11
+ import { tailRows } from "../transforms/tail.js";
12
+ import { topRows } from "../transforms/top.js";
13
+ import { uniqueRows } from "../transforms/unique.js";
14
+ /**
15
+ * Builds and executes a Pipeline from an optimized PlannedPipeline.
16
+ */
17
+ export function executePlannedPipeline(source, plan, readerOptions) {
18
+ const mergedReaderOpts = {
19
+ ...readerOptions,
20
+ maxRows: plan.effectiveReadLimit,
21
+ };
22
+ const pipeline = createPipeline(source, mergedReaderOpts);
23
+ for (const op of plan.operations) {
24
+ switch (op.type) {
25
+ case "filter":
26
+ pipeline.pipe(filterRows(op.expression));
27
+ break;
28
+ case "select":
29
+ pipeline.pipe(selectColumns(op.columns));
30
+ break;
31
+ case "rename":
32
+ pipeline.pipe(renameColumns(op.specs));
33
+ break;
34
+ case "cast":
35
+ pipeline.pipe(castColumns(op.specs, { onError: op.onError }));
36
+ break;
37
+ case "map":
38
+ pipeline.pipe(mapRows(op.specs));
39
+ break;
40
+ case "sort":
41
+ pipeline.pipe(sortRows({
42
+ by: op.specs,
43
+ nulls: op.nulls,
44
+ ignoreCase: op.ignoreCase,
45
+ natural: op.natural,
46
+ memoryLimit: op.memoryLimit,
47
+ }));
48
+ break;
49
+ case "top":
50
+ pipeline.pipe(topRows({
51
+ by: op.specs,
52
+ count: op.count,
53
+ order: op.order,
54
+ smallest: op.smallest,
55
+ nulls: op.nulls,
56
+ ignoreCase: op.ignoreCase,
57
+ natural: op.natural,
58
+ }));
59
+ break;
60
+ case "limit":
61
+ pipeline.pipe(limitRows(op.count));
62
+ break;
63
+ case "offset":
64
+ pipeline.pipe(offsetRows(op.count));
65
+ break;
66
+ case "tail":
67
+ pipeline.pipe(tailRows(op.count));
68
+ break;
69
+ case "unique":
70
+ pipeline.pipe(uniqueRows({
71
+ by: op.by,
72
+ keep: op.keep,
73
+ memoryLimit: op.memoryLimit,
74
+ }));
75
+ break;
76
+ case "group":
77
+ pipeline.pipe(reduceRows({
78
+ by: op.by,
79
+ aggregations: op.aggregations,
80
+ }));
81
+ break;
82
+ }
83
+ }
84
+ return pipeline;
85
+ }
86
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/planner/executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { PlannedPipeline } from "./types.js";
2
+ /**
3
+ * Formats a clean ASCII representation of the planned execution pipeline.
4
+ */
5
+ export declare function formatExecutionPlan(plan: PlannedPipeline, inputDescription?: string, outputDescription?: string): string;
6
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../src/planner/explain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,eAAe,EACrB,gBAAgB,SAAiB,EACjC,iBAAiB,SAAkB,GAClC,MAAM,CAuGR"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Formats a clean ASCII representation of the planned execution pipeline.
3
+ */
4
+ export function formatExecutionPlan(plan, inputDescription = "Input Stream", outputDescription = "Output Stream") {
5
+ const steps = [inputDescription];
6
+ for (const op of plan.operations) {
7
+ switch (op.type) {
8
+ case "filter":
9
+ steps.push(`Filter (${op.expression})`);
10
+ break;
11
+ case "select":
12
+ steps.push(`Select (${op.columns.join(", ")})`);
13
+ break;
14
+ case "rename":
15
+ const renames = Object.entries(op.specs).map(([o, n]) => `${o}->${n}`).join(", ");
16
+ steps.push(`Rename (${renames})`);
17
+ break;
18
+ case "cast":
19
+ const casts = Object.entries(op.specs).map(([c, t]) => `${c}:${t}`).join(", ");
20
+ steps.push(`Cast (${casts})`);
21
+ break;
22
+ case "map":
23
+ const maps = Object.entries(op.specs).map(([k, v]) => `${k}=${v}`).join(", ");
24
+ steps.push(`Map (${maps})`);
25
+ break;
26
+ case "sort":
27
+ const sorts = op.specs.map((s) => `${s.column} ${(s.direction || "asc").toUpperCase()}`).join(", ");
28
+ steps.push(`ExternalSort (${sorts}) [Spillable]`);
29
+ break;
30
+ case "top":
31
+ const topCols = op.specs.map((s) => `${s.column} ${(s.direction || (op.order === "asc" ? "ASC" : "DESC")).toUpperCase()}`).join(", ");
32
+ steps.push(`TopK (${topCols}, ${op.count}) [Bounded Heap]`);
33
+ break;
34
+ case "limit":
35
+ steps.push(`Limit (${op.count}) [Early Stream Termination]`);
36
+ break;
37
+ case "offset":
38
+ steps.push(`Offset (skip ${op.count})`);
39
+ break;
40
+ case "tail":
41
+ steps.push(`Tail (last ${op.count}) [Bounded RingBuffer]`);
42
+ break;
43
+ case "unique":
44
+ const byStr = op.by ? op.by.join(", ") : "whole row";
45
+ steps.push(`Unique (by: ${byStr}, keep: ${op.keep || "first"}) [Spillable]`);
46
+ break;
47
+ case "group":
48
+ const gByStr = op.by ? op.by.join(", ") : "global";
49
+ const aggsStr = op.aggregations.map((a) => `${a.targetField}=${a.func}(${a.sourceExpr || ""})`).join(", ");
50
+ steps.push(`Group (by: ${gByStr}, aggs: ${aggsStr}) [Spillable]`);
51
+ break;
52
+ }
53
+ }
54
+ steps.push(outputDescription);
55
+ let output = "\n======================================================\n";
56
+ output += " Rowpipe Execution Plan \n";
57
+ output += "======================================================\n\n";
58
+ for (let i = 0; i < steps.length; i++) {
59
+ output += ` ${steps[i]}\n`;
60
+ if (i < steps.length - 1) {
61
+ output += " ↓\n";
62
+ }
63
+ }
64
+ output += "\n------------------------------------------------------\n";
65
+ if (plan.optimizationsApplied.length > 0) {
66
+ output += "Optimizations Applied:\n";
67
+ for (const opt of plan.optimizationsApplied) {
68
+ output += ` • ${opt}\n`;
69
+ }
70
+ }
71
+ else {
72
+ output += "Optimizations Applied:\n (none)\n";
73
+ }
74
+ output += "------------------------------------------------------\n";
75
+ output += "Memory Classification:\n";
76
+ if (plan.memoryClassification === "streaming") {
77
+ output += " Fully Streaming (O(1) constant memory)\n";
78
+ }
79
+ else if (plan.memoryClassification === "bounded-state") {
80
+ output += " Bounded State (O(K) fixed memory bound)\n";
81
+ }
82
+ else {
83
+ output += " Spillable Global State (O(1) RAM threshold + Disk Spill)\n";
84
+ }
85
+ if (plan.effectiveReadLimit !== undefined) {
86
+ output += `Upstream Read Cap: ${plan.effectiveReadLimit} rows\n`;
87
+ }
88
+ output += "======================================================\n\n";
89
+ return output;
90
+ }
91
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../src/planner/explain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from "./types.js";
2
+ export * from "./optimizer.js";
3
+ export * from "./executor.js";
4
+ export * from "./explain.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/planner/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ export * from "./types.js";
2
+ export * from "./optimizer.js";
3
+ export * from "./executor.js";
4
+ export * from "./explain.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/planner/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { PipelineOperation, PlannedPipeline } from "./types.js";
2
+ /**
3
+ * Optimizes an operations sequence with rule-based transformations:
4
+ * 1. Sort + Limit -> TopK rewrite (converting O(N log N) external sort to O(K) heap)
5
+ * 2. Offset + Limit bound calculation for early upstream cancellation
6
+ * 3. Memory classification assessment
7
+ */
8
+ export declare function optimizePipeline(operations: PipelineOperation[]): PlannedPipeline;
9
+ //# sourceMappingURL=optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizer.d.ts","sourceRoot":"","sources":["../../src/planner/optimizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,iBAAiB,EACjB,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,iBAAiB,EAAE,GAAG,eAAe,CAgFjF"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Optimizes an operations sequence with rule-based transformations:
3
+ * 1. Sort + Limit -> TopK rewrite (converting O(N log N) external sort to O(K) heap)
4
+ * 2. Offset + Limit bound calculation for early upstream cancellation
5
+ * 3. Memory classification assessment
6
+ */
7
+ export function optimizePipeline(operations) {
8
+ const optimized = [];
9
+ const optimizationsApplied = [];
10
+ let i = 0;
11
+ while (i < operations.length) {
12
+ const current = operations[i];
13
+ const nextOp = operations[i + 1];
14
+ // Optimization Rule 1: Sort + Limit -> TopK
15
+ if (current.type === "sort" && nextOp && nextOp.type === "limit") {
16
+ const primarySpec = current.specs[0];
17
+ const isDesc = primarySpec ? primarySpec.direction === "desc" : false;
18
+ optimized.push({
19
+ type: "top",
20
+ specs: current.specs,
21
+ count: nextOp.count,
22
+ order: isDesc ? "desc" : "asc",
23
+ smallest: !isDesc,
24
+ nulls: current.nulls,
25
+ ignoreCase: current.ignoreCase,
26
+ natural: current.natural,
27
+ });
28
+ const sortSummary = current.specs.map((s) => `${s.column} ${s.direction || "asc"}`).join(", ");
29
+ optimizationsApplied.push(`sort(${sortSummary}) + limit(${nextOp.count}) -> top-k (${nextOp.count})`);
30
+ i += 2;
31
+ continue;
32
+ }
33
+ optimized.push(current);
34
+ i++;
35
+ }
36
+ // Calculate upstream cancellation limit
37
+ let effectiveReadLimit;
38
+ let offsetAmount = 0;
39
+ let hasOffset = false;
40
+ for (const op of optimized) {
41
+ if (op.type === "offset") {
42
+ offsetAmount += op.count;
43
+ hasOffset = true;
44
+ }
45
+ else if (op.type === "limit") {
46
+ const totalNeeded = (hasOffset ? offsetAmount : 0) + op.count;
47
+ effectiveReadLimit = effectiveReadLimit !== undefined ? Math.min(effectiveReadLimit, totalNeeded) : totalNeeded;
48
+ }
49
+ else if (op.type === "sort" || op.type === "tail" || op.type === "group") {
50
+ // Global operations need all rows, cannot stop early before them
51
+ effectiveReadLimit = undefined;
52
+ break;
53
+ }
54
+ }
55
+ if (hasOffset && effectiveReadLimit !== undefined) {
56
+ optimizationsApplied.push(`offset(${offsetAmount}) + limit -> upstream stream capped at ${effectiveReadLimit} rows`);
57
+ }
58
+ // Assess memory classification
59
+ let memoryClassification = "streaming";
60
+ for (const op of optimized) {
61
+ if (op.type === "sort" || op.type === "unique" || op.type === "group") {
62
+ memoryClassification = "spillable-global";
63
+ break;
64
+ }
65
+ if (op.type === "top" || op.type === "tail") {
66
+ if (memoryClassification === "streaming") {
67
+ memoryClassification = "bounded-state";
68
+ }
69
+ }
70
+ }
71
+ return {
72
+ operations: optimized,
73
+ optimizationsApplied,
74
+ memoryClassification,
75
+ effectiveReadLimit,
76
+ };
77
+ }
78
+ //# sourceMappingURL=optimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"optimizer.js","sourceRoot":"","sources":["../../src/planner/optimizer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { AggregationSpec } from "../analytics/reduce.js";
2
+ import type { SortKeySpec } from "../transforms/sort/comparator.js";
3
+ export type MemoryClassification = "streaming" | "bounded-state" | "spillable-global";
4
+ export type PipelineOperation = {
5
+ type: "filter";
6
+ expression: string;
7
+ } | {
8
+ type: "select";
9
+ columns: string[];
10
+ } | {
11
+ type: "rename";
12
+ specs: Record<string, string>;
13
+ } | {
14
+ type: "cast";
15
+ specs: Record<string, string>;
16
+ onError?: string;
17
+ } | {
18
+ type: "map";
19
+ specs: Record<string, string>;
20
+ } | {
21
+ type: "sort";
22
+ specs: SortKeySpec[];
23
+ nulls?: "first" | "last";
24
+ ignoreCase?: boolean;
25
+ natural?: boolean;
26
+ memoryLimit?: number | string;
27
+ } | {
28
+ type: "top";
29
+ specs: SortKeySpec[];
30
+ count: number;
31
+ order?: "asc" | "desc";
32
+ smallest?: boolean;
33
+ nulls?: "first" | "last";
34
+ ignoreCase?: boolean;
35
+ natural?: boolean;
36
+ } | {
37
+ type: "limit";
38
+ count: number;
39
+ } | {
40
+ type: "offset";
41
+ count: number;
42
+ } | {
43
+ type: "tail";
44
+ count: number;
45
+ } | {
46
+ type: "unique";
47
+ by?: string[];
48
+ keep?: "first" | "last";
49
+ approx?: boolean;
50
+ memoryLimit?: number | string;
51
+ } | {
52
+ type: "group";
53
+ by?: string[];
54
+ aggregations: AggregationSpec[];
55
+ memoryLimit?: number | string;
56
+ };
57
+ export interface PlannedPipeline {
58
+ operations: PipelineOperation[];
59
+ optimizationsApplied: string[];
60
+ memoryClassification: MemoryClassification;
61
+ effectiveReadLimit?: number;
62
+ }
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/planner/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,MAAM,MAAM,oBAAoB,GAC5B,WAAW,GACX,eAAe,GACf,kBAAkB,CAAC;AAEvB,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GACjE;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAC9C;IACE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B,GACD;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B,CAAC;AAEN,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/planner/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import type { DataStream } from "../core/types.js";
2
+ export interface CountOptions {
3
+ by?: string | string[];
4
+ distinct?: string;
5
+ approx?: boolean;
6
+ json?: boolean;
7
+ }
8
+ export interface CountResult {
9
+ totalRows: number;
10
+ distinctCount?: number;
11
+ isApproximate?: boolean;
12
+ groups?: Array<{
13
+ key: Record<string, unknown>;
14
+ count: number;
15
+ }>;
16
+ }
17
+ /**
18
+ * Executes high-performance streaming count analysis over DataStream.
19
+ */
20
+ export declare function countStream(stream: DataStream, options?: CountOptions): Promise<CountResult>;
21
+ //# sourceMappingURL=count.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"count.d.ts","sourceRoot":"","sources":["../../src/transforms/count.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAO,MAAM,kBAAkB,CAAC;AAKxD,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CA+DtB"}
@@ -0,0 +1,65 @@
1
+ import { HyperLogLog } from "../analytics/stats.js";
2
+ import { encodeCompositeKey } from "../diff/key.js";
3
+ /**
4
+ * Executes high-performance streaming count analysis over DataStream.
5
+ */
6
+ export async function countStream(stream, options = {}) {
7
+ const byCols = options.by
8
+ ? (Array.isArray(options.by) ? options.by : options.by.split(",").map((s) => s.trim()).filter(Boolean))
9
+ : undefined;
10
+ let totalRows = 0;
11
+ const distinctCol = options.distinct;
12
+ const useApprox = options.approx ?? false;
13
+ const hll = distinctCol && useApprox ? new HyperLogLog(12) : null;
14
+ const exactDistinctSet = distinctCol && !useApprox ? new Set() : null;
15
+ const groupCounts = byCols ? new Map() : null;
16
+ for await (const batch of stream) {
17
+ totalRows += batch.rows.length;
18
+ if (distinctCol) {
19
+ for (let i = 0; i < batch.rows.length; i++) {
20
+ const val = batch.rows[i][distinctCol];
21
+ if (val !== null && val !== undefined) {
22
+ if (hll) {
23
+ hll.add(val);
24
+ }
25
+ else if (exactDistinctSet) {
26
+ exactDistinctSet.add(String(val));
27
+ }
28
+ }
29
+ }
30
+ }
31
+ if (byCols && groupCounts) {
32
+ for (let i = 0; i < batch.rows.length; i++) {
33
+ const row = batch.rows[i];
34
+ const { encoded, rawKey } = encodeCompositeKey(row, byCols);
35
+ const existing = groupCounts.get(encoded);
36
+ if (existing) {
37
+ existing.count++;
38
+ }
39
+ else {
40
+ groupCounts.set(encoded, { key: rawKey, count: 1 });
41
+ }
42
+ }
43
+ }
44
+ }
45
+ let distinctCount;
46
+ if (distinctCol) {
47
+ if (hll) {
48
+ distinctCount = hll.count();
49
+ }
50
+ else if (exactDistinctSet) {
51
+ distinctCount = exactDistinctSet.size;
52
+ }
53
+ }
54
+ let groups;
55
+ if (groupCounts) {
56
+ groups = Array.from(groupCounts.values()).sort((a, b) => b.count - a.count);
57
+ }
58
+ return {
59
+ totalRows,
60
+ distinctCount,
61
+ isApproximate: useApprox && Boolean(distinctCol),
62
+ groups,
63
+ };
64
+ }
65
+ //# sourceMappingURL=count.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"count.js","sourceRoot":"","sources":["../../src/transforms/count.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { AggregationSpec } from "../analytics/reduce.js";
2
+ import type { TransformFunction } from "../core/types.js";
3
+ export interface GroupOptions {
4
+ by?: string | string[];
5
+ count?: boolean;
6
+ sum?: string | string[];
7
+ avg?: string | string[];
8
+ min?: string | string[];
9
+ max?: string | string[];
10
+ first?: string | string[];
11
+ last?: string | string[];
12
+ agg?: string | string[];
13
+ memoryLimit?: number | string;
14
+ tempDir?: string;
15
+ batchSize?: number;
16
+ }
17
+ /**
18
+ * Builds reduce specifications from group flags and explicit specs.
19
+ */
20
+ export declare function buildGroupReduceSpecs(options: GroupOptions): AggregationSpec[];
21
+ /**
22
+ * Groups and aggregates tabular stream with streaming single-pass accumulation.
23
+ */
24
+ export declare function groupRows(options?: GroupOptions): TransformFunction;
25
+ //# sourceMappingURL=group.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../src/transforms/group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,KAAK,EAA8B,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEtF,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,GAAG,eAAe,EAAE,CAuC9E;AAkBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,YAAiB,GAAG,iBAAiB,CAWvE"}
@@ -0,0 +1,71 @@
1
+ import { parseReduceSpecs, reduceRows } from "../analytics/reduce.js";
2
+ /**
3
+ * Builds reduce specifications from group flags and explicit specs.
4
+ */
5
+ export function buildGroupReduceSpecs(options) {
6
+ const rawSpecs = [];
7
+ if (options.count) {
8
+ rawSpecs.push("count=count()");
9
+ }
10
+ const addFieldAggs = (func, fields, suffix) => {
11
+ if (!fields)
12
+ return;
13
+ const list = Array.isArray(fields) ? fields : fields.split(",").map((s) => s.trim()).filter(Boolean);
14
+ for (const f of list) {
15
+ const alias = suffix ? `${f}_${suffix}` : `${f}_${func}`;
16
+ rawSpecs.push(`${alias}=${func}(${f})`);
17
+ }
18
+ };
19
+ addFieldAggs("sum", options.sum, "sum");
20
+ addFieldAggs("avg", options.avg, "avg");
21
+ addFieldAggs("min", options.min, "min");
22
+ addFieldAggs("max", options.max, "max");
23
+ addFieldAggs("first", options.first, "first");
24
+ addFieldAggs("last", options.last, "last");
25
+ if (options.agg) {
26
+ if (Array.isArray(options.agg)) {
27
+ for (const a of options.agg) {
28
+ rawSpecs.push(...parseRawAggStrings(a));
29
+ }
30
+ }
31
+ else {
32
+ rawSpecs.push(...parseRawAggStrings(options.agg));
33
+ }
34
+ }
35
+ if (rawSpecs.length === 0) {
36
+ // Default to count() if grouped without explicit aggregations
37
+ rawSpecs.push("count=count()");
38
+ }
39
+ return parseReduceSpecs(rawSpecs);
40
+ }
41
+ function parseRawAggStrings(input) {
42
+ const parts = input.split(",").map((s) => s.trim()).filter(Boolean);
43
+ return parts.map((p) => {
44
+ if (p.includes("="))
45
+ return p;
46
+ // Auto-generate alias: sum(revenue) -> revenue_sum=sum(revenue), count() -> count=count()
47
+ const match = /^([a-zA-Z0-9_]+)\((.*)\)$/.exec(p);
48
+ if (match) {
49
+ const fn = match[1];
50
+ const col = match[2]?.trim();
51
+ if (!col)
52
+ return `${fn}=${p}`;
53
+ return `${col}_${fn}=${p}`;
54
+ }
55
+ return p;
56
+ });
57
+ }
58
+ /**
59
+ * Groups and aggregates tabular stream with streaming single-pass accumulation.
60
+ */
61
+ export function groupRows(options = {}) {
62
+ const byCols = options.by
63
+ ? (Array.isArray(options.by) ? options.by : options.by.split(",").map((s) => s.trim()).filter(Boolean))
64
+ : undefined;
65
+ const aggregations = buildGroupReduceSpecs(options);
66
+ return reduceRows({
67
+ by: byCols,
68
+ aggregations,
69
+ });
70
+ }
71
+ //# sourceMappingURL=group.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group.js","sourceRoot":"","sources":["../../src/transforms/group.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { TransformFunction } from "../core/types.js";
2
+ /**
3
+ * Limits the number of rows emitted to `maxCount` and cancels the upstream stream immediately.
4
+ * Zero memory overhead ($O(1)$) and true early cancellation.
5
+ */
6
+ export declare function limitRows(maxCount: number): TransformFunction;
7
+ //# sourceMappingURL=limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limit.d.ts","sourceRoot":"","sources":["../../src/transforms/limit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA8B,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEtF;;;GAGG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,CAqC7D"}