@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.
@@ -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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"}