@rawsql-ts/ztd-cli 0.20.0 → 0.20.3
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/LICENSE +21 -0
- package/dist/commands/agents.d.ts +2 -0
- package/dist/commands/agents.js +68 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/checkContract.d.ts +46 -0
- package/dist/commands/checkContract.js +359 -0
- package/dist/commands/checkContract.js.map +1 -0
- package/dist/commands/connectionOptions.d.ts +12 -0
- package/dist/commands/connectionOptions.js +22 -0
- package/dist/commands/connectionOptions.js.map +1 -0
- package/dist/commands/ddl.d.ts +7 -0
- package/dist/commands/ddl.js +145 -0
- package/dist/commands/ddl.js.map +1 -0
- package/dist/commands/describe.d.ts +23 -0
- package/dist/commands/describe.js +399 -0
- package/dist/commands/describe.js.map +1 -0
- package/dist/commands/diff.d.ts +24 -0
- package/dist/commands/diff.js +73 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/genEntities.d.ts +14 -0
- package/dist/commands/genEntities.js +58 -0
- package/dist/commands/genEntities.js.map +1 -0
- package/dist/commands/init.d.ts +105 -0
- package/dist/commands/init.js +1508 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/lint.d.ts +89 -0
- package/dist/commands/lint.js +501 -0
- package/dist/commands/lint.js.map +1 -0
- package/dist/commands/modelGen.d.ts +60 -0
- package/dist/commands/modelGen.js +572 -0
- package/dist/commands/modelGen.js.map +1 -0
- package/dist/commands/options.d.ts +9 -0
- package/dist/commands/options.js +48 -0
- package/dist/commands/options.js.map +1 -0
- package/dist/commands/perf.d.ts +9 -0
- package/dist/commands/perf.js +374 -0
- package/dist/commands/perf.js.map +1 -0
- package/dist/commands/pull.d.ts +21 -0
- package/dist/commands/pull.js +115 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/query.d.ts +9 -0
- package/dist/commands/query.js +377 -0
- package/dist/commands/query.js.map +1 -0
- package/dist/commands/testEvidence.d.ts +237 -0
- package/dist/commands/testEvidence.js +1220 -0
- package/dist/commands/testEvidence.js.map +1 -0
- package/dist/commands/ztdConfig.d.ts +30 -0
- package/dist/commands/ztdConfig.js +224 -0
- package/dist/commands/ztdConfig.js.map +1 -0
- package/dist/commands/ztdConfigCommand.d.ts +18 -0
- package/dist/commands/ztdConfigCommand.js +268 -0
- package/dist/commands/ztdConfigCommand.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/dist/perf/benchmark.d.ts +277 -0
- package/dist/perf/benchmark.js +2186 -0
- package/dist/perf/benchmark.js.map +1 -0
- package/dist/perf/sandbox.d.ts +73 -0
- package/dist/perf/sandbox.js +492 -0
- package/dist/perf/sandbox.js.map +1 -0
- package/dist/query/analysis.d.ts +20 -0
- package/dist/query/analysis.js +192 -0
- package/dist/query/analysis.js.map +1 -0
- package/dist/query/analyzeColumnUsage.d.ts +10 -0
- package/dist/query/analyzeColumnUsage.js +451 -0
- package/dist/query/analyzeColumnUsage.js.map +1 -0
- package/dist/query/analyzeTableUsage.d.ts +10 -0
- package/dist/query/analyzeTableUsage.js +318 -0
- package/dist/query/analyzeTableUsage.js.map +1 -0
- package/dist/query/execute.d.ts +40 -0
- package/dist/query/execute.js +784 -0
- package/dist/query/execute.js.map +1 -0
- package/dist/query/format.d.ts +1 -0
- package/dist/query/format.js +9 -0
- package/dist/query/format.js.map +1 -0
- package/dist/query/lint.d.ts +29 -0
- package/dist/query/lint.js +340 -0
- package/dist/query/lint.js.map +1 -0
- package/dist/query/location.d.ts +18 -0
- package/dist/query/location.js +204 -0
- package/dist/query/location.js.map +1 -0
- package/dist/query/patch.d.ts +21 -0
- package/dist/query/patch.js +151 -0
- package/dist/query/patch.js.map +1 -0
- package/dist/query/planner.d.ts +31 -0
- package/dist/query/planner.js +134 -0
- package/dist/query/planner.js.map +1 -0
- package/dist/query/report.d.ts +7 -0
- package/dist/query/report.js +19 -0
- package/dist/query/report.js.map +1 -0
- package/dist/query/scalarFilterAnalysis.d.ts +6 -0
- package/dist/query/scalarFilterAnalysis.js +212 -0
- package/dist/query/scalarFilterAnalysis.js.map +1 -0
- package/dist/query/slice.d.ts +17 -0
- package/dist/query/slice.js +204 -0
- package/dist/query/slice.js.map +1 -0
- package/dist/query/structure.d.ts +24 -0
- package/dist/query/structure.js +135 -0
- package/dist/query/structure.js.map +1 -0
- package/dist/query/targets.d.ts +2 -0
- package/dist/query/targets.js +6 -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/specs/sql/activeOrders.catalog.d.ts +12 -0
- package/dist/specs/sql/activeOrders.catalog.js +36 -0
- package/dist/specs/sql/activeOrders.catalog.js.map +1 -0
- package/dist/specs/sql/usersList.catalog.d.ts +8 -0
- package/dist/specs/sql/usersList.catalog.js +14 -0
- package/dist/specs/sql/usersList.catalog.js.map +1 -0
- package/dist/specs/sqlCatalogDefinition.d.ts +20 -0
- package/dist/specs/sqlCatalogDefinition.js +10 -0
- package/dist/specs/sqlCatalogDefinition.js.map +1 -0
- package/dist/utils/agentCli.d.ts +23 -0
- package/dist/utils/agentCli.js +84 -0
- package/dist/utils/agentCli.js.map +1 -0
- package/dist/utils/agentSafety.d.ts +4 -0
- package/dist/utils/agentSafety.js +50 -0
- package/dist/utils/agentSafety.js.map +1 -0
- package/dist/utils/agents.d.ts +31 -0
- package/dist/utils/agents.js +362 -0
- package/dist/utils/agents.js.map +1 -0
- package/dist/utils/collectSqlFiles.d.ts +9 -0
- package/dist/utils/collectSqlFiles.js +58 -0
- package/dist/utils/collectSqlFiles.js.map +1 -0
- package/dist/utils/connectionSummary.d.ts +3 -0
- package/dist/utils/connectionSummary.js +29 -0
- package/dist/utils/connectionSummary.js.map +1 -0
- package/dist/utils/dbConnection.d.ts +31 -0
- package/dist/utils/dbConnection.js +151 -0
- package/dist/utils/dbConnection.js.map +1 -0
- package/dist/utils/fs.d.ts +1 -0
- package/dist/utils/fs.js +12 -0
- package/dist/utils/fs.js.map +1 -0
- package/dist/utils/modelGenBinder.d.ts +8 -0
- package/dist/utils/modelGenBinder.js +31 -0
- package/dist/utils/modelGenBinder.js.map +1 -0
- package/dist/utils/modelGenRender.d.ts +29 -0
- package/dist/utils/modelGenRender.js +158 -0
- package/dist/utils/modelGenRender.js.map +1 -0
- package/dist/utils/modelGenScanner.d.ts +24 -0
- package/dist/utils/modelGenScanner.js +196 -0
- package/dist/utils/modelGenScanner.js.map +1 -0
- package/dist/utils/modelProbe.d.ts +14 -0
- package/dist/utils/modelProbe.js +121 -0
- package/dist/utils/modelProbe.js.map +1 -0
- package/dist/utils/normalizePulledSchema.d.ts +12 -0
- package/dist/utils/normalizePulledSchema.js +213 -0
- package/dist/utils/normalizePulledSchema.js.map +1 -0
- package/dist/utils/optionalDependencies.d.ts +45 -0
- package/dist/utils/optionalDependencies.js +153 -0
- package/dist/utils/optionalDependencies.js.map +1 -0
- package/dist/utils/pgDump.d.ts +12 -0
- package/dist/utils/pgDump.js +58 -0
- package/dist/utils/pgDump.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/dist/utils/sqlLintHelpers.d.ts +18 -0
- package/dist/utils/sqlLintHelpers.js +270 -0
- package/dist/utils/sqlLintHelpers.js.map +1 -0
- package/dist/utils/telemetry.d.ts +71 -0
- package/dist/utils/telemetry.js +597 -0
- package/dist/utils/telemetry.js.map +1 -0
- package/dist/utils/typeMapper.d.ts +4 -0
- package/dist/utils/typeMapper.js +79 -0
- package/dist/utils/typeMapper.js.map +1 -0
- package/dist/utils/ztdProjectConfig.d.ts +41 -0
- package/dist/utils/ztdProjectConfig.js +182 -0
- package/dist/utils/ztdProjectConfig.js.map +1 -0
- package/package.json +19 -20
- package/templates/src/catalog/runtime/_smoke.runtime.ts +2 -2
- package/templates/src/db/sql-client-adapters.ts +1 -1
- package/templates/src/infrastructure/db/sql-client-adapters.ts +1 -1
- package/templates/src/infrastructure/telemetry/consoleRepositoryTelemetry.ts +1 -1
- package/templates/src/infrastructure/telemetry/repositoryTelemetry.ts +4 -4
- package/templates/tests/smoke.test.ts +2 -2
- package/templates/tests/smoke.validation.test.ts +1 -1
- package/templates/tests/support/testkit-client.ts +1 -1
- package/templates/tests/support/testkit-client.webapi.ts +1 -1
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findScalarFilterCandidates = findScalarFilterCandidates;
|
|
4
|
+
exports.findScalarFilterCandidatesInStatement = findScalarFilterCandidatesInStatement;
|
|
5
|
+
const node_fs_1 = require("node:fs");
|
|
6
|
+
const rawsql_ts_1 = require("rawsql-ts");
|
|
7
|
+
const analysis_1 = require("./analysis");
|
|
8
|
+
const SUPPORTED_COMPARISON_OPERATORS = new Set(['=', '!=', '<>', '>', '>=', '<', '<=']);
|
|
9
|
+
/**
|
|
10
|
+
* Detect non-correlated WHERE scalar subqueries that are good scalar-filter binding candidates.
|
|
11
|
+
*/
|
|
12
|
+
function findScalarFilterCandidates(sqlFile) {
|
|
13
|
+
const statement = (0, analysis_1.assertSupportedStatement)(rawsql_ts_1.SqlParser.parse((0, node_fs_1.readFileSync)(sqlFile, 'utf8')), 'findScalarFilterCandidates');
|
|
14
|
+
return findScalarFilterCandidatesInStatement(statement);
|
|
15
|
+
}
|
|
16
|
+
function findScalarFilterCandidatesInStatement(statement) {
|
|
17
|
+
const candidates = [];
|
|
18
|
+
collectScalarFilterCandidatesFromStatement(statement, candidates);
|
|
19
|
+
return uniquePreservingOrder(candidates);
|
|
20
|
+
}
|
|
21
|
+
function collectScalarFilterCandidatesFromStatement(statement, candidates) {
|
|
22
|
+
if (statement instanceof rawsql_ts_1.SimpleSelectQuery) {
|
|
23
|
+
collectScalarFilterCandidatesFromSimpleSelect(statement, candidates);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (statement instanceof rawsql_ts_1.BinarySelectQuery) {
|
|
27
|
+
collectScalarFilterCandidatesFromSelectNode(statement, candidates);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
if (statement instanceof rawsql_ts_1.ValuesQuery) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
if (statement instanceof rawsql_ts_1.InsertQuery) {
|
|
34
|
+
if (statement.selectQuery) {
|
|
35
|
+
collectScalarFilterCandidatesFromSelectNode(assertSelectQuery(statement.selectQuery), candidates);
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (statement instanceof rawsql_ts_1.UpdateQuery || statement instanceof rawsql_ts_1.DeleteQuery) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
function collectScalarFilterCandidatesFromSelectNode(statement, candidates) {
|
|
44
|
+
if (statement instanceof rawsql_ts_1.SimpleSelectQuery) {
|
|
45
|
+
collectScalarFilterCandidatesFromSimpleSelect(statement, candidates);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (statement instanceof rawsql_ts_1.BinarySelectQuery) {
|
|
49
|
+
collectScalarFilterCandidatesFromSelectNode(assertSelectQuery(statement.left), candidates);
|
|
50
|
+
collectScalarFilterCandidatesFromSelectNode(assertSelectQuery(statement.right), candidates);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function collectScalarFilterCandidatesFromSimpleSelect(statement, candidates) {
|
|
54
|
+
for (const cte of getWithClauseTables(statement.withClause)) {
|
|
55
|
+
collectScalarFilterCandidatesFromCte(cte, candidates);
|
|
56
|
+
}
|
|
57
|
+
if (!statement.whereClause) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
collectScalarFilterCandidatesFromExpression(statement.whereClause.condition, candidates);
|
|
61
|
+
}
|
|
62
|
+
function collectScalarFilterCandidatesFromCte(cte, candidates) {
|
|
63
|
+
collectScalarFilterCandidatesFromSelectNode(assertSelectQuery(cte.query), candidates);
|
|
64
|
+
}
|
|
65
|
+
function collectScalarFilterCandidatesFromExpression(expression, candidates) {
|
|
66
|
+
if (!(expression instanceof rawsql_ts_1.BinaryExpression)) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const operator = extractOperator(expression.operator);
|
|
70
|
+
if (!SUPPORTED_COMPARISON_OPERATORS.has(operator)) {
|
|
71
|
+
collectScalarFilterCandidatesFromExpression(expression.left, candidates);
|
|
72
|
+
collectScalarFilterCandidatesFromExpression(expression.right, candidates);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const leftInline = unwrapInlineQuery(expression.left);
|
|
76
|
+
const rightInline = unwrapInlineQuery(expression.right);
|
|
77
|
+
if (leftInline && isEligibleScalarSubquery(leftInline)) {
|
|
78
|
+
candidates.push(...collectColumnNames(expression.right));
|
|
79
|
+
}
|
|
80
|
+
if (rightInline && isEligibleScalarSubquery(rightInline)) {
|
|
81
|
+
candidates.push(...collectColumnNames(expression.left));
|
|
82
|
+
}
|
|
83
|
+
collectScalarFilterCandidatesFromExpression(expression.left, candidates);
|
|
84
|
+
collectScalarFilterCandidatesFromExpression(expression.right, candidates);
|
|
85
|
+
}
|
|
86
|
+
function isEligibleScalarSubquery(inlineQuery) {
|
|
87
|
+
const selectQuery = inlineQuery.selectQuery;
|
|
88
|
+
if (!(selectQuery instanceof rawsql_ts_1.SimpleSelectQuery)) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (!hasExactlyOneProjectedColumn(selectQuery)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
return !isCorrelatedScalarSubquery(selectQuery);
|
|
95
|
+
}
|
|
96
|
+
function hasExactlyOneProjectedColumn(selectQuery) {
|
|
97
|
+
if (selectQuery.selectClause.items.length !== 1) {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
const [item] = selectQuery.selectClause.items;
|
|
101
|
+
return !((item === null || item === void 0 ? void 0 : item.value) instanceof rawsql_ts_1.RawString && item.value.value.trim() === '*');
|
|
102
|
+
}
|
|
103
|
+
function isCorrelatedScalarSubquery(selectQuery) {
|
|
104
|
+
const localNames = collectLocalRelationNames(selectQuery);
|
|
105
|
+
const columnReferences = collectColumnReferences(selectQuery);
|
|
106
|
+
return columnReferences.some((reference) => {
|
|
107
|
+
var _a, _b;
|
|
108
|
+
const qualifierParts = (_b = (_a = reference.qualifiedName.namespaces) === null || _a === void 0 ? void 0 : _a.map((namespace) => namespace.name)) !== null && _b !== void 0 ? _b : [];
|
|
109
|
+
if (qualifierParts.length === 0) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
const qualifier = qualifierParts[qualifierParts.length - 1];
|
|
113
|
+
return !localNames.has(qualifier);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
function collectLocalRelationNames(selectQuery) {
|
|
117
|
+
var _a, _b, _c, _d;
|
|
118
|
+
const localNames = new Set();
|
|
119
|
+
const sources = (_b = (_a = selectQuery.fromClause) === null || _a === void 0 ? void 0 : _a.getSources()) !== null && _b !== void 0 ? _b : [];
|
|
120
|
+
for (const source of sources) {
|
|
121
|
+
const aliasName = (_d = (_c = source.aliasExpression) === null || _c === void 0 ? void 0 : _c.table) === null || _d === void 0 ? void 0 : _d.name;
|
|
122
|
+
if (aliasName) {
|
|
123
|
+
localNames.add(aliasName);
|
|
124
|
+
}
|
|
125
|
+
if (source.datasource instanceof rawsql_ts_1.TableSource) {
|
|
126
|
+
localNames.add(extractQualifiedNameLeaf(source.datasource.qualifiedName.name));
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return localNames;
|
|
130
|
+
}
|
|
131
|
+
function collectColumnNames(node) {
|
|
132
|
+
const columnNames = [];
|
|
133
|
+
walkAst(node, (current) => {
|
|
134
|
+
if (!(current instanceof rawsql_ts_1.ColumnReference)) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
columnNames.push(extractQualifiedNameLeaf(current.qualifiedName.name));
|
|
138
|
+
});
|
|
139
|
+
return uniquePreservingOrder(columnNames);
|
|
140
|
+
}
|
|
141
|
+
function collectColumnReferences(node) {
|
|
142
|
+
const matches = [];
|
|
143
|
+
walkAst(node, (current) => {
|
|
144
|
+
if (current instanceof rawsql_ts_1.ColumnReference) {
|
|
145
|
+
matches.push(current);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
return matches;
|
|
149
|
+
}
|
|
150
|
+
function walkAst(node, visit) {
|
|
151
|
+
if (!node || typeof node !== 'object') {
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
visit(node);
|
|
155
|
+
for (const value of Object.values(node)) {
|
|
156
|
+
if (!value) {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
if (Array.isArray(value)) {
|
|
160
|
+
for (const item of value) {
|
|
161
|
+
walkAst(item, visit);
|
|
162
|
+
}
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (typeof value === 'object') {
|
|
166
|
+
walkAst(value, visit);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function unwrapInlineQuery(expression) {
|
|
171
|
+
if (expression instanceof rawsql_ts_1.InlineQuery) {
|
|
172
|
+
return expression;
|
|
173
|
+
}
|
|
174
|
+
if (expression instanceof rawsql_ts_1.ParenExpression) {
|
|
175
|
+
return unwrapInlineQuery(expression.expression);
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
function extractOperator(operator) {
|
|
180
|
+
if (operator instanceof rawsql_ts_1.RawString) {
|
|
181
|
+
return operator.value.trim();
|
|
182
|
+
}
|
|
183
|
+
return '';
|
|
184
|
+
}
|
|
185
|
+
function extractQualifiedNameLeaf(name) {
|
|
186
|
+
return name instanceof rawsql_ts_1.RawString ? name.value : name.name;
|
|
187
|
+
}
|
|
188
|
+
function assertSelectQuery(statement) {
|
|
189
|
+
if (statement instanceof rawsql_ts_1.SimpleSelectQuery ||
|
|
190
|
+
statement instanceof rawsql_ts_1.BinarySelectQuery ||
|
|
191
|
+
statement instanceof rawsql_ts_1.ValuesQuery) {
|
|
192
|
+
return statement;
|
|
193
|
+
}
|
|
194
|
+
throw new Error('Expected a SELECT-compatible statement for scalar filter analysis.');
|
|
195
|
+
}
|
|
196
|
+
function getWithClauseTables(withClause) {
|
|
197
|
+
var _a, _b;
|
|
198
|
+
return withClause ? ((_b = (_a = withClause.tables) !== null && _a !== void 0 ? _a : withClause.commonTables) !== null && _b !== void 0 ? _b : []) : [];
|
|
199
|
+
}
|
|
200
|
+
function uniquePreservingOrder(values) {
|
|
201
|
+
const seen = new Set();
|
|
202
|
+
const result = [];
|
|
203
|
+
for (const value of values) {
|
|
204
|
+
if (seen.has(value)) {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
seen.add(value);
|
|
208
|
+
result.push(value);
|
|
209
|
+
}
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=scalarFilterAnalysis.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scalarFilterAnalysis.js","sourceRoot":"","sources":["../../src/query/scalarFilterAnalysis.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface QuerySliceOptions {
|
|
2
|
+
cte?: string;
|
|
3
|
+
final?: boolean;
|
|
4
|
+
limit?: number;
|
|
5
|
+
excludeCtes?: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface QuerySliceReport {
|
|
8
|
+
file: string;
|
|
9
|
+
mode: 'cte' | 'final';
|
|
10
|
+
target: string;
|
|
11
|
+
included_ctes: string[];
|
|
12
|
+
sql: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build a minimal executable SQL slice for either a target CTE or the final query.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildQuerySliceReport(sqlFile: string, options: QuerySliceOptions): QuerySliceReport;
|
|
@@ -0,0 +1,204 @@
|
|
|
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.buildQuerySliceReport = buildQuerySliceReport;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const rawsql_ts_1 = require("rawsql-ts");
|
|
10
|
+
const analysis_1 = require("./analysis");
|
|
11
|
+
/**
|
|
12
|
+
* Build a minimal executable SQL slice for either a target CTE or the final query.
|
|
13
|
+
*/
|
|
14
|
+
function buildQuerySliceReport(sqlFile, options) {
|
|
15
|
+
var _a;
|
|
16
|
+
validateSliceOptions(options);
|
|
17
|
+
const absolutePath = node_path_1.default.resolve(sqlFile);
|
|
18
|
+
const sql = (0, node_fs_1.readFileSync)(absolutePath, 'utf8');
|
|
19
|
+
const statement = (0, analysis_1.assertSupportedStatement)(rawsql_ts_1.SqlParser.parse(sql), 'ztd query slice');
|
|
20
|
+
const analysis = (0, analysis_1.analyzeStatement)(statement);
|
|
21
|
+
const excludedSet = new Set((_a = options.excludeCtes) !== null && _a !== void 0 ? _a : []);
|
|
22
|
+
if (analysis.ctes.length === 0) {
|
|
23
|
+
throw new Error('ztd query slice requires a query with at least one CTE.');
|
|
24
|
+
}
|
|
25
|
+
if (options.cte) {
|
|
26
|
+
return buildTargetSliceReport(absolutePath, statement, analysis.ctes, analysis.dependencyMap, options.cte, options.limit, excludedSet);
|
|
27
|
+
}
|
|
28
|
+
return buildFinalSliceReport(absolutePath, sql, options.limit, excludedSet);
|
|
29
|
+
}
|
|
30
|
+
function buildTargetSliceReport(absolutePath, statement, ctes, dependencyMap, targetName, limit, excludedSet) {
|
|
31
|
+
var _a, _b;
|
|
32
|
+
const stopSet = new Set([...excludedSet].filter((name) => name !== targetName));
|
|
33
|
+
const includedNames = (0, analysis_1.collectDependencyClosure)(targetName, dependencyMap, stopSet).filter((name) => name === targetName || !excludedSet.has(name));
|
|
34
|
+
if (!includedNames.includes(targetName)) {
|
|
35
|
+
throw new Error(`CTE not found in query: ${targetName}`);
|
|
36
|
+
}
|
|
37
|
+
const includedCtes = filterCtesByOrder(ctes, includedNames);
|
|
38
|
+
if (!includedCtes.some((cte) => cte.aliasExpression.table.name === targetName)) {
|
|
39
|
+
throw new Error(`CTE not found in query: ${targetName}`);
|
|
40
|
+
}
|
|
41
|
+
const formatter = new rawsql_ts_1.SqlFormatter();
|
|
42
|
+
const sliceQuery = buildSelectFromTargetQuery(targetName, limit);
|
|
43
|
+
const sql = composeSliceSql((_b = (_a = getWithClause(statement)) === null || _a === void 0 ? void 0 : _a.recursive) !== null && _b !== void 0 ? _b : false, includedCtes, formatter.format(sliceQuery).formattedSql, formatter);
|
|
44
|
+
return {
|
|
45
|
+
file: absolutePath,
|
|
46
|
+
mode: 'cte',
|
|
47
|
+
target: targetName,
|
|
48
|
+
included_ctes: includedCtes.map((cte) => cte.aliasExpression.table.name),
|
|
49
|
+
sql: `${sql}
|
|
50
|
+
`
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function buildFinalSliceReport(absolutePath, sql, limit, excludedSet) {
|
|
54
|
+
const parsed = (0, analysis_1.assertSupportedStatement)(rawsql_ts_1.SqlParser.parse(sql), 'ztd query slice');
|
|
55
|
+
const analysis = (0, analysis_1.analyzeStatement)(parsed);
|
|
56
|
+
const includedSet = (0, analysis_1.collectReachableCtes)(analysis.rootDependencies, analysis.dependencyMap, excludedSet);
|
|
57
|
+
const includedCtes = filterCtesByOrder(analysis.ctes, [...includedSet].filter((name) => !excludedSet.has(name)));
|
|
58
|
+
// Retain only the transitive closure needed by the final statement.
|
|
59
|
+
applyMinimalWithClause(parsed, includedCtes);
|
|
60
|
+
// Preserve the original final statement and only inject a LIMIT when the final statement is SELECT-compatible.
|
|
61
|
+
if (limit !== undefined) {
|
|
62
|
+
if (parsed instanceof rawsql_ts_1.SimpleSelectQuery) {
|
|
63
|
+
parsed.limitClause = new rawsql_ts_1.LimitClause(new rawsql_ts_1.LiteralValue(limit));
|
|
64
|
+
}
|
|
65
|
+
else if (parsed instanceof rawsql_ts_1.ValuesQuery || parsed instanceof rawsql_ts_1.BinarySelectQuery) {
|
|
66
|
+
const formatter = new rawsql_ts_1.SqlFormatter();
|
|
67
|
+
const wrapped = buildWrappedLimitQuery(parsed, limit);
|
|
68
|
+
return {
|
|
69
|
+
file: absolutePath,
|
|
70
|
+
mode: 'final',
|
|
71
|
+
target: 'FINAL_QUERY',
|
|
72
|
+
included_ctes: includedCtes.map((cte) => cte.aliasExpression.table.name),
|
|
73
|
+
sql: `${formatter.format(wrapped).formattedSql}
|
|
74
|
+
`
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
throw new Error('--limit is only supported for SELECT final slices or --cte slices.');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const formatter = new rawsql_ts_1.SqlFormatter();
|
|
82
|
+
return {
|
|
83
|
+
file: absolutePath,
|
|
84
|
+
mode: 'final',
|
|
85
|
+
target: 'FINAL_QUERY',
|
|
86
|
+
included_ctes: includedCtes.map((cte) => cte.aliasExpression.table.name),
|
|
87
|
+
sql: `${formatter.format(parsed).formattedSql}
|
|
88
|
+
`
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function validateSliceOptions(options) {
|
|
92
|
+
const hasTarget = typeof options.cte === 'string' && options.cte.trim() !== '';
|
|
93
|
+
const hasFinal = options.final === true;
|
|
94
|
+
if (hasTarget === hasFinal) {
|
|
95
|
+
throw new Error('Specify exactly one of --cte <name> or --final.');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function filterCtesByOrder(ctes, includedNames) {
|
|
99
|
+
const includedSet = new Set(includedNames);
|
|
100
|
+
return ctes.filter((cte) => includedSet.has(cte.aliasExpression.table.name));
|
|
101
|
+
}
|
|
102
|
+
function composeSliceSql(recursive, ctes, mainQuery, formatter) {
|
|
103
|
+
if (ctes.length === 0) {
|
|
104
|
+
return mainQuery;
|
|
105
|
+
}
|
|
106
|
+
// Format the WithClause directly so CommonTable metadata such as materialization hints
|
|
107
|
+
// and alias column lists survive the slice output intact.
|
|
108
|
+
const withClause = formatter.format(new rawsql_ts_1.WithClause(recursive, ctes)).formattedSql;
|
|
109
|
+
return `${withClause} ${mainQuery}`;
|
|
110
|
+
}
|
|
111
|
+
function buildSelectFromTargetQuery(targetName, limit) {
|
|
112
|
+
return new rawsql_ts_1.SimpleSelectQuery({
|
|
113
|
+
selectClause: new rawsql_ts_1.SelectClause([new rawsql_ts_1.SelectItem(new rawsql_ts_1.RawString('*'))]),
|
|
114
|
+
fromClause: new rawsql_ts_1.FromClause(new rawsql_ts_1.SourceExpression(new rawsql_ts_1.TableSource(null, targetName), null), null),
|
|
115
|
+
limitClause: limit === undefined ? null : new rawsql_ts_1.LimitClause(new rawsql_ts_1.LiteralValue(limit))
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
function buildWrappedLimitQuery(statement, limit) {
|
|
119
|
+
return new rawsql_ts_1.SimpleSelectQuery({
|
|
120
|
+
selectClause: new rawsql_ts_1.SelectClause([new rawsql_ts_1.SelectItem(new rawsql_ts_1.RawString('*'))]),
|
|
121
|
+
fromClause: new rawsql_ts_1.FromClause(new rawsql_ts_1.SourceExpression(new rawsql_ts_1.SubQuerySource(statement), new rawsql_ts_1.SourceAliasExpression('final_slice', null)), null),
|
|
122
|
+
limitClause: new rawsql_ts_1.LimitClause(new rawsql_ts_1.LiteralValue(limit))
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function applyMinimalWithClause(statement, ctes) {
|
|
126
|
+
var _a;
|
|
127
|
+
const existingWithClause = getWithClause(statement);
|
|
128
|
+
const nextWithClause = ctes.length > 0 ? new rawsql_ts_1.WithClause((_a = existingWithClause === null || existingWithClause === void 0 ? void 0 : existingWithClause.recursive) !== null && _a !== void 0 ? _a : false, ctes) : null;
|
|
129
|
+
if (statement instanceof rawsql_ts_1.SimpleSelectQuery ||
|
|
130
|
+
statement instanceof rawsql_ts_1.ValuesQuery ||
|
|
131
|
+
statement instanceof rawsql_ts_1.UpdateQuery ||
|
|
132
|
+
statement instanceof rawsql_ts_1.DeleteQuery) {
|
|
133
|
+
statement.withClause = nextWithClause;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (statement instanceof rawsql_ts_1.InsertQuery) {
|
|
137
|
+
if (!statement.selectQuery) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
// INSERT ... SELECT stores the CTEs on the nested selectQuery, not on InsertQuery itself.
|
|
141
|
+
applyMinimalWithClauseToSelect(assertSelectQuery(statement.selectQuery), nextWithClause);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
applyMinimalWithClauseToSelect(statement, nextWithClause);
|
|
145
|
+
}
|
|
146
|
+
function applyMinimalWithClauseToSelect(statement, withClause) {
|
|
147
|
+
if (statement instanceof rawsql_ts_1.SimpleSelectQuery || statement instanceof rawsql_ts_1.ValuesQuery) {
|
|
148
|
+
statement.withClause = withClause;
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
let current = statement;
|
|
152
|
+
while (current instanceof rawsql_ts_1.BinarySelectQuery) {
|
|
153
|
+
if (current.left instanceof rawsql_ts_1.BinarySelectQuery) {
|
|
154
|
+
current = current.left;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (current.left instanceof rawsql_ts_1.SimpleSelectQuery || current.left instanceof rawsql_ts_1.ValuesQuery) {
|
|
158
|
+
current.left.withClause = withClause;
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
throw new Error('Unable to apply sliced WITH clause to the final query.');
|
|
164
|
+
}
|
|
165
|
+
function getWithClause(statement) {
|
|
166
|
+
var _a;
|
|
167
|
+
if (statement instanceof rawsql_ts_1.SimpleSelectQuery ||
|
|
168
|
+
statement instanceof rawsql_ts_1.ValuesQuery ||
|
|
169
|
+
statement instanceof rawsql_ts_1.UpdateQuery ||
|
|
170
|
+
statement instanceof rawsql_ts_1.DeleteQuery) {
|
|
171
|
+
return (_a = statement.withClause) !== null && _a !== void 0 ? _a : null;
|
|
172
|
+
}
|
|
173
|
+
if (statement instanceof rawsql_ts_1.InsertQuery) {
|
|
174
|
+
return statement.selectQuery ? getSelectWithClause(assertSelectQuery(statement.selectQuery)) : null;
|
|
175
|
+
}
|
|
176
|
+
return getSelectWithClause(statement);
|
|
177
|
+
}
|
|
178
|
+
function assertSelectQuery(statement) {
|
|
179
|
+
if (statement instanceof rawsql_ts_1.SimpleSelectQuery ||
|
|
180
|
+
statement instanceof rawsql_ts_1.BinarySelectQuery ||
|
|
181
|
+
statement instanceof rawsql_ts_1.ValuesQuery) {
|
|
182
|
+
return statement;
|
|
183
|
+
}
|
|
184
|
+
throw new Error('Expected a SELECT-compatible statement for query slicing.');
|
|
185
|
+
}
|
|
186
|
+
function getSelectWithClause(statement) {
|
|
187
|
+
var _a, _b;
|
|
188
|
+
if (statement instanceof rawsql_ts_1.SimpleSelectQuery || statement instanceof rawsql_ts_1.ValuesQuery) {
|
|
189
|
+
return (_a = statement.withClause) !== null && _a !== void 0 ? _a : null;
|
|
190
|
+
}
|
|
191
|
+
let current = statement;
|
|
192
|
+
while (current instanceof rawsql_ts_1.BinarySelectQuery) {
|
|
193
|
+
if (current.left instanceof rawsql_ts_1.BinarySelectQuery) {
|
|
194
|
+
current = current.left;
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
if (current.left instanceof rawsql_ts_1.SimpleSelectQuery || current.left instanceof rawsql_ts_1.ValuesQuery) {
|
|
198
|
+
return (_b = current.left.withClause) !== null && _b !== void 0 ? _b : null;
|
|
199
|
+
}
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=slice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slice.js","sourceRoot":"","sources":["../../src/query/slice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export type QueryStructureFormat = 'text' | 'json' | 'dot';
|
|
2
|
+
export interface QueryStructureNode {
|
|
3
|
+
name: string;
|
|
4
|
+
depends_on: string[];
|
|
5
|
+
used_by_final_query: boolean;
|
|
6
|
+
unused: boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface QueryStructureReport {
|
|
9
|
+
query_type: 'SELECT' | 'INSERT' | 'UPDATE' | 'DELETE';
|
|
10
|
+
file: string;
|
|
11
|
+
cte_count: number;
|
|
12
|
+
ctes: QueryStructureNode[];
|
|
13
|
+
final_query: string | null;
|
|
14
|
+
referenced_tables: string[];
|
|
15
|
+
unused_ctes: string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Parse a SQL file and summarize its CTE graph and referenced base tables.
|
|
19
|
+
*/
|
|
20
|
+
export declare function buildQueryStructureReport(sqlFile: string, commandName?: string): QueryStructureReport;
|
|
21
|
+
/**
|
|
22
|
+
* Render the query structure report in the requested output format.
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatQueryStructureReport(report: QueryStructureReport, format: QueryStructureFormat): string;
|
|
@@ -0,0 +1,135 @@
|
|
|
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.buildQueryStructureReport = buildQueryStructureReport;
|
|
7
|
+
exports.formatQueryStructureReport = formatQueryStructureReport;
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
const rawsql_ts_1 = require("rawsql-ts");
|
|
11
|
+
const rawsql_ts_2 = require("rawsql-ts");
|
|
12
|
+
const analysis_1 = require("./analysis");
|
|
13
|
+
/**
|
|
14
|
+
* Parse a SQL file and summarize its CTE graph and referenced base tables.
|
|
15
|
+
*/
|
|
16
|
+
function buildQueryStructureReport(sqlFile, commandName = 'ztd query outline') {
|
|
17
|
+
const absolutePath = node_path_1.default.resolve(sqlFile);
|
|
18
|
+
const sql = (0, node_fs_1.readFileSync)(absolutePath, 'utf8');
|
|
19
|
+
const parsed = rawsql_ts_1.SqlParser.parse(sql);
|
|
20
|
+
const statement = (0, analysis_1.assertSupportedStatement)(parsed, commandName);
|
|
21
|
+
const analysis = (0, analysis_1.analyzeStatement)(statement);
|
|
22
|
+
const usedCtes = (0, analysis_1.collectReachableCtes)(analysis.rootDependencies, analysis.dependencyMap);
|
|
23
|
+
const unusedCtes = analysis.cteNames.filter((name) => !usedCtes.has(name)).sort();
|
|
24
|
+
const referencedTables = Array.from(new Set(new rawsql_ts_1.TableSourceCollector(false).collect(statement).map((source) => normalizeCollectedTableName(source)))).sort();
|
|
25
|
+
return {
|
|
26
|
+
query_type: (0, analysis_1.detectQueryType)(statement),
|
|
27
|
+
file: absolutePath,
|
|
28
|
+
cte_count: analysis.ctes.length,
|
|
29
|
+
ctes: analysis.cteNames.map((name) => {
|
|
30
|
+
var _a;
|
|
31
|
+
return ({
|
|
32
|
+
name,
|
|
33
|
+
depends_on: [...((_a = analysis.dependencyMap.get(name)) !== null && _a !== void 0 ? _a : [])].sort(),
|
|
34
|
+
used_by_final_query: usedCtes.has(name),
|
|
35
|
+
unused: !usedCtes.has(name)
|
|
36
|
+
});
|
|
37
|
+
}),
|
|
38
|
+
final_query: resolveFinalQuery(statement, analysis.cteNames, analysis.rootDependencies),
|
|
39
|
+
referenced_tables: referencedTables,
|
|
40
|
+
unused_ctes: unusedCtes
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Render the query structure report in the requested output format.
|
|
45
|
+
*/
|
|
46
|
+
function formatQueryStructureReport(report, format) {
|
|
47
|
+
switch (format) {
|
|
48
|
+
case 'json':
|
|
49
|
+
return `${JSON.stringify(report, null, 2)}\n`;
|
|
50
|
+
case 'dot':
|
|
51
|
+
return `${formatQueryStructureDot(report)}\n`;
|
|
52
|
+
case 'text':
|
|
53
|
+
default:
|
|
54
|
+
return `${formatQueryStructureText(report)}\n`;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function formatQueryStructureText(report) {
|
|
58
|
+
var _a;
|
|
59
|
+
const lines = [
|
|
60
|
+
`Query type: ${report.query_type}`,
|
|
61
|
+
`CTE count: ${report.cte_count}`,
|
|
62
|
+
'',
|
|
63
|
+
'CTEs:'
|
|
64
|
+
];
|
|
65
|
+
if (report.ctes.length === 0) {
|
|
66
|
+
lines.push('(none)');
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
report.ctes.forEach((cte, index) => {
|
|
70
|
+
const suffix = cte.unused ? ' [unused]' : '';
|
|
71
|
+
lines.push(`${index + 1}. ${cte.name}${suffix}`);
|
|
72
|
+
lines.push(` depends_on: ${cte.depends_on.length > 0 ? cte.depends_on.join(', ') : '(none)'}`);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
lines.push('', 'Final query target:', (_a = report.final_query) !== null && _a !== void 0 ? _a : '(none)');
|
|
76
|
+
lines.push('', 'Referenced tables:');
|
|
77
|
+
if (report.referenced_tables.length === 0) {
|
|
78
|
+
lines.push('(none)');
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
lines.push(...report.referenced_tables);
|
|
82
|
+
}
|
|
83
|
+
lines.push('', 'Unused CTEs:');
|
|
84
|
+
if (report.unused_ctes.length === 0) {
|
|
85
|
+
lines.push('(none)');
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
lines.push(...report.unused_ctes);
|
|
89
|
+
}
|
|
90
|
+
return lines.join('\n');
|
|
91
|
+
}
|
|
92
|
+
function formatQueryStructureDot(report) {
|
|
93
|
+
const lines = ['digraph query_structure {', ' rankdir=LR;', ' "FINAL_QUERY" [shape=box];'];
|
|
94
|
+
const directRoots = report.final_query ? report.final_query.split(', ').filter(Boolean) : [];
|
|
95
|
+
for (const cte of report.ctes) {
|
|
96
|
+
const attributes = cte.unused ? ' [style=dashed]' : '';
|
|
97
|
+
lines.push(` "${cte.name}"${attributes};`);
|
|
98
|
+
}
|
|
99
|
+
for (const cte of report.ctes) {
|
|
100
|
+
for (const dependency of cte.depends_on) {
|
|
101
|
+
lines.push(` "${cte.name}" -> "${dependency}";`);
|
|
102
|
+
}
|
|
103
|
+
if (directRoots.includes(cte.name)) {
|
|
104
|
+
lines.push(` "FINAL_QUERY" -> "${cte.name}";`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
lines.push('}');
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
}
|
|
110
|
+
function resolveFinalQuery(statement, cteNames, rootDependencies) {
|
|
111
|
+
if (rootDependencies.length > 0) {
|
|
112
|
+
return rootDependencies.join(', ');
|
|
113
|
+
}
|
|
114
|
+
const cteNameSet = new Set(cteNames);
|
|
115
|
+
const directSources = (0, analysis_1.uniquePreservingOrder)((0, analysis_1.collectDirectSources)(statement)
|
|
116
|
+
.map((source) => source.datasource)
|
|
117
|
+
.filter((source) => source instanceof rawsql_ts_2.TableSource)
|
|
118
|
+
.map((source) => normalizeFinalSourceName(source, cteNameSet)));
|
|
119
|
+
if (directSources.length === 0) {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
return directSources.join(', ');
|
|
123
|
+
}
|
|
124
|
+
function normalizeCollectedTableName(source) {
|
|
125
|
+
var _a, _b;
|
|
126
|
+
const namespaces = (_b = (_a = source.qualifiedName.namespaces) === null || _a === void 0 ? void 0 : _a.map((namespace) => namespace.name)) !== null && _b !== void 0 ? _b : [];
|
|
127
|
+
return (0, rawsql_ts_1.normalizeTableName)([...namespaces, source.table.name].join('.'));
|
|
128
|
+
}
|
|
129
|
+
function normalizeFinalSourceName(source, cteNameSet) {
|
|
130
|
+
if (cteNameSet.has(source.table.name)) {
|
|
131
|
+
return source.table.name;
|
|
132
|
+
}
|
|
133
|
+
return normalizeCollectedTableName(source);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=structure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../../src/query/structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseQueryTarget = void 0;
|
|
4
|
+
var sql_grep_core_1 = require("@rawsql-ts/sql-grep-core");
|
|
5
|
+
Object.defineProperty(exports, "parseQueryTarget", { enumerable: true, get: function () { return sql_grep_core_1.parseQueryTarget; } });
|
|
6
|
+
//# sourceMappingURL=targets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"targets.js","sourceRoot":"","sources":["../../src/query/targets.ts"],"names":[],"mappings":";;;AAAA,0DAA4D;AAAnD,iHAAA,gBAAgB,OAAA"}
|