rawsql-ts 0.16.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +161 -875
  3. package/dist/esm/index.d.ts +11 -0
  4. package/dist/esm/index.js +11 -0
  5. package/dist/esm/index.js.map +1 -1
  6. package/dist/esm/index.min.js +23 -21
  7. package/dist/esm/index.min.js.map +4 -4
  8. package/dist/esm/models/Clause.d.ts +15 -3
  9. package/dist/esm/models/Clause.js +2 -1
  10. package/dist/esm/models/Clause.js.map +1 -1
  11. package/dist/esm/models/CreateTableQuery.d.ts +3 -0
  12. package/dist/esm/models/CreateTableQuery.js +5 -4
  13. package/dist/esm/models/CreateTableQuery.js.map +1 -1
  14. package/dist/esm/models/DDLStatements.d.ts +71 -0
  15. package/dist/esm/models/DDLStatements.js +63 -0
  16. package/dist/esm/models/DDLStatements.js.map +1 -1
  17. package/dist/esm/models/KeywordTrie.d.ts +2 -3
  18. package/dist/esm/models/KeywordTrie.js +26 -27
  19. package/dist/esm/models/KeywordTrie.js.map +1 -1
  20. package/dist/esm/models/SqlPrintToken.d.ts +1 -0
  21. package/dist/esm/models/SqlPrintToken.js +1 -0
  22. package/dist/esm/models/SqlPrintToken.js.map +1 -1
  23. package/dist/esm/parsers/CheckpointStatementParser.d.ts +8 -0
  24. package/dist/esm/parsers/CheckpointStatementParser.js +14 -0
  25. package/dist/esm/parsers/CheckpointStatementParser.js.map +1 -0
  26. package/dist/esm/parsers/ClusterStatementParser.d.ts +8 -0
  27. package/dist/esm/parsers/ClusterStatementParser.js +14 -0
  28. package/dist/esm/parsers/ClusterStatementParser.js.map +1 -0
  29. package/dist/esm/parsers/CommandExpressionParser.js.map +1 -1
  30. package/dist/esm/parsers/CommentOnParser.d.ts +23 -0
  31. package/dist/esm/parsers/CommentOnParser.js +61 -0
  32. package/dist/esm/parsers/CommentOnParser.js.map +1 -0
  33. package/dist/esm/parsers/CommonTableParser.d.ts +5 -1
  34. package/dist/esm/parsers/CommonTableParser.js +94 -16
  35. package/dist/esm/parsers/CommonTableParser.js.map +1 -1
  36. package/dist/esm/parsers/CreateIndexParser.js +12 -6
  37. package/dist/esm/parsers/CreateIndexParser.js.map +1 -1
  38. package/dist/esm/parsers/CreateTableParser.d.ts +2 -0
  39. package/dist/esm/parsers/CreateTableParser.js +11 -2
  40. package/dist/esm/parsers/CreateTableParser.js.map +1 -1
  41. package/dist/esm/parsers/ExplainStatementParser.js.map +1 -1
  42. package/dist/esm/parsers/FullNameParser.js +35 -3
  43. package/dist/esm/parsers/FullNameParser.js.map +1 -1
  44. package/dist/esm/parsers/OrderByClauseParser.js.map +1 -1
  45. package/dist/esm/parsers/ReindexStatementParser.d.ts +8 -0
  46. package/dist/esm/parsers/ReindexStatementParser.js +14 -0
  47. package/dist/esm/parsers/ReindexStatementParser.js.map +1 -0
  48. package/dist/esm/parsers/SelectQueryParser.js.map +1 -1
  49. package/dist/esm/parsers/SourceParser.js +6 -1
  50. package/dist/esm/parsers/SourceParser.js.map +1 -1
  51. package/dist/esm/parsers/SqlParser.d.ts +12 -2
  52. package/dist/esm/parsers/SqlParser.js +117 -251
  53. package/dist/esm/parsers/SqlParser.js.map +1 -1
  54. package/dist/esm/parsers/SqlPrintTokenParser.d.ts +1 -0
  55. package/dist/esm/parsers/SqlPrintTokenParser.js +32 -4
  56. package/dist/esm/parsers/SqlPrintTokenParser.js.map +1 -1
  57. package/dist/esm/parsers/SqlTokenizer.d.ts +5 -0
  58. package/dist/esm/parsers/SqlTokenizer.js +181 -67
  59. package/dist/esm/parsers/SqlTokenizer.js.map +1 -1
  60. package/dist/esm/parsers/UsingClauseParser.js.map +1 -1
  61. package/dist/esm/parsers/VacuumStatementParser.d.ts +8 -0
  62. package/dist/esm/parsers/VacuumStatementParser.js +14 -0
  63. package/dist/esm/parsers/VacuumStatementParser.js.map +1 -0
  64. package/dist/esm/tokenReaders/CommandTokenReader.js +22 -4
  65. package/dist/esm/tokenReaders/CommandTokenReader.js.map +1 -1
  66. package/dist/esm/tokenReaders/StringSpecifierTokenReader.d.ts +2 -0
  67. package/dist/esm/tokenReaders/StringSpecifierTokenReader.js +30 -13
  68. package/dist/esm/tokenReaders/StringSpecifierTokenReader.js.map +1 -1
  69. package/dist/esm/tokenReaders/TokenReaderManager.d.ts +0 -7
  70. package/dist/esm/tokenReaders/TokenReaderManager.js +16 -48
  71. package/dist/esm/tokenReaders/TokenReaderManager.js.map +1 -1
  72. package/dist/esm/transformers/AliasRenamer.d.ts +1 -0
  73. package/dist/esm/transformers/AliasRenamer.js +7 -1
  74. package/dist/esm/transformers/AliasRenamer.js.map +1 -1
  75. package/dist/esm/transformers/CTECollector.d.ts +5 -2
  76. package/dist/esm/transformers/CTECollector.js +49 -0
  77. package/dist/esm/transformers/CTECollector.js.map +1 -1
  78. package/dist/esm/transformers/CTEDependencyTracer.d.ts +6 -1
  79. package/dist/esm/transformers/CTEDependencyTracer.js +44 -2
  80. package/dist/esm/transformers/CTEDependencyTracer.js.map +1 -1
  81. package/dist/esm/transformers/CTEDisabler.d.ts +6 -0
  82. package/dist/esm/transformers/CTEDisabler.js +19 -0
  83. package/dist/esm/transformers/CTEDisabler.js.map +1 -1
  84. package/dist/esm/transformers/CTERenamer.js +5 -2
  85. package/dist/esm/transformers/CTERenamer.js.map +1 -1
  86. package/dist/esm/transformers/ColumnReferenceCollector.d.ts +4 -0
  87. package/dist/esm/transformers/ColumnReferenceCollector.js +69 -1
  88. package/dist/esm/transformers/ColumnReferenceCollector.js.map +1 -1
  89. package/dist/esm/transformers/DeleteResultSelectConverter.js.map +1 -1
  90. package/dist/esm/transformers/DynamicQueryBuilder.d.ts +88 -16
  91. package/dist/esm/transformers/DynamicQueryBuilder.js +146 -18
  92. package/dist/esm/transformers/DynamicQueryBuilder.js.map +1 -1
  93. package/dist/esm/transformers/ExistsPredicateInjector.d.ts +33 -0
  94. package/dist/esm/transformers/ExistsPredicateInjector.js +294 -0
  95. package/dist/esm/transformers/ExistsPredicateInjector.js.map +1 -0
  96. package/dist/esm/transformers/FixtureCteBuilder.js +5 -2
  97. package/dist/esm/transformers/FixtureCteBuilder.js.map +1 -1
  98. package/dist/esm/transformers/InsertResultSelectConverter.d.ts +1 -0
  99. package/dist/esm/transformers/InsertResultSelectConverter.js +28 -7
  100. package/dist/esm/transformers/InsertResultSelectConverter.js.map +1 -1
  101. package/dist/esm/transformers/LinePrinter.d.ts +4 -2
  102. package/dist/esm/transformers/LinePrinter.js +93 -22
  103. package/dist/esm/transformers/LinePrinter.js.map +1 -1
  104. package/dist/esm/transformers/MergeResultSelectConverter.js.map +1 -1
  105. package/dist/esm/transformers/OptimizeUnusedLeftJoins.d.ts +33 -0
  106. package/dist/esm/transformers/OptimizeUnusedLeftJoins.js +333 -0
  107. package/dist/esm/transformers/OptimizeUnusedLeftJoins.js.map +1 -0
  108. package/dist/esm/transformers/PruneOptionalConditionBranches.d.ts +22 -0
  109. package/dist/esm/transformers/PruneOptionalConditionBranches.js +265 -0
  110. package/dist/esm/transformers/PruneOptionalConditionBranches.js.map +1 -0
  111. package/dist/esm/transformers/SSSQLFilterBuilder.d.ts +30 -0
  112. package/dist/esm/transformers/SSSQLFilterBuilder.js +253 -0
  113. package/dist/esm/transformers/SSSQLFilterBuilder.js.map +1 -0
  114. package/dist/esm/transformers/SchemaCollector.d.ts +3 -0
  115. package/dist/esm/transformers/SchemaCollector.js +37 -1
  116. package/dist/esm/transformers/SchemaCollector.js.map +1 -1
  117. package/dist/esm/transformers/SelectValueCollector.d.ts +5 -0
  118. package/dist/esm/transformers/SelectValueCollector.js +44 -2
  119. package/dist/esm/transformers/SelectValueCollector.js.map +1 -1
  120. package/dist/esm/transformers/SqlParamInjector.d.ts +5 -1
  121. package/dist/esm/transformers/SqlParamInjector.js +47 -11
  122. package/dist/esm/transformers/SqlParamInjector.js.map +1 -1
  123. package/dist/esm/transformers/SqlPrinter.js +8 -2
  124. package/dist/esm/transformers/SqlPrinter.js.map +1 -1
  125. package/dist/esm/transformers/TableSourceCollector.d.ts +9 -1
  126. package/dist/esm/transformers/TableSourceCollector.js +72 -5
  127. package/dist/esm/transformers/TableSourceCollector.js.map +1 -1
  128. package/dist/esm/transformers/UpdateResultSelectConverter.js.map +1 -1
  129. package/dist/esm/transformers/UpstreamSelectQueryFinder.d.ts +5 -0
  130. package/dist/esm/transformers/UpstreamSelectQueryFinder.js +46 -1
  131. package/dist/esm/transformers/UpstreamSelectQueryFinder.js.map +1 -1
  132. package/dist/esm/utils/CommentUtils.d.ts +1 -0
  133. package/dist/esm/utils/CommentUtils.js +14 -4
  134. package/dist/esm/utils/CommentUtils.js.map +1 -1
  135. package/dist/esm/utils/MultiQuerySplitter.d.ts +7 -11
  136. package/dist/esm/utils/MultiQuerySplitter.js +105 -66
  137. package/dist/esm/utils/MultiQuerySplitter.js.map +1 -1
  138. package/dist/esm/utils/ParameterRemover.d.ts +4 -0
  139. package/dist/esm/utils/ParameterRemover.js +23 -0
  140. package/dist/esm/utils/ParameterRemover.js.map +1 -1
  141. package/dist/esm/utils/RelationGraph.d.ts +43 -0
  142. package/dist/esm/utils/RelationGraph.js +117 -0
  143. package/dist/esm/utils/RelationGraph.js.map +1 -0
  144. package/dist/esm/utils/ScopeResolver.d.ts +5 -2
  145. package/dist/esm/utils/ScopeResolver.js +37 -18
  146. package/dist/esm/utils/ScopeResolver.js.map +1 -1
  147. package/dist/esm/utils/charLookupTable.d.ts +6 -0
  148. package/dist/esm/utils/charLookupTable.js +9 -1
  149. package/dist/esm/utils/charLookupTable.js.map +1 -1
  150. package/dist/esm/utils/serialTypeNormalization.d.ts +15 -0
  151. package/dist/esm/utils/serialTypeNormalization.js +55 -0
  152. package/dist/esm/utils/serialTypeNormalization.js.map +1 -0
  153. package/dist/esm/utils/stringUtils.js +51 -26
  154. package/dist/esm/utils/stringUtils.js.map +1 -1
  155. package/dist/index.js +6 -0
  156. package/dist/index.js.map +1 -1
  157. package/dist/index.min.js +22 -20
  158. package/dist/index.min.js.map +4 -4
  159. package/dist/models/CreateTableQuery.js +5 -4
  160. package/dist/models/CreateTableQuery.js.map +1 -1
  161. package/dist/models/DDLStatements.js +14 -1
  162. package/dist/models/DDLStatements.js.map +1 -1
  163. package/dist/models/KeywordTrie.js +26 -27
  164. package/dist/models/KeywordTrie.js.map +1 -1
  165. package/dist/models/SqlPrintToken.js +1 -0
  166. package/dist/models/SqlPrintToken.js.map +1 -1
  167. package/dist/parsers/CommentOnParser.js +65 -0
  168. package/dist/parsers/CommentOnParser.js.map +1 -0
  169. package/dist/parsers/CreateIndexParser.js +12 -6
  170. package/dist/parsers/CreateIndexParser.js.map +1 -1
  171. package/dist/parsers/CreateTableParser.js +6 -1
  172. package/dist/parsers/CreateTableParser.js.map +1 -1
  173. package/dist/parsers/FullNameParser.js +35 -3
  174. package/dist/parsers/FullNameParser.js.map +1 -1
  175. package/dist/parsers/SqlParser.js +93 -307
  176. package/dist/parsers/SqlParser.js.map +1 -1
  177. package/dist/parsers/SqlPrintTokenParser.js +27 -3
  178. package/dist/parsers/SqlPrintTokenParser.js.map +1 -1
  179. package/dist/parsers/SqlTokenizer.js +176 -67
  180. package/dist/parsers/SqlTokenizer.js.map +1 -1
  181. package/dist/src/index.d.ts +6 -0
  182. package/dist/src/models/CreateTableQuery.d.ts +3 -0
  183. package/dist/src/models/DDLStatements.d.ts +15 -0
  184. package/dist/src/models/KeywordTrie.d.ts +2 -3
  185. package/dist/src/models/SqlPrintToken.d.ts +1 -0
  186. package/dist/src/parsers/CommentOnParser.d.ts +23 -0
  187. package/dist/src/parsers/CreateTableParser.d.ts +1 -0
  188. package/dist/src/parsers/SqlParser.d.ts +8 -2
  189. package/dist/src/parsers/SqlPrintTokenParser.d.ts +1 -0
  190. package/dist/src/parsers/SqlTokenizer.d.ts +5 -0
  191. package/dist/src/tokenReaders/StringSpecifierTokenReader.d.ts +2 -0
  192. package/dist/src/tokenReaders/TokenReaderManager.d.ts +0 -7
  193. package/dist/src/transformers/DynamicQueryBuilder.d.ts +21 -13
  194. package/dist/src/transformers/LinePrinter.d.ts +4 -2
  195. package/dist/src/transformers/PruneOptionalConditionBranches.d.ts +22 -0
  196. package/dist/src/transformers/SSSQLFilterBuilder.d.ts +30 -0
  197. package/dist/src/utils/CommentUtils.d.ts +1 -0
  198. package/dist/src/utils/MultiQuerySplitter.d.ts +7 -11
  199. package/dist/src/utils/RelationGraph.d.ts +43 -0
  200. package/dist/tokenReaders/CommandTokenReader.js +21 -4
  201. package/dist/tokenReaders/CommandTokenReader.js.map +1 -1
  202. package/dist/tokenReaders/StringSpecifierTokenReader.js +30 -13
  203. package/dist/tokenReaders/StringSpecifierTokenReader.js.map +1 -1
  204. package/dist/tokenReaders/TokenReaderManager.js +16 -48
  205. package/dist/tokenReaders/TokenReaderManager.js.map +1 -1
  206. package/dist/transformers/DynamicQueryBuilder.js +28 -95
  207. package/dist/transformers/DynamicQueryBuilder.js.map +1 -1
  208. package/dist/transformers/LinePrinter.js +93 -22
  209. package/dist/transformers/LinePrinter.js.map +1 -1
  210. package/dist/transformers/PruneOptionalConditionBranches.js +270 -0
  211. package/dist/transformers/PruneOptionalConditionBranches.js.map +1 -0
  212. package/dist/transformers/SSSQLFilterBuilder.js +259 -0
  213. package/dist/transformers/SSSQLFilterBuilder.js.map +1 -0
  214. package/dist/tsconfig.browser.tsbuildinfo +1 -1
  215. package/dist/utils/CommentUtils.js +14 -4
  216. package/dist/utils/CommentUtils.js.map +1 -1
  217. package/dist/utils/MultiQuerySplitter.js +105 -66
  218. package/dist/utils/MultiQuerySplitter.js.map +1 -1
  219. package/dist/utils/RelationGraph.js +123 -0
  220. package/dist/utils/RelationGraph.js.map +1 -0
  221. package/dist/utils/stringUtils.js +42 -23
  222. package/dist/utils/stringUtils.js.map +1 -1
  223. package/package.json +4 -4
