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,151 @@
|
|
|
1
|
+
import { stripIdentifierQuotes, matchesKeywordAt, scanTopLevel, splitTopLevel, tokenizeTopLevelWhitespace, skipSqlTrivia, } from "./sql-tokenizer.js";
|
|
2
|
+
import { isSupportedIdentifierToken } from "./sql-utils.js";
|
|
3
|
+
import { extractFromClause } from "./clause-extraction.js";
|
|
4
|
+
/** Keywords that terminate a source segment in a FROM clause. */
|
|
5
|
+
const SOURCE_SEGMENT_TERMINATORS = [
|
|
6
|
+
"join", "left", "right", "inner", "full", "cross", "natural", "lateral",
|
|
7
|
+
"on", "using",
|
|
8
|
+
"where", "group", "order", "having", "limit", "qualify",
|
|
9
|
+
"union", "intersect", "except", "window", "fetch",
|
|
10
|
+
];
|
|
11
|
+
function findTerminatorKeyword(value, index) {
|
|
12
|
+
for (const keyword of SOURCE_SEGMENT_TERMINATORS) {
|
|
13
|
+
if (matchesKeywordAt(value, index, keyword)) {
|
|
14
|
+
return keyword;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
function extractTopLevelSourceSegments(fromClause) {
|
|
20
|
+
const segments = [];
|
|
21
|
+
let captureStart = null;
|
|
22
|
+
const pushSegment = (endIndex) => {
|
|
23
|
+
if (captureStart === null) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
let trimmedEnd = endIndex;
|
|
27
|
+
while (trimmedEnd > captureStart && /\s/u.test(fromClause[trimmedEnd - 1] ?? "")) {
|
|
28
|
+
trimmedEnd -= 1;
|
|
29
|
+
}
|
|
30
|
+
if (trimmedEnd > captureStart) {
|
|
31
|
+
segments.push({
|
|
32
|
+
text: fromClause.slice(captureStart, trimmedEnd),
|
|
33
|
+
relationStart: captureStart,
|
|
34
|
+
relationEnd: trimmedEnd,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
scanTopLevel(fromClause, (char, index, parenDepth) => {
|
|
39
|
+
if (parenDepth !== 0) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
if (captureStart === null) {
|
|
43
|
+
if (matchesKeywordAt(fromClause, index, "from")) {
|
|
44
|
+
captureStart = skipSqlTrivia(fromClause, index + 4);
|
|
45
|
+
}
|
|
46
|
+
else if (matchesKeywordAt(fromClause, index, "join")) {
|
|
47
|
+
captureStart = skipSqlTrivia(fromClause, index + 4);
|
|
48
|
+
}
|
|
49
|
+
else if (char === ",") {
|
|
50
|
+
captureStart = skipSqlTrivia(fromClause, index + 1);
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
if (char === ",") {
|
|
55
|
+
pushSegment(index);
|
|
56
|
+
captureStart = skipSqlTrivia(fromClause, index + 1);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
const terminator = findTerminatorKeyword(fromClause, index);
|
|
60
|
+
if (terminator) {
|
|
61
|
+
pushSegment(index);
|
|
62
|
+
captureStart =
|
|
63
|
+
terminator === "join"
|
|
64
|
+
? skipSqlTrivia(fromClause, index + terminator.length)
|
|
65
|
+
: null;
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
});
|
|
69
|
+
pushSegment(fromClause.length);
|
|
70
|
+
return segments;
|
|
71
|
+
}
|
|
72
|
+
function parseSqlSourceSegment(segment) {
|
|
73
|
+
const relationOffset = skipSqlTrivia(segment.text, 0);
|
|
74
|
+
if (relationOffset >= segment.text.length) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
let relationText;
|
|
78
|
+
let relationTokenStart;
|
|
79
|
+
let relationTokenEnd;
|
|
80
|
+
let aliasTokens;
|
|
81
|
+
if (segment.text.slice(relationOffset).startsWith("{{")) {
|
|
82
|
+
const closingIndex = segment.text.indexOf("}}", relationOffset);
|
|
83
|
+
if (closingIndex < 0) {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
relationTokenStart = relationOffset;
|
|
87
|
+
relationTokenEnd = closingIndex + 2;
|
|
88
|
+
relationText = segment.text.slice(relationTokenStart, relationTokenEnd).trim();
|
|
89
|
+
aliasTokens = tokenizeTopLevelWhitespace(segment.text.slice(relationTokenEnd)).map((token) => token.text);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
const tokens = tokenizeTopLevelWhitespace(segment.text);
|
|
93
|
+
if (tokens.length === 0) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
const relationToken = tokens[0];
|
|
97
|
+
relationText = relationToken.text;
|
|
98
|
+
relationTokenStart = relationToken.start;
|
|
99
|
+
relationTokenEnd = relationToken.end;
|
|
100
|
+
aliasTokens = tokens.slice(1).map((token) => token.text);
|
|
101
|
+
}
|
|
102
|
+
const alias = aliasTokens[0]?.toLowerCase() === "as"
|
|
103
|
+
? (aliasTokens[1] ? stripIdentifierQuotes(aliasTokens[1]) : null)
|
|
104
|
+
: aliasTokens[0]
|
|
105
|
+
? stripIdentifierQuotes(aliasTokens[0])
|
|
106
|
+
: null;
|
|
107
|
+
const refMatch = relationText.match(/^\{\{\s*ref\(\s*(['"])([^'"]+)\1\s*,\s*(['"])([^'"]+)\3\s*\)\s*\}\}$/iu);
|
|
108
|
+
if (refMatch) {
|
|
109
|
+
return {
|
|
110
|
+
locationName: refMatch[2] ?? "",
|
|
111
|
+
nodeName: refMatch[4] ?? "",
|
|
112
|
+
alias,
|
|
113
|
+
nodeID: null,
|
|
114
|
+
sourceStyle: "coalesce_ref",
|
|
115
|
+
locationCandidates: refMatch[2] ? [refMatch[2]] : [],
|
|
116
|
+
relationStart: segment.relationStart + relationTokenStart,
|
|
117
|
+
relationEnd: segment.relationStart + relationTokenEnd,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (relationText.startsWith("(")) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const parts = splitTopLevel(relationText, ".").map((part) => part.trim());
|
|
124
|
+
if (parts.length === 0 ||
|
|
125
|
+
parts.some((part) => part.length === 0 || !isSupportedIdentifierToken(part))) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
const normalizedParts = parts.map(stripIdentifierQuotes);
|
|
129
|
+
const nodeName = normalizedParts[normalizedParts.length - 1] ?? "";
|
|
130
|
+
return {
|
|
131
|
+
locationName: "",
|
|
132
|
+
nodeName,
|
|
133
|
+
alias,
|
|
134
|
+
nodeID: null,
|
|
135
|
+
sourceStyle: "table_name",
|
|
136
|
+
locationCandidates: normalizedParts.slice(0, -1).reverse(),
|
|
137
|
+
relationStart: segment.relationStart + relationTokenStart,
|
|
138
|
+
relationEnd: segment.relationStart + relationTokenEnd,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export function parseSqlSourceRefs(sql) {
|
|
142
|
+
const fromClause = extractFromClause(sql);
|
|
143
|
+
if (!fromClause) {
|
|
144
|
+
return { fromClause: "", refs: [] };
|
|
145
|
+
}
|
|
146
|
+
const refs = extractTopLevelSourceSegments(fromClause)
|
|
147
|
+
.map(parseSqlSourceSegment)
|
|
148
|
+
.filter((ref) => ref !== null);
|
|
149
|
+
return { fromClause, refs };
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=source-parsing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-parsing.js","sourceRoot":"","sources":["../../../src/services/pipelines/source-parsing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { normalizeSqlIdentifier, deepClone, normalizeWhitespace, buildSourceDependencyKey, getUniqueSourceDependencies, escapeRegExp, } from "./sql-utils.js";
|
|
2
|
+
export { extractSelectClause, extractFromClause, } from "./clause-extraction.js";
|
|
3
|
+
export { parseSqlSourceRefs } from "./source-parsing.js";
|
|
4
|
+
export { splitExpressionAlias, parseSqlSelectItems } from "./select-parsing.js";
|
|
5
|
+
export type { ParsedCte, CteColumn } from "./cte-parsing.js";
|
|
6
|
+
export { extractCtes } from "./cte-parsing.js";
|
|
7
|
+
export { buildCtePlan } from "./cte-planning.js";
|
|
8
|
+
//# sourceMappingURL=sql-parsing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-parsing.d.ts","sourceRoot":"","sources":["../../../src/services/pipelines/sql-parsing.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,sBAAsB,EACtB,SAAS,EACT,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEhF,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Re-export hub — the implementation lives in focused modules.
|
|
2
|
+
// All external consumers can continue importing from "./sql-parsing.js".
|
|
3
|
+
export { normalizeSqlIdentifier, deepClone, normalizeWhitespace, buildSourceDependencyKey, getUniqueSourceDependencies, escapeRegExp, } from "./sql-utils.js";
|
|
4
|
+
export { extractSelectClause, extractFromClause, } from "./clause-extraction.js";
|
|
5
|
+
export { parseSqlSourceRefs } from "./source-parsing.js";
|
|
6
|
+
export { splitExpressionAlias, parseSqlSelectItems } from "./select-parsing.js";
|
|
7
|
+
export { extractCtes } from "./cte-parsing.js";
|
|
8
|
+
export { buildCtePlan } from "./cte-planning.js";
|
|
9
|
+
//# sourceMappingURL=sql-parsing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-parsing.js","sourceRoot":"","sources":["../../../src/services/pipelines/sql-parsing.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,yEAAyE;AAEzE,OAAO,EACL,sBAAsB,EACtB,SAAS,EACT,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,YAAY,GACb,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAGhF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export declare function isIdentifierChar(char: string | undefined): boolean;
|
|
2
|
+
export declare function stripIdentifierQuotes(identifier: string): string;
|
|
3
|
+
export declare function findTopLevelKeywordIndex(sql: string, keyword: string, startIndex?: number): number;
|
|
4
|
+
/**
|
|
5
|
+
* Iterates through a SQL string character-by-character, tracking quoting and
|
|
6
|
+
* parenthesis depth. For each unquoted, non-comment character (excluding
|
|
7
|
+
* parenthesis delimiters themselves), the callback receives the character,
|
|
8
|
+
* its index, and the current parenthesis depth. Callers can inspect
|
|
9
|
+
* `parenDepth` to filter for top-level-only processing.
|
|
10
|
+
* The callback returns `true` to continue or `false` to stop early.
|
|
11
|
+
*
|
|
12
|
+
* The scanner handles: single-quoted strings (with '' escapes), double-quoted
|
|
13
|
+
* identifiers, backtick-quoted identifiers, bracket-quoted identifiers, block
|
|
14
|
+
* comments, and line comments.
|
|
15
|
+
*/
|
|
16
|
+
export declare function scanTopLevel(value: string, callback: (char: string, index: number, parenDepth: number) => boolean): void;
|
|
17
|
+
export declare function splitTopLevel(value: string, delimiter: string): string[];
|
|
18
|
+
export type TopLevelWhitespaceToken = {
|
|
19
|
+
text: string;
|
|
20
|
+
start: number;
|
|
21
|
+
end: number;
|
|
22
|
+
};
|
|
23
|
+
export declare function tokenizeTopLevelWhitespace(value: string): TopLevelWhitespaceToken[];
|
|
24
|
+
export declare function splitTopLevelWhitespace(value: string): string[];
|
|
25
|
+
export declare function skipSqlTrivia(value: string, index: number): number;
|
|
26
|
+
export declare function matchesKeywordAt(value: string, index: number, keyword: string): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Find the index of the closing parenthesis that balances the opening one.
|
|
29
|
+
* `startIndex` should be the position right after the opening '('.
|
|
30
|
+
* Returns the index of the closing ')' or -1 if unbalanced.
|
|
31
|
+
*
|
|
32
|
+
* Handles all SQL quoting contexts: single-quoted strings, double-quoted
|
|
33
|
+
* identifiers, backtick-quoted identifiers, bracket-quoted identifiers,
|
|
34
|
+
* line comments (`--`), and block comments.
|
|
35
|
+
*/
|
|
36
|
+
export declare function findClosingParen(sql: string, startIndex: number): number;
|
|
37
|
+
/**
|
|
38
|
+
* Extract the body between balanced parentheses.
|
|
39
|
+
* `startIndex` should be the position right after the opening '('.
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractParenBody(sql: string, startIndex: number): string | null;
|
|
42
|
+
//# sourceMappingURL=sql-tokenizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-tokenizer.d.ts","sourceRoot":"","sources":["../../../src/services/pipelines/sql-tokenizer.ts"],"names":[],"mappings":"AAAA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAElE;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAUhE;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,SAAI,GAAG,MAAM,CAsG7F;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,GACrE,IAAI,CA4DN;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAiBxE;AAED,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,uBAAuB,EAAE,CA4InF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAsBlE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAMvF;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAqDxE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI/E"}
|