rawsql-ts 0.11.0-beta → 0.11.1-beta
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 +1 -3
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +13 -13
- package/dist/esm/index.min.js.map +4 -4
- package/dist/esm/src/index.js +2 -0
- package/dist/esm/src/index.js.map +1 -1
- package/dist/esm/src/tokenReaders/OperatorTokenReader.js +4 -0
- package/dist/esm/src/tokenReaders/OperatorTokenReader.js.map +1 -1
- package/dist/esm/src/transformers/CTEDependencyTracer.js +249 -0
- package/dist/esm/src/transformers/CTEDependencyTracer.js.map +1 -0
- package/dist/esm/src/transformers/JsonMappingUnifier.js +217 -0
- package/dist/esm/src/transformers/JsonMappingUnifier.js.map +1 -0
- package/dist/esm/src/transformers/ModelDrivenJsonMapping.js +103 -0
- package/dist/esm/src/transformers/ModelDrivenJsonMapping.js.map +1 -0
- package/dist/esm/src/transformers/PostgresArrayEntityCteBuilder.js +204 -16
- package/dist/esm/src/transformers/PostgresArrayEntityCteBuilder.js.map +1 -1
- package/dist/esm/src/transformers/PostgresJsonQueryBuilder.js +10 -9
- package/dist/esm/src/transformers/PostgresJsonQueryBuilder.js.map +1 -1
- package/dist/esm/src/transformers/PostgresObjectEntityCteBuilder.js +8 -5
- package/dist/esm/src/transformers/PostgresObjectEntityCteBuilder.js.map +1 -1
- package/dist/esm/src/transformers/SelectableColumnCollector.js +17 -5
- package/dist/esm/src/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/esm/src/transformers/UnifiedJsonMapping.js +2 -4
- package/dist/esm/src/transformers/UnifiedJsonMapping.js.map +1 -1
- package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js +8 -1
- package/dist/esm/src/transformers/UpstreamSelectQueryFinder.js.map +1 -1
- package/dist/esm/src/utils/OperatorPrecedence.js +3 -1
- package/dist/esm/src/utils/OperatorPrecedence.js.map +1 -1
- package/dist/esm/src/utils/SchemaManager.js +0 -1
- package/dist/esm/src/utils/SchemaManager.js.map +1 -1
- package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/esm/types/src/index.d.ts +2 -0
- package/dist/esm/types/src/transformers/CTEDependencyTracer.d.ts +58 -0
- package/dist/esm/types/src/transformers/JsonMappingUnifier.d.ts +95 -0
- package/dist/esm/types/src/transformers/ModelDrivenJsonMapping.d.ts +62 -0
- package/dist/esm/types/src/transformers/PostgresArrayEntityCteBuilder.d.ts +80 -1
- package/dist/esm/types/src/transformers/PostgresJsonQueryBuilder.d.ts +0 -1
- package/dist/esm/types/src/transformers/SelectableColumnCollector.d.ts +14 -3
- package/dist/esm/types/src/transformers/UnifiedJsonMapping.d.ts +0 -1
- package/dist/esm/types/src/transformers/UpstreamSelectQueryFinder.d.ts +5 -1
- package/dist/index.min.js +13 -13
- package/dist/index.min.js.map +4 -4
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/tokenReaders/OperatorTokenReader.js +4 -0
- package/dist/src/tokenReaders/OperatorTokenReader.js.map +1 -1
- package/dist/src/transformers/CTEDependencyTracer.d.ts +58 -0
- package/dist/src/transformers/CTEDependencyTracer.js +253 -0
- package/dist/src/transformers/CTEDependencyTracer.js.map +1 -0
- package/dist/src/transformers/JsonMappingUnifier.d.ts +95 -0
- package/dist/src/transformers/JsonMappingUnifier.js +226 -0
- package/dist/src/transformers/JsonMappingUnifier.js.map +1 -0
- package/dist/src/transformers/ModelDrivenJsonMapping.d.ts +62 -0
- package/dist/src/transformers/ModelDrivenJsonMapping.js +110 -0
- package/dist/src/transformers/ModelDrivenJsonMapping.js.map +1 -0
- package/dist/src/transformers/PostgresArrayEntityCteBuilder.d.ts +80 -1
- package/dist/src/transformers/PostgresArrayEntityCteBuilder.js +204 -16
- package/dist/src/transformers/PostgresArrayEntityCteBuilder.js.map +1 -1
- package/dist/src/transformers/PostgresJsonQueryBuilder.d.ts +0 -1
- package/dist/src/transformers/PostgresJsonQueryBuilder.js +10 -9
- package/dist/src/transformers/PostgresJsonQueryBuilder.js.map +1 -1
- package/dist/src/transformers/PostgresObjectEntityCteBuilder.js +8 -5
- package/dist/src/transformers/PostgresObjectEntityCteBuilder.js.map +1 -1
- package/dist/src/transformers/SelectableColumnCollector.d.ts +14 -3
- package/dist/src/transformers/SelectableColumnCollector.js +17 -5
- package/dist/src/transformers/SelectableColumnCollector.js.map +1 -1
- package/dist/src/transformers/UnifiedJsonMapping.d.ts +0 -1
- package/dist/src/transformers/UnifiedJsonMapping.js +2 -4
- package/dist/src/transformers/UnifiedJsonMapping.js.map +1 -1
- package/dist/src/transformers/UpstreamSelectQueryFinder.d.ts +5 -1
- package/dist/src/transformers/UpstreamSelectQueryFinder.js +8 -1
- package/dist/src/transformers/UpstreamSelectQueryFinder.js.map +1 -1
- package/dist/src/utils/OperatorPrecedence.js +3 -1
- package/dist/src/utils/OperatorPrecedence.js.map +1 -1
- package/dist/src/utils/SchemaManager.js +0 -1
- package/dist/src/utils/SchemaManager.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
package/dist/esm/src/index.js
CHANGED
|
@@ -16,6 +16,8 @@ export * from './transformers/SelectableColumnCollector';
|
|
|
16
16
|
export * from './transformers/TableColumnResolver';
|
|
17
17
|
export * from './transformers/TableSourceCollector';
|
|
18
18
|
export * from './transformers/UnifiedJsonMapping';
|
|
19
|
+
export { convertModelDrivenMapping, validateModelDrivenMapping } from './transformers/ModelDrivenJsonMapping';
|
|
20
|
+
export { processJsonMapping, unifyJsonMapping, isModelDrivenFormat, isUnifiedFormat, isLegacyFormat } from './transformers/JsonMappingUnifier';
|
|
19
21
|
export * from './transformers/UpstreamSelectQueryFinder';
|
|
20
22
|
export * from './transformers/TypeTransformationPostProcessor';
|
|
21
23
|
export * from './transformers/SchemaCollector';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AAErC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC,CAAC,0BAA0B;AACvE,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,gDAAgD,CAAC;AAE/D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,oEAAoE"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAE5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,sBAAsB,CAAC;AAErC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC,CAAC,0BAA0B;AACvE,cAAc,qCAAqC,CAAC;AACpD,cAAc,0CAA0C,CAAC;AACzD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAEH,yBAAyB,EACzB,0BAA0B,EAK7B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACH,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,cAAc,EACjB,MAAM,mCAAmC,CAAC;AAC3C,cAAc,0CAA0C,CAAC;AACzD,cAAc,gDAAgD,CAAC;AAE/D,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAChD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sCAAsC,CAAC;AACrD,cAAc,oCAAoC,CAAC;AAEnD,cAAc,4BAA4B,CAAC;AAC3C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,uBAAuB,CAAC;AACtC,oEAAoE"}
|
|
@@ -12,15 +12,19 @@ const trie = new KeywordTrie([
|
|
|
12
12
|
["is", "distinct", "from"],
|
|
13
13
|
["is", "not", "distinct", "from"],
|
|
14
14
|
["like"],
|
|
15
|
+
["ilike"],
|
|
15
16
|
["in"],
|
|
16
17
|
["exists"],
|
|
17
18
|
["between"],
|
|
18
19
|
["not", "like"],
|
|
20
|
+
["not", "ilike"],
|
|
19
21
|
["not", "in"],
|
|
20
22
|
["not", "exists"],
|
|
21
23
|
["not", "between"],
|
|
22
24
|
["escape"], // e.g. '10% OFF on all items' like '10\%%' escape '\'
|
|
23
25
|
["uescape"], // e.g. U&'d!0061t!+000061' uescape '!'
|
|
26
|
+
["similar", "to"], // e.g. name similar to 'J(ohn|ane)%'
|
|
27
|
+
["not", "similar", "to"], // e.g. name not similar to 'J(ohn|ane)%'
|
|
24
28
|
["similar"], // e.g. substring('abcdef' similar '%#"cd#"%' escape '#')
|
|
25
29
|
["placing"], // e.g. overlay('abcdef' placing 'cd' from 3 for 2)
|
|
26
30
|
// unary
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperatorTokenReader.js","sourceRoot":"","sources":["../../../../src/tokenReaders/OperatorTokenReader.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperatorTokenReader.js","sourceRoot":"","sources":["../../../../src/tokenReaders/OperatorTokenReader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import { SimpleSelectQuery, BinarySelectQuery } from "../models/SelectQuery";
|
|
2
|
+
import { CTECollector } from "./CTECollector";
|
|
3
|
+
import { SelectableColumnCollector } from "./SelectableColumnCollector";
|
|
4
|
+
import { TableSourceCollector } from "./TableSourceCollector";
|
|
5
|
+
/**
|
|
6
|
+
* Debug utility for visualizing CTE dependencies and column search paths
|
|
7
|
+
*/
|
|
8
|
+
export class CTEDependencyTracer {
|
|
9
|
+
constructor(options) {
|
|
10
|
+
var _a;
|
|
11
|
+
this.columnCollector = new SelectableColumnCollector();
|
|
12
|
+
this.silent = (_a = options === null || options === void 0 ? void 0 : options.silent) !== null && _a !== void 0 ? _a : false;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build complete CTE dependency graph
|
|
16
|
+
*/
|
|
17
|
+
buildGraph(query) {
|
|
18
|
+
const cteCollector = new CTECollector();
|
|
19
|
+
const ctes = cteCollector.collect(query);
|
|
20
|
+
const nodes = new Map();
|
|
21
|
+
// First pass: Create all nodes
|
|
22
|
+
ctes.forEach(cte => {
|
|
23
|
+
const cteName = cte.getSourceAliasName();
|
|
24
|
+
let columns = [];
|
|
25
|
+
try {
|
|
26
|
+
const columnRefs = this.columnCollector.collect(cte.query);
|
|
27
|
+
columns = columnRefs.map(col => col.name);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (!this.silent) {
|
|
31
|
+
console.warn(`Failed to collect columns for CTE ${cteName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
nodes.set(cteName, {
|
|
35
|
+
name: cteName,
|
|
36
|
+
columns,
|
|
37
|
+
dependencies: [],
|
|
38
|
+
dependents: [],
|
|
39
|
+
query: cte.query,
|
|
40
|
+
level: 0
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
// Second pass: Build dependencies
|
|
44
|
+
ctes.forEach(cte => {
|
|
45
|
+
const cteName = cte.getSourceAliasName();
|
|
46
|
+
const node = nodes.get(cteName);
|
|
47
|
+
// Find all CTEs referenced in this CTE's query
|
|
48
|
+
const referencedCTEs = this.findReferencedCTEs(cte.query, nodes);
|
|
49
|
+
node.dependencies = referencedCTEs;
|
|
50
|
+
// Update dependents
|
|
51
|
+
referencedCTEs.forEach(depName => {
|
|
52
|
+
const depNode = nodes.get(depName);
|
|
53
|
+
if (depNode && !depNode.dependents.includes(cteName)) {
|
|
54
|
+
depNode.dependents.push(cteName);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
// Third pass: Calculate levels
|
|
59
|
+
this.calculateLevels(nodes);
|
|
60
|
+
// Identify root and leaf nodes
|
|
61
|
+
const rootNodes = [];
|
|
62
|
+
const leafNodes = [];
|
|
63
|
+
nodes.forEach((node, name) => {
|
|
64
|
+
if (node.dependencies.length === 0) {
|
|
65
|
+
rootNodes.push(name);
|
|
66
|
+
}
|
|
67
|
+
if (node.dependents.length === 0) {
|
|
68
|
+
leafNodes.push(name);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return { nodes, rootNodes, leafNodes };
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Trace column search path through CTE dependencies
|
|
75
|
+
*/
|
|
76
|
+
traceColumnSearch(query, columnName) {
|
|
77
|
+
const graph = this.buildGraph(query);
|
|
78
|
+
const searchPath = [];
|
|
79
|
+
const foundIn = [];
|
|
80
|
+
const notFoundIn = [];
|
|
81
|
+
// Start from main query
|
|
82
|
+
searchPath.push('MAIN_QUERY');
|
|
83
|
+
let mainColumns = [];
|
|
84
|
+
try {
|
|
85
|
+
// SelectableColumnCollector only supports SimpleSelectQuery
|
|
86
|
+
if (query instanceof SimpleSelectQuery) {
|
|
87
|
+
const columnRefs = this.columnCollector.collect(query);
|
|
88
|
+
mainColumns = columnRefs.map(col => col.name);
|
|
89
|
+
}
|
|
90
|
+
else if (query instanceof BinarySelectQuery) {
|
|
91
|
+
// For UNION/INTERSECT/EXCEPT queries, collect from all branches
|
|
92
|
+
const leftColumns = query.left instanceof SimpleSelectQuery
|
|
93
|
+
? this.columnCollector.collect(query.left).map(col => col.name)
|
|
94
|
+
: [];
|
|
95
|
+
const rightColumns = query.right instanceof SimpleSelectQuery
|
|
96
|
+
? this.columnCollector.collect(query.right).map(col => col.name)
|
|
97
|
+
: [];
|
|
98
|
+
// Combine and deduplicate columns from both branches
|
|
99
|
+
const allColumns = [...leftColumns, ...rightColumns];
|
|
100
|
+
mainColumns = [...new Set(allColumns)];
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
if (!this.silent) {
|
|
105
|
+
console.warn(`Failed to collect columns from main query: ${error instanceof Error ? error.message : String(error)}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (mainColumns.some(col => col.toLowerCase() === columnName.toLowerCase())) {
|
|
109
|
+
foundIn.push('MAIN_QUERY');
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
notFoundIn.push('MAIN_QUERY');
|
|
113
|
+
}
|
|
114
|
+
// Search through CTEs in dependency order (leaf to root)
|
|
115
|
+
const visited = new Set();
|
|
116
|
+
const searchOrder = this.getSearchOrder(graph);
|
|
117
|
+
searchOrder.forEach(cteName => {
|
|
118
|
+
if (visited.has(cteName))
|
|
119
|
+
return;
|
|
120
|
+
visited.add(cteName);
|
|
121
|
+
searchPath.push(cteName);
|
|
122
|
+
const node = graph.nodes.get(cteName);
|
|
123
|
+
if (node.columns.some(col => col.toLowerCase() === columnName.toLowerCase())) {
|
|
124
|
+
foundIn.push(cteName);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
notFoundIn.push(cteName);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
return { searchPath, foundIn, notFoundIn, graph };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Print visual representation of CTE dependency graph
|
|
134
|
+
*/
|
|
135
|
+
printGraph(graph) {
|
|
136
|
+
if (this.silent)
|
|
137
|
+
return;
|
|
138
|
+
console.log('\n=== CTE Dependency Graph ===');
|
|
139
|
+
// Group by levels
|
|
140
|
+
const levels = new Map();
|
|
141
|
+
graph.nodes.forEach((node, name) => {
|
|
142
|
+
const level = node.level;
|
|
143
|
+
if (!levels.has(level)) {
|
|
144
|
+
levels.set(level, []);
|
|
145
|
+
}
|
|
146
|
+
levels.get(level).push(name);
|
|
147
|
+
});
|
|
148
|
+
// Print level by level
|
|
149
|
+
const maxLevel = Math.max(...Array.from(levels.keys()));
|
|
150
|
+
for (let level = 0; level <= maxLevel; level++) {
|
|
151
|
+
const nodesAtLevel = levels.get(level) || [];
|
|
152
|
+
if (nodesAtLevel.length > 0) {
|
|
153
|
+
console.log(`\nLevel ${level}:`);
|
|
154
|
+
nodesAtLevel.forEach(name => {
|
|
155
|
+
const node = graph.nodes.get(name);
|
|
156
|
+
console.log(` ${name} (${node.columns.length} cols)`);
|
|
157
|
+
if (node.dependencies.length > 0) {
|
|
158
|
+
console.log(` depends on: ${node.dependencies.join(', ')}`);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Print column search trace
|
|
166
|
+
*/
|
|
167
|
+
printColumnTrace(columnName, trace) {
|
|
168
|
+
if (this.silent)
|
|
169
|
+
return;
|
|
170
|
+
console.log(`\n=== Column Search Trace for "${columnName}" ===`);
|
|
171
|
+
console.log(`Search path: ${trace.searchPath.join(' → ')}`);
|
|
172
|
+
console.log(`Found in: ${trace.foundIn.length > 0 ? trace.foundIn.join(', ') : 'NONE'}`);
|
|
173
|
+
console.log(`Not found in: ${trace.notFoundIn.join(', ')}`);
|
|
174
|
+
if (trace.foundIn.length > 0) {
|
|
175
|
+
console.log('\n--- Details of CTEs containing the column ---');
|
|
176
|
+
trace.foundIn.forEach(cteName => {
|
|
177
|
+
if (cteName === 'MAIN_QUERY')
|
|
178
|
+
return;
|
|
179
|
+
const node = trace.graph.nodes.get(cteName);
|
|
180
|
+
if (node) {
|
|
181
|
+
console.log(`${cteName}:`);
|
|
182
|
+
console.log(` All columns: ${node.columns.join(', ')}`);
|
|
183
|
+
console.log(` Dependencies: ${node.dependencies.length > 0 ? node.dependencies.join(', ') : 'none'}`);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Find CTEs that are actually referenced in the given query.
|
|
190
|
+
* Uses TableSourceCollector to properly identify table references from the AST.
|
|
191
|
+
*/
|
|
192
|
+
findReferencedCTEs(query, allCTEs) {
|
|
193
|
+
// Use TableSourceCollector to get all table references from the query
|
|
194
|
+
const tableCollector = new TableSourceCollector();
|
|
195
|
+
const tableSources = tableCollector.collect(query);
|
|
196
|
+
const referenced = [];
|
|
197
|
+
// Check each table source to see if it matches a CTE name
|
|
198
|
+
for (const source of tableSources) {
|
|
199
|
+
const tableName = source.table.name;
|
|
200
|
+
if (tableName && allCTEs.has(tableName)) {
|
|
201
|
+
if (!referenced.includes(tableName)) {
|
|
202
|
+
referenced.push(tableName);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return referenced;
|
|
207
|
+
}
|
|
208
|
+
calculateLevels(nodes) {
|
|
209
|
+
const visited = new Set();
|
|
210
|
+
const calculateLevel = (nodeName) => {
|
|
211
|
+
if (visited.has(nodeName)) {
|
|
212
|
+
return nodes.get(nodeName).level;
|
|
213
|
+
}
|
|
214
|
+
visited.add(nodeName);
|
|
215
|
+
const node = nodes.get(nodeName);
|
|
216
|
+
if (node.dependencies.length === 0) {
|
|
217
|
+
node.level = 0;
|
|
218
|
+
return 0;
|
|
219
|
+
}
|
|
220
|
+
let maxDepLevel = -1;
|
|
221
|
+
node.dependencies.forEach(depName => {
|
|
222
|
+
const depLevel = calculateLevel(depName);
|
|
223
|
+
maxDepLevel = Math.max(maxDepLevel, depLevel);
|
|
224
|
+
});
|
|
225
|
+
node.level = maxDepLevel + 1;
|
|
226
|
+
return node.level;
|
|
227
|
+
};
|
|
228
|
+
nodes.forEach((_, name) => calculateLevel(name));
|
|
229
|
+
}
|
|
230
|
+
getSearchOrder(graph) {
|
|
231
|
+
// Return CTEs in order from leaf to root (level descending)
|
|
232
|
+
const ordered = [];
|
|
233
|
+
const levels = new Map();
|
|
234
|
+
graph.nodes.forEach((node, name) => {
|
|
235
|
+
const level = node.level;
|
|
236
|
+
if (!levels.has(level)) {
|
|
237
|
+
levels.set(level, []);
|
|
238
|
+
}
|
|
239
|
+
levels.get(level).push(name);
|
|
240
|
+
});
|
|
241
|
+
const maxLevel = Math.max(...Array.from(levels.keys()));
|
|
242
|
+
for (let level = maxLevel; level >= 0; level--) {
|
|
243
|
+
const nodesAtLevel = levels.get(level) || [];
|
|
244
|
+
ordered.push(...nodesAtLevel);
|
|
245
|
+
}
|
|
246
|
+
return ordered;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=CTEDependencyTracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CTEDependencyTracer.js","sourceRoot":"","sources":["../../../../src/transformers/CTEDependencyTracer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1F,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAuB9D;;GAEG;AACH,MAAM,OAAO,mBAAmB;IAI5B,YAAY,OAA8B;;QACtC,IAAI,CAAC,eAAe,GAAG,IAAI,yBAAyB,EAAE,CAAC;QACvD,IAAI,CAAC,MAAM,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,KAAK,CAAC;IAC3C,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,KAAkB;QAChC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEzC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;QAEzC,+BAA+B;QAC/B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACf,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;YACzC,IAAI,OAAO,GAAa,EAAE,CAAC;YAE3B,IAAI,CAAC;gBACD,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC3D,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,qCAAqC,OAAO,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC5H,CAAC;YACL,CAAC;YAED,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE;gBACf,IAAI,EAAE,OAAO;gBACb,OAAO;gBACP,YAAY,EAAE,EAAE;gBAChB,UAAU,EAAE,EAAE;gBACd,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,KAAK,EAAE,CAAC;aACX,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,kCAAkC;QAClC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACf,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;YAEjC,+CAA+C;YAC/C,MAAM,cAAc,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACjE,IAAI,CAAC,YAAY,GAAG,cAAc,CAAC;YAEnC,oBAAoB;YACpB,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACnC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnD,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrC,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,+BAA+B;QAC/B,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAE5B,+BAA+B;QAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAa,EAAE,CAAC;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACI,iBAAiB,CAAC,KAAkB,EAAE,UAAkB;QAM3D,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,wBAAwB;QACxB,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE9B,IAAI,WAAW,GAAa,EAAE,CAAC;QAC/B,IAAI,CAAC;YACD,4DAA4D;YAC5D,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACvD,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClD,CAAC;iBAAM,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;gBAC5C,gEAAgE;gBAChE,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,YAAY,iBAAiB;oBACvD,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC/D,CAAC,CAAC,EAAE,CAAC;gBACT,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,YAAY,iBAAiB;oBACzD,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC;oBAChE,CAAC,CAAC,EAAE,CAAC;gBAET,qDAAqD;gBACrD,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,YAAY,CAAC,CAAC;gBACrD,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;YAC3C,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,8CAA8C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACzH,CAAC;QACL,CAAC;QAED,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;aAAM,CAAC;YACJ,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClC,CAAC;QAED,yDAAyD;QACzD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAE/C,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;gBAAE,OAAO;YACjC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAErB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;YAEvC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBAC3E,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACJ,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACI,UAAU,CAAC,KAAe;QAC7B,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAExB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAE9C,kBAAkB;QAClB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC3C,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC,CAAC;gBACjC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACxB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;oBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;oBACvD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC/B,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACnE,CAAC;gBACL,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED;;OAEG;IACI,gBAAgB,CAAC,UAAkB,EAAE,KAAgD;QACxF,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAExB,OAAO,CAAC,GAAG,CAAC,kCAAkC,UAAU,OAAO,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF,OAAO,CAAC,GAAG,CAAC,iBAAiB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE5D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;YAC/D,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAC5B,IAAI,OAAO,KAAK,YAAY;oBAAE,OAAO;gBACrC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC5C,IAAI,IAAI,EAAE,CAAC;oBACP,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;oBAC3B,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACzD,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC3G,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,kBAAkB,CAAC,KAAkB,EAAE,OAA6B;QACxE,sEAAsE;QACtE,MAAM,cAAc,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAClD,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEnD,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,0DAA0D;QAC1D,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACpC,IAAI,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;gBACtC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;oBAClC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/B,CAAC;YACL,CAAC;QACL,CAAC;QAED,OAAO,UAAU,CAAC;IACtB,CAAC;IAEO,eAAe,CAAC,KAA2B;QAC/C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAElC,MAAM,cAAc,GAAG,CAAC,QAAgB,EAAU,EAAE;YAChD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxB,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,KAAK,CAAC;YACtC,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC;YAElC,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBACf,OAAO,CAAC,CAAC;YACb,CAAC;YAED,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC;YACrB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;gBAChC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;gBACzC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC,KAAK,CAAC;QACtB,CAAC,CAAC;QAEF,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;IAEO,cAAc,CAAC,KAAe;QAClC,4DAA4D;QAC5D,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC3C,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,KAAK,IAAI,KAAK,GAAG,QAAQ,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7C,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ"}
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified JSON Mapping processor that supports both legacy and model-driven formats.
|
|
3
|
+
*
|
|
4
|
+
* This module provides backward compatibility while encouraging migration to the model-driven format.
|
|
5
|
+
* It automatically detects the input format and normalizes to a consistent internal representation.
|
|
6
|
+
*/
|
|
7
|
+
import { convertModelDrivenMapping } from './ModelDrivenJsonMapping';
|
|
8
|
+
/**
|
|
9
|
+
* Detects the format of a JSON mapping configuration.
|
|
10
|
+
*
|
|
11
|
+
* @param input - The mapping configuration to analyze
|
|
12
|
+
* @returns The detected format type
|
|
13
|
+
*/
|
|
14
|
+
export function detectMappingFormat(input) {
|
|
15
|
+
// Model-driven format: has typeInfo and structure
|
|
16
|
+
if (input.typeInfo && input.structure) {
|
|
17
|
+
return 'model-driven';
|
|
18
|
+
}
|
|
19
|
+
// Unified format: has rootName and rootEntity
|
|
20
|
+
if (input.rootName && input.rootEntity) {
|
|
21
|
+
return 'unified';
|
|
22
|
+
}
|
|
23
|
+
// Legacy format: direct JsonMapping structure
|
|
24
|
+
if (input.columns || input.relationships) {
|
|
25
|
+
return 'legacy';
|
|
26
|
+
}
|
|
27
|
+
// Default fallback
|
|
28
|
+
return 'legacy';
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Converts legacy unified format to JsonMapping.
|
|
32
|
+
*
|
|
33
|
+
* @param input - Unified format mapping configuration
|
|
34
|
+
* @returns Converted JsonMapping
|
|
35
|
+
*/
|
|
36
|
+
function convertUnifiedFormat(input) {
|
|
37
|
+
if (!input.rootEntity) {
|
|
38
|
+
throw new Error('Unified format requires rootEntity');
|
|
39
|
+
}
|
|
40
|
+
const result = {
|
|
41
|
+
rootName: input.rootName || 'root',
|
|
42
|
+
rootEntity: {
|
|
43
|
+
id: input.rootEntity.id || 'root',
|
|
44
|
+
name: input.rootEntity.name || 'Root',
|
|
45
|
+
columns: input.rootEntity.columns || {}
|
|
46
|
+
},
|
|
47
|
+
nestedEntities: []
|
|
48
|
+
};
|
|
49
|
+
// Convert nestedEntities
|
|
50
|
+
if (input.nestedEntities && Array.isArray(input.nestedEntities)) {
|
|
51
|
+
result.nestedEntities = input.nestedEntities.map(entity => ({
|
|
52
|
+
id: entity.id || entity.propertyName || 'nested',
|
|
53
|
+
name: entity.name || entity.propertyName || 'Nested',
|
|
54
|
+
parentId: entity.parentId || result.rootEntity.id,
|
|
55
|
+
propertyName: entity.propertyName || 'nested',
|
|
56
|
+
relationshipType: entity.relationshipType || 'object',
|
|
57
|
+
columns: entity.columns || {}
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Converts legacy format directly to JsonMapping.
|
|
64
|
+
*
|
|
65
|
+
* @param input - Legacy format mapping configuration
|
|
66
|
+
* @returns JsonMapping
|
|
67
|
+
*/
|
|
68
|
+
function convertLegacyFormat(input) {
|
|
69
|
+
const result = {
|
|
70
|
+
rootName: input.rootName || 'root',
|
|
71
|
+
rootEntity: {
|
|
72
|
+
id: 'root',
|
|
73
|
+
name: input.rootName || 'Root',
|
|
74
|
+
columns: input.columns || {}
|
|
75
|
+
},
|
|
76
|
+
nestedEntities: []
|
|
77
|
+
};
|
|
78
|
+
// Convert relationships to nestedEntities
|
|
79
|
+
if (input.relationships && typeof input.relationships === 'object') {
|
|
80
|
+
for (const [propertyName, relationship] of Object.entries(input.relationships)) {
|
|
81
|
+
// Type assertion for legacy relationship format
|
|
82
|
+
const rel = relationship;
|
|
83
|
+
result.nestedEntities.push({
|
|
84
|
+
id: propertyName,
|
|
85
|
+
name: propertyName.charAt(0).toUpperCase() + propertyName.slice(1),
|
|
86
|
+
parentId: 'root',
|
|
87
|
+
propertyName,
|
|
88
|
+
relationshipType: rel.type === 'hasMany' ? 'array' : 'object',
|
|
89
|
+
columns: rel.columns || {}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Main processor that unifies all JSON mapping formats into a consistent JsonMapping.
|
|
97
|
+
*
|
|
98
|
+
* Features:
|
|
99
|
+
* - Automatic format detection
|
|
100
|
+
* - Backward compatibility with all existing formats
|
|
101
|
+
* - Metadata preservation for advanced features
|
|
102
|
+
* - Zero external dependencies
|
|
103
|
+
*
|
|
104
|
+
* @param input - Any supported JSON mapping format
|
|
105
|
+
* @returns Unified processing result with JsonMapping and metadata
|
|
106
|
+
*/
|
|
107
|
+
export function processJsonMapping(input) {
|
|
108
|
+
const format = detectMappingFormat(input);
|
|
109
|
+
let jsonMapping;
|
|
110
|
+
let metadata = {};
|
|
111
|
+
try {
|
|
112
|
+
switch (format) {
|
|
113
|
+
case 'model-driven':
|
|
114
|
+
// Validate model-driven input
|
|
115
|
+
if (!input.typeInfo || !input.structure) {
|
|
116
|
+
throw new Error('Model-driven format requires typeInfo and structure fields');
|
|
117
|
+
}
|
|
118
|
+
// Convert model-driven to JsonMapping
|
|
119
|
+
const modelDrivenInput = {
|
|
120
|
+
typeInfo: input.typeInfo,
|
|
121
|
+
structure: input.structure
|
|
122
|
+
};
|
|
123
|
+
const converted = convertModelDrivenMapping(modelDrivenInput);
|
|
124
|
+
jsonMapping = converted.jsonMapping;
|
|
125
|
+
// Preserve metadata
|
|
126
|
+
metadata = {
|
|
127
|
+
typeInfo: input.typeInfo,
|
|
128
|
+
typeProtection: converted.typeProtection
|
|
129
|
+
};
|
|
130
|
+
break;
|
|
131
|
+
case 'unified':
|
|
132
|
+
// Validate unified input
|
|
133
|
+
if (!input.rootEntity) {
|
|
134
|
+
throw new Error('Unified format requires rootEntity field');
|
|
135
|
+
}
|
|
136
|
+
jsonMapping = convertUnifiedFormat(input);
|
|
137
|
+
break;
|
|
138
|
+
case 'legacy':
|
|
139
|
+
// Validate legacy input
|
|
140
|
+
if (!input.columns && !input.relationships) {
|
|
141
|
+
throw new Error('Legacy format requires at least columns or relationships field');
|
|
142
|
+
}
|
|
143
|
+
jsonMapping = convertLegacyFormat(input);
|
|
144
|
+
break;
|
|
145
|
+
default:
|
|
146
|
+
throw new Error(`Unsupported mapping format: ${format}`);
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
format,
|
|
150
|
+
jsonMapping,
|
|
151
|
+
originalInput: input,
|
|
152
|
+
metadata
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
throw new Error(`Failed to process JSON mapping (format: ${format}): ${error instanceof Error ? error.message : String(error)}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Convenience function for direct JsonMapping extraction.
|
|
161
|
+
*
|
|
162
|
+
* @param input - Any supported JSON mapping format
|
|
163
|
+
* @returns JsonMapping ready for use with PostgresJsonQueryBuilder
|
|
164
|
+
*/
|
|
165
|
+
export function unifyJsonMapping(input) {
|
|
166
|
+
return processJsonMapping(input).jsonMapping;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Type guard to check if input uses model-driven format.
|
|
170
|
+
*
|
|
171
|
+
* @param input - Mapping input to check
|
|
172
|
+
* @returns True if input is model-driven format
|
|
173
|
+
*/
|
|
174
|
+
export function isModelDrivenFormat(input) {
|
|
175
|
+
return detectMappingFormat(input) === 'model-driven';
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Type guard to check if input uses unified format.
|
|
179
|
+
*
|
|
180
|
+
* @param input - Mapping input to check
|
|
181
|
+
* @returns True if input is unified format
|
|
182
|
+
*/
|
|
183
|
+
export function isUnifiedFormat(input) {
|
|
184
|
+
return detectMappingFormat(input) === 'unified';
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Type guard to check if input uses legacy format.
|
|
188
|
+
*
|
|
189
|
+
* @param input - Mapping input to check
|
|
190
|
+
* @returns True if input is legacy format
|
|
191
|
+
*/
|
|
192
|
+
export function isLegacyFormat(input) {
|
|
193
|
+
return detectMappingFormat(input) === 'legacy';
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Migration helper that suggests upgrading to model-driven format.
|
|
197
|
+
*
|
|
198
|
+
* @param input - Current mapping configuration
|
|
199
|
+
* @returns Suggestions for migration (if applicable)
|
|
200
|
+
*/
|
|
201
|
+
export function suggestModelDrivenMigration(input) {
|
|
202
|
+
const format = detectMappingFormat(input);
|
|
203
|
+
const suggestions = [];
|
|
204
|
+
if (format !== 'model-driven') {
|
|
205
|
+
suggestions.push('Consider migrating to model-driven JSON mapping format');
|
|
206
|
+
suggestions.push('Benefits: Better type safety, IDE support, and future-proof design');
|
|
207
|
+
suggestions.push('See: Model-Driven JSON Mapping Guide for migration instructions');
|
|
208
|
+
if (format === 'unified') {
|
|
209
|
+
suggestions.push('Your current unified format can be automatically converted');
|
|
210
|
+
}
|
|
211
|
+
if (format === 'legacy') {
|
|
212
|
+
suggestions.push('Legacy format support will be maintained but new features target model-driven format');
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
return suggestions;
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=JsonMappingUnifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsonMappingUnifier.js","sourceRoot":"","sources":["../../../../src/transformers/JsonMappingUnifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model-driven JSON mapping structure that mirrors TypeScript model definitions.
|
|
3
|
+
* This approach provides intuitive, hierarchical mapping that closely resembles the target data structure.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Convert a model-driven JSON mapping to the traditional JsonMapping format.
|
|
7
|
+
* This enables backward compatibility with existing PostgresJsonQueryBuilder.
|
|
8
|
+
*/
|
|
9
|
+
export function convertModelDrivenMapping(modelMapping) {
|
|
10
|
+
const protectedStringFields = [];
|
|
11
|
+
let entityIdCounter = 0;
|
|
12
|
+
// Generate unique entity IDs
|
|
13
|
+
const generateEntityId = () => `entity_${++entityIdCounter}`;
|
|
14
|
+
// Helper function to process structure fields and extract entities
|
|
15
|
+
const processStructure = (structure, parentId = null) => {
|
|
16
|
+
const columns = {};
|
|
17
|
+
const nestedEntities = [];
|
|
18
|
+
for (const [fieldName, config] of Object.entries(structure)) {
|
|
19
|
+
if (typeof config === 'string') {
|
|
20
|
+
// Simple field mapping: "fieldName": "column_name"
|
|
21
|
+
columns[fieldName] = config;
|
|
22
|
+
}
|
|
23
|
+
else if ('column' in config && typeof config.column === 'string' && !('type' in config && (config.type === 'object' || config.type === 'array'))) {
|
|
24
|
+
// Enhanced field mapping: "fieldName": { "column": "column_name", "type": "string" }
|
|
25
|
+
const fieldConfig = config;
|
|
26
|
+
if (typeof fieldConfig === 'object' && 'column' in fieldConfig) {
|
|
27
|
+
columns[fieldName] = fieldConfig.column;
|
|
28
|
+
if (fieldConfig.type === 'string') {
|
|
29
|
+
protectedStringFields.push(fieldConfig.column);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else if ('from' in config && typeof config.from === 'string' && !('type' in config && (config.type === 'object' || config.type === 'array'))) {
|
|
34
|
+
// Legacy field mapping: "fieldName": { "from": "column_name", "type": "string" }
|
|
35
|
+
const fieldConfig = config;
|
|
36
|
+
if (typeof fieldConfig === 'object' && 'from' in fieldConfig) {
|
|
37
|
+
columns[fieldName] = fieldConfig.from;
|
|
38
|
+
if (fieldConfig.type === 'string') {
|
|
39
|
+
protectedStringFields.push(fieldConfig.from);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else if ('type' in config && (config.type === 'object' || config.type === 'array')) {
|
|
44
|
+
// Nested structure: object or array
|
|
45
|
+
const nestedStructure = config;
|
|
46
|
+
const entityId = generateEntityId();
|
|
47
|
+
const processedNested = processStructure(nestedStructure.structure, entityId);
|
|
48
|
+
nestedEntities.push({
|
|
49
|
+
id: entityId,
|
|
50
|
+
name: fieldName.charAt(0).toUpperCase() + fieldName.slice(1), // Capitalize first letter
|
|
51
|
+
parentId: parentId || 'root',
|
|
52
|
+
propertyName: fieldName,
|
|
53
|
+
relationshipType: nestedStructure.type,
|
|
54
|
+
columns: processedNested.columns
|
|
55
|
+
});
|
|
56
|
+
// Add nested entities from deeper levels
|
|
57
|
+
nestedEntities.push(...processedNested.nestedEntities.map(entity => (Object.assign(Object.assign({}, entity), { parentId: entity.parentId === 'root' ? entityId : entity.parentId }))));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return { columns, nestedEntities };
|
|
61
|
+
};
|
|
62
|
+
// Process the root structure
|
|
63
|
+
const processed = processStructure(modelMapping.structure); // Build the traditional JsonMapping
|
|
64
|
+
const jsonMapping = {
|
|
65
|
+
rootName: 'root', // Default root name
|
|
66
|
+
rootEntity: {
|
|
67
|
+
id: 'root',
|
|
68
|
+
name: 'Root',
|
|
69
|
+
columns: processed.columns
|
|
70
|
+
},
|
|
71
|
+
nestedEntities: processed.nestedEntities
|
|
72
|
+
};
|
|
73
|
+
// Add typeInfo for backward compatibility
|
|
74
|
+
jsonMapping.typeInfo = modelMapping.typeInfo;
|
|
75
|
+
return {
|
|
76
|
+
jsonMapping,
|
|
77
|
+
typeProtection: { protectedStringFields }
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validate that a model-driven mapping structure is well-formed.
|
|
82
|
+
*/
|
|
83
|
+
export function validateModelDrivenMapping(mapping) {
|
|
84
|
+
const errors = [];
|
|
85
|
+
// Validate typeInfo
|
|
86
|
+
if (!mapping.typeInfo) {
|
|
87
|
+
errors.push('typeInfo is required');
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
if (!mapping.typeInfo.interface) {
|
|
91
|
+
errors.push('typeInfo.interface is required');
|
|
92
|
+
}
|
|
93
|
+
if (!mapping.typeInfo.importPath) {
|
|
94
|
+
errors.push('typeInfo.importPath is required');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Validate structure
|
|
98
|
+
if (!mapping.structure || typeof mapping.structure !== 'object') {
|
|
99
|
+
errors.push('structure is required and must be an object');
|
|
100
|
+
}
|
|
101
|
+
return errors;
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=ModelDrivenJsonMapping.js.map
|