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.
- package/README.md +238 -55
- package/dist/cli/commands/count.d.ts +12 -0
- package/dist/cli/commands/count.d.ts.map +1 -0
- package/dist/cli/commands/count.js +49 -0
- package/dist/cli/commands/count.js.map +1 -0
- package/dist/cli/commands/explain.d.ts +3 -0
- package/dist/cli/commands/explain.d.ts.map +1 -0
- package/dist/cli/commands/explain.js +11 -0
- package/dist/cli/commands/explain.js.map +1 -0
- package/dist/cli/commands/files.d.ts +2 -1
- package/dist/cli/commands/files.d.ts.map +1 -1
- package/dist/cli/commands/files.js +5 -2
- package/dist/cli/commands/files.js.map +1 -1
- package/dist/cli/commands/group.d.ts +12 -0
- package/dist/cli/commands/group.d.ts.map +1 -0
- package/dist/cli/commands/group.js +51 -0
- package/dist/cli/commands/group.js.map +1 -0
- package/dist/cli/commands/head.d.ts +7 -0
- package/dist/cli/commands/head.d.ts.map +1 -0
- package/dist/cli/commands/head.js +6 -0
- package/dist/cli/commands/head.js.map +1 -0
- package/dist/cli/commands/limit.d.ts +11 -0
- package/dist/cli/commands/limit.d.ts.map +1 -0
- package/dist/cli/commands/limit.js +40 -0
- package/dist/cli/commands/limit.js.map +1 -0
- package/dist/cli/commands/offset.d.ts +11 -0
- package/dist/cli/commands/offset.d.ts.map +1 -0
- package/dist/cli/commands/offset.js +39 -0
- package/dist/cli/commands/offset.js.map +1 -0
- package/dist/cli/commands/pipeline.d.ts +43 -0
- package/dist/cli/commands/pipeline.d.ts.map +1 -0
- package/dist/cli/commands/pipeline.js +198 -0
- package/dist/cli/commands/pipeline.js.map +1 -0
- package/dist/cli/commands/sort.d.ts +17 -0
- package/dist/cli/commands/sort.d.ts.map +1 -0
- package/dist/cli/commands/sort.js +55 -0
- package/dist/cli/commands/sort.js.map +1 -0
- package/dist/cli/commands/tail.d.ts +13 -0
- package/dist/cli/commands/tail.d.ts.map +1 -0
- package/dist/cli/commands/tail.js +39 -0
- package/dist/cli/commands/tail.js.map +1 -0
- package/dist/cli/commands/top.d.ts +19 -0
- package/dist/cli/commands/top.d.ts.map +1 -0
- package/dist/cli/commands/top.js +51 -0
- package/dist/cli/commands/top.js.map +1 -0
- package/dist/cli/commands/unique.d.ts +15 -0
- package/dist/cli/commands/unique.d.ts.map +1 -0
- package/dist/cli/commands/unique.js +44 -0
- package/dist/cli/commands/unique.js.map +1 -0
- package/dist/cli/index.js +252 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/core/pipeline.d.ts +40 -0
- package/dist/core/pipeline.d.ts.map +1 -1
- package/dist/core/pipeline.js +65 -0
- package/dist/core/pipeline.js.map +1 -1
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/planner/executor.d.ts +8 -0
- package/dist/planner/executor.d.ts.map +1 -0
- package/dist/planner/executor.js +86 -0
- package/dist/planner/executor.js.map +1 -0
- package/dist/planner/explain.d.ts +6 -0
- package/dist/planner/explain.d.ts.map +1 -0
- package/dist/planner/explain.js +91 -0
- package/dist/planner/explain.js.map +1 -0
- package/dist/planner/index.d.ts +5 -0
- package/dist/planner/index.d.ts.map +1 -0
- package/dist/planner/index.js +5 -0
- package/dist/planner/index.js.map +1 -0
- package/dist/planner/optimizer.d.ts +9 -0
- package/dist/planner/optimizer.d.ts.map +1 -0
- package/dist/planner/optimizer.js +78 -0
- package/dist/planner/optimizer.js.map +1 -0
- package/dist/planner/types.d.ts +63 -0
- package/dist/planner/types.d.ts.map +1 -0
- package/dist/planner/types.js +2 -0
- package/dist/planner/types.js.map +1 -0
- package/dist/transforms/count.d.ts +21 -0
- package/dist/transforms/count.d.ts.map +1 -0
- package/dist/transforms/count.js +65 -0
- package/dist/transforms/count.js.map +1 -0
- package/dist/transforms/group.d.ts +25 -0
- package/dist/transforms/group.d.ts.map +1 -0
- package/dist/transforms/group.js +71 -0
- package/dist/transforms/group.js.map +1 -0
- package/dist/transforms/limit.d.ts +7 -0
- package/dist/transforms/limit.d.ts.map +1 -0
- package/dist/transforms/limit.js +40 -0
- package/dist/transforms/limit.js.map +1 -0
- package/dist/transforms/offset.d.ts +7 -0
- package/dist/transforms/offset.d.ts.map +1 -0
- package/dist/transforms/offset.js +38 -0
- package/dist/transforms/offset.js.map +1 -0
- package/dist/transforms/sort/comparator.d.ts +43 -0
- package/dist/transforms/sort/comparator.d.ts.map +1 -0
- package/dist/transforms/sort/comparator.js +131 -0
- package/dist/transforms/sort/comparator.js.map +1 -0
- package/dist/transforms/sort/external-sort.d.ts +8 -0
- package/dist/transforms/sort/external-sort.d.ts.map +1 -0
- package/dist/transforms/sort/external-sort.js +159 -0
- package/dist/transforms/sort/external-sort.js.map +1 -0
- package/dist/transforms/sort/index.d.ts +10 -0
- package/dist/transforms/sort/index.d.ts.map +1 -0
- package/dist/transforms/sort/index.js +11 -0
- package/dist/transforms/sort/index.js.map +1 -0
- package/dist/transforms/tail.d.ts +6 -0
- package/dist/transforms/tail.d.ts.map +1 -0
- package/dist/transforms/tail.js +27 -0
- package/dist/transforms/tail.js.map +1 -0
- package/dist/transforms/top.d.ts +17 -0
- package/dist/transforms/top.d.ts.map +1 -0
- package/dist/transforms/top.js +52 -0
- package/dist/transforms/top.js.map +1 -0
- package/dist/transforms/unique.d.ts +13 -0
- package/dist/transforms/unique.d.ts.map +1 -0
- package/dist/transforms/unique.js +91 -0
- package/dist/transforms/unique.js.map +1 -0
- package/dist/utils/heap.d.ts +25 -0
- package/dist/utils/heap.d.ts.map +1 -0
- package/dist/utils/heap.js +90 -0
- package/dist/utils/heap.js.map +1 -0
- package/dist/utils/keystore.d.ts +80 -0
- package/dist/utils/keystore.d.ts.map +1 -0
- package/dist/utils/keystore.js +217 -0
- package/dist/utils/keystore.js.map +1 -0
- package/dist/utils/ring-buffer.d.ts +15 -0
- package/dist/utils/ring-buffer.d.ts.map +1 -0
- package/dist/utils/ring-buffer.js +40 -0
- package/dist/utils/ring-buffer.js.map +1 -0
- package/package.json +3 -2
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|