@@ -0,0 +1,22 @@
1
+ import { SelectQuery, SimpleSelectQuery } from '../models/SelectQuery';
2
+ import { SqlParameterValue, ValueComponent } from '../models/ValueComponent';
3
+ export type OptionalConditionPruningParameters = Record<string, SqlParameterValue>;
4
+ export type OptionalConditionParameterState = 'absent' | 'present' | 'unknown';
5
+ export type OptionalConditionParameterStates = Record<string, OptionalConditionParameterState>;
6
+ export type SupportedOptionalConditionBranchKind = 'expression';
7
+ export interface SupportedOptionalConditionBranch {
8
+ query: SimpleSelectQuery;
9
+ parameterName: string;
10
+ expression: ValueComponent;
11
+ kind: SupportedOptionalConditionBranchKind;
12
+ }
13
+ /**
14
+ * Prunes supported optional WHERE branches when an explicitly targeted parameter is absent-equivalent.
15
+ * For the MVP, only `null` and `undefined` are treated as absent and unsupported shapes remain exact no-op.
16
+ */
17
+ export declare const pruneOptionalConditionBranches: (query: SelectQuery, pruningParameters: OptionalConditionPruningParameters) => SelectQuery;
18
+ /**
19
+ * Collects supported top-level optional condition branches from the query graph.
20
+ * The returned branch expressions keep object identity so callers can move them without re-rendering.
21
+ */
22
+ export declare const collectSupportedOptionalConditionBranches: (query: SelectQuery) => SupportedOptionalConditionBranch[];
@@ -0,0 +1,265 @@
1
+ import { WhereClause } from '../models/Clause';
2
+ import { BinarySelectQuery, SimpleSelectQuery } from '../models/SelectQuery';
3
+ import { BinaryExpression, LiteralValue, ParameterExpression, ParenExpression, RawString } from '../models/ValueComponent';
4
+ import { ParameterCollector } from './ParameterCollector';
5
+ const isBinaryOperator = (expression, operator) => {
6
+ return expression instanceof BinaryExpression && expression.operator.value.trim().toLowerCase() === operator;
7
+ };
8
+ const unwrapSingleOuterParen = (expression) => {
9
+ let candidate = expression;
10
+ // Generated SQL often nests harmless wrapper parentheses, so peel them before shape matching.
11
+ while (candidate instanceof ParenExpression) {
12
+ candidate = candidate.expression;
13
+ }
14
+ return candidate;
15
+ };
16
+ const collectTopLevelAndTerms = (expression) => {
17
+ const candidate = unwrapSingleOuterParen(expression);
18
+ if (!isBinaryOperator(candidate, 'and')) {
19
+ return [expression];
20
+ }
21
+ return [
22
+ ...collectTopLevelAndTerms(candidate.left),
23
+ ...collectTopLevelAndTerms(candidate.right)
24
+ ];
25
+ };
26
+ const collectTopLevelOrTerms = (expression) => {
27
+ const candidate = unwrapSingleOuterParen(expression);
28
+ if (!isBinaryOperator(candidate, 'or')) {
29
+ return [expression];
30
+ }
31
+ return [
32
+ ...collectTopLevelOrTerms(candidate.left),
33
+ ...collectTopLevelOrTerms(candidate.right)
34
+ ];
35
+ };
36
+ const isNullLiteral = (expression) => {
37
+ return ((expression instanceof LiteralValue && expression.value === null) ||
38
+ (expression instanceof RawString && expression.value.trim().toLowerCase() === 'null'));
39
+ };
40
+ const isTrueSentinel = (expression) => {
41
+ const candidate = unwrapSingleOuterParen(expression);
42
+ if (candidate instanceof LiteralValue) {
43
+ return candidate.value === true;
44
+ }
45
+ if (!isBinaryOperator(candidate, '=')) {
46
+ return false;
47
+ }
48
+ return (candidate.left instanceof LiteralValue &&
49
+ candidate.right instanceof LiteralValue &&
50
+ candidate.left.value === 1 &&
51
+ candidate.right.value === 1);
52
+ };
53
+ const getGuardedParameterName = (expression) => {
54
+ const candidate = unwrapSingleOuterParen(expression);
55
+ if (!isBinaryOperator(candidate, 'is')) {
56
+ return null;
57
+ }
58
+ if (!(candidate.left instanceof ParameterExpression) || !isNullLiteral(candidate.right)) {
59
+ return null;
60
+ }
61
+ return candidate.left.name.value;
62
+ };
63
+ const getUniqueParameterNames = (expression) => {
64
+ return new Set(ParameterCollector.collect(expression).map(parameter => parameter.name.value));
65
+ };
66
+ const isSupportedMeaningfulBranch = (expression, parameterName) => {
67
+ const candidate = unwrapSingleOuterParen(expression);
68
+ if (candidate instanceof ParameterExpression) {
69
+ return false;
70
+ }
71
+ const parameterNames = getUniqueParameterNames(candidate);
72
+ if (parameterNames.size !== 1 || !parameterNames.has(parameterName)) {
73
+ return false;
74
+ }
75
+ // Keep the matcher conservative enough to avoid pruning tautologies or half-authored branches.
76
+ return !(candidate instanceof LiteralValue || candidate instanceof RawString);
77
+ };
78
+ const isExplicitPruningTarget = (pruningParameters, parameterName) => {
79
+ return Object.prototype.hasOwnProperty.call(pruningParameters, parameterName);
80
+ };
81
+ const isKnownAbsentTarget = (pruningParameters, parameterName) => {
82
+ if (!isExplicitPruningTarget(pruningParameters, parameterName)) {
83
+ return false;
84
+ }
85
+ const parameterValue = pruningParameters[parameterName];
86
+ return parameterValue === null || parameterValue === undefined;
87
+ };
88
+ const shouldPruneOptionalBranch = (expression, pruningParameters) => {
89
+ const branch = getSupportedOptionalConditionBranch(expression);
90
+ return branch !== null && isKnownAbsentTarget(pruningParameters, branch.parameterName);
91
+ };
92
+ const rebuildAndCondition = (terms) => {
93
+ if (terms.length === 0) {
94
+ return null;
95
+ }
96
+ let condition = terms[0];
97
+ for (let index = 1; index < terms.length; index += 1) {
98
+ condition = new BinaryExpression(condition, 'and', terms[index]);
99
+ }
100
+ return condition;
101
+ };
102
+ const pruneSimpleQueryWhereClause = (query, pruningParameters) => {
103
+ if (!query.whereClause) {
104
+ return false;
105
+ }
106
+ const topLevelTerms = collectTopLevelAndTerms(query.whereClause.condition);
107
+ const retainedTerms = [];
108
+ let prunedAnyBranch = false;
109
+ // Only top-level WHERE ... AND ... terms are eligible for pruning in this MVP.
110
+ for (const term of topLevelTerms) {
111
+ if (shouldPruneOptionalBranch(term, pruningParameters)) {
112
+ prunedAnyBranch = true;
113
+ continue;
114
+ }
115
+ retainedTerms.push(term);
116
+ }
117
+ if (!prunedAnyBranch) {
118
+ return false;
119
+ }
120
+ // Cleanup stays intentionally conservative: only drop trivially-true sentinels after pruning.
121
+ const cleanedTerms = retainedTerms.filter(term => !isTrueSentinel(term));
122
+ const rebuiltCondition = rebuildAndCondition(cleanedTerms);
123
+ query.whereClause = rebuiltCondition ? new WhereClause(rebuiltCondition) : null;
124
+ return true;
125
+ };
126
+ const isSelectQueryNode = (value) => {
127
+ return value instanceof SimpleSelectQuery || value instanceof BinarySelectQuery;
128
+ };
129
+ const traverseNestedSelectQueries = (root, pruningParameters) => {
130
+ let changed = false;
131
+ const visited = new WeakSet();
132
+ const walk = (value) => {
133
+ if (!value || typeof value !== 'object') {
134
+ return;
135
+ }
136
+ if (visited.has(value)) {
137
+ return;
138
+ }
139
+ visited.add(value);
140
+ if (value !== root && isSelectQueryNode(value)) {
141
+ changed = traverseSelectQuery(value, pruningParameters) || changed;
142
+ return;
143
+ }
144
+ if (Array.isArray(value)) {
145
+ value.forEach(walk);
146
+ return;
147
+ }
148
+ for (const child of Object.values(value)) {
149
+ walk(child);
150
+ }
151
+ };
152
+ walk(root);
153
+ return changed;
154
+ };
155
+ const traverseSelectQuery = (query, pruningParameters) => {
156
+ if (query instanceof SimpleSelectQuery) {
157
+ const selfChanged = pruneSimpleQueryWhereClause(query, pruningParameters);
158
+ const nestedChanged = traverseNestedSelectQueries(query, pruningParameters);
159
+ return selfChanged || nestedChanged;
160
+ }
161
+ if (query instanceof BinarySelectQuery) {
162
+ const leftChanged = traverseSelectQuery(query.left, pruningParameters);
163
+ const rightChanged = traverseSelectQuery(query.right, pruningParameters);
164
+ return leftChanged || rightChanged;
165
+ }
166
+ return false;
167
+ };
168
+ const getSupportedOptionalConditionBranch = (expression) => {
169
+ const orTerms = collectTopLevelOrTerms(expression);
170
+ if (orTerms.length < 2) {
171
+ return null;
172
+ }
173
+ const guardTerms = orTerms
174
+ .map(term => ({ term, parameterName: getGuardedParameterName(term) }))
175
+ .filter((candidate) => candidate.parameterName !== null);
176
+ if (guardTerms.length !== 1) {
177
+ return null;
178
+ }
179
+ const [{ term: guardTerm, parameterName }] = guardTerms;
180
+ const meaningfulTerms = orTerms.filter(term => term !== guardTerm);
181
+ if (meaningfulTerms.length === 0) {
182
+ return null;
183
+ }
184
+ if (!meaningfulTerms.every(term => isSupportedMeaningfulBranch(term, parameterName))) {
185
+ return null;
186
+ }
187
+ return {
188
+ parameterName,
189
+ kind: 'expression'
190
+ };
191
+ };
192
+ const collectSupportedBranchesFromSimpleQuery = (query, branches) => {
193
+ if (!query.whereClause) {
194
+ return;
195
+ }
196
+ const topLevelTerms = collectTopLevelAndTerms(query.whereClause.condition);
197
+ for (const term of topLevelTerms) {
198
+ const branch = getSupportedOptionalConditionBranch(term);
199
+ if (!branch) {
200
+ continue;
201
+ }
202
+ branches.push({
203
+ query,
204
+ parameterName: branch.parameterName,
205
+ expression: term,
206
+ kind: branch.kind
207
+ });
208
+ }
209
+ };
210
+ const collectSupportedBranchesFromSelectQuery = (query, branches) => {
211
+ if (query instanceof SimpleSelectQuery) {
212
+ collectSupportedBranchesFromSimpleQuery(query, branches);
213
+ traverseNestedSelectQueriesForCollection(query, branches);
214
+ return;
215
+ }
216
+ if (query instanceof BinarySelectQuery) {
217
+ collectSupportedBranchesFromSelectQuery(query.left, branches);
218
+ collectSupportedBranchesFromSelectQuery(query.right, branches);
219
+ }
220
+ };
221
+ const traverseNestedSelectQueriesForCollection = (root, branches) => {
222
+ const visited = new WeakSet();
223
+ const walk = (value) => {
224
+ if (!value || typeof value !== 'object') {
225
+ return;
226
+ }
227
+ if (visited.has(value)) {
228
+ return;
229
+ }
230
+ visited.add(value);
231
+ if (value !== root && isSelectQueryNode(value)) {
232
+ collectSupportedBranchesFromSelectQuery(value, branches);
233
+ return;
234
+ }
235
+ if (Array.isArray(value)) {
236
+ value.forEach(walk);
237
+ return;
238
+ }
239
+ for (const child of Object.values(value)) {
240
+ walk(child);
241
+ }
242
+ };
243
+ walk(root);
244
+ };
245
+ /**
246
+ * Prunes supported optional WHERE branches when an explicitly targeted parameter is absent-equivalent.
247
+ * For the MVP, only `null` and `undefined` are treated as absent and unsupported shapes remain exact no-op.
248
+ */
249
+ export const pruneOptionalConditionBranches = (query, pruningParameters) => {
250
+ if (Object.keys(pruningParameters).length === 0) {
251
+ return query;
252
+ }
253
+ traverseSelectQuery(query, pruningParameters);
254
+ return query;
255
+ };
256
+ /**
257
+ * Collects supported top-level optional condition branches from the query graph.
258
+ * The returned branch expressions keep object identity so callers can move them without re-rendering.
259
+ */
260
+ export const collectSupportedOptionalConditionBranches = (query) => {
261
+ const branches = [];
262
+ collectSupportedBranchesFromSelectQuery(query, branches);
263
+ return branches;
264
+ };
265
+ //# sourceMappingURL=PruneOptionalConditionBranches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PruneOptionalConditionBranches.js","sourceRoot":"","sources":["../../../src/transformers/PruneOptionalConditionBranches.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { SelectQuery } from "../models/SelectQuery";
2
+ import { type SupportedOptionalConditionBranch } from "./PruneOptionalConditionBranches";
3
+ export type SSSQLFilterValue = unknown;
4
+ export type SSSQLFilterInput = Record<string, SSSQLFilterValue>;
5
+ export type SssqlScaffoldFilters = SSSQLFilterInput;
6
+ export interface SssqlTransformResult {
7
+ query: SelectQuery;
8
+ }
9
+ /**
10
+ * Builds and refreshes truthful SSSQL optional filter branches.
11
+ * Runtime callers should use pruning, not dynamic predicate injection.
12
+ */
13
+ export declare class SSSQLFilterBuilder {
14
+ private readonly tableColumnResolver?;
15
+ private readonly finder;
16
+ constructor(tableColumnResolver?: ((tableName: string) => string[]) | undefined);
17
+ scaffold(query: SelectQuery | string, filters: SSSQLFilterInput): SelectQuery;
18
+ refresh(query: SelectQuery | string, filters: SSSQLFilterInput): SelectQuery;
19
+ private parseQuery;
20
+ private resolveTarget;
21
+ private resolveTargetInQuery;
22
+ private resolveQualifiedTarget;
23
+ private resolveUnqualifiedTarget;
24
+ private findAliasForTable;
25
+ private resolveAliasForSource;
26
+ private rebaseMovedBranch;
27
+ }
28
+ export type { SupportedOptionalConditionBranch };
29
+ export declare const scaffoldSssqlQuery: (sqlContent: string, filters: SssqlScaffoldFilters) => SssqlTransformResult;
30
+ export declare const refreshSssqlQuery: (sqlContent: string, filters: SssqlScaffoldFilters) => SssqlTransformResult;
@@ -0,0 +1,253 @@
1
+ import { WhereClause, TableSource } from "../models/Clause";
2
+ import { BinaryExpression, ColumnReference, IdentifierString, LiteralValue, ParameterExpression, ParenExpression } from "../models/ValueComponent";
3
+ import { SelectQueryParser } from "../parsers/SelectQueryParser";
4
+ import { UpstreamSelectQueryFinder } from "./UpstreamSelectQueryFinder";
5
+ import { SelectableColumnCollector, DuplicateDetectionMode } from "./SelectableColumnCollector";
6
+ import { ColumnReferenceCollector } from "./ColumnReferenceCollector";
7
+ import { collectSupportedOptionalConditionBranches } from "./PruneOptionalConditionBranches";
8
+ const normalizeIdentifier = (value) => value.trim().toLowerCase();
9
+ const normalizeColumnReferenceKey = (reference) => {
10
+ return `${normalizeIdentifier(reference.getNamespace())}.${normalizeIdentifier(reference.column.name)}`;
11
+ };
12
+ const isExplicitEqualityScaffoldValue = (value) => {
13
+ var _a;
14
+ if (value === null || value === undefined) {
15
+ return true;
16
+ }
17
+ if (Array.isArray(value)) {
18
+ return false;
19
+ }
20
+ if (typeof value !== "object") {
21
+ return true;
22
+ }
23
+ const entries = Object.entries(value).filter(([, entry]) => entry !== undefined);
24
+ return entries.length === 1 && ((_a = entries[0]) === null || _a === void 0 ? void 0 : _a[0]) === "=";
25
+ };
26
+ const parseQualifiedFilterName = (filterName) => {
27
+ const segments = filterName.split(".");
28
+ if (segments.length !== 2) {
29
+ return null;
30
+ }
31
+ const [table, column] = segments.map(segment => segment.trim());
32
+ if (!table || !column) {
33
+ return null;
34
+ }
35
+ return { table, column };
36
+ };
37
+ const makeParameterName = (filterName) => {
38
+ return filterName
39
+ .trim()
40
+ .replace(/\./g, "_")
41
+ .replace(/[^a-zA-Z0-9_]/g, "_");
42
+ };
43
+ const buildOptionalEqualityBranch = (column, parameterName) => {
44
+ const parameter = new ParameterExpression(parameterName);
45
+ const guard = new BinaryExpression(new ParameterExpression(parameterName), "is", new LiteralValue(null));
46
+ const equality = new BinaryExpression(new ColumnReference(column.getNamespace() || null, column.column.name), "=", parameter);
47
+ return new ParenExpression(new BinaryExpression(guard, "or", equality));
48
+ };
49
+ const rebuildWhereWithoutTerm = (query, termToRemove) => {
50
+ if (!query.whereClause) {
51
+ return;
52
+ }
53
+ const collectTopLevelAndTerms = (expression) => {
54
+ if (expression instanceof BinaryExpression &&
55
+ expression.operator.value.trim().toLowerCase() === "and") {
56
+ return [
57
+ ...collectTopLevelAndTerms(expression.left),
58
+ ...collectTopLevelAndTerms(expression.right)
59
+ ];
60
+ }
61
+ return [expression];
62
+ };
63
+ const terms = collectTopLevelAndTerms(query.whereClause.condition).filter(term => term !== termToRemove);
64
+ if (terms.length === 0) {
65
+ query.whereClause = null;
66
+ return;
67
+ }
68
+ let rebuilt = terms[0];
69
+ for (let index = 1; index < terms.length; index += 1) {
70
+ rebuilt = new BinaryExpression(rebuilt, "and", terms[index]);
71
+ }
72
+ query.whereClause = new WhereClause(rebuilt);
73
+ };
74
+ /**
75
+ * Builds and refreshes truthful SSSQL optional filter branches.
76
+ * Runtime callers should use pruning, not dynamic predicate injection.
77
+ */
78
+ export class SSSQLFilterBuilder {
79
+ constructor(tableColumnResolver) {
80
+ this.tableColumnResolver = tableColumnResolver;
81
+ this.finder = new UpstreamSelectQueryFinder(this.tableColumnResolver);
82
+ }
83
+ scaffold(query, filters) {
84
+ const parsed = this.parseQuery(query);
85
+ for (const [filterName, filterValue] of Object.entries(filters)) {
86
+ if (!isExplicitEqualityScaffoldValue(filterValue)) {
87
+ throw new Error(`SSSQL scaffold only supports equality filters in v1. Use refresh for pre-authored branches: '${filterName}'.`);
88
+ }
89
+ const target = this.resolveTarget(parsed, filterName);
90
+ target.query.appendWhere(buildOptionalEqualityBranch(target.column, target.parameterName));
91
+ }
92
+ return parsed;
93
+ }
94
+ refresh(query, filters) {
95
+ const parsed = this.parseQuery(query);
96
+ for (const [filterName, filterValue] of Object.entries(filters)) {
97
+ const target = this.resolveTarget(parsed, filterName);
98
+ const matches = collectSupportedOptionalConditionBranches(parsed)
99
+ .filter(branch => branch.parameterName === target.parameterName);
100
+ if (matches.length === 0) {
101
+ if (!isExplicitEqualityScaffoldValue(filterValue)) {
102
+ throw new Error(`No existing SSSQL branch was found for '${filterName}', and v1 scaffold only supports equality filters.`);
103
+ }
104
+ target.query.appendWhere(buildOptionalEqualityBranch(target.column, target.parameterName));
105
+ continue;
106
+ }
107
+ if (matches.length > 1) {
108
+ throw new Error(`Multiple SSSQL branches matched parameter ':${target.parameterName}'. Refresh is ambiguous.`);
109
+ }
110
+ const [match] = matches;
111
+ if (!match) {
112
+ continue;
113
+ }
114
+ if (match.query === target.query) {
115
+ continue;
116
+ }
117
+ this.rebaseMovedBranch(match.expression, match.query, target.column);
118
+ rebuildWhereWithoutTerm(match.query, match.expression);
119
+ target.query.appendWhere(match.expression);
120
+ }
121
+ return parsed;
122
+ }
123
+ parseQuery(query) {
124
+ return typeof query === "string" ? SelectQueryParser.parse(query) : query;
125
+ }
126
+ resolveTarget(root, filterName) {
127
+ var _a;
128
+ const qualified = parseQualifiedFilterName(filterName);
129
+ const lookupColumn = (_a = qualified === null || qualified === void 0 ? void 0 : qualified.column) !== null && _a !== void 0 ? _a : filterName.trim();
130
+ const candidateQueries = [...new Set(this.finder.find(root, lookupColumn))];
131
+ const matches = candidateQueries
132
+ .map(query => this.resolveTargetInQuery(query, filterName, qualified))
133
+ .filter((target) => target !== null);
134
+ if (matches.length === 0) {
135
+ throw new Error(`Could not resolve SSSQL filter target '${filterName}' in the current query graph.`);
136
+ }
137
+ if (matches.length > 1) {
138
+ throw new Error(`SSSQL filter target '${filterName}' is ambiguous across multiple query scopes.`);
139
+ }
140
+ return matches[0];
141
+ }
142
+ resolveTargetInQuery(query, filterName, qualified) {
143
+ if (qualified) {
144
+ return this.resolveQualifiedTarget(query, qualified);
145
+ }
146
+ return this.resolveUnqualifiedTarget(query, filterName);
147
+ }
148
+ resolveQualifiedTarget(query, filterName) {
149
+ const alias = this.findAliasForTable(query, filterName.table);
150
+ if (!alias) {
151
+ return null;
152
+ }
153
+ const collector = new SelectableColumnCollector(this.tableColumnResolver, false, DuplicateDetectionMode.FullName, { upstream: true });
154
+ const matches = collector.collect(query)
155
+ .filter((entry) => entry.value instanceof ColumnReference)
156
+ .filter(entry => normalizeColumnReferenceKey(entry.value) === `${normalizeIdentifier(alias)}.${normalizeIdentifier(filterName.column)}`);
157
+ if (matches.length === 0) {
158
+ return null;
159
+ }
160
+ if (matches.length > 1) {
161
+ throw new Error(`SSSQL scaffold target '${filterName.table}.${filterName.column}' resolved to multiple columns.`);
162
+ }
163
+ return {
164
+ query,
165
+ column: matches[0].value,
166
+ parameterName: makeParameterName(`${filterName.table}.${filterName.column}`)
167
+ };
168
+ }
169
+ resolveUnqualifiedTarget(query, filterName) {
170
+ const collector = new SelectableColumnCollector(this.tableColumnResolver, false, DuplicateDetectionMode.FullName, { upstream: true });
171
+ const matches = collector.collect(query)
172
+ .filter((entry) => entry.value instanceof ColumnReference)
173
+ .filter(entry => normalizeIdentifier(entry.name) === normalizeIdentifier(filterName));
174
+ if (matches.length === 0) {
175
+ return null;
176
+ }
177
+ if (matches.length > 1) {
178
+ throw new Error(`SSSQL scaffold target '${filterName}' is ambiguous. Use a qualified table.column reference.`);
179
+ }
180
+ return {
181
+ query,
182
+ column: matches[0].value,
183
+ parameterName: makeParameterName(filterName)
184
+ };
185
+ }
186
+ findAliasForTable(query, tableName) {
187
+ var _a, _b;
188
+ const normalizedTable = normalizeIdentifier(tableName);
189
+ const sources = (_b = (_a = query.fromClause) === null || _a === void 0 ? void 0 : _a.getSources()) !== null && _b !== void 0 ? _b : [];
190
+ const matchingAliases = sources
191
+ .map(source => this.resolveAliasForSource(source, normalizedTable))
192
+ .filter((alias) => alias !== null);
193
+ if (matchingAliases.length === 0) {
194
+ return null;
195
+ }
196
+ if (matchingAliases.length > 1) {
197
+ throw new Error(`SSSQL scaffold target table '${tableName}' is ambiguous in the selected query scope.`);
198
+ }
199
+ return matchingAliases[0];
200
+ }
201
+ resolveAliasForSource(source, normalizedTable) {
202
+ var _a;
203
+ if (!(source.datasource instanceof TableSource)) {
204
+ return null;
205
+ }
206
+ const sourceName = normalizeIdentifier(source.datasource.getSourceName());
207
+ const shortName = normalizeIdentifier(source.datasource.table.name);
208
+ if (sourceName !== normalizedTable && shortName !== normalizedTable) {
209
+ return null;
210
+ }
211
+ return (_a = source.getAliasName()) !== null && _a !== void 0 ? _a : source.datasource.table.name;
212
+ }
213
+ rebaseMovedBranch(expression, sourceQuery, targetColumn) {
214
+ var _a, _b, _c;
215
+ const targetNamespace = targetColumn.qualifiedName.namespaces
216
+ ? targetColumn.qualifiedName.namespaces.map(namespace => namespace.name)
217
+ : null;
218
+ const targetColumnName = normalizeIdentifier(targetColumn.column.name);
219
+ const sourceAliases = new Set(new ColumnReferenceCollector()
220
+ .collect(expression)
221
+ .filter(reference => normalizeIdentifier(reference.column.name) === targetColumnName)
222
+ .map(reference => normalizeIdentifier(reference.getNamespace()))
223
+ .filter(namespace => namespace.length > 0));
224
+ if (sourceAliases.size === 0) {
225
+ return;
226
+ }
227
+ if (sourceAliases.size > 1) {
228
+ const aliases = [...sourceAliases].join(", ");
229
+ throw new Error(`SSSQL refresh cannot safely rebase '${targetColumn.column.name}' across multiple aliases (${aliases}).`);
230
+ }
231
+ const [sourceAlias] = [...sourceAliases];
232
+ const availableAliases = new Set(((_b = (_a = sourceQuery.fromClause) === null || _a === void 0 ? void 0 : _a.getSources()) !== null && _b !== void 0 ? _b : [])
233
+ .map(source => source.getAliasName())
234
+ .filter((alias) => typeof alias === "string")
235
+ .map(alias => normalizeIdentifier(alias)));
236
+ if (!availableAliases.has(sourceAlias)) {
237
+ return;
238
+ }
239
+ for (const reference of new ColumnReferenceCollector().collect(expression)) {
240
+ if (normalizeIdentifier(reference.getNamespace()) !== sourceAlias) {
241
+ continue;
242
+ }
243
+ reference.qualifiedName.namespaces = (_c = targetNamespace === null || targetNamespace === void 0 ? void 0 : targetNamespace.map(namespace => new IdentifierString(namespace))) !== null && _c !== void 0 ? _c : null;
244
+ }
245
+ }
246
+ }
247
+ export const scaffoldSssqlQuery = (sqlContent, filters) => ({
248
+ query: new SSSQLFilterBuilder().scaffold(sqlContent, filters)
249
+ });
250
+ export const refreshSssqlQuery = (sqlContent, filters) => ({
251
+ query: new SSSQLFilterBuilder().refresh(sqlContent, filters)
252
+ });
253
+ //# sourceMappingURL=SSSQLFilterBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SSSQLFilterBuilder.js","sourceRoot":"","sources":["../../../src/transformers/SSSQLFilterBuilder.ts"],"names":[],"mappings":"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"}
@@ -95,4 +95,7 @@ export declare class SchemaCollector implements SqlComponentVisitor<void> {
95
95
  private resolveTableWildcard;
96
96
  private extractColumnsUsingCollector;
97
97
  private removeDuplicates;
98
+ private extractColumnsFromReturning;
99
+ private extractSelectItemName;
100
+ private isSelectQuery;
98
101
  }