@rawsql-ts/sql-grep-core 0.1.1
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 +50 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/query/analyzeColumnUsage.d.ts +10 -0
- package/dist/query/analyzeColumnUsage.js +478 -0
- package/dist/query/analyzeColumnUsage.js.map +1 -0
- package/dist/query/analyzeTableUsage.d.ts +10 -0
- package/dist/query/analyzeTableUsage.js +321 -0
- package/dist/query/analyzeTableUsage.js.map +1 -0
- package/dist/query/format.d.ts +17 -0
- package/dist/query/format.js +171 -0
- package/dist/query/format.js.map +1 -0
- package/dist/query/location.d.ts +18 -0
- package/dist/query/location.js +214 -0
- package/dist/query/location.js.map +1 -0
- package/dist/query/report.d.ts +29 -0
- package/dist/query/report.js +380 -0
- package/dist/query/report.js.map +1 -0
- package/dist/query/targets.d.ts +14 -0
- package/dist/query/targets.js +84 -0
- package/dist/query/targets.js.map +1 -0
- package/dist/query/types.d.ts +97 -0
- package/dist/query/types.js +3 -0
- package/dist/query/types.js.map +1 -0
- package/dist/utils/queryFingerprint.d.ts +14 -0
- package/dist/utils/queryFingerprint.js +34 -0
- package/dist/utils/queryFingerprint.js.map +1 -0
- package/dist/utils/sqlCatalogDiscovery.d.ts +44 -0
- package/dist/utils/sqlCatalogDiscovery.js +166 -0
- package/dist/utils/sqlCatalogDiscovery.js.map +1 -0
- package/dist/utils/sqlCatalogStatements.d.ts +20 -0
- package/dist/utils/sqlCatalogStatements.js +23 -0
- package/dist/utils/sqlCatalogStatements.js.map +1 -0
- package/package.json +51 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.clearStatementCache = clearStatementCache;
|
|
4
|
+
exports.locateUsageText = locateUsageText;
|
|
5
|
+
const MAX_SNIPPET_LENGTH = 200;
|
|
6
|
+
const MAX_STATEMENT_CACHE_SIZE = 256;
|
|
7
|
+
const statementCache = new Map();
|
|
8
|
+
function clearStatementCache() {
|
|
9
|
+
statementCache.clear();
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Locate the best matching occurrence in a statement and project it to file-relative coordinates.
|
|
13
|
+
*/
|
|
14
|
+
function locateUsageText(params) {
|
|
15
|
+
const cache = getStatementCache(params.statementText);
|
|
16
|
+
const occurrences = collectOccurrences(params.statementText, params.candidates);
|
|
17
|
+
if (occurrences.length === 0) {
|
|
18
|
+
return {
|
|
19
|
+
location: null,
|
|
20
|
+
snippet: params.statementText.trim(),
|
|
21
|
+
ambiguous: false
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const clauseWindow = params.clauseAnchor
|
|
25
|
+
? findClauseWindow(cache, params.clauseAnchor, occurrences)
|
|
26
|
+
: null;
|
|
27
|
+
const selected = selectOccurrence(occurrences, clauseWindow);
|
|
28
|
+
if (!selected) {
|
|
29
|
+
return {
|
|
30
|
+
location: null,
|
|
31
|
+
snippet: extractSnippet(params.statementText, 0, Math.min(params.statementText.length, MAX_SNIPPET_LENGTH)),
|
|
32
|
+
ambiguous: occurrences.length > 1
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const snippet = params.snippetMode === 'line'
|
|
36
|
+
? extractLineSnippet(params.statementText, selected.start, selected.end)
|
|
37
|
+
: extractClauseSnippet(params.statementText, selected.start, selected.end, clauseWindow);
|
|
38
|
+
return {
|
|
39
|
+
location: buildLocation(params.statementText, params.statementStartOffsetInFile, selected.start, selected.end),
|
|
40
|
+
snippet,
|
|
41
|
+
ambiguous: selected.ambiguous
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function getStatementCache(statementText) {
|
|
45
|
+
const cached = statementCache.get(statementText);
|
|
46
|
+
if (cached) {
|
|
47
|
+
// Refresh cache recency on access so older statements are evicted first.
|
|
48
|
+
statementCache.delete(statementText);
|
|
49
|
+
statementCache.set(statementText, cached);
|
|
50
|
+
return cached;
|
|
51
|
+
}
|
|
52
|
+
const clauseMarkers = Array.from(statementText.matchAll(/\b(SELECT|WHERE|ORDER\s+BY|GROUP\s+BY|HAVING|RETURNING|SET|JOIN|ON|USING|FROM|INSERT\s+INTO|UPDATE|DELETE\s+FROM)\b/gi))
|
|
53
|
+
.map((match) => {
|
|
54
|
+
var _a, _b;
|
|
55
|
+
return ({
|
|
56
|
+
start: (_a = match.index) !== null && _a !== void 0 ? _a : 0,
|
|
57
|
+
end: ((_b = match.index) !== null && _b !== void 0 ? _b : 0) + match[0].length,
|
|
58
|
+
keyword: match[0].replace(/\s+/g, ' ').trim().toUpperCase()
|
|
59
|
+
});
|
|
60
|
+
})
|
|
61
|
+
.sort((left, right) => left.start - right.start || left.end - right.end);
|
|
62
|
+
const value = { clauseMarkers };
|
|
63
|
+
setStatementCache(statementText, value);
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
function setStatementCache(statementText, value) {
|
|
67
|
+
if (statementCache.has(statementText)) {
|
|
68
|
+
statementCache.delete(statementText);
|
|
69
|
+
}
|
|
70
|
+
statementCache.set(statementText, value);
|
|
71
|
+
// Keep the cache bounded for long-running CLI processes and large batch scans.
|
|
72
|
+
while (statementCache.size > MAX_STATEMENT_CACHE_SIZE) {
|
|
73
|
+
const oldestKey = statementCache.keys().next().value;
|
|
74
|
+
if (oldestKey === undefined) {
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
statementCache.delete(oldestKey);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function selectOccurrence(occurrences, clauseWindow) {
|
|
81
|
+
if (!clauseWindow) {
|
|
82
|
+
return occurrences.length > 0
|
|
83
|
+
? {
|
|
84
|
+
...occurrences[0],
|
|
85
|
+
ambiguous: occurrences.length > 1
|
|
86
|
+
}
|
|
87
|
+
: null;
|
|
88
|
+
}
|
|
89
|
+
const inWindow = occurrences.filter((occurrence) => occurrence.start >= clauseWindow.start &&
|
|
90
|
+
occurrence.start < clauseWindow.end);
|
|
91
|
+
const candidates = inWindow.length > 0
|
|
92
|
+
? inWindow
|
|
93
|
+
: occurrences.filter((occurrence) => occurrence.start >= clauseWindow.start);
|
|
94
|
+
const selectedPool = candidates.length > 0 ? candidates : occurrences;
|
|
95
|
+
if (selectedPool.length === 0) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const selected = [...selectedPool].sort((left, right) => Math.abs(left.start - clauseWindow.start) - Math.abs(right.start - clauseWindow.start) ||
|
|
99
|
+
left.start - right.start ||
|
|
100
|
+
(right.end - right.start) - (left.end - left.start))[0];
|
|
101
|
+
return {
|
|
102
|
+
...selected,
|
|
103
|
+
ambiguous: selectedPool.length > 1
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function findClauseWindow(cache, clauseAnchor, occurrences) {
|
|
107
|
+
var _a, _b;
|
|
108
|
+
const anchorPattern = clauseAnchor.tokens.join(' ').toUpperCase();
|
|
109
|
+
const matchingClauses = cache.clauseMarkers.filter((marker) => marker.keyword === anchorPattern);
|
|
110
|
+
const anchor = matchingClauses.length === 0
|
|
111
|
+
? undefined
|
|
112
|
+
: (_a = matchingClauses.find((marker) => {
|
|
113
|
+
const nextClause = cache.clauseMarkers.find((candidate) => candidate.start > marker.end);
|
|
114
|
+
return occurrences.some((occurrence) => {
|
|
115
|
+
var _a;
|
|
116
|
+
return occurrence.start >= marker.end &&
|
|
117
|
+
occurrence.start < ((_a = nextClause === null || nextClause === void 0 ? void 0 : nextClause.start) !== null && _a !== void 0 ? _a : Number.MAX_SAFE_INTEGER);
|
|
118
|
+
});
|
|
119
|
+
})) !== null && _a !== void 0 ? _a : matchingClauses[0];
|
|
120
|
+
if (!anchor) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const nextClause = cache.clauseMarkers.find((marker) => marker.start > anchor.end);
|
|
124
|
+
return {
|
|
125
|
+
anchorStart: anchor.start,
|
|
126
|
+
start: anchor.end,
|
|
127
|
+
end: (_b = nextClause === null || nextClause === void 0 ? void 0 : nextClause.start) !== null && _b !== void 0 ? _b : Number.MAX_SAFE_INTEGER
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
function collectOccurrences(statementText, candidates) {
|
|
131
|
+
var _a;
|
|
132
|
+
const occurrences = [];
|
|
133
|
+
for (const candidate of Array.from(new Set(candidates.filter(Boolean)))) {
|
|
134
|
+
const pattern = buildCandidatePattern(candidate);
|
|
135
|
+
for (const match of statementText.matchAll(pattern)) {
|
|
136
|
+
const start = (_a = match.index) !== null && _a !== void 0 ? _a : -1;
|
|
137
|
+
if (start < 0) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
occurrences.push({
|
|
141
|
+
start,
|
|
142
|
+
end: start + match[0].length
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return dedupeOccurrences(occurrences);
|
|
147
|
+
}
|
|
148
|
+
function buildCandidatePattern(candidate) {
|
|
149
|
+
const parts = candidate.split('.');
|
|
150
|
+
const pattern = parts
|
|
151
|
+
.map((part) => `(?:"${escapeRegex(part)}"|${escapeRegex(part)})`)
|
|
152
|
+
.join('\\s*\\.\\s*');
|
|
153
|
+
return new RegExp(`(?<![A-Za-z0-9_])${pattern}(?![A-Za-z0-9_])`, 'gi');
|
|
154
|
+
}
|
|
155
|
+
function dedupeOccurrences(occurrences) {
|
|
156
|
+
const sorted = [...occurrences].sort((left, right) => left.start - right.start ||
|
|
157
|
+
(right.end - right.start) - (left.end - left.start) ||
|
|
158
|
+
left.end - right.end);
|
|
159
|
+
const deduped = [];
|
|
160
|
+
for (const occurrence of sorted) {
|
|
161
|
+
const duplicate = deduped.find((entry) => (entry.start === occurrence.start && entry.end === occurrence.end) ||
|
|
162
|
+
(occurrence.start >= entry.start && occurrence.end <= entry.end));
|
|
163
|
+
if (!duplicate) {
|
|
164
|
+
deduped.push(occurrence);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return deduped.sort((left, right) => left.start - right.start ||
|
|
168
|
+
(right.end - right.start) - (left.end - left.start));
|
|
169
|
+
}
|
|
170
|
+
function clampSnippetEnd(selectedEnd, clauseEnd) {
|
|
171
|
+
return Math.min(Math.max(selectedEnd, 0) + MAX_SNIPPET_LENGTH, clauseEnd);
|
|
172
|
+
}
|
|
173
|
+
function extractClauseSnippet(statementText, selectedStart, selectedEnd, clauseWindow) {
|
|
174
|
+
var _a;
|
|
175
|
+
const snippetStart = clauseWindow ? clauseWindow.anchorStart : selectedStart;
|
|
176
|
+
const snippetEnd = clampSnippetEnd(selectedEnd, (_a = clauseWindow === null || clauseWindow === void 0 ? void 0 : clauseWindow.end) !== null && _a !== void 0 ? _a : statementText.length);
|
|
177
|
+
return extractSnippet(statementText, snippetStart, snippetEnd);
|
|
178
|
+
}
|
|
179
|
+
function extractLineSnippet(statementText, start, end) {
|
|
180
|
+
// Keep table snippets anchored to the concrete identifier line so the reason for the match is obvious.
|
|
181
|
+
const lineStart = statementText.lastIndexOf('\n', Math.max(0, start - 1)) + 1;
|
|
182
|
+
const lineEndIndex = statementText.indexOf('\n', end);
|
|
183
|
+
const lineEnd = lineEndIndex >= 0 ? lineEndIndex : statementText.length;
|
|
184
|
+
return extractSnippet(statementText, lineStart, lineEnd);
|
|
185
|
+
}
|
|
186
|
+
function buildLocation(statementText, statementStartOffsetInFile, statementOffsetStart, statementOffsetEnd) {
|
|
187
|
+
const start = offsetToLineColumn(statementText, statementOffsetStart);
|
|
188
|
+
const end = offsetToLineColumn(statementText, statementOffsetEnd);
|
|
189
|
+
return {
|
|
190
|
+
startLine: start.line,
|
|
191
|
+
startColumn: start.column,
|
|
192
|
+
endLine: end.line,
|
|
193
|
+
endColumn: end.column,
|
|
194
|
+
fileOffsetStart: statementStartOffsetInFile + statementOffsetStart,
|
|
195
|
+
fileOffsetEnd: statementStartOffsetInFile + statementOffsetEnd,
|
|
196
|
+
statementOffsetStart,
|
|
197
|
+
statementOffsetEnd
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
function extractSnippet(statementText, start, end) {
|
|
201
|
+
return statementText.slice(Math.max(0, start), Math.min(end, statementText.length)).trim();
|
|
202
|
+
}
|
|
203
|
+
function offsetToLineColumn(text, offset) {
|
|
204
|
+
const safeOffset = Math.max(0, Math.min(offset, text.length));
|
|
205
|
+
const lines = text.slice(0, safeOffset).split('\n');
|
|
206
|
+
return {
|
|
207
|
+
line: lines.length,
|
|
208
|
+
column: lines[lines.length - 1].length + 1
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function escapeRegex(value) {
|
|
212
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"location.js","sourceRoot":"","sources":["../../src/query/location.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { QueryUsageReport, QueryUsageTargetKind, QueryUsageView } from './types';
|
|
2
|
+
export declare const QUERY_USES_REPORT_SPANS: {
|
|
3
|
+
readonly specDiscovery: "spec-discovery";
|
|
4
|
+
readonly reportBuild: "build-query-usage-report";
|
|
5
|
+
readonly impactAggregation: "impact-aggregation";
|
|
6
|
+
};
|
|
7
|
+
export interface QueryUsageSpanRunner {
|
|
8
|
+
<T>(name: string, run: () => T, attrs?: Record<string, unknown>): T;
|
|
9
|
+
}
|
|
10
|
+
export interface BuildQueryUsageReportParams {
|
|
11
|
+
kind: QueryUsageTargetKind;
|
|
12
|
+
rawTarget: string;
|
|
13
|
+
rootDir?: string;
|
|
14
|
+
specsDir?: string;
|
|
15
|
+
sqlRoot?: string;
|
|
16
|
+
excludeGenerated?: boolean;
|
|
17
|
+
anySchema?: boolean;
|
|
18
|
+
anyTable?: boolean;
|
|
19
|
+
view?: QueryUsageView;
|
|
20
|
+
withSpanSync?: QueryUsageSpanRunner;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Build a deterministic impact or detail investigation report from catalog specs.
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildQueryUsageReport(params: BuildQueryUsageReportParams): QueryUsageReport;
|
|
26
|
+
/**
|
|
27
|
+
* Write report output when an explicit output path is requested.
|
|
28
|
+
*/
|
|
29
|
+
export declare function writeQueryUsageOutput(outPath: string, contents: string): void;
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.QUERY_USES_REPORT_SPANS = void 0;
|
|
7
|
+
exports.buildQueryUsageReport = buildQueryUsageReport;
|
|
8
|
+
exports.writeQueryUsageOutput = writeQueryUsageOutput;
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const sqlCatalogDiscovery_1 = require("../utils/sqlCatalogDiscovery");
|
|
12
|
+
const sqlCatalogStatements_1 = require("../utils/sqlCatalogStatements");
|
|
13
|
+
const analyzeColumnUsage_1 = require("./analyzeColumnUsage");
|
|
14
|
+
const analyzeTableUsage_1 = require("./analyzeTableUsage");
|
|
15
|
+
const format_1 = require("./format");
|
|
16
|
+
const location_1 = require("./location");
|
|
17
|
+
const targets_1 = require("./targets");
|
|
18
|
+
exports.QUERY_USES_REPORT_SPANS = {
|
|
19
|
+
specDiscovery: 'spec-discovery',
|
|
20
|
+
reportBuild: 'build-query-usage-report',
|
|
21
|
+
impactAggregation: 'impact-aggregation',
|
|
22
|
+
};
|
|
23
|
+
function runSpan(withSpanSync, name, run, attrs) {
|
|
24
|
+
if (!withSpanSync) {
|
|
25
|
+
return run();
|
|
26
|
+
}
|
|
27
|
+
return withSpanSync(name, run, attrs);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build a deterministic impact or detail investigation report from catalog specs.
|
|
31
|
+
*/
|
|
32
|
+
function buildQueryUsageReport(params) {
|
|
33
|
+
var _a, _b;
|
|
34
|
+
const rootDir = node_path_1.default.resolve((_a = params.rootDir) !== null && _a !== void 0 ? _a : process.cwd());
|
|
35
|
+
const specsDir = params.specsDir ? node_path_1.default.resolve(rootDir, params.specsDir) : node_path_1.default.resolve(rootDir, 'src', 'catalog', 'specs');
|
|
36
|
+
const sqlRoot = params.sqlRoot ? node_path_1.default.resolve(rootDir, params.sqlRoot) : node_path_1.default.resolve(rootDir, 'src', 'sql');
|
|
37
|
+
const normalizedSqlRoot = normalizePath(node_path_1.default.relative(rootDir, sqlRoot) || '.');
|
|
38
|
+
const view = (_b = params.view) !== null && _b !== void 0 ? _b : 'impact';
|
|
39
|
+
const parsedTarget = (0, targets_1.parseQueryTarget)({
|
|
40
|
+
kind: params.kind,
|
|
41
|
+
raw: params.rawTarget,
|
|
42
|
+
anySchema: params.anySchema,
|
|
43
|
+
anyTable: params.anyTable,
|
|
44
|
+
});
|
|
45
|
+
return runSpan(params.withSpanSync, exports.QUERY_USES_REPORT_SPANS.reportBuild, () => {
|
|
46
|
+
const warnings = [];
|
|
47
|
+
const discovery = runSpan(params.withSpanSync, exports.QUERY_USES_REPORT_SPANS.specDiscovery, () => {
|
|
48
|
+
const specFiles = (0, node_fs_1.existsSync)(specsDir)
|
|
49
|
+
? (0, sqlCatalogDiscovery_1.walkSqlCatalogSpecFiles)(specsDir, { excludeGenerated: params.excludeGenerated })
|
|
50
|
+
: [];
|
|
51
|
+
const loadedSpecs = specFiles.flatMap((filePath) => {
|
|
52
|
+
try {
|
|
53
|
+
return (0, sqlCatalogDiscovery_1.loadSqlCatalogSpecsFromFile)(filePath, (message) => new Error(message));
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
warnings.push({
|
|
57
|
+
sql_file: normalizePath(node_path_1.default.relative(rootDir, filePath)),
|
|
58
|
+
code: 'spec-load-failed',
|
|
59
|
+
message: error instanceof Error ? error.message : String(error),
|
|
60
|
+
});
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return { loadedSpecs };
|
|
65
|
+
}, {
|
|
66
|
+
excludeGenerated: Boolean(params.excludeGenerated),
|
|
67
|
+
kind: params.kind,
|
|
68
|
+
});
|
|
69
|
+
const detailMatches = [];
|
|
70
|
+
let statementsScanned = 0;
|
|
71
|
+
let unresolvedSqlFiles = 0;
|
|
72
|
+
let parseWarnings = 0;
|
|
73
|
+
let fallbackMatches = 0;
|
|
74
|
+
if (discovery.loadedSpecs.length === 0) {
|
|
75
|
+
warnings.push({
|
|
76
|
+
code: 'no-catalog-specs-found',
|
|
77
|
+
message: `No catalog specs found under ${normalizePath(node_path_1.default.relative(rootDir, specsDir) || '.')}.
|
|
78
|
+
Hint: run "ztd init" or pass "--specs-dir".`,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
// Bound location cache lifetime to this batch so repeated runs do not accumulate statement entries.
|
|
82
|
+
(0, location_1.clearStatementCache)();
|
|
83
|
+
for (const loaded of discovery.loadedSpecs) {
|
|
84
|
+
const catalogId = typeof loaded.spec.id === 'string' && loaded.spec.id.trim().length > 0
|
|
85
|
+
? loaded.spec.id.trim()
|
|
86
|
+
: `<missing-id:${node_path_1.default.basename(loaded.filePath)}>`;
|
|
87
|
+
const sqlFile = typeof loaded.spec.sqlFile === 'string' && loaded.spec.sqlFile.trim().length > 0
|
|
88
|
+
? loaded.spec.sqlFile.trim()
|
|
89
|
+
: null;
|
|
90
|
+
if (!sqlFile) {
|
|
91
|
+
unresolvedSqlFiles += 1;
|
|
92
|
+
warnings.push({
|
|
93
|
+
catalog_id: catalogId,
|
|
94
|
+
sql_file: normalizePath(node_path_1.default.relative(rootDir, loaded.filePath)),
|
|
95
|
+
code: 'unresolved-sql-file',
|
|
96
|
+
message: 'spec.sqlFile must be a non-empty string.',
|
|
97
|
+
});
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const resolvedSqlFile = resolveCatalogSqlFile({
|
|
101
|
+
sqlRoot,
|
|
102
|
+
specFilePath: loaded.filePath,
|
|
103
|
+
sqlFile,
|
|
104
|
+
});
|
|
105
|
+
if (!resolvedSqlFile) {
|
|
106
|
+
unresolvedSqlFiles += 1;
|
|
107
|
+
const projectRootCandidate = normalizePath(node_path_1.default.relative(rootDir, node_path_1.default.resolve(sqlRoot, sqlFile)));
|
|
108
|
+
const specRelativeCandidate = normalizePath(node_path_1.default.relative(rootDir, node_path_1.default.resolve(node_path_1.default.dirname(loaded.filePath), sqlFile)));
|
|
109
|
+
warnings.push({
|
|
110
|
+
catalog_id: catalogId,
|
|
111
|
+
sql_file: projectRootCandidate,
|
|
112
|
+
code: 'unresolved-sql-file',
|
|
113
|
+
message: [
|
|
114
|
+
`SQL file does not exist: ${sqlFile}`,
|
|
115
|
+
`Tried project SQL root (${normalizedSqlRoot}): ${projectRootCandidate}`,
|
|
116
|
+
`Tried spec-relative fallback: ${specRelativeCandidate}`,
|
|
117
|
+
`Hint: keep existing sqlFile values unchanged and re-run with --sql-root ${normalizedSqlRoot} if your project stores SQL under a shared root.`,
|
|
118
|
+
].join('\n'),
|
|
119
|
+
});
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
const normalizedSqlFile = normalizePath(node_path_1.default.relative(rootDir, resolvedSqlFile));
|
|
123
|
+
const sqlText = (0, node_fs_1.readFileSync)(resolvedSqlFile, 'utf8');
|
|
124
|
+
const statements = (0, sqlCatalogStatements_1.buildCatalogStatements)({
|
|
125
|
+
catalogId,
|
|
126
|
+
sqlFile: normalizedSqlFile,
|
|
127
|
+
sqlText,
|
|
128
|
+
});
|
|
129
|
+
statementsScanned += statements.length;
|
|
130
|
+
for (const statement of statements) {
|
|
131
|
+
const result = params.kind === 'table'
|
|
132
|
+
? (0, analyzeTableUsage_1.analyzeTableUsage)({ statement, target: parsedTarget.target, mode: parsedTarget.mode })
|
|
133
|
+
: (0, analyzeColumnUsage_1.analyzeColumnUsage)({ statement, target: parsedTarget.target, mode: parsedTarget.mode });
|
|
134
|
+
detailMatches.push(...result.matches);
|
|
135
|
+
warnings.push(...result.warnings);
|
|
136
|
+
const statementParseWarnings = result.warnings.filter((warning) => warning.code === 'parse-failed').length;
|
|
137
|
+
parseWarnings += statementParseWarnings;
|
|
138
|
+
if (params.kind === 'table' && statementParseWarnings > 0) {
|
|
139
|
+
const fallback = buildTableFallbackMatch(statement, parsedTarget.target, parsedTarget.mode);
|
|
140
|
+
if (fallback) {
|
|
141
|
+
detailMatches.push(fallback);
|
|
142
|
+
fallbackMatches += 1;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const matches = view === 'detail'
|
|
148
|
+
? detailMatches
|
|
149
|
+
: runSpan(params.withSpanSync, exports.QUERY_USES_REPORT_SPANS.impactAggregation, () => aggregateImpactMatches(detailMatches), {
|
|
150
|
+
detailMatchCount: detailMatches.length,
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
schemaVersion: 2,
|
|
154
|
+
mode: parsedTarget.mode,
|
|
155
|
+
view,
|
|
156
|
+
target: parsedTarget.target,
|
|
157
|
+
summary: {
|
|
158
|
+
catalogsScanned: discovery.loadedSpecs.length,
|
|
159
|
+
statementsScanned,
|
|
160
|
+
matches: matches.length,
|
|
161
|
+
fallbackMatches,
|
|
162
|
+
unresolvedSqlFiles,
|
|
163
|
+
parseWarnings,
|
|
164
|
+
},
|
|
165
|
+
matches: (0, format_1.sortQueryUsageMatches)(matches),
|
|
166
|
+
warnings: (0, format_1.sortQueryUsageWarnings)(warnings),
|
|
167
|
+
};
|
|
168
|
+
}, {
|
|
169
|
+
kind: params.kind,
|
|
170
|
+
view,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Write report output when an explicit output path is requested.
|
|
175
|
+
*/
|
|
176
|
+
function writeQueryUsageOutput(outPath, contents) {
|
|
177
|
+
const absolute = node_path_1.default.resolve(process.cwd(), outPath);
|
|
178
|
+
(0, node_fs_1.mkdirSync)(node_path_1.default.dirname(absolute), { recursive: true });
|
|
179
|
+
(0, node_fs_1.writeFileSync)(absolute, contents, 'utf8');
|
|
180
|
+
}
|
|
181
|
+
function aggregateImpactMatches(matches) {
|
|
182
|
+
const grouped = new Map();
|
|
183
|
+
for (const match of matches) {
|
|
184
|
+
const key = `${match.catalog_id}\u0000${match.query_id}\u0000${match.statement_fingerprint}`;
|
|
185
|
+
const bucket = grouped.get(key);
|
|
186
|
+
if (bucket) {
|
|
187
|
+
bucket.push(match);
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
grouped.set(key, [match]);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return Array.from(grouped.values()).map((group) => {
|
|
194
|
+
var _a;
|
|
195
|
+
const [first] = group;
|
|
196
|
+
const usageKindCounts = {};
|
|
197
|
+
const noteSet = new Set();
|
|
198
|
+
const representatives = new Map();
|
|
199
|
+
for (const match of group) {
|
|
200
|
+
usageKindCounts[match.usage_kind] = ((_a = usageKindCounts[match.usage_kind]) !== null && _a !== void 0 ? _a : 0) + 1;
|
|
201
|
+
for (const note of summarizeImpactNotes(match.notes)) {
|
|
202
|
+
noteSet.add(note);
|
|
203
|
+
}
|
|
204
|
+
const current = representatives.get(match.usage_kind);
|
|
205
|
+
if (!current || compareConfidence(match.confidence, current.confidence) < 0) {
|
|
206
|
+
representatives.set(match.usage_kind, match);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
kind: 'impact',
|
|
211
|
+
catalog_id: first.catalog_id,
|
|
212
|
+
query_id: first.query_id,
|
|
213
|
+
statement_fingerprint: first.statement_fingerprint,
|
|
214
|
+
sql_file: first.sql_file,
|
|
215
|
+
usageKindCounts: sortUsageKindCounts(usageKindCounts),
|
|
216
|
+
confidence: aggregateConfidence(group.map((match) => match.confidence)),
|
|
217
|
+
notes: Array.from(noteSet).sort(),
|
|
218
|
+
source: group.some((match) => match.source === 'ast') ? 'ast' : 'fallback',
|
|
219
|
+
representatives: Array.from(representatives.values())
|
|
220
|
+
.filter((match) => match.usage_kind !== 'select')
|
|
221
|
+
.sort((left, right) => {
|
|
222
|
+
var _a, _b;
|
|
223
|
+
return left.usage_kind.localeCompare(right.usage_kind) ||
|
|
224
|
+
compareConfidence(left.confidence, right.confidence) ||
|
|
225
|
+
compareNullableNumber((_a = left.location) === null || _a === void 0 ? void 0 : _a.fileOffsetStart, (_b = right.location) === null || _b === void 0 ? void 0 : _b.fileOffsetStart);
|
|
226
|
+
})
|
|
227
|
+
.map((match) => ({
|
|
228
|
+
usage_kind: match.usage_kind,
|
|
229
|
+
location: match.location,
|
|
230
|
+
snippet: match.snippet,
|
|
231
|
+
exprHints: match.exprHints,
|
|
232
|
+
confidence: match.confidence,
|
|
233
|
+
notes: match.notes,
|
|
234
|
+
})),
|
|
235
|
+
};
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
function aggregateConfidence(confidences) {
|
|
239
|
+
if (confidences.includes('high')) {
|
|
240
|
+
return 'high';
|
|
241
|
+
}
|
|
242
|
+
if (confidences.includes('medium')) {
|
|
243
|
+
return 'medium';
|
|
244
|
+
}
|
|
245
|
+
return 'low';
|
|
246
|
+
}
|
|
247
|
+
function summarizeImpactNotes(notes) {
|
|
248
|
+
const summarized = new Set();
|
|
249
|
+
for (const note of notes) {
|
|
250
|
+
switch (note) {
|
|
251
|
+
case 'ambiguous-multiple-occurrences':
|
|
252
|
+
summarized.add('statement-has-ambiguous-occurrences');
|
|
253
|
+
break;
|
|
254
|
+
case 'unqualified-column':
|
|
255
|
+
summarized.add('statement-has-unqualified-column');
|
|
256
|
+
break;
|
|
257
|
+
case 'join-using-column':
|
|
258
|
+
summarized.add('statement-has-join-using');
|
|
259
|
+
break;
|
|
260
|
+
case 'wildcard-select':
|
|
261
|
+
summarized.add('statement-has-wildcard');
|
|
262
|
+
break;
|
|
263
|
+
default:
|
|
264
|
+
summarized.add(note);
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return Array.from(summarized).sort();
|
|
269
|
+
}
|
|
270
|
+
function buildTableFallbackMatch(statement, target, mode) {
|
|
271
|
+
var _a;
|
|
272
|
+
const usageKind = inferTableFallbackUsageKind(statement.statementText, target);
|
|
273
|
+
if (!usageKind) {
|
|
274
|
+
return null;
|
|
275
|
+
}
|
|
276
|
+
const searchTerms = [target.schema && target.table ? `${target.schema}.${target.table}` : '', (_a = target.table) !== null && _a !== void 0 ? _a : target.raw]
|
|
277
|
+
.filter(Boolean);
|
|
278
|
+
const located = (0, location_1.locateUsageText)({
|
|
279
|
+
statementText: statement.statementText,
|
|
280
|
+
statementStartOffsetInFile: statement.statementStartOffsetInFile,
|
|
281
|
+
candidates: searchTerms,
|
|
282
|
+
clauseAnchor: resolveFallbackClauseAnchor(usageKind),
|
|
283
|
+
});
|
|
284
|
+
const notes = ['parser-fallback'];
|
|
285
|
+
if (mode !== 'exact') {
|
|
286
|
+
notes.push('relaxed-match-any-schema');
|
|
287
|
+
}
|
|
288
|
+
if (located.ambiguous) {
|
|
289
|
+
notes.push('ambiguous-multiple-occurrences');
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
kind: 'detail',
|
|
293
|
+
catalog_id: statement.catalogId,
|
|
294
|
+
query_id: statement.queryId,
|
|
295
|
+
statement_fingerprint: statement.statementFingerprint,
|
|
296
|
+
sql_file: statement.sqlFile,
|
|
297
|
+
usage_kind: usageKind,
|
|
298
|
+
location: located.location,
|
|
299
|
+
snippet: located.snippet,
|
|
300
|
+
confidence: 'low',
|
|
301
|
+
notes: notes.sort(),
|
|
302
|
+
source: 'fallback',
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
function resolveFallbackClauseAnchor(usageKind) {
|
|
306
|
+
switch (usageKind) {
|
|
307
|
+
case 'update-target':
|
|
308
|
+
return { kind: usageKind, tokens: ['UPDATE'] };
|
|
309
|
+
case 'delete-target':
|
|
310
|
+
return { kind: usageKind, tokens: ['DELETE', 'FROM'] };
|
|
311
|
+
case 'insert-target':
|
|
312
|
+
return { kind: usageKind, tokens: ['INSERT', 'INTO'] };
|
|
313
|
+
case 'join':
|
|
314
|
+
return { kind: usageKind, tokens: ['JOIN'] };
|
|
315
|
+
case 'using':
|
|
316
|
+
return { kind: usageKind, tokens: ['USING'] };
|
|
317
|
+
case 'from':
|
|
318
|
+
default:
|
|
319
|
+
return { kind: usageKind, tokens: ['FROM'] };
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
function inferTableFallbackUsageKind(sql, target) {
|
|
323
|
+
const tablePattern = target.schema && target.table ? `${escapeRegex(target.schema)}\\s*\\.\\s*${escapeRegex(target.table)}` : target.table ? escapeRegex(target.table) : '';
|
|
324
|
+
if (!tablePattern) {
|
|
325
|
+
return null;
|
|
326
|
+
}
|
|
327
|
+
const candidates = [
|
|
328
|
+
['update-target', new RegExp(`\\bupdate\\s+${tablePattern}\\b`, 'i')],
|
|
329
|
+
['delete-target', new RegExp(`\\bdelete\\s+from\\s+${tablePattern}\\b`, 'i')],
|
|
330
|
+
['insert-target', new RegExp(`\\binsert\\s+into\\s+${tablePattern}\\b`, 'i')],
|
|
331
|
+
['join', new RegExp(`\\bjoin\\s+${tablePattern}\\b`, 'i')],
|
|
332
|
+
['using', new RegExp(`\\busing\\s+${tablePattern}\\b`, 'i')],
|
|
333
|
+
['from', new RegExp(`\\bfrom\\s+${tablePattern}\\b`, 'i')],
|
|
334
|
+
];
|
|
335
|
+
for (const [kind, pattern] of candidates) {
|
|
336
|
+
if (pattern.test(sql)) {
|
|
337
|
+
return kind;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
function sortUsageKindCounts(value) {
|
|
343
|
+
return Object.fromEntries(Object.entries(value).sort((left, right) => left[0].localeCompare(right[0])));
|
|
344
|
+
}
|
|
345
|
+
function compareConfidence(left, right) {
|
|
346
|
+
const rank = { high: 0, medium: 1, low: 2 };
|
|
347
|
+
return rank[left] - rank[right];
|
|
348
|
+
}
|
|
349
|
+
function compareNullableNumber(left, right) {
|
|
350
|
+
if (left === undefined && right === undefined) {
|
|
351
|
+
return 0;
|
|
352
|
+
}
|
|
353
|
+
if (left === undefined) {
|
|
354
|
+
return 1;
|
|
355
|
+
}
|
|
356
|
+
if (right === undefined) {
|
|
357
|
+
return -1;
|
|
358
|
+
}
|
|
359
|
+
return left - right;
|
|
360
|
+
}
|
|
361
|
+
function normalizePath(input) {
|
|
362
|
+
return input.split(node_path_1.default.sep).join('/');
|
|
363
|
+
}
|
|
364
|
+
function resolveCatalogSqlFile(params) {
|
|
365
|
+
// Prefer the project-level SQL root because existing QuerySpec sqlFile values are root-relative by convention.
|
|
366
|
+
const projectRootCandidate = node_path_1.default.resolve(params.sqlRoot, params.sqlFile);
|
|
367
|
+
if ((0, node_fs_1.existsSync)(projectRootCandidate)) {
|
|
368
|
+
return projectRootCandidate;
|
|
369
|
+
}
|
|
370
|
+
// Preserve backward compatibility for specs that stored sqlFile relative to the spec file itself.
|
|
371
|
+
const specRelativeCandidate = node_path_1.default.resolve(node_path_1.default.dirname(params.specFilePath), params.sqlFile);
|
|
372
|
+
if ((0, node_fs_1.existsSync)(specRelativeCandidate)) {
|
|
373
|
+
return specRelativeCandidate;
|
|
374
|
+
}
|
|
375
|
+
return null;
|
|
376
|
+
}
|
|
377
|
+
function escapeRegex(value) {
|
|
378
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/query/report.ts"],"names":[],"mappings":"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"}
|