rawsql-ts 0.17.0 → 0.18.0
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/esm/index.d.ts +4 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +4 -4
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/transformers/DynamicQueryBuilder.d.ts +9 -13
- package/dist/esm/transformers/DynamicQueryBuilder.js +8 -108
- package/dist/esm/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/esm/transformers/PruneOptionalConditionBranches.d.ts +14 -2
- package/dist/esm/transformers/PruneOptionalConditionBranches.js +105 -37
- package/dist/esm/transformers/PruneOptionalConditionBranches.js.map +1 -1
- package/dist/esm/transformers/SSSQLFilterBuilder.d.ts +30 -0
- package/dist/esm/transformers/SSSQLFilterBuilder.js +253 -0
- package/dist/esm/transformers/SSSQLFilterBuilder.js.map +1 -0
- package/dist/esm/utils/RelationGraph.d.ts +43 -0
- package/dist/esm/utils/RelationGraph.js +117 -0
- package/dist/esm/utils/RelationGraph.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +4 -4
- package/dist/index.min.js.map +4 -4
- package/dist/src/index.d.ts +4 -0
- package/dist/src/transformers/DynamicQueryBuilder.d.ts +9 -13
- package/dist/src/transformers/PruneOptionalConditionBranches.d.ts +14 -2
- package/dist/src/transformers/SSSQLFilterBuilder.d.ts +30 -0
- package/dist/src/utils/RelationGraph.d.ts +43 -0
- package/dist/transformers/DynamicQueryBuilder.js +8 -97
- package/dist/transformers/DynamicQueryBuilder.js.map +1 -1
- package/dist/transformers/PruneOptionalConditionBranches.js +106 -37
- package/dist/transformers/PruneOptionalConditionBranches.js.map +1 -1
- package/dist/transformers/SSSQLFilterBuilder.js +259 -0
- package/dist/transformers/SSSQLFilterBuilder.js.map +1 -0
- package/dist/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/utils/RelationGraph.js +123 -0
- package/dist/utils/RelationGraph.js.map +1 -0
- package/package.json +64 -65
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { WhereClause, TableSource } from "../models/Clause";
|
|
2
|
+
import { BinaryExpression, ColumnReference, IdentifierString, LiteralValue, ParameterExpression, ParenExpression } from "../models/ValueComponent";
|
|
3
|
+
import { SelectQueryParser } from "../parsers/SelectQueryParser";
|
|
4
|
+
import { UpstreamSelectQueryFinder } from "./UpstreamSelectQueryFinder";
|
|
5
|
+
import { SelectableColumnCollector, DuplicateDetectionMode } from "./SelectableColumnCollector";
|
|
6
|
+
import { ColumnReferenceCollector } from "./ColumnReferenceCollector";
|
|
7
|
+
import { collectSupportedOptionalConditionBranches } from "./PruneOptionalConditionBranches";
|
|
8
|
+
const normalizeIdentifier = (value) => value.trim().toLowerCase();
|
|
9
|
+
const normalizeColumnReferenceKey = (reference) => {
|
|
10
|
+
return `${normalizeIdentifier(reference.getNamespace())}.${normalizeIdentifier(reference.column.name)}`;
|
|
11
|
+
};
|
|
12
|
+
const isExplicitEqualityScaffoldValue = (value) => {
|
|
13
|
+
var _a;
|
|
14
|
+
if (value === null || value === undefined) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
if (Array.isArray(value)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
if (typeof value !== "object") {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
const entries = Object.entries(value).filter(([, entry]) => entry !== undefined);
|
|
24
|
+
return entries.length === 1 && ((_a = entries[0]) === null || _a === void 0 ? void 0 : _a[0]) === "=";
|
|
25
|
+
};
|
|
26
|
+
const parseQualifiedFilterName = (filterName) => {
|
|
27
|
+
const segments = filterName.split(".");
|
|
28
|
+
if (segments.length !== 2) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const [table, column] = segments.map(segment => segment.trim());
|
|
32
|
+
if (!table || !column) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
return { table, column };
|
|
36
|
+
};
|
|
37
|
+
const makeParameterName = (filterName) => {
|
|
38
|
+
return filterName
|
|
39
|
+
.trim()
|
|
40
|
+
.replace(/\./g, "_")
|
|
41
|
+
.replace(/[^a-zA-Z0-9_]/g, "_");
|
|
42
|
+
};
|
|
43
|
+
const buildOptionalEqualityBranch = (column, parameterName) => {
|
|
44
|
+
const parameter = new ParameterExpression(parameterName);
|
|
45
|
+
const guard = new BinaryExpression(new ParameterExpression(parameterName), "is", new LiteralValue(null));
|
|
46
|
+
const equality = new BinaryExpression(new ColumnReference(column.getNamespace() || null, column.column.name), "=", parameter);
|
|
47
|
+
return new ParenExpression(new BinaryExpression(guard, "or", equality));
|
|
48
|
+
};
|
|
49
|
+
const rebuildWhereWithoutTerm = (query, termToRemove) => {
|
|
50
|
+
if (!query.whereClause) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const collectTopLevelAndTerms = (expression) => {
|
|
54
|
+
if (expression instanceof BinaryExpression &&
|
|
55
|
+
expression.operator.value.trim().toLowerCase() === "and") {
|
|
56
|
+
return [
|
|
57
|
+
...collectTopLevelAndTerms(expression.left),
|
|
58
|
+
...collectTopLevelAndTerms(expression.right)
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
return [expression];
|
|
62
|
+
};
|
|
63
|
+
const terms = collectTopLevelAndTerms(query.whereClause.condition).filter(term => term !== termToRemove);
|
|
64
|
+
if (terms.length === 0) {
|
|
65
|
+
query.whereClause = null;
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
let rebuilt = terms[0];
|
|
69
|
+
for (let index = 1; index < terms.length; index += 1) {
|
|
70
|
+
rebuilt = new BinaryExpression(rebuilt, "and", terms[index]);
|
|
71
|
+
}
|
|
72
|
+
query.whereClause = new WhereClause(rebuilt);
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Builds and refreshes truthful SSSQL optional filter branches.
|
|
76
|
+
* Runtime callers should use pruning, not dynamic predicate injection.
|
|
77
|
+
*/
|
|
78
|
+
export class SSSQLFilterBuilder {
|
|
79
|
+
constructor(tableColumnResolver) {
|
|
80
|
+
this.tableColumnResolver = tableColumnResolver;
|
|
81
|
+
this.finder = new UpstreamSelectQueryFinder(this.tableColumnResolver);
|
|
82
|
+
}
|
|
83
|
+
scaffold(query, filters) {
|
|
84
|
+
const parsed = this.parseQuery(query);
|
|
85
|
+
for (const [filterName, filterValue] of Object.entries(filters)) {
|
|
86
|
+
if (!isExplicitEqualityScaffoldValue(filterValue)) {
|
|
87
|
+
throw new Error(`SSSQL scaffold only supports equality filters in v1. Use refresh for pre-authored branches: '${filterName}'.`);
|
|
88
|
+
}
|
|
89
|
+
const target = this.resolveTarget(parsed, filterName);
|
|
90
|
+
target.query.appendWhere(buildOptionalEqualityBranch(target.column, target.parameterName));
|
|
91
|
+
}
|
|
92
|
+
return parsed;
|
|
93
|
+
}
|
|
94
|
+
refresh(query, filters) {
|
|
95
|
+
const parsed = this.parseQuery(query);
|
|
96
|
+
for (const [filterName, filterValue] of Object.entries(filters)) {
|
|
97
|
+
const target = this.resolveTarget(parsed, filterName);
|
|
98
|
+
const matches = collectSupportedOptionalConditionBranches(parsed)
|
|
99
|
+
.filter(branch => branch.parameterName === target.parameterName);
|
|
100
|
+
if (matches.length === 0) {
|
|
101
|
+
if (!isExplicitEqualityScaffoldValue(filterValue)) {
|
|
102
|
+
throw new Error(`No existing SSSQL branch was found for '${filterName}', and v1 scaffold only supports equality filters.`);
|
|
103
|
+
}
|
|
104
|
+
target.query.appendWhere(buildOptionalEqualityBranch(target.column, target.parameterName));
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (matches.length > 1) {
|
|
108
|
+
throw new Error(`Multiple SSSQL branches matched parameter ':${target.parameterName}'. Refresh is ambiguous.`);
|
|
109
|
+
}
|
|
110
|
+
const [match] = matches;
|
|
111
|
+
if (!match) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (match.query === target.query) {
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
this.rebaseMovedBranch(match.expression, match.query, target.column);
|
|
118
|
+
rebuildWhereWithoutTerm(match.query, match.expression);
|
|
119
|
+
target.query.appendWhere(match.expression);
|
|
120
|
+
}
|
|
121
|
+
return parsed;
|
|
122
|
+
}
|
|
123
|
+
parseQuery(query) {
|
|
124
|
+
return typeof query === "string" ? SelectQueryParser.parse(query) : query;
|
|
125
|
+
}
|
|
126
|
+
resolveTarget(root, filterName) {
|
|
127
|
+
var _a;
|
|
128
|
+
const qualified = parseQualifiedFilterName(filterName);
|
|
129
|
+
const lookupColumn = (_a = qualified === null || qualified === void 0 ? void 0 : qualified.column) !== null && _a !== void 0 ? _a : filterName.trim();
|
|
130
|
+
const candidateQueries = [...new Set(this.finder.find(root, lookupColumn))];
|
|
131
|
+
const matches = candidateQueries
|
|
132
|
+
.map(query => this.resolveTargetInQuery(query, filterName, qualified))
|
|
133
|
+
.filter((target) => target !== null);
|
|
134
|
+
if (matches.length === 0) {
|
|
135
|
+
throw new Error(`Could not resolve SSSQL filter target '${filterName}' in the current query graph.`);
|
|
136
|
+
}
|
|
137
|
+
if (matches.length > 1) {
|
|
138
|
+
throw new Error(`SSSQL filter target '${filterName}' is ambiguous across multiple query scopes.`);
|
|
139
|
+
}
|
|
140
|
+
return matches[0];
|
|
141
|
+
}
|
|
142
|
+
resolveTargetInQuery(query, filterName, qualified) {
|
|
143
|
+
if (qualified) {
|
|
144
|
+
return this.resolveQualifiedTarget(query, qualified);
|
|
145
|
+
}
|
|
146
|
+
return this.resolveUnqualifiedTarget(query, filterName);
|
|
147
|
+
}
|
|
148
|
+
resolveQualifiedTarget(query, filterName) {
|
|
149
|
+
const alias = this.findAliasForTable(query, filterName.table);
|
|
150
|
+
if (!alias) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const collector = new SelectableColumnCollector(this.tableColumnResolver, false, DuplicateDetectionMode.FullName, { upstream: true });
|
|
154
|
+
const matches = collector.collect(query)
|
|
155
|
+
.filter((entry) => entry.value instanceof ColumnReference)
|
|
156
|
+
.filter(entry => normalizeColumnReferenceKey(entry.value) === `${normalizeIdentifier(alias)}.${normalizeIdentifier(filterName.column)}`);
|
|
157
|
+
if (matches.length === 0) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
if (matches.length > 1) {
|
|
161
|
+
throw new Error(`SSSQL scaffold target '${filterName.table}.${filterName.column}' resolved to multiple columns.`);
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
query,
|
|
165
|
+
column: matches[0].value,
|
|
166
|
+
parameterName: makeParameterName(`${filterName.table}.${filterName.column}`)
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
resolveUnqualifiedTarget(query, filterName) {
|
|
170
|
+
const collector = new SelectableColumnCollector(this.tableColumnResolver, false, DuplicateDetectionMode.FullName, { upstream: true });
|
|
171
|
+
const matches = collector.collect(query)
|
|
172
|
+
.filter((entry) => entry.value instanceof ColumnReference)
|
|
173
|
+
.filter(entry => normalizeIdentifier(entry.name) === normalizeIdentifier(filterName));
|
|
174
|
+
if (matches.length === 0) {
|
|
175
|
+
return null;
|
|
176
|
+
}
|
|
177
|
+
if (matches.length > 1) {
|
|
178
|
+
throw new Error(`SSSQL scaffold target '${filterName}' is ambiguous. Use a qualified table.column reference.`);
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
query,
|
|
182
|
+
column: matches[0].value,
|
|
183
|
+
parameterName: makeParameterName(filterName)
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
findAliasForTable(query, tableName) {
|
|
187
|
+
var _a, _b;
|
|
188
|
+
const normalizedTable = normalizeIdentifier(tableName);
|
|
189
|
+
const sources = (_b = (_a = query.fromClause) === null || _a === void 0 ? void 0 : _a.getSources()) !== null && _b !== void 0 ? _b : [];
|
|
190
|
+
const matchingAliases = sources
|
|
191
|
+
.map(source => this.resolveAliasForSource(source, normalizedTable))
|
|
192
|
+
.filter((alias) => alias !== null);
|
|
193
|
+
if (matchingAliases.length === 0) {
|
|
194
|
+
return null;
|
|
195
|
+
}
|
|
196
|
+
if (matchingAliases.length > 1) {
|
|
197
|
+
throw new Error(`SSSQL scaffold target table '${tableName}' is ambiguous in the selected query scope.`);
|
|
198
|
+
}
|
|
199
|
+
return matchingAliases[0];
|
|
200
|
+
}
|
|
201
|
+
resolveAliasForSource(source, normalizedTable) {
|
|
202
|
+
var _a;
|
|
203
|
+
if (!(source.datasource instanceof TableSource)) {
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
const sourceName = normalizeIdentifier(source.datasource.getSourceName());
|
|
207
|
+
const shortName = normalizeIdentifier(source.datasource.table.name);
|
|
208
|
+
if (sourceName !== normalizedTable && shortName !== normalizedTable) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
return (_a = source.getAliasName()) !== null && _a !== void 0 ? _a : source.datasource.table.name;
|
|
212
|
+
}
|
|
213
|
+
rebaseMovedBranch(expression, sourceQuery, targetColumn) {
|
|
214
|
+
var _a, _b, _c;
|
|
215
|
+
const targetNamespace = targetColumn.qualifiedName.namespaces
|
|
216
|
+
? targetColumn.qualifiedName.namespaces.map(namespace => namespace.name)
|
|
217
|
+
: null;
|
|
218
|
+
const targetColumnName = normalizeIdentifier(targetColumn.column.name);
|
|
219
|
+
const sourceAliases = new Set(new ColumnReferenceCollector()
|
|
220
|
+
.collect(expression)
|
|
221
|
+
.filter(reference => normalizeIdentifier(reference.column.name) === targetColumnName)
|
|
222
|
+
.map(reference => normalizeIdentifier(reference.getNamespace()))
|
|
223
|
+
.filter(namespace => namespace.length > 0));
|
|
224
|
+
if (sourceAliases.size === 0) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (sourceAliases.size > 1) {
|
|
228
|
+
const aliases = [...sourceAliases].join(", ");
|
|
229
|
+
throw new Error(`SSSQL refresh cannot safely rebase '${targetColumn.column.name}' across multiple aliases (${aliases}).`);
|
|
230
|
+
}
|
|
231
|
+
const [sourceAlias] = [...sourceAliases];
|
|
232
|
+
const availableAliases = new Set(((_b = (_a = sourceQuery.fromClause) === null || _a === void 0 ? void 0 : _a.getSources()) !== null && _b !== void 0 ? _b : [])
|
|
233
|
+
.map(source => source.getAliasName())
|
|
234
|
+
.filter((alias) => typeof alias === "string")
|
|
235
|
+
.map(alias => normalizeIdentifier(alias)));
|
|
236
|
+
if (!availableAliases.has(sourceAlias)) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
for (const reference of new ColumnReferenceCollector().collect(expression)) {
|
|
240
|
+
if (normalizeIdentifier(reference.getNamespace()) !== sourceAlias) {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
reference.qualifiedName.namespaces = (_c = targetNamespace === null || targetNamespace === void 0 ? void 0 : targetNamespace.map(namespace => new IdentifierString(namespace))) !== null && _c !== void 0 ? _c : null;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
export const scaffoldSssqlQuery = (sqlContent, filters) => ({
|
|
248
|
+
query: new SSSQLFilterBuilder().scaffold(sqlContent, filters)
|
|
249
|
+
});
|
|
250
|
+
export const refreshSssqlQuery = (sqlContent, filters) => ({
|
|
251
|
+
query: new SSSQLFilterBuilder().refresh(sqlContent, filters)
|
|
252
|
+
});
|
|
253
|
+
//# sourceMappingURL=SSSQLFilterBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SSSQLFilterBuilder.js","sourceRoot":"","sources":["../../../src/transformers/SSSQLFilterBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { CreateTableQuery } from '../models/CreateTableQuery';
|
|
2
|
+
import { QualifiedName } from '../models/ValueComponent';
|
|
3
|
+
export type RelationConstraintKind = 'column-reference' | 'table-foreign-key';
|
|
4
|
+
export type RelationEvidenceKind = RelationConstraintKind | 'primary-key' | 'unique-key';
|
|
5
|
+
export type RelationConfidence = 'confirmed' | 'inferred' | 'unknown';
|
|
6
|
+
export interface RelationGraphEdge {
|
|
7
|
+
childTable: string;
|
|
8
|
+
parentTable: string;
|
|
9
|
+
childColumns: string[];
|
|
10
|
+
parentColumns: string[];
|
|
11
|
+
constraintKind: RelationConstraintKind;
|
|
12
|
+
constraintName: string | null;
|
|
13
|
+
/**
|
|
14
|
+
* Evidence behind the relation edge. v1 uses FK evidence, but callers can
|
|
15
|
+
* keep the same edge shape when PK / UNIQUE inference is added later.
|
|
16
|
+
*/
|
|
17
|
+
evidenceKind: RelationEvidenceKind;
|
|
18
|
+
/**
|
|
19
|
+
* Indicates whether the relation is directly confirmed or inferred from
|
|
20
|
+
* broader schema evidence.
|
|
21
|
+
*/
|
|
22
|
+
confidence: RelationConfidence;
|
|
23
|
+
isSelfReference: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface RelationGraph {
|
|
26
|
+
relations: RelationGraphEdge[];
|
|
27
|
+
byChildTable: Map<string, RelationGraphEdge[]>;
|
|
28
|
+
byParentTable: Map<string, RelationGraphEdge[]>;
|
|
29
|
+
tableNames: Set<string>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Build a direction-aware relation graph from parsed CREATE TABLE statements.
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildRelationGraphFromCreateTableQueries(queries: CreateTableQuery[]): RelationGraph;
|
|
35
|
+
/**
|
|
36
|
+
* Return the known parent relations for a child table.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getOutgoingRelations(graph: RelationGraph, childTable: string): RelationGraphEdge[];
|
|
39
|
+
/**
|
|
40
|
+
* Return the known child relations for a parent table.
|
|
41
|
+
*/
|
|
42
|
+
export declare function getIncomingRelations(graph: RelationGraph, parentTable: string): RelationGraphEdge[];
|
|
43
|
+
export declare function getQualifiedNameText(value: QualifiedName): string;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { normalizeTableName } from './TableNameUtils';
|
|
2
|
+
/**
|
|
3
|
+
* Build a direction-aware relation graph from parsed CREATE TABLE statements.
|
|
4
|
+
*/
|
|
5
|
+
export function buildRelationGraphFromCreateTableQueries(queries) {
|
|
6
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
|
|
7
|
+
const relations = [];
|
|
8
|
+
const byChildTable = new Map();
|
|
9
|
+
const byParentTable = new Map();
|
|
10
|
+
const tableNames = new Set();
|
|
11
|
+
const seen = new Set();
|
|
12
|
+
for (const query of queries) {
|
|
13
|
+
const childTable = normalizeRelationTableName(buildQualifiedName(query.namespaces, query.tableName.name));
|
|
14
|
+
tableNames.add(childTable);
|
|
15
|
+
for (const column of query.columns) {
|
|
16
|
+
for (const constraint of column.constraints) {
|
|
17
|
+
if (constraint.kind !== 'references' || !constraint.reference) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
const edge = createEdge({
|
|
21
|
+
childTable,
|
|
22
|
+
parentTable: normalizeRelationTableName(constraint.reference.targetTable.toString()),
|
|
23
|
+
childColumns: [column.name.name],
|
|
24
|
+
parentColumns: (_b = (_a = constraint.reference.columns) === null || _a === void 0 ? void 0 : _a.map((item) => item.name)) !== null && _b !== void 0 ? _b : [],
|
|
25
|
+
constraintKind: 'column-reference',
|
|
26
|
+
constraintName: (_d = (_c = constraint.constraintName) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : null,
|
|
27
|
+
evidenceKind: 'column-reference',
|
|
28
|
+
confidence: 'confirmed'
|
|
29
|
+
});
|
|
30
|
+
addEdge(relations, byChildTable, byParentTable, seen, tableNames, edge);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
for (const constraint of query.tableConstraints) {
|
|
34
|
+
if (constraint.kind !== 'foreign-key' || !constraint.reference) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const edge = createEdge({
|
|
38
|
+
childTable,
|
|
39
|
+
parentTable: normalizeRelationTableName(constraint.reference.targetTable.toString()),
|
|
40
|
+
childColumns: (_f = (_e = constraint.columns) === null || _e === void 0 ? void 0 : _e.map((item) => item.name)) !== null && _f !== void 0 ? _f : [],
|
|
41
|
+
parentColumns: (_h = (_g = constraint.reference.columns) === null || _g === void 0 ? void 0 : _g.map((item) => item.name)) !== null && _h !== void 0 ? _h : [],
|
|
42
|
+
constraintKind: 'table-foreign-key',
|
|
43
|
+
constraintName: (_k = (_j = constraint.constraintName) === null || _j === void 0 ? void 0 : _j.name) !== null && _k !== void 0 ? _k : null,
|
|
44
|
+
evidenceKind: 'table-foreign-key',
|
|
45
|
+
confidence: 'confirmed'
|
|
46
|
+
});
|
|
47
|
+
addEdge(relations, byChildTable, byParentTable, seen, tableNames, edge);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
relations,
|
|
52
|
+
byChildTable,
|
|
53
|
+
byParentTable,
|
|
54
|
+
tableNames
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Return the known parent relations for a child table.
|
|
59
|
+
*/
|
|
60
|
+
export function getOutgoingRelations(graph, childTable) {
|
|
61
|
+
var _a;
|
|
62
|
+
return [...((_a = graph.byChildTable.get(normalizeRelationTableName(childTable))) !== null && _a !== void 0 ? _a : [])];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Return the known child relations for a parent table.
|
|
66
|
+
*/
|
|
67
|
+
export function getIncomingRelations(graph, parentTable) {
|
|
68
|
+
var _a;
|
|
69
|
+
return [...((_a = graph.byParentTable.get(normalizeRelationTableName(parentTable))) !== null && _a !== void 0 ? _a : [])];
|
|
70
|
+
}
|
|
71
|
+
function addEdge(relations, byChildTable, byParentTable, seen, tableNames, edge) {
|
|
72
|
+
tableNames.add(edge.childTable);
|
|
73
|
+
tableNames.add(edge.parentTable);
|
|
74
|
+
const signature = [
|
|
75
|
+
edge.childTable,
|
|
76
|
+
edge.parentTable,
|
|
77
|
+
edge.childColumns.join(','),
|
|
78
|
+
edge.parentColumns.join(','),
|
|
79
|
+
edge.constraintKind
|
|
80
|
+
].join('|');
|
|
81
|
+
if (seen.has(signature)) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
seen.add(signature);
|
|
85
|
+
relations.push(edge);
|
|
86
|
+
pushIndexedEdge(byChildTable, edge.childTable, edge);
|
|
87
|
+
pushIndexedEdge(byParentTable, edge.parentTable, edge);
|
|
88
|
+
}
|
|
89
|
+
function pushIndexedEdge(index, key, edge) {
|
|
90
|
+
var _a;
|
|
91
|
+
const bucket = (_a = index.get(key)) !== null && _a !== void 0 ? _a : [];
|
|
92
|
+
bucket.push(edge);
|
|
93
|
+
index.set(key, bucket);
|
|
94
|
+
}
|
|
95
|
+
function createEdge(params) {
|
|
96
|
+
return {
|
|
97
|
+
childTable: params.childTable,
|
|
98
|
+
parentTable: params.parentTable,
|
|
99
|
+
childColumns: [...params.childColumns],
|
|
100
|
+
parentColumns: [...params.parentColumns],
|
|
101
|
+
constraintKind: params.constraintKind,
|
|
102
|
+
constraintName: params.constraintName,
|
|
103
|
+
evidenceKind: params.evidenceKind,
|
|
104
|
+
confidence: params.confidence,
|
|
105
|
+
isSelfReference: params.childTable === params.parentTable
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function buildQualifiedName(namespaces, name) {
|
|
109
|
+
return [...(namespaces !== null && namespaces !== void 0 ? namespaces : []), name].join('.');
|
|
110
|
+
}
|
|
111
|
+
function normalizeRelationTableName(tableName) {
|
|
112
|
+
return normalizeTableName(tableName);
|
|
113
|
+
}
|
|
114
|
+
export function getQualifiedNameText(value) {
|
|
115
|
+
return normalizeRelationTableName(value.toString());
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=RelationGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RelationGraph.js","sourceRoot":"","sources":["../../../src/utils/RelationGraph.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -86,6 +86,7 @@ __exportStar(require("./transformers/FilterableItemCollector"), exports);
|
|
|
86
86
|
var FixtureCteBuilder_1 = require("./transformers/FixtureCteBuilder");
|
|
87
87
|
Object.defineProperty(exports, "FixtureCteBuilder", { enumerable: true, get: function () { return FixtureCteBuilder_1.FixtureCteBuilder; } });
|
|
88
88
|
__exportStar(require("./transformers/DynamicQueryBuilder"), exports);
|
|
89
|
+
__exportStar(require("./transformers/SSSQLFilterBuilder"), exports);
|
|
89
90
|
__exportStar(require("./transformers/PruneOptionalConditionBranches"), exports);
|
|
90
91
|
var OptimizeUnusedLeftJoins_1 = require("./transformers/OptimizeUnusedLeftJoins");
|
|
91
92
|
Object.defineProperty(exports, "optimizeUnusedLeftJoins", { enumerable: true, get: function () { return OptimizeUnusedLeftJoins_1.optimizeUnusedLeftJoins; } });
|
|
@@ -121,9 +122,12 @@ __exportStar(require("./transformers/SqlParamInjector"), exports);
|
|
|
121
122
|
__exportStar(require("./transformers/SqlSortInjector"), exports);
|
|
122
123
|
__exportStar(require("./transformers/SqlPaginationInjector"), exports);
|
|
123
124
|
__exportStar(require("./transformers/DynamicQueryBuilder"), exports);
|
|
125
|
+
__exportStar(require("./utils/ParameterHelper"), exports);
|
|
126
|
+
__exportStar(require("./transformers/SqlParameterBinder"), exports);
|
|
124
127
|
__exportStar(require("./utils/SqlSchemaValidator"), exports);
|
|
125
128
|
__exportStar(require("./utils/JsonSchemaValidator"), exports);
|
|
126
129
|
__exportStar(require("./utils/SchemaManager"), exports);
|
|
130
|
+
__exportStar(require("./utils/RelationGraph"), exports);
|
|
127
131
|
__exportStar(require("./utils/CommentEditor"), exports);
|
|
128
132
|
__exportStar(require("./utils/LexemeCursor"), exports);
|
|
129
133
|
__exportStar(require("./utils/CTERegionDetector"), exports);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|