coalesce-transform-mcp 0.3.0 → 0.4.2
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 +74 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +6 -2
- package/dist/client.js.map +1 -1
- package/dist/coalesce/api/environments.d.ts +0 -12
- package/dist/coalesce/api/environments.d.ts.map +1 -1
- package/dist/coalesce/api/environments.js +0 -4
- package/dist/coalesce/api/environments.js.map +1 -1
- package/dist/coalesce/api/jobs.d.ts +3 -5
- package/dist/coalesce/api/jobs.d.ts.map +1 -1
- package/dist/coalesce/api/jobs.js +3 -6
- package/dist/coalesce/api/jobs.js.map +1 -1
- package/dist/coalesce/api/nodes.d.ts +3 -3
- package/dist/coalesce/api/nodes.d.ts.map +1 -1
- package/dist/coalesce/api/nodes.js +6 -4
- package/dist/coalesce/api/nodes.js.map +1 -1
- package/dist/coalesce/api/runs.d.ts.map +1 -1
- package/dist/coalesce/api/runs.js +11 -1
- package/dist/coalesce/api/runs.js.map +1 -1
- package/dist/coalesce/api/scan.d.ts +14 -0
- package/dist/coalesce/api/scan.d.ts.map +1 -0
- package/dist/coalesce/api/scan.js +64 -0
- package/dist/coalesce/api/scan.js.map +1 -0
- package/dist/coalesce/api/subgraphs.d.ts +3 -2
- package/dist/coalesce/api/subgraphs.d.ts.map +1 -1
- package/dist/coalesce/api/subgraphs.js +3 -2
- package/dist/coalesce/api/subgraphs.js.map +1 -1
- package/dist/coalesce/run-schemas.d.ts.map +1 -1
- package/dist/coalesce/run-schemas.js +26 -16
- package/dist/coalesce/run-schemas.js.map +1 -1
- package/dist/coalesce/tool-response.d.ts +1 -13
- package/dist/coalesce/tool-response.d.ts.map +1 -1
- package/dist/coalesce/tool-response.js +20 -6
- package/dist/coalesce/tool-response.js.map +1 -1
- package/dist/coalesce/tool-schemas.d.ts +1 -2
- package/dist/coalesce/tool-schemas.d.ts.map +1 -1
- package/dist/coalesce/tool-schemas.js +368 -5
- package/dist/coalesce/tool-schemas.js.map +1 -1
- package/dist/coalesce/types.d.ts +8 -0
- package/dist/coalesce/types.d.ts.map +1 -1
- package/dist/coalesce/types.js +3 -1
- package/dist/coalesce/types.js.map +1 -1
- package/dist/constants.d.ts +18 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +21 -0
- package/dist/constants.js.map +1 -0
- package/dist/mcp/cache.d.ts +2 -1
- package/dist/mcp/cache.d.ts.map +1 -1
- package/dist/mcp/cache.js +122 -138
- package/dist/mcp/cache.js.map +1 -1
- package/dist/mcp/environments.d.ts +2 -1
- package/dist/mcp/environments.d.ts.map +1 -1
- package/dist/mcp/environments.js +56 -112
- package/dist/mcp/environments.js.map +1 -1
- package/dist/mcp/git-accounts.d.ts +2 -1
- package/dist/mcp/git-accounts.d.ts.map +1 -1
- package/dist/mcp/git-accounts.js +74 -96
- package/dist/mcp/git-accounts.js.map +1 -1
- package/dist/mcp/jobs.d.ts +2 -1
- package/dist/mcp/jobs.d.ts.map +1 -1
- package/dist/mcp/jobs.js +68 -122
- package/dist/mcp/jobs.js.map +1 -1
- package/dist/mcp/lineage.d.ts +5 -0
- package/dist/mcp/lineage.d.ts.map +1 -0
- package/dist/mcp/lineage.js +410 -0
- package/dist/mcp/lineage.js.map +1 -0
- package/dist/mcp/node-type-corpus.d.ts +2 -1
- package/dist/mcp/node-type-corpus.d.ts.map +1 -1
- package/dist/mcp/node-type-corpus.js +148 -151
- package/dist/mcp/node-type-corpus.js.map +1 -1
- package/dist/mcp/nodes.d.ts +2 -1
- package/dist/mcp/nodes.d.ts.map +1 -1
- package/dist/mcp/nodes.js +358 -464
- package/dist/mcp/nodes.js.map +1 -1
- package/dist/mcp/pipelines.d.ts +2 -1
- package/dist/mcp/pipelines.d.ts.map +1 -1
- package/dist/mcp/pipelines.js +514 -314
- package/dist/mcp/pipelines.js.map +1 -1
- package/dist/mcp/projects.d.ts +2 -1
- package/dist/mcp/projects.d.ts.map +1 -1
- package/dist/mcp/projects.js +66 -100
- package/dist/mcp/projects.js.map +1 -1
- package/dist/mcp/repo-node-types.d.ts +2 -1
- package/dist/mcp/repo-node-types.d.ts.map +1 -1
- package/dist/mcp/repo-node-types.js +92 -121
- package/dist/mcp/repo-node-types.js.map +1 -1
- package/dist/mcp/runs.d.ts +3 -2
- package/dist/mcp/runs.d.ts.map +1 -1
- package/dist/mcp/runs.js +93 -148
- package/dist/mcp/runs.js.map +1 -1
- package/dist/mcp/skills.d.ts +13 -0
- package/dist/mcp/skills.d.ts.map +1 -0
- package/dist/mcp/skills.js +85 -0
- package/dist/mcp/skills.js.map +1 -0
- package/dist/mcp/subgraphs.d.ts +2 -1
- package/dist/mcp/subgraphs.d.ts.map +1 -1
- package/dist/mcp/subgraphs.js +61 -98
- package/dist/mcp/subgraphs.js.map +1 -1
- package/dist/mcp/tool-helpers.d.ts +37 -0
- package/dist/mcp/tool-helpers.d.ts.map +1 -0
- package/dist/mcp/tool-helpers.js +82 -0
- package/dist/mcp/tool-helpers.js.map +1 -0
- package/dist/mcp/users.d.ts +2 -1
- package/dist/mcp/users.d.ts.map +1 -1
- package/dist/mcp/users.js +92 -145
- package/dist/mcp/users.js.map +1 -1
- package/dist/mcp/workshop.d.ts +2 -1
- package/dist/mcp/workshop.d.ts.map +1 -1
- package/dist/mcp/workshop.js +66 -101
- package/dist/mcp/workshop.js.map +1 -1
- package/dist/mcp/workspaces.d.ts +2 -1
- package/dist/mcp/workspaces.d.ts.map +1 -1
- package/dist/mcp/workspaces.js +19 -34
- package/dist/mcp/workspaces.js.map +1 -1
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +85 -0
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/context/pipeline-workshop-guide.md +1 -1
- package/dist/resources/context/tool-usage.md +7 -0
- package/dist/resources/index.d.ts +13 -0
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +105 -5
- package/dist/resources/index.js.map +1 -1
- package/dist/schemas/node-payloads.d.ts +2 -2
- package/dist/server.d.ts +2 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +158 -41
- package/dist/server.js.map +1 -1
- package/dist/services/cache/snapshots.d.ts.map +1 -1
- package/dist/services/cache/snapshots.js +9 -5
- package/dist/services/cache/snapshots.js.map +1 -1
- package/dist/services/config/schema-resolver.d.ts.map +1 -1
- package/dist/services/config/schema-resolver.js +3 -6
- package/dist/services/config/schema-resolver.js.map +1 -1
- package/dist/services/lineage/lineage-cache.d.ts +53 -0
- package/dist/services/lineage/lineage-cache.d.ts.map +1 -0
- package/dist/services/lineage/lineage-cache.js +335 -0
- package/dist/services/lineage/lineage-cache.js.map +1 -0
- package/dist/services/lineage/lineage-documentation.d.ts +29 -0
- package/dist/services/lineage/lineage-documentation.d.ts.map +1 -0
- package/dist/services/lineage/lineage-documentation.js +80 -0
- package/dist/services/lineage/lineage-documentation.js.map +1 -0
- package/dist/services/lineage/lineage-propagation.d.ts +47 -0
- package/dist/services/lineage/lineage-propagation.d.ts.map +1 -0
- package/dist/services/lineage/lineage-propagation.js +176 -0
- package/dist/services/lineage/lineage-propagation.js.map +1 -0
- package/dist/services/lineage/lineage-search.d.ts +33 -0
- package/dist/services/lineage/lineage-search.d.ts.map +1 -0
- package/dist/services/lineage/lineage-search.js +133 -0
- package/dist/services/lineage/lineage-search.js.map +1 -0
- package/dist/services/lineage/lineage-traversal.d.ts +34 -0
- package/dist/services/lineage/lineage-traversal.d.ts.map +1 -0
- package/dist/services/lineage/lineage-traversal.js +283 -0
- package/dist/services/lineage/lineage-traversal.js.map +1 -0
- package/dist/services/pipelines/clause-extraction.d.ts +3 -0
- package/dist/services/pipelines/clause-extraction.d.ts.map +1 -0
- package/dist/services/pipelines/clause-extraction.js +27 -0
- package/dist/services/pipelines/clause-extraction.js.map +1 -0
- package/dist/services/pipelines/column-helpers.d.ts +8 -0
- package/dist/services/pipelines/column-helpers.d.ts.map +1 -0
- package/dist/services/pipelines/column-helpers.js +125 -0
- package/dist/services/pipelines/column-helpers.js.map +1 -0
- package/dist/services/pipelines/cte-parsing.d.ts +29 -0
- package/dist/services/pipelines/cte-parsing.d.ts.map +1 -0
- package/dist/services/pipelines/cte-parsing.js +160 -0
- package/dist/services/pipelines/cte-parsing.js.map +1 -0
- package/dist/services/pipelines/cte-planning.d.ts +22 -0
- package/dist/services/pipelines/cte-planning.d.ts.map +1 -0
- package/dist/services/pipelines/cte-planning.js +206 -0
- package/dist/services/pipelines/cte-planning.js.map +1 -0
- package/dist/services/pipelines/execution.d.ts.map +1 -1
- package/dist/services/pipelines/execution.js +0 -1
- package/dist/services/pipelines/execution.js.map +1 -1
- package/dist/services/pipelines/intent-parsing.d.ts +24 -0
- package/dist/services/pipelines/intent-parsing.d.ts.map +1 -0
- package/dist/services/pipelines/intent-parsing.js +245 -0
- package/dist/services/pipelines/intent-parsing.js.map +1 -0
- package/dist/services/pipelines/intent-resolution.d.ts +24 -0
- package/dist/services/pipelines/intent-resolution.d.ts.map +1 -0
- package/dist/services/pipelines/intent-resolution.js +141 -0
- package/dist/services/pipelines/intent-resolution.js.map +1 -0
- package/dist/services/pipelines/intent.d.ts +4 -45
- package/dist/services/pipelines/intent.d.ts.map +1 -1
- package/dist/services/pipelines/intent.js +14 -408
- package/dist/services/pipelines/intent.js.map +1 -1
- package/dist/services/pipelines/node-type-candidates.d.ts +6 -0
- package/dist/services/pipelines/node-type-candidates.d.ts.map +1 -0
- package/dist/services/pipelines/node-type-candidates.js +165 -0
- package/dist/services/pipelines/node-type-candidates.js.map +1 -0
- package/dist/services/pipelines/node-type-intent.d.ts +1 -5
- package/dist/services/pipelines/node-type-intent.d.ts.map +1 -1
- package/dist/services/pipelines/node-type-intent.js +1 -5
- package/dist/services/pipelines/node-type-intent.js.map +1 -1
- package/dist/services/pipelines/node-type-scoring.d.ts +13 -0
- package/dist/services/pipelines/node-type-scoring.d.ts.map +1 -0
- package/dist/services/pipelines/node-type-scoring.js +322 -0
- package/dist/services/pipelines/node-type-scoring.js.map +1 -0
- package/dist/services/pipelines/node-type-selection.d.ts +22 -2
- package/dist/services/pipelines/node-type-selection.d.ts.map +1 -1
- package/dist/services/pipelines/node-type-selection.js +16 -538
- package/dist/services/pipelines/node-type-selection.js.map +1 -1
- package/dist/services/pipelines/plan-builder.d.ts +33 -0
- package/dist/services/pipelines/plan-builder.d.ts.map +1 -0
- package/dist/services/pipelines/plan-builder.js +224 -0
- package/dist/services/pipelines/plan-builder.js.map +1 -0
- package/dist/services/pipelines/planning-types.d.ts +543 -0
- package/dist/services/pipelines/planning-types.d.ts.map +1 -0
- package/dist/services/pipelines/planning-types.js +85 -0
- package/dist/services/pipelines/planning-types.js.map +1 -0
- package/dist/services/pipelines/planning.d.ts +8 -537
- package/dist/services/pipelines/planning.d.ts.map +1 -1
- package/dist/services/pipelines/planning.js +10 -1956
- package/dist/services/pipelines/planning.js.map +1 -1
- package/dist/services/pipelines/review.d.ts.map +1 -1
- package/dist/services/pipelines/review.js +3 -8
- package/dist/services/pipelines/review.js.map +1 -1
- package/dist/services/pipelines/select-parsing.d.ts +7 -0
- package/dist/services/pipelines/select-parsing.d.ts.map +1 -0
- package/dist/services/pipelines/select-parsing.js +185 -0
- package/dist/services/pipelines/select-parsing.js.map +1 -0
- package/dist/services/pipelines/source-parsing.d.ts +8 -0
- package/dist/services/pipelines/source-parsing.d.ts.map +1 -0
- package/dist/services/pipelines/source-parsing.js +151 -0
- package/dist/services/pipelines/source-parsing.js.map +1 -0
- package/dist/services/pipelines/sql-parsing.d.ts +8 -0
- package/dist/services/pipelines/sql-parsing.d.ts.map +1 -0
- package/dist/services/pipelines/sql-parsing.js +9 -0
- package/dist/services/pipelines/sql-parsing.js.map +1 -0
- package/dist/services/pipelines/sql-tokenizer.d.ts +42 -0
- package/dist/services/pipelines/sql-tokenizer.d.ts.map +1 -0
- package/dist/services/pipelines/sql-tokenizer.js +493 -0
- package/dist/services/pipelines/sql-tokenizer.js.map +1 -0
- package/dist/services/pipelines/sql-utils.d.ts +30 -0
- package/dist/services/pipelines/sql-utils.d.ts.map +1 -0
- package/dist/services/pipelines/sql-utils.js +62 -0
- package/dist/services/pipelines/sql-utils.js.map +1 -0
- package/dist/services/pipelines/workshop.d.ts.map +1 -1
- package/dist/services/pipelines/workshop.js +53 -25
- package/dist/services/pipelines/workshop.js.map +1 -1
- package/dist/services/pipelines/workspace-resolution.d.ts +18 -0
- package/dist/services/pipelines/workspace-resolution.d.ts.map +1 -0
- package/dist/services/pipelines/workspace-resolution.js +279 -0
- package/dist/services/pipelines/workspace-resolution.js.map +1 -0
- package/dist/services/runs/diagnostics.d.ts.map +1 -1
- package/dist/services/runs/diagnostics.js +3 -8
- package/dist/services/runs/diagnostics.js.map +1 -1
- package/dist/services/shared/elicitation.d.ts +14 -0
- package/dist/services/shared/elicitation.d.ts.map +1 -0
- package/dist/services/shared/elicitation.js +56 -0
- package/dist/services/shared/elicitation.js.map +1 -0
- package/dist/services/workspace/node-creation.d.ts.map +1 -1
- package/dist/services/workspace/node-creation.js +5 -1
- package/dist/services/workspace/node-creation.js.map +1 -1
- package/dist/services/workspace/node-update-helpers.d.ts.map +1 -1
- package/dist/services/workspace/node-update-helpers.js +3 -8
- package/dist/services/workspace/node-update-helpers.js.map +1 -1
- package/dist/utils.d.ts +11 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +20 -1
- package/dist/utils.js.map +1 -1
- package/dist/workflows/get-environment-health.d.ts +49 -0
- package/dist/workflows/get-environment-health.d.ts.map +1 -0
- package/dist/workflows/get-environment-health.js +310 -0
- package/dist/workflows/get-environment-health.js.map +1 -0
- package/dist/workflows/get-environment-overview.d.ts +2 -1
- package/dist/workflows/get-environment-overview.d.ts.map +1 -1
- package/dist/workflows/get-environment-overview.js +13 -19
- package/dist/workflows/get-environment-overview.js.map +1 -1
- package/dist/workflows/get-run-details.d.ts +2 -2
- package/dist/workflows/get-run-details.d.ts.map +1 -1
- package/dist/workflows/get-run-details.js +14 -19
- package/dist/workflows/get-run-details.js.map +1 -1
- package/dist/workflows/retry-and-wait.d.ts.map +1 -1
- package/dist/workflows/retry-and-wait.js +3 -2
- package/dist/workflows/retry-and-wait.js.map +1 -1
- package/dist/workflows/run-and-wait.d.ts.map +1 -1
- package/dist/workflows/run-and-wait.js +3 -2
- package/dist/workflows/run-and-wait.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import { parseColumnKey, columnKey } from "./lineage-cache.js";
|
|
2
|
+
export function walkUpstream(cache, startNodeID) {
|
|
3
|
+
const result = [];
|
|
4
|
+
const visited = new Set();
|
|
5
|
+
const queue = [{ nodeID: startNodeID, depth: 0 }];
|
|
6
|
+
while (queue.length > 0) {
|
|
7
|
+
const { nodeID, depth } = queue.shift();
|
|
8
|
+
if (visited.has(nodeID))
|
|
9
|
+
continue;
|
|
10
|
+
visited.add(nodeID);
|
|
11
|
+
if (nodeID !== startNodeID) {
|
|
12
|
+
const node = cache.nodes.get(nodeID);
|
|
13
|
+
if (node) {
|
|
14
|
+
result.push({ nodeID: node.id, nodeName: node.name, nodeType: node.nodeType, depth });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const upstream = cache.upstreamNodes.get(nodeID);
|
|
18
|
+
if (upstream) {
|
|
19
|
+
for (const upID of upstream) {
|
|
20
|
+
if (!visited.has(upID)) {
|
|
21
|
+
queue.push({ nodeID: upID, depth: depth + 1 });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
export function walkDownstream(cache, startNodeID) {
|
|
29
|
+
const result = [];
|
|
30
|
+
const visited = new Set();
|
|
31
|
+
const queue = [{ nodeID: startNodeID, depth: 0 }];
|
|
32
|
+
while (queue.length > 0) {
|
|
33
|
+
const { nodeID, depth } = queue.shift();
|
|
34
|
+
if (visited.has(nodeID))
|
|
35
|
+
continue;
|
|
36
|
+
visited.add(nodeID);
|
|
37
|
+
if (nodeID !== startNodeID) {
|
|
38
|
+
const node = cache.nodes.get(nodeID);
|
|
39
|
+
if (node) {
|
|
40
|
+
result.push({ nodeID: node.id, nodeName: node.name, nodeType: node.nodeType, depth });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const downstream = cache.downstreamNodes.get(nodeID);
|
|
44
|
+
if (downstream) {
|
|
45
|
+
for (const downID of downstream) {
|
|
46
|
+
if (!visited.has(downID)) {
|
|
47
|
+
queue.push({ nodeID: downID, depth: depth + 1 });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
export function walkColumnLineage(cache, nodeID, columnID) {
|
|
55
|
+
const result = [];
|
|
56
|
+
const startKey = columnKey(nodeID, columnID);
|
|
57
|
+
// Walk upstream
|
|
58
|
+
const visitedUp = new Set();
|
|
59
|
+
const queueUp = [{ key: startKey, depth: 0 }];
|
|
60
|
+
while (queueUp.length > 0) {
|
|
61
|
+
const { key, depth } = queueUp.shift();
|
|
62
|
+
if (visitedUp.has(key))
|
|
63
|
+
continue;
|
|
64
|
+
visitedUp.add(key);
|
|
65
|
+
if (key !== startKey) {
|
|
66
|
+
const parsed = parseColumnKey(key);
|
|
67
|
+
const node = cache.nodes.get(parsed.nodeID);
|
|
68
|
+
if (node) {
|
|
69
|
+
const col = node.columns.find((c) => c.id === parsed.columnID);
|
|
70
|
+
if (col) {
|
|
71
|
+
result.push({
|
|
72
|
+
nodeID: parsed.nodeID,
|
|
73
|
+
nodeName: node.name,
|
|
74
|
+
nodeType: node.nodeType,
|
|
75
|
+
columnID: parsed.columnID,
|
|
76
|
+
columnName: col.name,
|
|
77
|
+
direction: "upstream",
|
|
78
|
+
depth,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
const upstream = cache.columnUpstream.get(key);
|
|
84
|
+
if (upstream) {
|
|
85
|
+
for (const srcKey of upstream) {
|
|
86
|
+
if (!visitedUp.has(srcKey)) {
|
|
87
|
+
queueUp.push({ key: srcKey, depth: depth + 1 });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Walk downstream
|
|
93
|
+
const visitedDown = new Set();
|
|
94
|
+
const queueDown = [{ key: startKey, depth: 0 }];
|
|
95
|
+
while (queueDown.length > 0) {
|
|
96
|
+
const { key, depth } = queueDown.shift();
|
|
97
|
+
if (visitedDown.has(key))
|
|
98
|
+
continue;
|
|
99
|
+
visitedDown.add(key);
|
|
100
|
+
if (key !== startKey) {
|
|
101
|
+
const parsed = parseColumnKey(key);
|
|
102
|
+
const node = cache.nodes.get(parsed.nodeID);
|
|
103
|
+
if (node) {
|
|
104
|
+
const col = node.columns.find((c) => c.id === parsed.columnID);
|
|
105
|
+
if (col) {
|
|
106
|
+
result.push({
|
|
107
|
+
nodeID: parsed.nodeID,
|
|
108
|
+
nodeName: node.name,
|
|
109
|
+
nodeType: node.nodeType,
|
|
110
|
+
columnID: parsed.columnID,
|
|
111
|
+
columnName: col.name,
|
|
112
|
+
direction: "downstream",
|
|
113
|
+
depth,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const downstream = cache.columnDownstream.get(key);
|
|
119
|
+
if (downstream) {
|
|
120
|
+
for (const dstKey of downstream) {
|
|
121
|
+
if (!visitedDown.has(dstKey)) {
|
|
122
|
+
queueDown.push({ key: dstKey, depth: depth + 1 });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
export function analyzeNodeImpact(cache, nodeID, columnID) {
|
|
130
|
+
const node = cache.nodes.get(nodeID);
|
|
131
|
+
if (!node) {
|
|
132
|
+
throw new Error(`Node ${nodeID} not found in lineage cache. Ensure the workspace has been cached with detail=true.`);
|
|
133
|
+
}
|
|
134
|
+
let sourceColumnName;
|
|
135
|
+
if (columnID) {
|
|
136
|
+
const col = node.columns.find((c) => c.id === columnID);
|
|
137
|
+
if (!col) {
|
|
138
|
+
const available = node.columns.map((c) => `${c.id} (${c.name})`).join(", ");
|
|
139
|
+
throw new Error(`Column ${columnID} not found on node ${nodeID} (${node.name}). Available columns: ${available || "none"}`);
|
|
140
|
+
}
|
|
141
|
+
sourceColumnName = col.name;
|
|
142
|
+
}
|
|
143
|
+
// Node-level impact: all downstream nodes
|
|
144
|
+
const impactedNodes = walkDownstream(cache, nodeID);
|
|
145
|
+
// Column-level impact
|
|
146
|
+
let impactedColumns = [];
|
|
147
|
+
if (columnID) {
|
|
148
|
+
impactedColumns = walkColumnLineage(cache, nodeID, columnID).filter((e) => e.direction === "downstream");
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// All columns on this node -> trace each downstream
|
|
152
|
+
for (const col of node.columns) {
|
|
153
|
+
const downstream = walkColumnLineage(cache, nodeID, col.id).filter((e) => e.direction === "downstream");
|
|
154
|
+
impactedColumns.push(...downstream);
|
|
155
|
+
}
|
|
156
|
+
// Deduplicate
|
|
157
|
+
const seen = new Set();
|
|
158
|
+
impactedColumns = impactedColumns.filter((e) => {
|
|
159
|
+
const key = columnKey(e.nodeID, e.columnID);
|
|
160
|
+
if (seen.has(key))
|
|
161
|
+
return false;
|
|
162
|
+
seen.add(key);
|
|
163
|
+
return true;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
// Group by depth
|
|
167
|
+
const byDepth = {};
|
|
168
|
+
for (const n of impactedNodes) {
|
|
169
|
+
if (!byDepth[n.depth])
|
|
170
|
+
byDepth[n.depth] = [];
|
|
171
|
+
byDepth[n.depth].push(n.nodeName);
|
|
172
|
+
}
|
|
173
|
+
// Critical path: longest path from source to leaf
|
|
174
|
+
const criticalPath = findCriticalPath(cache, nodeID);
|
|
175
|
+
return {
|
|
176
|
+
sourceNodeID: nodeID,
|
|
177
|
+
sourceNodeName: node.name,
|
|
178
|
+
sourceNodeType: node.nodeType,
|
|
179
|
+
...(columnID ? { sourceColumnID: columnID } : {}),
|
|
180
|
+
...(sourceColumnName ? { sourceColumnName } : {}),
|
|
181
|
+
impactedNodes,
|
|
182
|
+
impactedColumns,
|
|
183
|
+
totalImpactedNodes: impactedNodes.length,
|
|
184
|
+
totalImpactedColumns: impactedColumns.length,
|
|
185
|
+
byDepth,
|
|
186
|
+
criticalPath,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function findCriticalPath(cache, startNodeID) {
|
|
190
|
+
const node = cache.nodes.get(startNodeID);
|
|
191
|
+
if (!node)
|
|
192
|
+
return [];
|
|
193
|
+
// Collect reachable downstream subgraph via BFS
|
|
194
|
+
const reachable = new Set();
|
|
195
|
+
const bfsQueue = [startNodeID];
|
|
196
|
+
while (bfsQueue.length > 0) {
|
|
197
|
+
const id = bfsQueue.shift();
|
|
198
|
+
if (reachable.has(id))
|
|
199
|
+
continue;
|
|
200
|
+
reachable.add(id);
|
|
201
|
+
const downstream = cache.downstreamNodes.get(id);
|
|
202
|
+
if (downstream) {
|
|
203
|
+
for (const nextID of downstream) {
|
|
204
|
+
if (!reachable.has(nextID))
|
|
205
|
+
bfsQueue.push(nextID);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Topological sort (Kahn's algorithm) over the reachable subgraph
|
|
210
|
+
const inDegree = new Map();
|
|
211
|
+
for (const id of reachable)
|
|
212
|
+
inDegree.set(id, 0);
|
|
213
|
+
for (const id of reachable) {
|
|
214
|
+
const downstream = cache.downstreamNodes.get(id);
|
|
215
|
+
if (downstream) {
|
|
216
|
+
for (const nextID of downstream) {
|
|
217
|
+
if (reachable.has(nextID)) {
|
|
218
|
+
inDegree.set(nextID, (inDegree.get(nextID) ?? 0) + 1);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const topoQueue = [];
|
|
224
|
+
for (const [id, deg] of inDegree) {
|
|
225
|
+
if (deg === 0)
|
|
226
|
+
topoQueue.push(id);
|
|
227
|
+
}
|
|
228
|
+
const topoOrder = [];
|
|
229
|
+
while (topoQueue.length > 0) {
|
|
230
|
+
const id = topoQueue.shift();
|
|
231
|
+
topoOrder.push(id);
|
|
232
|
+
const downstream = cache.downstreamNodes.get(id);
|
|
233
|
+
if (downstream) {
|
|
234
|
+
for (const nextID of downstream) {
|
|
235
|
+
if (!reachable.has(nextID))
|
|
236
|
+
continue;
|
|
237
|
+
const newDeg = (inDegree.get(nextID) ?? 1) - 1;
|
|
238
|
+
inDegree.set(nextID, newDeg);
|
|
239
|
+
if (newDeg === 0)
|
|
240
|
+
topoQueue.push(nextID);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// DP longest path from startNodeID — O(V+E)
|
|
245
|
+
const dist = new Map();
|
|
246
|
+
const predecessor = new Map();
|
|
247
|
+
dist.set(startNodeID, 0);
|
|
248
|
+
for (const id of topoOrder) {
|
|
249
|
+
const d = dist.get(id);
|
|
250
|
+
if (d === undefined)
|
|
251
|
+
continue; // not reachable from start
|
|
252
|
+
const downstream = cache.downstreamNodes.get(id);
|
|
253
|
+
if (downstream) {
|
|
254
|
+
for (const nextID of downstream) {
|
|
255
|
+
if (!reachable.has(nextID))
|
|
256
|
+
continue;
|
|
257
|
+
if (d + 1 > (dist.get(nextID) ?? -1)) {
|
|
258
|
+
dist.set(nextID, d + 1);
|
|
259
|
+
predecessor.set(nextID, id);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Find the farthest node
|
|
265
|
+
let farthestID = startNodeID;
|
|
266
|
+
let maxDist = 0;
|
|
267
|
+
for (const [id, d] of dist) {
|
|
268
|
+
if (d > maxDist) {
|
|
269
|
+
maxDist = d;
|
|
270
|
+
farthestID = id;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// Reconstruct path
|
|
274
|
+
const pathIDs = [];
|
|
275
|
+
let cur = farthestID;
|
|
276
|
+
while (cur !== undefined) {
|
|
277
|
+
pathIDs.push(cur);
|
|
278
|
+
cur = predecessor.get(cur);
|
|
279
|
+
}
|
|
280
|
+
pathIDs.reverse();
|
|
281
|
+
return pathIDs.map((id) => cache.nodes.get(id)?.name ?? id);
|
|
282
|
+
}
|
|
283
|
+
//# sourceMappingURL=lineage-traversal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lineage-traversal.js","sourceRoot":"","sources":["../../../src/services/lineage/lineage-traversal.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clause-extraction.d.ts","sourceRoot":"","sources":["../../../src/services/pipelines/clause-extraction.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU9D;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAa5D"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { findTopLevelKeywordIndex } from "./sql-tokenizer.js";
|
|
2
|
+
export function extractSelectClause(sql) {
|
|
3
|
+
const selectIndex = findTopLevelKeywordIndex(sql, "select");
|
|
4
|
+
if (selectIndex < 0) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
const fromIndex = findTopLevelKeywordIndex(sql, "from", selectIndex + 6);
|
|
8
|
+
if (fromIndex < 0) {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
return sql.slice(selectIndex + 6, fromIndex).trim();
|
|
12
|
+
}
|
|
13
|
+
export function extractFromClause(sql) {
|
|
14
|
+
const selectIndex = findTopLevelKeywordIndex(sql, "select");
|
|
15
|
+
if (selectIndex < 0) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const fromIndex = findTopLevelKeywordIndex(sql, "from", selectIndex + 6);
|
|
19
|
+
if (fromIndex < 0) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
return sql
|
|
23
|
+
.slice(fromIndex)
|
|
24
|
+
.trim()
|
|
25
|
+
.replace(/;+\s*$/u, "");
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=clause-extraction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clause-extraction.js","sourceRoot":"","sources":["../../../src/services/pipelines/clause-extraction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,WAAW,GAAG,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;IACzE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,WAAW,GAAG,wBAAwB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,SAAS,GAAG,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;IACzE,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,GAAG;SACP,KAAK,CAAC,SAAS,CAAC;SAChB,IAAI,EAAE;SACN,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PlannedSelectItem, PlannedPipelineNode } from "./planning-types.js";
|
|
2
|
+
export declare function getColumnNamesFromNode(node: Record<string, unknown>): string[];
|
|
3
|
+
export declare function getNodeColumnArray(node: Record<string, unknown>): Record<string, unknown>[];
|
|
4
|
+
export declare function getColumnSourceNodeIDs(column: Record<string, unknown>): string[];
|
|
5
|
+
export declare function findMatchingBaseColumn(node: Record<string, unknown>, selectItem: PlannedSelectItem): Record<string, unknown> | null;
|
|
6
|
+
export declare function renameSourceMappingEntries(node: Record<string, unknown>, newName: string): Record<string, unknown>;
|
|
7
|
+
export declare function buildStageSourceMappingFromPlan(currentNode: Record<string, unknown>, nodePlan: PlannedPipelineNode): Record<string, unknown>[];
|
|
8
|
+
//# sourceMappingURL=column-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-helpers.d.ts","sourceRoot":"","sources":["../../../src/services/pipelines/column-helpers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGlF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAY9E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAM3F;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAgBhF;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,UAAU,EAAE,iBAAiB,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAqBhC;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+BzB;AAED,wBAAgB,+BAA+B,CAC7C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,QAAQ,EAAE,mBAAmB,GAC5B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CA0C3B"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { isPlainObject } from "../../utils.js";
|
|
2
|
+
import { normalizeSqlIdentifier, deepClone, getUniqueSourceDependencies } from "./sql-parsing.js";
|
|
3
|
+
export function getColumnNamesFromNode(node) {
|
|
4
|
+
const metadata = isPlainObject(node.metadata) ? node.metadata : undefined;
|
|
5
|
+
if (!Array.isArray(metadata?.columns)) {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
return metadata.columns.flatMap((column) => {
|
|
9
|
+
if (!isPlainObject(column) || typeof column.name !== "string") {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
return [column.name];
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export function getNodeColumnArray(node) {
|
|
16
|
+
const metadata = isPlainObject(node.metadata) ? node.metadata : undefined;
|
|
17
|
+
if (!Array.isArray(metadata?.columns)) {
|
|
18
|
+
return [];
|
|
19
|
+
}
|
|
20
|
+
return metadata.columns.filter(isPlainObject);
|
|
21
|
+
}
|
|
22
|
+
export function getColumnSourceNodeIDs(column) {
|
|
23
|
+
if (!Array.isArray(column.sources)) {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
const ids = new Set();
|
|
27
|
+
for (const source of column.sources) {
|
|
28
|
+
if (!isPlainObject(source) || !Array.isArray(source.columnReferences)) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
for (const ref of source.columnReferences) {
|
|
32
|
+
if (isPlainObject(ref) && typeof ref.nodeID === "string") {
|
|
33
|
+
ids.add(ref.nodeID);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return Array.from(ids);
|
|
38
|
+
}
|
|
39
|
+
export function findMatchingBaseColumn(node, selectItem) {
|
|
40
|
+
if (!selectItem.sourceColumnName)
|
|
41
|
+
return null;
|
|
42
|
+
const normalizedTargetName = normalizeSqlIdentifier(selectItem.sourceColumnName);
|
|
43
|
+
for (const column of getNodeColumnArray(node)) {
|
|
44
|
+
if (typeof column.name !== "string" ||
|
|
45
|
+
normalizeSqlIdentifier(column.name) !== normalizedTargetName) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const sourceNodeIDs = getColumnSourceNodeIDs(column);
|
|
49
|
+
if (selectItem.sourceNodeID && sourceNodeIDs.includes(selectItem.sourceNodeID)) {
|
|
50
|
+
return deepClone(column);
|
|
51
|
+
}
|
|
52
|
+
if (!selectItem.sourceNodeID) {
|
|
53
|
+
return deepClone(column);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
export function renameSourceMappingEntries(node, newName) {
|
|
59
|
+
const metadata = isPlainObject(node.metadata) ? node.metadata : undefined;
|
|
60
|
+
if (!metadata || !Array.isArray(metadata.sourceMapping)) {
|
|
61
|
+
return node;
|
|
62
|
+
}
|
|
63
|
+
const previousName = typeof node.name === "string" && node.name.trim().length > 0 ? node.name : null;
|
|
64
|
+
const updateSingleUnnamedMapping = previousName === null && metadata.sourceMapping.length === 1;
|
|
65
|
+
return {
|
|
66
|
+
...node,
|
|
67
|
+
metadata: {
|
|
68
|
+
...metadata,
|
|
69
|
+
sourceMapping: metadata.sourceMapping.map((entry) => {
|
|
70
|
+
if (!isPlainObject(entry)) {
|
|
71
|
+
return entry;
|
|
72
|
+
}
|
|
73
|
+
const shouldRename = (previousName !== null && entry.name === previousName) ||
|
|
74
|
+
updateSingleUnnamedMapping;
|
|
75
|
+
if (!shouldRename) {
|
|
76
|
+
return entry;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
...entry,
|
|
80
|
+
name: newName,
|
|
81
|
+
};
|
|
82
|
+
}),
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export function buildStageSourceMappingFromPlan(currentNode, nodePlan) {
|
|
87
|
+
const metadata = isPlainObject(currentNode.metadata) ? currentNode.metadata : undefined;
|
|
88
|
+
const existingEntry = metadata && Array.isArray(metadata.sourceMapping)
|
|
89
|
+
? metadata.sourceMapping.find(isPlainObject)
|
|
90
|
+
: undefined;
|
|
91
|
+
const aliases = {};
|
|
92
|
+
for (const ref of nodePlan.sourceRefs) {
|
|
93
|
+
if (!ref.nodeID) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
const alias = ref.alias ?? ref.nodeName;
|
|
97
|
+
if (nodePlan.sourceRefs.length > 1 || ref.alias) {
|
|
98
|
+
aliases[alias] = ref.nodeID;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return [
|
|
102
|
+
{
|
|
103
|
+
...(isPlainObject(existingEntry) ? existingEntry : {}),
|
|
104
|
+
aliases,
|
|
105
|
+
customSQL: {
|
|
106
|
+
...(isPlainObject(existingEntry) && isPlainObject(existingEntry.customSQL)
|
|
107
|
+
? existingEntry.customSQL
|
|
108
|
+
: {}),
|
|
109
|
+
customSQL: "",
|
|
110
|
+
},
|
|
111
|
+
dependencies: getUniqueSourceDependencies(nodePlan.sourceRefs),
|
|
112
|
+
join: {
|
|
113
|
+
...(isPlainObject(existingEntry) && isPlainObject(existingEntry.join)
|
|
114
|
+
? existingEntry.join
|
|
115
|
+
: {}),
|
|
116
|
+
joinCondition: nodePlan.joinCondition ?? "",
|
|
117
|
+
},
|
|
118
|
+
name: nodePlan.name,
|
|
119
|
+
noLinkRefs: isPlainObject(existingEntry) && Array.isArray(existingEntry.noLinkRefs)
|
|
120
|
+
? existingEntry.noLinkRefs
|
|
121
|
+
: [],
|
|
122
|
+
},
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=column-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-helpers.js","sourceRoot":"","sources":["../../../src/services/pipelines/column-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parsed CTE with name and body SQL.
|
|
3
|
+
*/
|
|
4
|
+
export type ParsedCte = {
|
|
5
|
+
name: string;
|
|
6
|
+
body: string;
|
|
7
|
+
columns: CteColumn[];
|
|
8
|
+
whereClause: string | null;
|
|
9
|
+
sourceTable: string | null;
|
|
10
|
+
hasGroupBy: boolean;
|
|
11
|
+
hasJoin: boolean;
|
|
12
|
+
};
|
|
13
|
+
export type CteColumn = {
|
|
14
|
+
outputName: string;
|
|
15
|
+
expression: string;
|
|
16
|
+
isTransform: boolean;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Extract CTEs with their bodies from SQL.
|
|
20
|
+
* Uses quoting-aware scanning to find CTE headers and balanced parentheses,
|
|
21
|
+
* avoiding false matches inside string literals, quoted identifiers, and comments.
|
|
22
|
+
*/
|
|
23
|
+
export declare function extractCtes(sql: string): ParsedCte[];
|
|
24
|
+
/**
|
|
25
|
+
* Classify a CTE's pattern to pick the right node type.
|
|
26
|
+
*/
|
|
27
|
+
export declare function classifyCtePattern(cte: ParsedCte): "staging" | "multiSource" | "aggregation";
|
|
28
|
+
export declare function isAggregateFn(name: string): boolean;
|
|
29
|
+
//# sourceMappingURL=cte-parsing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cte-parsing.d.ts","sourceRoot":"","sources":["../../../src/services/pipelines/cte-parsing.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CA6CpD;AAmGD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,aAAa,GAAG,aAAa,CAI5F;AAUD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD"}
|