rawsql-ts 0.1.0-beta.10 → 0.1.0-beta.12
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 +165 -174
- package/dist/esm/index.js +17 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/models/BinarySelectQuery.js +137 -0
- package/dist/esm/models/BinarySelectQuery.js.map +1 -0
- package/dist/esm/models/Clause.js +289 -0
- package/dist/esm/models/Clause.js.map +1 -0
- package/dist/esm/models/KeywordTrie.js +48 -0
- package/dist/esm/models/KeywordTrie.js.map +1 -0
- package/dist/esm/models/Lexeme.js +18 -0
- package/dist/esm/models/Lexeme.js.map +1 -0
- package/dist/esm/models/SelectQuery.js +5 -0
- package/dist/esm/models/SelectQuery.js.map +1 -0
- package/dist/esm/models/SimpleSelectQuery.js +288 -0
- package/dist/esm/models/SimpleSelectQuery.js.map +1 -0
- package/dist/esm/models/SqlComponent.js +22 -0
- package/dist/esm/models/SqlComponent.js.map +1 -0
- package/dist/esm/models/ValueComponent.js +223 -0
- package/dist/esm/models/ValueComponent.js.map +1 -0
- package/dist/esm/models/ValuesQuery.js +12 -0
- package/dist/esm/models/ValuesQuery.js.map +1 -0
- package/dist/esm/parsers/CommandExpressionParser.js +120 -0
- package/dist/esm/parsers/CommandExpressionParser.js.map +1 -0
- package/dist/esm/parsers/CommonTableParser.js +58 -0
- package/dist/esm/parsers/CommonTableParser.js.map +1 -0
- package/dist/esm/parsers/ForClauseParser.js +54 -0
- package/dist/esm/parsers/ForClauseParser.js.map +1 -0
- package/dist/esm/parsers/FromClauseParser.js +43 -0
- package/dist/esm/parsers/FromClauseParser.js.map +1 -0
- package/dist/esm/parsers/FunctionExpressionParser.js +174 -0
- package/dist/esm/parsers/FunctionExpressionParser.js.map +1 -0
- package/dist/esm/parsers/GroupByParser.js +54 -0
- package/dist/esm/parsers/GroupByParser.js.map +1 -0
- package/dist/esm/parsers/HavingParser.js +32 -0
- package/dist/esm/parsers/HavingParser.js.map +1 -0
- package/dist/esm/parsers/IdentifierParser.js +35 -0
- package/dist/esm/parsers/IdentifierParser.js.map +1 -0
- package/dist/esm/parsers/JoinClauseParser.js +101 -0
- package/dist/esm/parsers/JoinClauseParser.js.map +1 -0
- package/dist/esm/parsers/KeywordParser.js +87 -0
- package/dist/esm/parsers/KeywordParser.js.map +1 -0
- package/dist/esm/parsers/LimitClauseParser.js +46 -0
- package/dist/esm/parsers/LimitClauseParser.js.map +1 -0
- package/dist/esm/parsers/LiteralParser.js +34 -0
- package/dist/esm/parsers/LiteralParser.js.map +1 -0
- package/dist/esm/parsers/OrderByClauseParser.js +73 -0
- package/dist/esm/parsers/OrderByClauseParser.js.map +1 -0
- package/dist/esm/parsers/OverExpressionParser.js +40 -0
- package/dist/esm/parsers/OverExpressionParser.js.map +1 -0
- package/dist/esm/parsers/ParameterExpressionParser.js +11 -0
- package/dist/esm/parsers/ParameterExpressionParser.js.map +1 -0
- package/dist/esm/parsers/ParenExpressionParser.js +29 -0
- package/dist/esm/parsers/ParenExpressionParser.js.map +1 -0
- package/dist/esm/parsers/PartitionByParser.js +49 -0
- package/dist/esm/parsers/PartitionByParser.js.map +1 -0
- package/dist/esm/parsers/SelectClauseParser.js +80 -0
- package/dist/esm/parsers/SelectClauseParser.js.map +1 -0
- package/dist/esm/parsers/SelectQueryParser.js +149 -0
- package/dist/esm/parsers/SelectQueryParser.js.map +1 -0
- package/dist/esm/parsers/SourceAliasExpressionParser.js +45 -0
- package/dist/esm/parsers/SourceAliasExpressionParser.js.map +1 -0
- package/dist/esm/parsers/SourceExpressionParser.js +31 -0
- package/dist/esm/parsers/SourceExpressionParser.js.map +1 -0
- package/dist/esm/parsers/SourceParser.js +115 -0
- package/dist/esm/parsers/SourceParser.js.map +1 -0
- package/dist/esm/parsers/SqlTokenizer.js +170 -0
- package/dist/esm/parsers/SqlTokenizer.js.map +1 -0
- package/dist/esm/parsers/StringSpecifierExpressionParser.js +18 -0
- package/dist/esm/parsers/StringSpecifierExpressionParser.js.map +1 -0
- package/dist/esm/parsers/UnaryExpressionParser.js +26 -0
- package/dist/esm/parsers/UnaryExpressionParser.js.map +1 -0
- package/dist/esm/parsers/ValueParser.js +132 -0
- package/dist/esm/parsers/ValueParser.js.map +1 -0
- package/dist/esm/parsers/ValuesQueryParser.js +82 -0
- package/dist/esm/parsers/ValuesQueryParser.js.map +1 -0
- package/dist/esm/parsers/WhereClauseParser.js +32 -0
- package/dist/esm/parsers/WhereClauseParser.js.map +1 -0
- package/dist/esm/parsers/WindowClauseParser.js +41 -0
- package/dist/esm/parsers/WindowClauseParser.js.map +1 -0
- package/dist/esm/parsers/WindowExpressionParser.js +159 -0
- package/dist/esm/parsers/WindowExpressionParser.js.map +1 -0
- package/dist/esm/parsers/WithClauseParser.js +53 -0
- package/dist/esm/parsers/WithClauseParser.js.map +1 -0
- package/dist/esm/tokenReaders/BaseTokenReader.js +78 -0
- package/dist/esm/tokenReaders/BaseTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/CommandTokenReader.js +141 -0
- package/dist/esm/tokenReaders/CommandTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/FunctionTokenReader.js +41 -0
- package/dist/esm/tokenReaders/FunctionTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/IdentifierTokenReader.js +66 -0
- package/dist/esm/tokenReaders/IdentifierTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/LiteralTokenReader.js +185 -0
- package/dist/esm/tokenReaders/LiteralTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/OperatorTokenReader.js +94 -0
- package/dist/esm/tokenReaders/OperatorTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/ParameterTokenReader.js +40 -0
- package/dist/esm/tokenReaders/ParameterTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/StringSpecifierTokenReader.js +27 -0
- package/dist/esm/tokenReaders/StringSpecifierTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/SymbolTokenReader.js +31 -0
- package/dist/esm/tokenReaders/SymbolTokenReader.js.map +1 -0
- package/dist/esm/tokenReaders/TokenReaderManager.js +106 -0
- package/dist/esm/tokenReaders/TokenReaderManager.js.map +1 -0
- package/dist/esm/tokenReaders/TypeTokenReader.js +55 -0
- package/dist/esm/tokenReaders/TypeTokenReader.js.map +1 -0
- package/dist/esm/transformers/CTEBuilder.js +184 -0
- package/dist/esm/transformers/CTEBuilder.js.map +1 -0
- package/dist/esm/transformers/CTECollector.js +380 -0
- package/dist/esm/transformers/CTECollector.js.map +1 -0
- package/dist/esm/transformers/CTEDisabler.js +321 -0
- package/dist/esm/transformers/CTEDisabler.js.map +1 -0
- package/dist/esm/transformers/CTEInjector.js +79 -0
- package/dist/esm/transformers/CTEInjector.js.map +1 -0
- package/dist/esm/transformers/CTENormalizer.js +42 -0
- package/dist/esm/transformers/CTENormalizer.js.map +1 -0
- package/dist/esm/transformers/Formatter.js +463 -0
- package/dist/esm/transformers/Formatter.js.map +1 -0
- package/dist/esm/transformers/QueryConverter.js +115 -0
- package/dist/esm/transformers/QueryConverter.js.map +1 -0
- package/dist/esm/transformers/SelectValueCollector.js +245 -0
- package/dist/esm/transformers/SelectValueCollector.js.map +1 -0
- package/dist/esm/transformers/SelectableColumnCollector.js +304 -0
- package/dist/esm/transformers/SelectableColumnCollector.js.map +1 -0
- package/dist/esm/transformers/TableColumnResolver.js +2 -0
- package/dist/esm/transformers/TableColumnResolver.js.map +1 -0
- package/dist/esm/transformers/TableSourceCollector.js +380 -0
- package/dist/esm/transformers/TableSourceCollector.js.map +1 -0
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js +125 -0
- package/dist/esm/transformers/UpstreamSelectQueryFinder.js.map +1 -0
- package/dist/esm/types/index.d.ts +14 -0
- package/dist/esm/types/models/BinarySelectQuery.d.ts +91 -0
- package/dist/esm/types/models/Clause.d.ts +189 -0
- package/dist/esm/types/models/KeywordTrie.d.ts +11 -0
- package/dist/esm/types/models/Lexeme.d.ts +25 -0
- package/dist/esm/types/models/SelectQuery.d.ts +5 -0
- package/dist/esm/types/models/SimpleSelectQuery.d.ts +167 -0
- package/dist/esm/types/models/SqlComponent.d.ts +18 -0
- package/dist/esm/types/models/ValueComponent.d.ts +158 -0
- package/dist/esm/types/models/ValuesQuery.d.ts +10 -0
- package/dist/esm/types/parsers/CommandExpressionParser.d.ts +15 -0
- package/dist/esm/types/parsers/CommonTableParser.d.ts +9 -0
- package/dist/esm/types/parsers/ForClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/FromClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/FunctionExpressionParser.d.ts +22 -0
- package/dist/esm/types/parsers/GroupByParser.d.ts +10 -0
- package/dist/esm/types/parsers/HavingParser.d.ts +9 -0
- package/dist/esm/types/parsers/IdentifierParser.d.ts +8 -0
- package/dist/esm/types/parsers/JoinClauseParser.d.ts +14 -0
- package/dist/esm/types/parsers/KeywordParser.d.ts +17 -0
- package/dist/esm/types/parsers/LimitClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/LiteralParser.d.ts +8 -0
- package/dist/esm/types/parsers/OrderByClauseParser.d.ts +10 -0
- package/dist/esm/types/parsers/OverExpressionParser.d.ts +9 -0
- package/dist/esm/types/parsers/ParameterExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/ParenExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/PartitionByParser.d.ts +9 -0
- package/dist/esm/types/parsers/SelectClauseParser.d.ts +10 -0
- package/dist/esm/types/parsers/SelectQueryParser.d.ts +13 -0
- package/dist/esm/types/parsers/SourceAliasExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/SourceExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/SourceParser.d.ts +13 -0
- package/dist/esm/types/parsers/SqlTokenizer.d.ts +64 -0
- package/dist/esm/types/parsers/StringSpecifierExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/UnaryExpressionParser.d.ts +8 -0
- package/dist/esm/types/parsers/ValueParser.d.ts +14 -0
- package/dist/esm/types/parsers/ValuesQueryParser.d.ts +10 -0
- package/dist/esm/types/parsers/WhereClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/WindowClauseParser.d.ts +9 -0
- package/dist/esm/types/parsers/WindowExpressionParser.d.ts +12 -0
- package/dist/esm/types/parsers/WithClauseParser.d.ts +9 -0
- package/dist/esm/types/tokenReaders/BaseTokenReader.d.ts +43 -0
- package/dist/esm/types/tokenReaders/CommandTokenReader.d.ts +7 -0
- package/dist/esm/types/tokenReaders/FunctionTokenReader.d.ts +11 -0
- package/dist/esm/types/tokenReaders/IdentifierTokenReader.d.ts +15 -0
- package/dist/esm/types/tokenReaders/LiteralTokenReader.d.ts +23 -0
- package/dist/esm/types/tokenReaders/OperatorTokenReader.d.ts +5 -0
- package/dist/esm/types/tokenReaders/ParameterTokenReader.d.ts +11 -0
- package/dist/esm/types/tokenReaders/StringSpecifierTokenReader.d.ts +8 -0
- package/dist/esm/types/tokenReaders/SymbolTokenReader.d.ts +12 -0
- package/dist/esm/types/tokenReaders/TokenReaderManager.d.ts +53 -0
- package/dist/esm/types/tokenReaders/TypeTokenReader.d.ts +11 -0
- package/dist/esm/types/transformers/CTEBuilder.d.ts +52 -0
- package/dist/esm/types/transformers/CTECollector.d.ts +81 -0
- package/dist/esm/types/transformers/CTEDisabler.d.ts +77 -0
- package/dist/esm/types/transformers/CTEInjector.d.ts +40 -0
- package/dist/esm/types/transformers/CTENormalizer.d.ts +25 -0
- package/dist/esm/types/transformers/Formatter.d.ts +82 -0
- package/dist/esm/types/transformers/QueryConverter.d.ts +41 -0
- package/dist/esm/types/transformers/SelectValueCollector.d.ts +60 -0
- package/dist/esm/types/transformers/SelectableColumnCollector.d.ts +70 -0
- package/dist/esm/types/transformers/TableColumnResolver.d.ts +10 -0
- package/dist/esm/types/transformers/TableSourceCollector.d.ts +92 -0
- package/dist/esm/types/transformers/UpstreamSelectQueryFinder.d.ts +27 -0
- package/dist/esm/types/utils/charLookupTable.d.ts +11 -0
- package/dist/esm/types/utils/stringUtils.d.ts +43 -0
- package/dist/esm/utils/charLookupTable.js +69 -0
- package/dist/esm/utils/charLookupTable.js.map +1 -0
- package/dist/esm/utils/stringUtils.js +164 -0
- package/dist/esm/utils/stringUtils.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/transformers/SelectValueCollector.d.ts +2 -4
- package/dist/transformers/SelectValueCollector.js.map +1 -1
- package/dist/transformers/TableColumnResolver.d.ts +10 -0
- package/dist/transformers/TableColumnResolver.js +3 -0
- package/dist/transformers/TableColumnResolver.js.map +1 -0
- package/package.json +17 -1
@@ -0,0 +1,184 @@
|
|
1
|
+
import { WithClause } from "../models/Clause";
|
2
|
+
import { CTECollector } from "./CTECollector";
|
3
|
+
import { TableSourceCollector } from "./TableSourceCollector";
|
4
|
+
import { Formatter } from "./Formatter";
|
5
|
+
/**
|
6
|
+
* CTENameConflictResolver is responsible for resolving name conflicts among Common Table Expressions (CTEs).
|
7
|
+
* It also sorts the tables in the proper order based on dependencies and recursiveness.
|
8
|
+
*/
|
9
|
+
export class CTEBuilder {
|
10
|
+
constructor() {
|
11
|
+
this.sourceCollector = new TableSourceCollector(true);
|
12
|
+
this.cteCollector = new CTECollector();
|
13
|
+
this.formatter = new Formatter();
|
14
|
+
}
|
15
|
+
/**
|
16
|
+
* Resolves name conflicts among CommonTables.
|
17
|
+
* If there are duplicate CTE names, they must have identical definitions.
|
18
|
+
* Also sorts the tables so that:
|
19
|
+
* 1. Recursive CTEs come first (CTEs that reference themselves)
|
20
|
+
* 2. Then remaining tables are sorted so inner (deeper) CTEs come before outer CTEs
|
21
|
+
*
|
22
|
+
* @param commonTables The list of CommonTables to check for name conflicts
|
23
|
+
* @returns An object containing:
|
24
|
+
* - needRecursive: boolean indicating if any recursive CTEs are present
|
25
|
+
* - commonTables: A new list of CommonTables with resolved name conflicts and proper order
|
26
|
+
* @throws Error if there are duplicate CTE names with different definitions
|
27
|
+
*/
|
28
|
+
build(commonTables) {
|
29
|
+
// Early return for empty CTEs
|
30
|
+
// Note:
|
31
|
+
// Although it may seem reasonable to return early when there is only one element,
|
32
|
+
// the 'recursive' property is determined dynamically. Therefore, if there is at least one element,
|
33
|
+
// the CTEs must be rebuilt to ensure correct recursive detection.
|
34
|
+
if (commonTables.length === 0) {
|
35
|
+
return new WithClause(false, commonTables);
|
36
|
+
}
|
37
|
+
// Step 1: Resolve name conflicts
|
38
|
+
const resolvedTables = this.resolveDuplicateNames(commonTables);
|
39
|
+
// Step 2: Identify recursive CTEs and build dependency graph
|
40
|
+
const { tableMap, recursiveCTEs, dependencies } = this.buildDependencyGraph(resolvedTables);
|
41
|
+
// Step 3: Sort tables according to dependencies and recursiveness
|
42
|
+
const sortedTables = this.sortCommonTables(resolvedTables, tableMap, recursiveCTEs, dependencies);
|
43
|
+
return new WithClause(recursiveCTEs.size > 0, sortedTables);
|
44
|
+
}
|
45
|
+
/**
|
46
|
+
* Resolves duplicate CTE names by checking if they have identical definitions.
|
47
|
+
* If definitions differ, throws an error.
|
48
|
+
*
|
49
|
+
* @param commonTables The list of CTEs to check for duplicates
|
50
|
+
* @returns A list of CTEs with duplicates removed
|
51
|
+
* @throws Error if there are duplicate CTE names with different definitions
|
52
|
+
*/
|
53
|
+
resolveDuplicateNames(commonTables) {
|
54
|
+
// Group CTEs by their names
|
55
|
+
const ctesByName = new Map();
|
56
|
+
for (const table of commonTables) {
|
57
|
+
const tableName = table.aliasExpression.table.name;
|
58
|
+
if (!ctesByName.has(tableName)) {
|
59
|
+
ctesByName.set(tableName, []);
|
60
|
+
}
|
61
|
+
ctesByName.get(tableName).push(table);
|
62
|
+
}
|
63
|
+
// Resolve name duplications
|
64
|
+
const resolvedTables = [];
|
65
|
+
for (const [name, tables] of ctesByName.entries()) {
|
66
|
+
if (tables.length === 1) {
|
67
|
+
// No duplication
|
68
|
+
resolvedTables.push(tables[0]);
|
69
|
+
continue;
|
70
|
+
}
|
71
|
+
// For duplicate names, check if definitions are identical
|
72
|
+
const definitions = tables.map(table => this.formatter.format(table.query));
|
73
|
+
const uniqueDefinitions = new Set(definitions);
|
74
|
+
if (uniqueDefinitions.size === 1) {
|
75
|
+
// If all definitions are identical, use only the first one
|
76
|
+
resolvedTables.push(tables[0]);
|
77
|
+
}
|
78
|
+
else {
|
79
|
+
// Error if definitions differ
|
80
|
+
throw new Error(`CTE name conflict detected: '${name}' has multiple different definitions`);
|
81
|
+
}
|
82
|
+
}
|
83
|
+
return resolvedTables;
|
84
|
+
}
|
85
|
+
/**
|
86
|
+
* Builds a dependency graph of CTEs and identifies recursive CTEs.
|
87
|
+
*
|
88
|
+
* @param tables The list of CTEs to analyze
|
89
|
+
* @returns Object containing the table map, set of recursive CTEs, and dependency map
|
90
|
+
*/
|
91
|
+
buildDependencyGraph(tables) {
|
92
|
+
// Create a map of table names for quick lookup
|
93
|
+
const tableMap = new Map();
|
94
|
+
for (const table of tables) {
|
95
|
+
tableMap.set(table.aliasExpression.table.name, table);
|
96
|
+
}
|
97
|
+
// Identify recursive CTEs (those that reference themselves)
|
98
|
+
const recursiveCTEs = new Set();
|
99
|
+
// Build dependency graph: which tables reference which other tables
|
100
|
+
const dependencies = new Map();
|
101
|
+
const referencedBy = new Map();
|
102
|
+
for (const table of tables) {
|
103
|
+
const tableName = table.aliasExpression.table.name;
|
104
|
+
// Check for self-references (recursive CTEs)
|
105
|
+
const referencedTables = this.sourceCollector.collect(table.query);
|
106
|
+
// Check if this CTE references itself
|
107
|
+
for (const referencedTable of referencedTables) {
|
108
|
+
if (referencedTable.table.name === tableName) {
|
109
|
+
recursiveCTEs.add(tableName);
|
110
|
+
break;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
// Setup dependencies
|
114
|
+
if (!dependencies.has(tableName)) {
|
115
|
+
dependencies.set(tableName, new Set());
|
116
|
+
}
|
117
|
+
// Find any references to other CTEs in this table's query
|
118
|
+
const referencedCTEs = this.cteCollector.collect(table.query);
|
119
|
+
for (const referencedCTE of referencedCTEs) {
|
120
|
+
const referencedName = referencedCTE.aliasExpression.table.name;
|
121
|
+
// Only consider references to tables in our collection
|
122
|
+
if (tableMap.has(referencedName)) {
|
123
|
+
dependencies.get(tableName).add(referencedName);
|
124
|
+
// Add the reverse relationship
|
125
|
+
if (!referencedBy.has(referencedName)) {
|
126
|
+
referencedBy.set(referencedName, new Set());
|
127
|
+
}
|
128
|
+
referencedBy.get(referencedName).add(tableName);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
}
|
132
|
+
return { tableMap, recursiveCTEs, dependencies };
|
133
|
+
}
|
134
|
+
/**
|
135
|
+
* Sorts the CTEs using topological sort, with recursive CTEs coming first.
|
136
|
+
*
|
137
|
+
* @param tables The list of CTEs to sort
|
138
|
+
* @param tableMap Map of table names to their CommonTable objects
|
139
|
+
* @param recursiveCTEs Set of table names that are recursive (self-referential)
|
140
|
+
* @param dependencies Map of table dependencies
|
141
|
+
* @returns Sorted list of CTEs
|
142
|
+
* @throws Error if a circular reference is detected
|
143
|
+
*/
|
144
|
+
sortCommonTables(tables, tableMap, recursiveCTEs, dependencies) {
|
145
|
+
const recursiveResult = [];
|
146
|
+
const nonRecursiveResult = [];
|
147
|
+
const visited = new Set();
|
148
|
+
const visiting = new Set();
|
149
|
+
// Topological sort function
|
150
|
+
const visit = (tableName) => {
|
151
|
+
if (visited.has(tableName))
|
152
|
+
return;
|
153
|
+
if (visiting.has(tableName)) {
|
154
|
+
throw new Error(`Circular reference detected in CTE: ${tableName}`);
|
155
|
+
}
|
156
|
+
visiting.add(tableName);
|
157
|
+
// Process dependencies first (inner CTEs)
|
158
|
+
const deps = dependencies.get(tableName) || new Set();
|
159
|
+
for (const dep of deps) {
|
160
|
+
visit(dep);
|
161
|
+
}
|
162
|
+
visiting.delete(tableName);
|
163
|
+
visited.add(tableName);
|
164
|
+
// Add this table after its dependencies
|
165
|
+
// Recursive CTEs go to recursiveResult, others to nonRecursiveResult
|
166
|
+
if (recursiveCTEs.has(tableName)) {
|
167
|
+
recursiveResult.push(tableMap.get(tableName));
|
168
|
+
}
|
169
|
+
else {
|
170
|
+
nonRecursiveResult.push(tableMap.get(tableName));
|
171
|
+
}
|
172
|
+
};
|
173
|
+
// Process all tables
|
174
|
+
for (const table of tables) {
|
175
|
+
const tableName = table.aliasExpression.table.name;
|
176
|
+
if (!visited.has(tableName)) {
|
177
|
+
visit(tableName);
|
178
|
+
}
|
179
|
+
}
|
180
|
+
// Combine the results: recursive CTEs first, then non-recursive CTEs
|
181
|
+
return [...recursiveResult, ...nonRecursiveResult];
|
182
|
+
}
|
183
|
+
}
|
184
|
+
//# sourceMappingURL=CTEBuilder.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CTEBuilder.js","sourceRoot":"","sources":["../../../src/transformers/CTEBuilder.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,380 @@
|
|
1
|
+
import { CommonTable, ForClause, FromClause, GroupByClause, HavingClause, JoinClause, JoinOnClause, JoinUsingClause, LimitClause, OrderByClause, OrderByItem, ParenSource, SelectClause, SelectItem, SourceExpression, SubQuerySource, TableSource, WhereClause, WindowFrameClause, WithClause } from "../models/Clause";
|
2
|
+
import { BinarySelectQuery, SimpleSelectQuery, ValuesQuery } from "../models/SelectQuery";
|
3
|
+
import { ArrayExpression, BetweenExpression, BinaryExpression, CaseExpression, CaseKeyValuePair, CastExpression, ColumnReference, FunctionCall, InlineQuery, ParenExpression, ParameterExpression, SwitchCaseArgument, TupleExpression, UnaryExpression, WindowFrameExpression, IdentifierString, RawString, WindowFrameSpec, LiteralValue, TypeValue } from "../models/ValueComponent";
|
4
|
+
/**
|
5
|
+
* A visitor that collects all CommonTable instances from a SQL query structure.
|
6
|
+
* This includes tables from:
|
7
|
+
* - WITH clauses
|
8
|
+
* - Subqueries
|
9
|
+
* - Inline queries
|
10
|
+
* - UNION queries
|
11
|
+
* - Value components that may contain queries
|
12
|
+
*/
|
13
|
+
export class CTECollector {
|
14
|
+
constructor() {
|
15
|
+
this.commonTables = [];
|
16
|
+
this.visitedNodes = new Set();
|
17
|
+
this.isRootVisit = true;
|
18
|
+
this.handlers = new Map();
|
19
|
+
// Setup handlers for all component types that might contain CommonTables
|
20
|
+
// SelectQuery types
|
21
|
+
this.handlers.set(SimpleSelectQuery.kind, (expr) => this.visitSimpleSelectQuery(expr));
|
22
|
+
this.handlers.set(BinarySelectQuery.kind, (expr) => this.visitBinarySelectQuery(expr));
|
23
|
+
this.handlers.set(ValuesQuery.kind, (expr) => this.visitValuesQuery(expr));
|
24
|
+
// WITH clause that directly contains CommonTables
|
25
|
+
this.handlers.set(WithClause.kind, (expr) => this.visitWithClause(expr));
|
26
|
+
this.handlers.set(CommonTable.kind, (expr) => this.visitCommonTable(expr));
|
27
|
+
// SelectComponent types
|
28
|
+
this.handlers.set(SelectItem.kind, (expr) => this.visitSelectItem(expr));
|
29
|
+
// Identifiers and raw strings (leaf nodes that don't need traversal)
|
30
|
+
this.handlers.set(IdentifierString.kind, (expr) => this.visitIdentifierString(expr));
|
31
|
+
this.handlers.set(RawString.kind, (expr) => this.visitRawString(expr));
|
32
|
+
this.handlers.set(ColumnReference.kind, (expr) => this.visitColumnReference(expr));
|
33
|
+
this.handlers.set(ParameterExpression.kind, (expr) => this.visitParameterExpression(expr));
|
34
|
+
this.handlers.set(LiteralValue.kind, (expr) => this.visitLiteralValue(expr));
|
35
|
+
// Source components
|
36
|
+
this.handlers.set(SourceExpression.kind, (expr) => this.visitSourceExpression(expr));
|
37
|
+
this.handlers.set(TableSource.kind, (expr) => this.visitTableSource(expr));
|
38
|
+
this.handlers.set(ParenSource.kind, (expr) => this.visitParenSource(expr));
|
39
|
+
// Subqueries and inline queries
|
40
|
+
this.handlers.set(SubQuerySource.kind, (expr) => this.visitSubQuerySource(expr));
|
41
|
+
this.handlers.set(InlineQuery.kind, (expr) => this.visitInlineQuery(expr));
|
42
|
+
// FROM and JOIN clauses
|
43
|
+
this.handlers.set(FromClause.kind, (expr) => this.visitFromClause(expr));
|
44
|
+
this.handlers.set(JoinClause.kind, (expr) => this.visitJoinClause(expr));
|
45
|
+
this.handlers.set(JoinOnClause.kind, (expr) => this.visitJoinOnClause(expr));
|
46
|
+
this.handlers.set(JoinUsingClause.kind, (expr) => this.visitJoinUsingClause(expr));
|
47
|
+
// WHERE clause
|
48
|
+
this.handlers.set(WhereClause.kind, (expr) => this.visitWhereClause(expr));
|
49
|
+
// Value components that might contain subqueries
|
50
|
+
this.handlers.set(ParenExpression.kind, (expr) => this.visitParenExpression(expr));
|
51
|
+
this.handlers.set(BinaryExpression.kind, (expr) => this.visitBinaryExpression(expr));
|
52
|
+
this.handlers.set(UnaryExpression.kind, (expr) => this.visitUnaryExpression(expr));
|
53
|
+
this.handlers.set(CaseExpression.kind, (expr) => this.visitCaseExpression(expr));
|
54
|
+
this.handlers.set(CaseKeyValuePair.kind, (expr) => this.visitCaseKeyValuePair(expr));
|
55
|
+
this.handlers.set(SwitchCaseArgument.kind, (expr) => this.visitSwitchCaseArgument(expr));
|
56
|
+
this.handlers.set(BetweenExpression.kind, (expr) => this.visitBetweenExpression(expr));
|
57
|
+
this.handlers.set(FunctionCall.kind, (expr) => this.visitFunctionCall(expr));
|
58
|
+
this.handlers.set(ArrayExpression.kind, (expr) => this.visitArrayExpression(expr));
|
59
|
+
this.handlers.set(TupleExpression.kind, (expr) => this.visitTupleExpression(expr));
|
60
|
+
this.handlers.set(CastExpression.kind, (expr) => this.visitCastExpression(expr));
|
61
|
+
this.handlers.set(WindowFrameExpression.kind, (expr) => this.visitWindowFrameExpression(expr));
|
62
|
+
this.handlers.set(WindowFrameSpec.kind, (expr) => this.visitWindowFrameSpec(expr));
|
63
|
+
this.handlers.set(TypeValue.kind, (expr) => this.visitTypeValue(expr));
|
64
|
+
// Add handlers for other clause types
|
65
|
+
this.handlers.set(SelectClause.kind, (expr) => this.visitSelectClause(expr));
|
66
|
+
this.handlers.set(GroupByClause.kind, (expr) => this.visitGroupByClause(expr));
|
67
|
+
this.handlers.set(HavingClause.kind, (expr) => this.visitHavingClause(expr));
|
68
|
+
this.handlers.set(OrderByClause.kind, (expr) => this.visitOrderByClause(expr));
|
69
|
+
this.handlers.set(WindowFrameClause.kind, (expr) => this.visitWindowFrameClause(expr));
|
70
|
+
this.handlers.set(LimitClause.kind, (expr) => this.visitLimitClause(expr));
|
71
|
+
this.handlers.set(ForClause.kind, (expr) => this.visitForClause(expr));
|
72
|
+
this.handlers.set(OrderByItem.kind, (expr) => this.visitOrderByItem(expr));
|
73
|
+
}
|
74
|
+
/**
|
75
|
+
* Get all collected CommonTables
|
76
|
+
*/
|
77
|
+
getCommonTables() {
|
78
|
+
return this.commonTables;
|
79
|
+
}
|
80
|
+
/**
|
81
|
+
* Reset the collection of CommonTables
|
82
|
+
*/
|
83
|
+
reset() {
|
84
|
+
this.commonTables = [];
|
85
|
+
this.visitedNodes.clear();
|
86
|
+
}
|
87
|
+
collect(query) {
|
88
|
+
// Visit the query to collect all CommonTables
|
89
|
+
this.visit(query);
|
90
|
+
return this.getCommonTables();
|
91
|
+
}
|
92
|
+
/**
|
93
|
+
* Main entry point for the visitor pattern.
|
94
|
+
* Implements the shallow visit pattern to distinguish between root and recursive visits.
|
95
|
+
*/
|
96
|
+
visit(arg) {
|
97
|
+
// If not a root visit, just visit the node and return
|
98
|
+
if (!this.isRootVisit) {
|
99
|
+
this.visitNode(arg);
|
100
|
+
return;
|
101
|
+
}
|
102
|
+
// If this is a root visit, we need to reset the state
|
103
|
+
this.reset();
|
104
|
+
this.isRootVisit = false;
|
105
|
+
try {
|
106
|
+
this.visitNode(arg);
|
107
|
+
}
|
108
|
+
finally {
|
109
|
+
// Regardless of success or failure, reset the root visit flag
|
110
|
+
this.isRootVisit = true;
|
111
|
+
}
|
112
|
+
}
|
113
|
+
/**
|
114
|
+
* Internal visit method used for all nodes.
|
115
|
+
* This separates the visit flag management from the actual node visitation logic.
|
116
|
+
*/
|
117
|
+
visitNode(arg) {
|
118
|
+
var _a, _b;
|
119
|
+
// Skip if we've already visited this node to prevent infinite recursion
|
120
|
+
if (this.visitedNodes.has(arg)) {
|
121
|
+
return;
|
122
|
+
}
|
123
|
+
// Mark as visited
|
124
|
+
this.visitedNodes.add(arg);
|
125
|
+
const handler = this.handlers.get(arg.getKind());
|
126
|
+
if (handler) {
|
127
|
+
handler(arg);
|
128
|
+
return;
|
129
|
+
}
|
130
|
+
// Provide more detailed error message
|
131
|
+
const kindSymbol = ((_a = arg.getKind()) === null || _a === void 0 ? void 0 : _a.toString()) || 'unknown';
|
132
|
+
const constructor = ((_b = arg.constructor) === null || _b === void 0 ? void 0 : _b.name) || 'unknown';
|
133
|
+
throw new Error(`No handler for ${constructor} with kind ${kindSymbol}. Consider adding a handler for this type.`);
|
134
|
+
}
|
135
|
+
visitSimpleSelectQuery(query) {
|
136
|
+
// The order matters here!
|
137
|
+
// First, visit all clauses that might contain nested CTEs
|
138
|
+
// to ensure inner CTEs are collected before outer CTEs
|
139
|
+
// Check FROM clause first (can contain subqueries with nested CTEs)
|
140
|
+
if (query.fromClause) {
|
141
|
+
query.fromClause.accept(this);
|
142
|
+
}
|
143
|
+
// Check WHERE clause (can contain subqueries with WITH clauses)
|
144
|
+
if (query.whereClause) {
|
145
|
+
query.whereClause.accept(this);
|
146
|
+
}
|
147
|
+
// Check other clauses that might contain CTEs
|
148
|
+
if (query.groupByClause) {
|
149
|
+
query.groupByClause.accept(this);
|
150
|
+
}
|
151
|
+
if (query.havingClause) {
|
152
|
+
query.havingClause.accept(this);
|
153
|
+
}
|
154
|
+
if (query.orderByClause) {
|
155
|
+
query.orderByClause.accept(this);
|
156
|
+
}
|
157
|
+
if (query.windowFrameClause) {
|
158
|
+
query.windowFrameClause.accept(this);
|
159
|
+
}
|
160
|
+
if (query.rowLimitClause) {
|
161
|
+
query.rowLimitClause.accept(this);
|
162
|
+
}
|
163
|
+
if (query.forClause) {
|
164
|
+
query.forClause.accept(this);
|
165
|
+
}
|
166
|
+
// Check SELECT clause
|
167
|
+
query.selectClause.accept(this);
|
168
|
+
// Finally check the WITH clause after all nested CTEs have been collected
|
169
|
+
// This ensures inner CTEs are collected before outer CTEs
|
170
|
+
if (query.WithClause) {
|
171
|
+
query.WithClause.accept(this);
|
172
|
+
}
|
173
|
+
}
|
174
|
+
visitBinarySelectQuery(query) {
|
175
|
+
// Visit both sides of the binary query (UNION, EXCEPT, etc.)
|
176
|
+
query.left.accept(this);
|
177
|
+
query.right.accept(this);
|
178
|
+
}
|
179
|
+
visitValuesQuery(query) {
|
180
|
+
// VALUES queries might contain subqueries in tuple expressions
|
181
|
+
for (const tuple of query.tuples) {
|
182
|
+
tuple.accept(this);
|
183
|
+
}
|
184
|
+
}
|
185
|
+
visitWithClause(withClause) {
|
186
|
+
// Visit each CommonTable
|
187
|
+
// Simply process tables in sequence
|
188
|
+
// Note: visitCommonTable already handles nested CTEs
|
189
|
+
for (let i = 0; i < withClause.tables.length; i++) {
|
190
|
+
const commonTable = withClause.tables[i];
|
191
|
+
commonTable.accept(this);
|
192
|
+
}
|
193
|
+
}
|
194
|
+
visitCommonTable(commonTable) {
|
195
|
+
// Process CommonTable directly within the query
|
196
|
+
// Use the same instance to process the query instead of creating another Collector
|
197
|
+
commonTable.query.accept(this);
|
198
|
+
// Add current CTE after all nested CTEs have been added
|
199
|
+
this.commonTables.push(commonTable);
|
200
|
+
}
|
201
|
+
visitSelectClause(clause) {
|
202
|
+
// Check each item in the select clause
|
203
|
+
for (const item of clause.items) {
|
204
|
+
item.accept(this);
|
205
|
+
}
|
206
|
+
}
|
207
|
+
visitSelectItem(item) {
|
208
|
+
// Select items might contain subqueries
|
209
|
+
item.value.accept(this);
|
210
|
+
}
|
211
|
+
visitFromClause(fromClause) {
|
212
|
+
// Check the source
|
213
|
+
fromClause.source.accept(this);
|
214
|
+
// Check joins
|
215
|
+
if (fromClause.joins) {
|
216
|
+
for (const join of fromClause.joins) {
|
217
|
+
join.accept(this);
|
218
|
+
}
|
219
|
+
}
|
220
|
+
}
|
221
|
+
visitSourceExpression(source) {
|
222
|
+
source.datasource.accept(this);
|
223
|
+
// The alias part doesn't contain subqueries so we skip it
|
224
|
+
}
|
225
|
+
visitTableSource(source) {
|
226
|
+
// Table sources don't contain subqueries, nothing to do
|
227
|
+
}
|
228
|
+
visitParenSource(source) {
|
229
|
+
source.source.accept(this);
|
230
|
+
}
|
231
|
+
visitSubQuerySource(subQuery) {
|
232
|
+
subQuery.query.accept(this);
|
233
|
+
}
|
234
|
+
visitInlineQuery(inlineQuery) {
|
235
|
+
inlineQuery.selectQuery.accept(this);
|
236
|
+
}
|
237
|
+
visitJoinClause(joinClause) {
|
238
|
+
// Check join source
|
239
|
+
joinClause.source.accept(this);
|
240
|
+
// Check join condition
|
241
|
+
if (joinClause.condition) {
|
242
|
+
joinClause.condition.accept(this);
|
243
|
+
}
|
244
|
+
}
|
245
|
+
visitJoinOnClause(joinOn) {
|
246
|
+
joinOn.condition.accept(this);
|
247
|
+
}
|
248
|
+
visitJoinUsingClause(joinUsing) {
|
249
|
+
joinUsing.condition.accept(this);
|
250
|
+
}
|
251
|
+
visitWhereClause(whereClause) {
|
252
|
+
whereClause.condition.accept(this);
|
253
|
+
}
|
254
|
+
visitGroupByClause(clause) {
|
255
|
+
for (const item of clause.grouping) {
|
256
|
+
item.accept(this);
|
257
|
+
}
|
258
|
+
}
|
259
|
+
visitHavingClause(clause) {
|
260
|
+
clause.condition.accept(this);
|
261
|
+
}
|
262
|
+
visitOrderByClause(clause) {
|
263
|
+
for (const item of clause.order) {
|
264
|
+
item.accept(this);
|
265
|
+
}
|
266
|
+
}
|
267
|
+
visitWindowFrameClause(clause) {
|
268
|
+
clause.expression.accept(this);
|
269
|
+
}
|
270
|
+
visitLimitClause(clause) {
|
271
|
+
clause.limit.accept(this);
|
272
|
+
if (clause.offset) {
|
273
|
+
clause.offset.accept(this);
|
274
|
+
}
|
275
|
+
}
|
276
|
+
visitForClause(clause) {
|
277
|
+
// FOR clause doesn't contain subqueries
|
278
|
+
}
|
279
|
+
visitOrderByItem(item) {
|
280
|
+
item.value.accept(this);
|
281
|
+
}
|
282
|
+
visitParenExpression(expr) {
|
283
|
+
expr.expression.accept(this);
|
284
|
+
}
|
285
|
+
visitBinaryExpression(expr) {
|
286
|
+
expr.left.accept(this);
|
287
|
+
expr.right.accept(this);
|
288
|
+
}
|
289
|
+
visitUnaryExpression(expr) {
|
290
|
+
expr.expression.accept(this);
|
291
|
+
}
|
292
|
+
visitCaseExpression(expr) {
|
293
|
+
if (expr.condition) {
|
294
|
+
expr.condition.accept(this);
|
295
|
+
}
|
296
|
+
expr.switchCase.accept(this);
|
297
|
+
}
|
298
|
+
visitSwitchCaseArgument(switchCase) {
|
299
|
+
// Check all case expressions
|
300
|
+
for (const caseItem of switchCase.cases) {
|
301
|
+
caseItem.accept(this);
|
302
|
+
}
|
303
|
+
// Check ELSE expression
|
304
|
+
if (switchCase.elseValue) {
|
305
|
+
switchCase.elseValue.accept(this);
|
306
|
+
}
|
307
|
+
}
|
308
|
+
visitCaseKeyValuePair(pair) {
|
309
|
+
// Check the WHEN condition
|
310
|
+
pair.key.accept(this);
|
311
|
+
// Check the THEN value
|
312
|
+
pair.value.accept(this);
|
313
|
+
}
|
314
|
+
visitBetweenExpression(expr) {
|
315
|
+
expr.expression.accept(this);
|
316
|
+
expr.lower.accept(this);
|
317
|
+
expr.upper.accept(this);
|
318
|
+
}
|
319
|
+
visitFunctionCall(func) {
|
320
|
+
if (func.argument) {
|
321
|
+
func.argument.accept(this);
|
322
|
+
}
|
323
|
+
// Check OVER clause if present
|
324
|
+
if (func.over) {
|
325
|
+
func.over.accept(this);
|
326
|
+
}
|
327
|
+
}
|
328
|
+
visitArrayExpression(expr) {
|
329
|
+
expr.expression.accept(this);
|
330
|
+
}
|
331
|
+
visitTupleExpression(expr) {
|
332
|
+
// Check each value in the tuple for possible subqueries
|
333
|
+
for (const value of expr.values) {
|
334
|
+
value.accept(this);
|
335
|
+
}
|
336
|
+
}
|
337
|
+
visitCastExpression(expr) {
|
338
|
+
// Check the input expression
|
339
|
+
expr.input.accept(this);
|
340
|
+
// Check the type expression
|
341
|
+
expr.castType.accept(this);
|
342
|
+
}
|
343
|
+
visitTypeValue(expr) {
|
344
|
+
// Visit the argument if present
|
345
|
+
if (expr.argument) {
|
346
|
+
expr.argument.accept(this);
|
347
|
+
}
|
348
|
+
// The type itself doesn't contain subqueries
|
349
|
+
}
|
350
|
+
visitWindowFrameExpression(expr) {
|
351
|
+
if (expr.partition) {
|
352
|
+
expr.partition.accept(this);
|
353
|
+
}
|
354
|
+
if (expr.order) {
|
355
|
+
expr.order.accept(this);
|
356
|
+
}
|
357
|
+
if (expr.frameSpec) {
|
358
|
+
expr.frameSpec.accept(this);
|
359
|
+
}
|
360
|
+
}
|
361
|
+
visitWindowFrameSpec(spec) {
|
362
|
+
// WindowFrameSpec is a simple value object, nothing to traverse
|
363
|
+
}
|
364
|
+
visitIdentifierString(ident) {
|
365
|
+
// Leaf node, nothing to traverse
|
366
|
+
}
|
367
|
+
visitRawString(raw) {
|
368
|
+
// Leaf node, nothing to traverse
|
369
|
+
}
|
370
|
+
visitColumnReference(column) {
|
371
|
+
// Column references don't have subqueries
|
372
|
+
}
|
373
|
+
visitParameterExpression(param) {
|
374
|
+
// Parameter expressions don't have child components
|
375
|
+
}
|
376
|
+
visitLiteralValue(value) {
|
377
|
+
// Literal values are leaf nodes
|
378
|
+
}
|
379
|
+
}
|
380
|
+
//# sourceMappingURL=CTECollector.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"CTECollector.js","sourceRoot":"","sources":["../../../src/transformers/CTECollector.ts"],"names":[],"mappings":"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"}
|