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