rawsql-ts 0.1.1-beta.1 → 0.1.1-beta.2
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/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 +384 -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 +318 -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 +82 -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 +72 -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/package.json +1 -1
@@ -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, FunctionCall, InlineQuery, ParenExpression, SwitchCaseArgument, TupleExpression, UnaryExpression } from "../models/ValueComponent";
|
4
|
+
import { CTECollector } from "./CTECollector";
|
5
|
+
/**
|
6
|
+
* A visitor that collects all table source names from a SQL query structure.
|
7
|
+
*
|
8
|
+
* When selectableOnly is true (default behavior):
|
9
|
+
* - Includes only table sources from FROM and JOIN clauses
|
10
|
+
* - Excludes inline queries, subqueries, and CTEs
|
11
|
+
*
|
12
|
+
* When selectableOnly is false:
|
13
|
+
* - Scans all parts of the query including WITH clauses, subqueries, etc.
|
14
|
+
* - Collects all table sources from the entire query
|
15
|
+
* - Excludes tables that are managed by CTEs
|
16
|
+
*
|
17
|
+
* For UNION-like queries, it scans both the left and right parts.
|
18
|
+
*/
|
19
|
+
export class TableSourceCollector {
|
20
|
+
constructor(selectableOnly = true) {
|
21
|
+
this.tableSources = [];
|
22
|
+
this.visitedNodes = new Set();
|
23
|
+
this.tableNameMap = new Map();
|
24
|
+
this.cteNames = new Set();
|
25
|
+
this.isRootVisit = true;
|
26
|
+
this.selectableOnly = selectableOnly;
|
27
|
+
this.handlers = new Map();
|
28
|
+
// Setup handlers for query components
|
29
|
+
this.handlers.set(SimpleSelectQuery.kind, (expr) => this.visitSimpleSelectQuery(expr));
|
30
|
+
this.handlers.set(BinarySelectQuery.kind, (expr) => this.visitBinarySelectQuery(expr));
|
31
|
+
this.handlers.set(ValuesQuery.kind, (expr) => this.visitValuesQuery(expr));
|
32
|
+
// WITH clause and common tables
|
33
|
+
this.handlers.set(WithClause.kind, (expr) => this.visitWithClause(expr));
|
34
|
+
this.handlers.set(CommonTable.kind, (expr) => this.visitCommonTable(expr));
|
35
|
+
// Handlers for FROM and JOIN components
|
36
|
+
this.handlers.set(FromClause.kind, (expr) => this.visitFromClause(expr));
|
37
|
+
this.handlers.set(JoinClause.kind, (expr) => this.visitJoinClause(expr));
|
38
|
+
this.handlers.set(JoinOnClause.kind, (expr) => this.visitJoinOnClause(expr));
|
39
|
+
this.handlers.set(JoinUsingClause.kind, (expr) => this.visitJoinUsingClause(expr));
|
40
|
+
// Source components
|
41
|
+
this.handlers.set(SourceExpression.kind, (expr) => this.visitSourceExpression(expr));
|
42
|
+
this.handlers.set(TableSource.kind, (expr) => this.visitTableSource(expr));
|
43
|
+
this.handlers.set(ParenSource.kind, (expr) => this.visitParenSource(expr));
|
44
|
+
this.handlers.set(SubQuerySource.kind, (expr) => this.visitSubQuerySource(expr));
|
45
|
+
this.handlers.set(InlineQuery.kind, (expr) => this.visitInlineQuery(expr));
|
46
|
+
// Only register these handlers when not in selectableOnly mode
|
47
|
+
if (!selectableOnly) {
|
48
|
+
// Additional clause handlers for full scanning
|
49
|
+
this.handlers.set(WhereClause.kind, (expr) => this.visitWhereClause(expr));
|
50
|
+
this.handlers.set(GroupByClause.kind, (expr) => this.visitGroupByClause(expr));
|
51
|
+
this.handlers.set(HavingClause.kind, (expr) => this.visitHavingClause(expr));
|
52
|
+
this.handlers.set(OrderByClause.kind, (expr) => this.visitOrderByClause(expr));
|
53
|
+
this.handlers.set(WindowFrameClause.kind, (expr) => this.visitWindowFrameClause(expr));
|
54
|
+
this.handlers.set(LimitClause.kind, (expr) => this.visitLimitClause(expr));
|
55
|
+
this.handlers.set(ForClause.kind, (expr) => this.visitForClause(expr));
|
56
|
+
this.handlers.set(OrderByItem.kind, (expr) => this.visitOrderByItem(expr));
|
57
|
+
this.handlers.set(SelectClause.kind, (expr) => this.visitSelectClause(expr));
|
58
|
+
this.handlers.set(SelectItem.kind, (expr) => this.visitSelectItem(expr));
|
59
|
+
// Value components that might contain table references
|
60
|
+
this.handlers.set(ParenExpression.kind, (expr) => this.visitParenExpression(expr));
|
61
|
+
this.handlers.set(BinaryExpression.kind, (expr) => this.visitBinaryExpression(expr));
|
62
|
+
this.handlers.set(UnaryExpression.kind, (expr) => this.visitUnaryExpression(expr));
|
63
|
+
this.handlers.set(CaseExpression.kind, (expr) => this.visitCaseExpression(expr));
|
64
|
+
this.handlers.set(CaseKeyValuePair.kind, (expr) => this.visitCaseKeyValuePair(expr));
|
65
|
+
this.handlers.set(SwitchCaseArgument.kind, (expr) => this.visitSwitchCaseArgument(expr));
|
66
|
+
this.handlers.set(BetweenExpression.kind, (expr) => this.visitBetweenExpression(expr));
|
67
|
+
this.handlers.set(FunctionCall.kind, (expr) => this.visitFunctionCall(expr));
|
68
|
+
this.handlers.set(ArrayExpression.kind, (expr) => this.visitArrayExpression(expr));
|
69
|
+
this.handlers.set(TupleExpression.kind, (expr) => this.visitTupleExpression(expr));
|
70
|
+
this.handlers.set(CastExpression.kind, (expr) => this.visitCastExpression(expr));
|
71
|
+
}
|
72
|
+
}
|
73
|
+
/**
|
74
|
+
* Gets all collected table sources
|
75
|
+
*/
|
76
|
+
getTableSources() {
|
77
|
+
return this.tableSources;
|
78
|
+
}
|
79
|
+
/**
|
80
|
+
* Reset the collection of table sources
|
81
|
+
*/
|
82
|
+
reset() {
|
83
|
+
this.tableSources = [];
|
84
|
+
this.tableNameMap.clear();
|
85
|
+
this.visitedNodes.clear();
|
86
|
+
this.cteNames.clear();
|
87
|
+
}
|
88
|
+
/**
|
89
|
+
* Gets a unique identifier for a table source
|
90
|
+
*/
|
91
|
+
getTableIdentifier(source) {
|
92
|
+
let identifier = source.table.name;
|
93
|
+
if (source.namespaces && source.namespaces.length > 0) {
|
94
|
+
identifier = source.namespaces.map(ns => ns.name).join('.') + '.' + identifier;
|
95
|
+
}
|
96
|
+
return identifier;
|
97
|
+
}
|
98
|
+
collect(query) {
|
99
|
+
// Visit the SQL component to collect table sources
|
100
|
+
this.visit(query);
|
101
|
+
return this.getTableSources();
|
102
|
+
}
|
103
|
+
/**
|
104
|
+
* Main entry point for the visitor pattern.
|
105
|
+
* Implements the shallow visit pattern to distinguish between root and recursive visits.
|
106
|
+
*/
|
107
|
+
visit(arg) {
|
108
|
+
// If not a root visit, just visit the node and return
|
109
|
+
if (!this.isRootVisit) {
|
110
|
+
this.visitNode(arg);
|
111
|
+
return;
|
112
|
+
}
|
113
|
+
// If this is a root visit, we need to reset the state
|
114
|
+
this.reset();
|
115
|
+
this.isRootVisit = false;
|
116
|
+
try {
|
117
|
+
// When in full scan mode, collect CTEs first to exclude them from table sources
|
118
|
+
if (!this.selectableOnly) {
|
119
|
+
this.collectCTEs(arg);
|
120
|
+
}
|
121
|
+
this.visitNode(arg);
|
122
|
+
}
|
123
|
+
finally {
|
124
|
+
// Regardless of success or failure, reset the root visit flag
|
125
|
+
this.isRootVisit = true;
|
126
|
+
}
|
127
|
+
}
|
128
|
+
/**
|
129
|
+
* Internal visit method used for all nodes.
|
130
|
+
* This separates the visit flag management from the actual node visitation logic.
|
131
|
+
*/
|
132
|
+
visitNode(arg) {
|
133
|
+
// Skip if we've already visited this node to prevent infinite recursion
|
134
|
+
if (this.visitedNodes.has(arg)) {
|
135
|
+
return;
|
136
|
+
}
|
137
|
+
// Mark as visited
|
138
|
+
this.visitedNodes.add(arg);
|
139
|
+
const handler = this.handlers.get(arg.getKind());
|
140
|
+
if (handler) {
|
141
|
+
handler(arg);
|
142
|
+
return;
|
143
|
+
}
|
144
|
+
// If no handler found, that's ok - we only care about specific components
|
145
|
+
}
|
146
|
+
/**
|
147
|
+
* Collects all CTE names to exclude them from real table sources
|
148
|
+
*/
|
149
|
+
collectCTEs(query) {
|
150
|
+
// Use CommonTableCollector to get all CTEs
|
151
|
+
const cteCollector = new CTECollector();
|
152
|
+
cteCollector.visit(query);
|
153
|
+
const commonTables = cteCollector.getCommonTables();
|
154
|
+
// Add CTE names to the set
|
155
|
+
for (const cte of commonTables) {
|
156
|
+
this.cteNames.add(cte.aliasExpression.table.name);
|
157
|
+
}
|
158
|
+
}
|
159
|
+
visitSimpleSelectQuery(query) {
|
160
|
+
// Process the FROM and JOIN clauses
|
161
|
+
if (query.fromClause) {
|
162
|
+
query.fromClause.accept(this);
|
163
|
+
}
|
164
|
+
// If in full scan mode, visit all other clauses too
|
165
|
+
if (!this.selectableOnly) {
|
166
|
+
if (query.WithClause) {
|
167
|
+
query.WithClause.accept(this);
|
168
|
+
}
|
169
|
+
if (query.whereClause) {
|
170
|
+
query.whereClause.accept(this);
|
171
|
+
}
|
172
|
+
if (query.groupByClause) {
|
173
|
+
query.groupByClause.accept(this);
|
174
|
+
}
|
175
|
+
if (query.havingClause) {
|
176
|
+
query.havingClause.accept(this);
|
177
|
+
}
|
178
|
+
if (query.orderByClause) {
|
179
|
+
query.orderByClause.accept(this);
|
180
|
+
}
|
181
|
+
if (query.windowFrameClause) {
|
182
|
+
query.windowFrameClause.accept(this);
|
183
|
+
}
|
184
|
+
if (query.rowLimitClause) {
|
185
|
+
query.rowLimitClause.accept(this);
|
186
|
+
}
|
187
|
+
if (query.forClause) {
|
188
|
+
query.forClause.accept(this);
|
189
|
+
}
|
190
|
+
query.selectClause.accept(this);
|
191
|
+
}
|
192
|
+
}
|
193
|
+
visitBinarySelectQuery(query) {
|
194
|
+
// For UNION-like queries, visit both sides
|
195
|
+
query.left.accept(this);
|
196
|
+
query.right.accept(this);
|
197
|
+
}
|
198
|
+
visitValuesQuery(query) {
|
199
|
+
if (!this.selectableOnly) {
|
200
|
+
// VALUES queries might contain subqueries in tuple expressions
|
201
|
+
for (const tuple of query.tuples) {
|
202
|
+
tuple.accept(this);
|
203
|
+
}
|
204
|
+
}
|
205
|
+
}
|
206
|
+
visitWithClause(withClause) {
|
207
|
+
if (!this.selectableOnly) {
|
208
|
+
// Visit each CommonTable
|
209
|
+
for (const table of withClause.tables) {
|
210
|
+
table.accept(this);
|
211
|
+
}
|
212
|
+
}
|
213
|
+
}
|
214
|
+
visitCommonTable(commonTable) {
|
215
|
+
if (!this.selectableOnly) {
|
216
|
+
// Process the query within the common table
|
217
|
+
commonTable.query.accept(this);
|
218
|
+
}
|
219
|
+
}
|
220
|
+
visitFromClause(fromClause) {
|
221
|
+
// Check the main source in FROM clause
|
222
|
+
fromClause.source.accept(this);
|
223
|
+
// Check all JOIN clauses
|
224
|
+
if (fromClause.joins) {
|
225
|
+
for (const join of fromClause.joins) {
|
226
|
+
join.accept(this);
|
227
|
+
}
|
228
|
+
}
|
229
|
+
}
|
230
|
+
visitSourceExpression(source) {
|
231
|
+
// Process the actual data source, ignoring aliases
|
232
|
+
source.datasource.accept(this);
|
233
|
+
}
|
234
|
+
visitTableSource(source) {
|
235
|
+
// Get the table identifier for uniqueness check
|
236
|
+
const identifier = this.getTableIdentifier(source);
|
237
|
+
// Check if this is a table managed by a CTE
|
238
|
+
if (!this.tableNameMap.has(identifier) && !this.isCTETable(source.table.name)) {
|
239
|
+
this.tableNameMap.set(identifier, true);
|
240
|
+
this.tableSources.push(source);
|
241
|
+
}
|
242
|
+
}
|
243
|
+
/**
|
244
|
+
* Checks if a table name is a CTE name
|
245
|
+
*/
|
246
|
+
isCTETable(tableName) {
|
247
|
+
return this.cteNames.has(tableName);
|
248
|
+
}
|
249
|
+
visitParenSource(source) {
|
250
|
+
// For parenthesized sources, visit the inner source
|
251
|
+
source.source.accept(this);
|
252
|
+
}
|
253
|
+
visitSubQuerySource(subQuery) {
|
254
|
+
if (!this.selectableOnly) {
|
255
|
+
// In full scan mode, we also check subqueries
|
256
|
+
subQuery.query.accept(this);
|
257
|
+
}
|
258
|
+
// In selectableOnly mode, we don't collect sources from subqueries
|
259
|
+
}
|
260
|
+
visitInlineQuery(inlineQuery) {
|
261
|
+
if (!this.selectableOnly) {
|
262
|
+
// In full scan mode, visit inline queries too
|
263
|
+
inlineQuery.selectQuery.accept(this);
|
264
|
+
}
|
265
|
+
}
|
266
|
+
visitJoinClause(joinClause) {
|
267
|
+
// Visit the source being joined
|
268
|
+
joinClause.source.accept(this);
|
269
|
+
// If full scanning, also visit the join condition
|
270
|
+
if (!this.selectableOnly && joinClause.condition) {
|
271
|
+
joinClause.condition.accept(this);
|
272
|
+
}
|
273
|
+
}
|
274
|
+
visitJoinOnClause(joinOn) {
|
275
|
+
if (!this.selectableOnly) {
|
276
|
+
// In full scan mode, check ON condition for table references
|
277
|
+
joinOn.condition.accept(this);
|
278
|
+
}
|
279
|
+
}
|
280
|
+
visitJoinUsingClause(joinUsing) {
|
281
|
+
if (!this.selectableOnly) {
|
282
|
+
// In full scan mode, check USING condition for table references
|
283
|
+
joinUsing.condition.accept(this);
|
284
|
+
}
|
285
|
+
}
|
286
|
+
// Additional visitor methods only used in full scan mode
|
287
|
+
visitWhereClause(whereClause) {
|
288
|
+
whereClause.condition.accept(this);
|
289
|
+
}
|
290
|
+
visitGroupByClause(clause) {
|
291
|
+
for (const item of clause.grouping) {
|
292
|
+
item.accept(this);
|
293
|
+
}
|
294
|
+
}
|
295
|
+
visitHavingClause(clause) {
|
296
|
+
clause.condition.accept(this);
|
297
|
+
}
|
298
|
+
visitOrderByClause(clause) {
|
299
|
+
for (const item of clause.order) {
|
300
|
+
item.accept(this);
|
301
|
+
}
|
302
|
+
}
|
303
|
+
visitWindowFrameClause(clause) {
|
304
|
+
clause.expression.accept(this);
|
305
|
+
}
|
306
|
+
visitLimitClause(clause) {
|
307
|
+
clause.limit.accept(this);
|
308
|
+
if (clause.offset) {
|
309
|
+
clause.offset.accept(this);
|
310
|
+
}
|
311
|
+
}
|
312
|
+
visitForClause(clause) {
|
313
|
+
// FOR clause doesn't contain table sources
|
314
|
+
}
|
315
|
+
visitOrderByItem(item) {
|
316
|
+
item.value.accept(this);
|
317
|
+
}
|
318
|
+
visitSelectClause(clause) {
|
319
|
+
for (const item of clause.items) {
|
320
|
+
item.accept(this);
|
321
|
+
}
|
322
|
+
}
|
323
|
+
visitSelectItem(item) {
|
324
|
+
item.value.accept(this);
|
325
|
+
}
|
326
|
+
visitParenExpression(expr) {
|
327
|
+
expr.expression.accept(this);
|
328
|
+
}
|
329
|
+
visitBinaryExpression(expr) {
|
330
|
+
expr.left.accept(this);
|
331
|
+
expr.right.accept(this);
|
332
|
+
}
|
333
|
+
visitUnaryExpression(expr) {
|
334
|
+
expr.expression.accept(this);
|
335
|
+
}
|
336
|
+
visitCaseExpression(expr) {
|
337
|
+
if (expr.condition) {
|
338
|
+
expr.condition.accept(this);
|
339
|
+
}
|
340
|
+
expr.switchCase.accept(this);
|
341
|
+
}
|
342
|
+
visitSwitchCaseArgument(switchCase) {
|
343
|
+
for (const caseItem of switchCase.cases) {
|
344
|
+
caseItem.accept(this);
|
345
|
+
}
|
346
|
+
if (switchCase.elseValue) {
|
347
|
+
switchCase.elseValue.accept(this);
|
348
|
+
}
|
349
|
+
}
|
350
|
+
visitCaseKeyValuePair(pair) {
|
351
|
+
pair.key.accept(this);
|
352
|
+
pair.value.accept(this);
|
353
|
+
}
|
354
|
+
visitBetweenExpression(expr) {
|
355
|
+
expr.expression.accept(this);
|
356
|
+
expr.lower.accept(this);
|
357
|
+
expr.upper.accept(this);
|
358
|
+
}
|
359
|
+
visitFunctionCall(func) {
|
360
|
+
if (func.argument) {
|
361
|
+
func.argument.accept(this);
|
362
|
+
}
|
363
|
+
if (func.over) {
|
364
|
+
func.over.accept(this);
|
365
|
+
}
|
366
|
+
}
|
367
|
+
visitArrayExpression(expr) {
|
368
|
+
expr.expression.accept(this);
|
369
|
+
}
|
370
|
+
visitTupleExpression(expr) {
|
371
|
+
for (const value of expr.values) {
|
372
|
+
value.accept(this);
|
373
|
+
}
|
374
|
+
}
|
375
|
+
visitCastExpression(expr) {
|
376
|
+
expr.input.accept(this);
|
377
|
+
expr.castType.accept(this);
|
378
|
+
}
|
379
|
+
}
|
380
|
+
//# sourceMappingURL=TableSourceCollector.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"TableSourceCollector.js","sourceRoot":"","sources":["../../../src/transformers/TableSourceCollector.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,125 @@
|
|
1
|
+
import { SimpleSelectQuery, BinarySelectQuery, ValuesQuery } from "../models/SelectQuery";
|
2
|
+
import { SubQuerySource, TableSource } from "../models/Clause";
|
3
|
+
import { SelectableColumnCollector } from "./SelectableColumnCollector";
|
4
|
+
import { CTECollector } from "./CTECollector";
|
5
|
+
/**
|
6
|
+
* UpstreamSelectQueryFinder searches upstream queries for the specified columns.
|
7
|
+
* If a query (including its upstream CTEs or subqueries) contains all columns,
|
8
|
+
* it returns the highest such SelectQuery. Otherwise, it searches downstream.
|
9
|
+
* For UNION queries, it checks each branch independently.
|
10
|
+
*/
|
11
|
+
export class UpstreamSelectQueryFinder {
|
12
|
+
constructor(tableColumnResolver) {
|
13
|
+
this.tableColumnResolver = tableColumnResolver;
|
14
|
+
this.columnCollector = new SelectableColumnCollector(this.tableColumnResolver);
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* Finds the highest SelectQuery containing all specified columns.
|
18
|
+
* @param query The root SelectQuery to search.
|
19
|
+
* @param columnNames Array of column names to check for.
|
20
|
+
* @returns An array of SelectQuery objects, or an empty array if not found.
|
21
|
+
*/
|
22
|
+
find(query, columnNames) {
|
23
|
+
// Use CTECollector to collect CTEs from the root query only once and reuse
|
24
|
+
const cteCollector = new CTECollector();
|
25
|
+
const ctes = cteCollector.collect(query);
|
26
|
+
const cteMap = new Map();
|
27
|
+
for (const cte of ctes) {
|
28
|
+
cteMap.set(cte.getAliasSourceName(), cte);
|
29
|
+
}
|
30
|
+
return this.findUpstream(query, columnNames, cteMap);
|
31
|
+
}
|
32
|
+
handleTableSource(src, columnNames, cteMap) {
|
33
|
+
// Handles the logic for TableSource in findUpstream
|
34
|
+
const cte = cteMap.get(src.table.name);
|
35
|
+
if (cte) {
|
36
|
+
// Remove the current CTE name from the map to prevent infinite recursion
|
37
|
+
const nextCteMap = new Map(cteMap);
|
38
|
+
nextCteMap.delete(src.table.name);
|
39
|
+
const result = this.findUpstream(cte.query, columnNames, nextCteMap);
|
40
|
+
if (result.length === 0) {
|
41
|
+
return null;
|
42
|
+
}
|
43
|
+
return result;
|
44
|
+
}
|
45
|
+
return null;
|
46
|
+
}
|
47
|
+
handleSubQuerySource(src, columnNames, cteMap) {
|
48
|
+
// Handles the logic for SubQuerySource in findUpstream
|
49
|
+
const result = this.findUpstream(src.query, columnNames, cteMap);
|
50
|
+
if (result.length === 0) {
|
51
|
+
return null;
|
52
|
+
}
|
53
|
+
return result;
|
54
|
+
}
|
55
|
+
/**
|
56
|
+
* Processes all source branches in a FROM clause and checks if all upstream queries contain the specified columns.
|
57
|
+
* Returns a flat array of SelectQuery if all branches are valid, otherwise null.
|
58
|
+
*/
|
59
|
+
processFromClauseBranches(fromClause, columnNames, cteMap) {
|
60
|
+
const sources = fromClause.getSources();
|
61
|
+
if (sources.length === 0)
|
62
|
+
return null;
|
63
|
+
let allBranchResults = [];
|
64
|
+
let allBranchesOk = true;
|
65
|
+
let validBranchCount = 0; // Count only filterable branches
|
66
|
+
for (const sourceExpr of sources) {
|
67
|
+
const src = sourceExpr.datasource;
|
68
|
+
let branchResult = null;
|
69
|
+
if (src instanceof TableSource) {
|
70
|
+
branchResult = this.handleTableSource(src, columnNames, cteMap);
|
71
|
+
validBranchCount++;
|
72
|
+
}
|
73
|
+
else if (src instanceof SubQuerySource) {
|
74
|
+
branchResult = this.handleSubQuerySource(src, columnNames, cteMap);
|
75
|
+
validBranchCount++;
|
76
|
+
}
|
77
|
+
else if (src instanceof ValuesQuery) {
|
78
|
+
// Skip ValuesQuery: not filterable, do not count as a valid branch
|
79
|
+
continue;
|
80
|
+
}
|
81
|
+
else {
|
82
|
+
allBranchesOk = false;
|
83
|
+
break;
|
84
|
+
}
|
85
|
+
// If the branch result is null,
|
86
|
+
// it means it didn't find the required columns in this branch
|
87
|
+
if (branchResult === null) {
|
88
|
+
allBranchesOk = false;
|
89
|
+
break;
|
90
|
+
}
|
91
|
+
allBranchResults.push(branchResult);
|
92
|
+
}
|
93
|
+
// Check if all valid (filterable) branches are valid and contain the required columns
|
94
|
+
if (allBranchesOk && allBranchResults.length === validBranchCount) {
|
95
|
+
return allBranchResults.flat();
|
96
|
+
}
|
97
|
+
return null;
|
98
|
+
}
|
99
|
+
findUpstream(query, columnNames, cteMap) {
|
100
|
+
if (query instanceof SimpleSelectQuery) {
|
101
|
+
// Check upstream sources first: prioritize searching upstream branches for the required columns.
|
102
|
+
const fromClause = query.fromClause;
|
103
|
+
if (fromClause) {
|
104
|
+
const branchResult = this.processFromClauseBranches(fromClause, columnNames, cteMap);
|
105
|
+
if (branchResult) {
|
106
|
+
return branchResult;
|
107
|
+
}
|
108
|
+
}
|
109
|
+
// If not found in all upstream branches, check this query itself
|
110
|
+
const columns = this.columnCollector.collect(query).map(col => col.name);
|
111
|
+
const hasAll = columnNames.every(name => columns.includes(name));
|
112
|
+
if (hasAll) {
|
113
|
+
return [query];
|
114
|
+
}
|
115
|
+
return [];
|
116
|
+
}
|
117
|
+
else if (query instanceof BinarySelectQuery) {
|
118
|
+
const left = this.findUpstream(query.left, columnNames, cteMap);
|
119
|
+
const right = this.findUpstream(query.right, columnNames, cteMap);
|
120
|
+
return [...left, ...right];
|
121
|
+
}
|
122
|
+
return [];
|
123
|
+
}
|
124
|
+
}
|
125
|
+
//# sourceMappingURL=UpstreamSelectQueryFinder.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"UpstreamSelectQueryFinder.js","sourceRoot":"","sources":["../../../src/transformers/UpstreamSelectQueryFinder.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
export * from './parsers/SelectQueryParser';
|
2
|
+
export * from './models/BinarySelectQuery';
|
3
|
+
export * from './models/SelectQuery';
|
4
|
+
export * from './models/ValueComponent';
|
5
|
+
export * from './models/ValuesQuery';
|
6
|
+
export * from './transformers/CTECollector';
|
7
|
+
export * from './transformers/CTENormalizer';
|
8
|
+
export * from './transformers/Formatter';
|
9
|
+
export * from './transformers/QueryConverter';
|
10
|
+
export * from './transformers/SelectValueCollector';
|
11
|
+
export * from './transformers/SelectableColumnCollector';
|
12
|
+
export * from './transformers/TableColumnResolver';
|
13
|
+
export * from './transformers/TableSourceCollector';
|
14
|
+
export * from './transformers/UpstreamSelectQueryFinder';
|
@@ -0,0 +1,91 @@
|
|
1
|
+
import { SourceExpression } from "./Clause";
|
2
|
+
import type { SelectQuery } from "./SelectQuery";
|
3
|
+
import { SqlComponent } from "./SqlComponent";
|
4
|
+
import { RawString } from "./ValueComponent";
|
5
|
+
/**
|
6
|
+
* Represents a binary SELECT query (e.g., UNION, INTERSECT, EXCEPT).
|
7
|
+
*/
|
8
|
+
export declare class BinarySelectQuery extends SqlComponent {
|
9
|
+
static kind: symbol;
|
10
|
+
left: SelectQuery;
|
11
|
+
operator: RawString;
|
12
|
+
right: SelectQuery;
|
13
|
+
constructor(left: SelectQuery, operator: string, right: SelectQuery);
|
14
|
+
/**
|
15
|
+
* Appends another query to this binary query using UNION as the operator.
|
16
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
17
|
+
* and the right side is the provided query.
|
18
|
+
*
|
19
|
+
* @param query The query to append with UNION
|
20
|
+
* @returns A new BinarySelectQuery representing "(this) UNION query"
|
21
|
+
*/
|
22
|
+
union(query: SelectQuery): BinarySelectQuery;
|
23
|
+
/**
|
24
|
+
* Appends another query to this binary query using UNION ALL as the operator.
|
25
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
26
|
+
* and the right side is the provided query.
|
27
|
+
*
|
28
|
+
* @param query The query to append with UNION ALL
|
29
|
+
* @returns A new BinarySelectQuery representing "(this) UNION ALL query"
|
30
|
+
*/
|
31
|
+
unionAll(query: SelectQuery): BinarySelectQuery;
|
32
|
+
/**
|
33
|
+
* Appends another query to this binary query using INTERSECT as the operator.
|
34
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
35
|
+
* and the right side is the provided query.
|
36
|
+
*
|
37
|
+
* @param query The query to append with INTERSECT
|
38
|
+
* @returns A new BinarySelectQuery representing "(this) INTERSECT query"
|
39
|
+
*/
|
40
|
+
intersect(query: SelectQuery): BinarySelectQuery;
|
41
|
+
/**
|
42
|
+
* Appends another query to this binary query using INTERSECT ALL as the operator.
|
43
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
44
|
+
* and the right side is the provided query.
|
45
|
+
*
|
46
|
+
* @param query The query to append with INTERSECT ALL
|
47
|
+
* @returns A new BinarySelectQuery representing "(this) INTERSECT ALL query"
|
48
|
+
*/
|
49
|
+
intersectAll(query: SelectQuery): BinarySelectQuery;
|
50
|
+
/**
|
51
|
+
* Appends another query to this binary query using EXCEPT as the operator.
|
52
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
53
|
+
* and the right side is the provided query.
|
54
|
+
*
|
55
|
+
* @param query The query to append with EXCEPT
|
56
|
+
* @returns A new BinarySelectQuery representing "(this) EXCEPT query"
|
57
|
+
*/
|
58
|
+
except(query: SelectQuery): BinarySelectQuery;
|
59
|
+
/**
|
60
|
+
* Appends another query to this binary query using EXCEPT ALL as the operator.
|
61
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
62
|
+
* and the right side is the provided query.
|
63
|
+
*
|
64
|
+
* @param query The query to append with EXCEPT ALL
|
65
|
+
* @returns A new BinarySelectQuery representing "(this) EXCEPT ALL query"
|
66
|
+
*/
|
67
|
+
exceptAll(query: SelectQuery): BinarySelectQuery;
|
68
|
+
/**
|
69
|
+
* Appends another query to this binary query using the specified operator.
|
70
|
+
* This creates a new BinarySelectQuery where the left side is this binary query
|
71
|
+
* and the right side is the provided query.
|
72
|
+
*
|
73
|
+
* @param operator SQL operator to use (e.g. 'union', 'union all', 'intersect', 'except')
|
74
|
+
* @param query The query to append with the specified operator
|
75
|
+
* @returns A new BinarySelectQuery representing "(this) [operator] query"
|
76
|
+
*/
|
77
|
+
appendSelectQuery(operator: string, query: SelectQuery): BinarySelectQuery;
|
78
|
+
/**
|
79
|
+
* Appends another query to this binary query using UNION as the operator, accepting a raw SQL string.
|
80
|
+
* This method parses the SQL string and appends the resulting query using UNION.
|
81
|
+
* @param sql The SQL string to parse and union
|
82
|
+
* @returns A new BinarySelectQuery representing "(this) UNION (parsed query)"
|
83
|
+
*/
|
84
|
+
unionRaw(sql: string): BinarySelectQuery;
|
85
|
+
unionAllRaw(sql: string): BinarySelectQuery;
|
86
|
+
intersectRaw(sql: string): BinarySelectQuery;
|
87
|
+
intersectAllRaw(sql: string): BinarySelectQuery;
|
88
|
+
exceptRaw(sql: string): BinarySelectQuery;
|
89
|
+
exceptAllRaw(sql: string): BinarySelectQuery;
|
90
|
+
toSource(alias?: string): SourceExpression;
|
91
|
+
}
|