rawsql-ts 0.12.0 → 0.13.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 (537) hide show
  1. package/LICENSE +21 -0
  2. package/dist/esm/index.js +11 -0
  3. package/dist/esm/index.js.map +1 -1
  4. package/dist/esm/index.min.js +16 -16
  5. package/dist/esm/index.min.js.map +3 -3
  6. package/dist/esm/src/index.d.ts +12 -0
  7. package/dist/esm/src/index.js +11 -0
  8. package/dist/esm/src/index.js.map +1 -1
  9. package/dist/esm/src/models/Clause.d.ts +7 -3
  10. package/dist/esm/src/models/Clause.js +17 -4
  11. package/dist/esm/src/models/Clause.js.map +1 -1
  12. package/dist/esm/src/models/DDLStatements.d.ts +14 -2
  13. package/dist/esm/src/models/DDLStatements.js +12 -0
  14. package/dist/esm/src/models/DDLStatements.js.map +1 -1
  15. package/dist/esm/src/models/InsertQuery.d.ts +1 -4
  16. package/dist/esm/src/models/InsertQuery.js +3 -5
  17. package/dist/esm/src/models/InsertQuery.js.map +1 -1
  18. package/dist/esm/src/models/SqlPrintToken.d.ts +1 -0
  19. package/dist/esm/src/models/SqlPrintToken.js +1 -0
  20. package/dist/esm/src/models/SqlPrintToken.js.map +1 -1
  21. package/dist/esm/src/models/TableDefinitionModel.d.ts +39 -0
  22. package/dist/esm/src/models/TableDefinitionModel.js +77 -0
  23. package/dist/esm/src/models/TableDefinitionModel.js.map +1 -0
  24. package/dist/esm/src/models/ValuesQuery.d.ts +2 -0
  25. package/dist/esm/src/models/ValuesQuery.js +1 -0
  26. package/dist/esm/src/models/ValuesQuery.js.map +1 -1
  27. package/dist/esm/src/parsers/AlterTableParser.js +1 -1
  28. package/dist/esm/src/parsers/AlterTableParser.js.map +1 -1
  29. package/dist/esm/src/parsers/InsertQueryParser.js +4 -1
  30. package/dist/esm/src/parsers/InsertQueryParser.js.map +1 -1
  31. package/dist/esm/src/parsers/ReturningClauseParser.js +33 -47
  32. package/dist/esm/src/parsers/ReturningClauseParser.js.map +1 -1
  33. package/dist/esm/src/parsers/SqlParser.d.ts +0 -1
  34. package/dist/esm/src/parsers/SqlParser.js +44 -58
  35. package/dist/esm/src/parsers/SqlParser.js.map +1 -1
  36. package/dist/esm/src/parsers/SqlPrintTokenParser.d.ts +1 -0
  37. package/dist/esm/src/parsers/SqlPrintTokenParser.js +23 -5
  38. package/dist/esm/src/parsers/SqlPrintTokenParser.js.map +1 -1
  39. package/dist/esm/src/tokenReaders/LiteralTokenReader.js +7 -0
  40. package/dist/esm/src/tokenReaders/LiteralTokenReader.js.map +1 -1
  41. package/dist/esm/src/transformers/DDLDiffGenerator.d.ts +14 -0
  42. package/dist/esm/src/transformers/DDLDiffGenerator.js +197 -0
  43. package/dist/esm/src/transformers/DDLDiffGenerator.js.map +1 -0
  44. package/dist/esm/src/transformers/DDLGeneralizer.d.ts +13 -0
  45. package/dist/esm/src/transformers/DDLGeneralizer.js +98 -0
  46. package/dist/esm/src/transformers/DDLGeneralizer.js.map +1 -0
  47. package/dist/esm/src/transformers/DDLToFixtureConverter.d.ts +19 -0
  48. package/dist/esm/src/transformers/DDLToFixtureConverter.js +202 -0
  49. package/dist/esm/src/transformers/DDLToFixtureConverter.js.map +1 -0
  50. package/dist/esm/src/transformers/DeleteResultSelectConverter.d.ts +53 -0
  51. package/dist/esm/src/transformers/DeleteResultSelectConverter.js +394 -0
  52. package/dist/esm/src/transformers/DeleteResultSelectConverter.js.map +1 -0
  53. package/dist/esm/src/transformers/FixtureCteBuilder.d.ts +60 -0
  54. package/dist/esm/src/transformers/FixtureCteBuilder.js +147 -0
  55. package/dist/esm/src/transformers/FixtureCteBuilder.js.map +1 -0
  56. package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js +5 -2
  57. package/dist/esm/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -1
  58. package/dist/esm/src/transformers/InsertResultSelectConverter.d.ts +64 -0
  59. package/dist/esm/src/transformers/InsertResultSelectConverter.js +495 -0
  60. package/dist/esm/src/transformers/InsertResultSelectConverter.js.map +1 -0
  61. package/dist/esm/src/transformers/MergeResultSelectConverter.d.ts +38 -0
  62. package/dist/esm/src/transformers/MergeResultSelectConverter.js +306 -0
  63. package/dist/esm/src/transformers/MergeResultSelectConverter.js.map +1 -0
  64. package/dist/esm/src/transformers/QueryBuilder.d.ts +11 -0
  65. package/dist/esm/src/transformers/QueryBuilder.js +19 -3
  66. package/dist/esm/src/transformers/QueryBuilder.js.map +1 -1
  67. package/dist/esm/src/transformers/SelectResultSelectConverter.d.ts +10 -0
  68. package/dist/esm/src/transformers/SelectResultSelectConverter.js +32 -0
  69. package/dist/esm/src/transformers/SelectResultSelectConverter.js.map +1 -0
  70. package/dist/esm/src/transformers/SimulatedSelectConverter.d.ts +23 -0
  71. package/dist/esm/src/transformers/SimulatedSelectConverter.js +61 -0
  72. package/dist/esm/src/transformers/SimulatedSelectConverter.js.map +1 -0
  73. package/dist/esm/src/transformers/UpdateResultSelectConverter.d.ts +51 -0
  74. package/dist/esm/src/transformers/UpdateResultSelectConverter.js +340 -0
  75. package/dist/esm/src/transformers/UpdateResultSelectConverter.js.map +1 -0
  76. package/dist/esm/src/utils/SelectQueryWithClauseHelper.d.ts +12 -0
  77. package/dist/esm/src/utils/SelectQueryWithClauseHelper.js +43 -0
  78. package/dist/esm/src/utils/SelectQueryWithClauseHelper.js.map +1 -0
  79. package/dist/esm/src/utils/ValueComponentRewriter.d.ts +3 -0
  80. package/dist/esm/src/utils/ValueComponentRewriter.js +180 -0
  81. package/dist/esm/src/utils/ValueComponentRewriter.js.map +1 -0
  82. package/dist/esm/tsconfig.browser.tsbuildinfo +1 -1
  83. package/dist/formatters/OriginalFormatRestorer.js +139 -0
  84. package/dist/formatters/OriginalFormatRestorer.js.map +1 -0
  85. package/dist/index.js +144 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/index.min.js +17 -17
  88. package/dist/index.min.js.map +3 -3
  89. package/dist/models/BinarySelectQuery.js +198 -0
  90. package/dist/models/BinarySelectQuery.js.map +1 -0
  91. package/dist/models/CTEError.js +37 -0
  92. package/dist/models/CTEError.js.map +1 -0
  93. package/dist/models/Clause.js +535 -0
  94. package/dist/models/Clause.js.map +1 -0
  95. package/dist/models/CreateTableQuery.js +135 -0
  96. package/dist/models/CreateTableQuery.js.map +1 -0
  97. package/dist/models/DDLStatements.js +275 -0
  98. package/dist/models/DDLStatements.js.map +1 -0
  99. package/dist/models/DeleteQuery.js +20 -0
  100. package/dist/models/DeleteQuery.js.map +1 -0
  101. package/dist/models/FormattingLexeme.js +3 -0
  102. package/dist/models/FormattingLexeme.js.map +1 -0
  103. package/dist/models/HintClause.js +41 -0
  104. package/dist/models/HintClause.js.map +1 -0
  105. package/dist/models/InsertQuery.js +23 -0
  106. package/dist/models/InsertQuery.js.map +1 -0
  107. package/dist/models/KeywordTrie.js +54 -0
  108. package/dist/models/KeywordTrie.js.map +1 -0
  109. package/dist/models/Lexeme.js +22 -0
  110. package/dist/models/Lexeme.js.map +1 -0
  111. package/dist/models/MergeQuery.js +104 -0
  112. package/dist/models/MergeQuery.js.map +1 -0
  113. package/dist/models/SelectQuery.js +22 -0
  114. package/dist/models/SelectQuery.js.map +1 -0
  115. package/dist/models/SimpleSelectQuery.js +648 -0
  116. package/dist/models/SimpleSelectQuery.js.map +1 -0
  117. package/dist/models/SqlComponent.js +73 -0
  118. package/dist/models/SqlComponent.js.map +1 -0
  119. package/dist/models/SqlPrintToken.js +143 -0
  120. package/dist/models/SqlPrintToken.js.map +1 -0
  121. package/dist/models/TableDefinitionModel.js +86 -0
  122. package/dist/models/TableDefinitionModel.js.map +1 -0
  123. package/dist/models/UpdateQuery.js +29 -0
  124. package/dist/models/UpdateQuery.js.map +1 -0
  125. package/dist/models/ValueComponent.js +380 -0
  126. package/dist/models/ValueComponent.js.map +1 -0
  127. package/dist/models/ValuesQuery.js +62 -0
  128. package/dist/models/ValuesQuery.js.map +1 -0
  129. package/dist/parsers/AlterTableParser.js +490 -0
  130. package/dist/parsers/AlterTableParser.js.map +1 -0
  131. package/dist/parsers/AnalyzeStatementParser.js +94 -0
  132. package/dist/parsers/AnalyzeStatementParser.js.map +1 -0
  133. package/dist/parsers/CommandExpressionParser.js +213 -0
  134. package/dist/parsers/CommandExpressionParser.js.map +1 -0
  135. package/dist/parsers/CommonTableParser.js +177 -0
  136. package/dist/parsers/CommonTableParser.js.map +1 -0
  137. package/dist/parsers/CreateIndexParser.js +241 -0
  138. package/dist/parsers/CreateIndexParser.js.map +1 -0
  139. package/dist/parsers/CreateTableParser.js +738 -0
  140. package/dist/parsers/CreateTableParser.js.map +1 -0
  141. package/dist/parsers/DeleteClauseParser.js +37 -0
  142. package/dist/parsers/DeleteClauseParser.js.map +1 -0
  143. package/dist/parsers/DeleteQueryParser.js +77 -0
  144. package/dist/parsers/DeleteQueryParser.js.map +1 -0
  145. package/dist/parsers/DropConstraintParser.js +51 -0
  146. package/dist/parsers/DropConstraintParser.js.map +1 -0
  147. package/dist/parsers/DropIndexParser.js +73 -0
  148. package/dist/parsers/DropIndexParser.js.map +1 -0
  149. package/dist/parsers/DropTableParser.js +63 -0
  150. package/dist/parsers/DropTableParser.js.map +1 -0
  151. package/dist/parsers/ExplainStatementParser.js +189 -0
  152. package/dist/parsers/ExplainStatementParser.js.map +1 -0
  153. package/dist/parsers/FetchClauseParser.js +89 -0
  154. package/dist/parsers/FetchClauseParser.js.map +1 -0
  155. package/dist/parsers/ForClauseParser.js +58 -0
  156. package/dist/parsers/ForClauseParser.js.map +1 -0
  157. package/dist/parsers/FromClauseParser.js +54 -0
  158. package/dist/parsers/FromClauseParser.js.map +1 -0
  159. package/dist/parsers/FullNameParser.js +110 -0
  160. package/dist/parsers/FullNameParser.js.map +1 -0
  161. package/dist/parsers/FunctionExpressionParser.js +524 -0
  162. package/dist/parsers/FunctionExpressionParser.js.map +1 -0
  163. package/dist/parsers/GroupByParser.js +58 -0
  164. package/dist/parsers/GroupByParser.js.map +1 -0
  165. package/dist/parsers/HavingParser.js +36 -0
  166. package/dist/parsers/HavingParser.js.map +1 -0
  167. package/dist/parsers/IdentifierDecorator.js +17 -0
  168. package/dist/parsers/IdentifierDecorator.js.map +1 -0
  169. package/dist/parsers/IdentifierParser.js +15 -0
  170. package/dist/parsers/IdentifierParser.js.map +1 -0
  171. package/dist/parsers/InsertQueryParser.js +162 -0
  172. package/dist/parsers/InsertQueryParser.js.map +1 -0
  173. package/dist/parsers/JoinClauseParser.js +117 -0
  174. package/dist/parsers/JoinClauseParser.js.map +1 -0
  175. package/dist/parsers/JoinOnClauseParser.js +21 -0
  176. package/dist/parsers/JoinOnClauseParser.js.map +1 -0
  177. package/dist/parsers/JoinUsingClauseParser.js +23 -0
  178. package/dist/parsers/JoinUsingClauseParser.js.map +1 -0
  179. package/dist/parsers/KeywordParser.js +99 -0
  180. package/dist/parsers/KeywordParser.js.map +1 -0
  181. package/dist/parsers/LimitClauseParser.js +38 -0
  182. package/dist/parsers/LimitClauseParser.js.map +1 -0
  183. package/dist/parsers/LiteralParser.js +48 -0
  184. package/dist/parsers/LiteralParser.js.map +1 -0
  185. package/dist/parsers/MergeQueryParser.js +483 -0
  186. package/dist/parsers/MergeQueryParser.js.map +1 -0
  187. package/dist/parsers/OffsetClauseParser.js +42 -0
  188. package/dist/parsers/OffsetClauseParser.js.map +1 -0
  189. package/dist/parsers/OrderByClauseParser.js +108 -0
  190. package/dist/parsers/OrderByClauseParser.js.map +1 -0
  191. package/dist/parsers/OverExpressionParser.js +44 -0
  192. package/dist/parsers/OverExpressionParser.js.map +1 -0
  193. package/dist/parsers/ParameterDecorator.js +40 -0
  194. package/dist/parsers/ParameterDecorator.js.map +1 -0
  195. package/dist/parsers/ParameterExpressionParser.js +24 -0
  196. package/dist/parsers/ParameterExpressionParser.js.map +1 -0
  197. package/dist/parsers/ParenExpressionParser.js +109 -0
  198. package/dist/parsers/ParenExpressionParser.js.map +1 -0
  199. package/dist/parsers/ParseError.js +25 -0
  200. package/dist/parsers/ParseError.js.map +1 -0
  201. package/dist/parsers/PartitionByParser.js +53 -0
  202. package/dist/parsers/PartitionByParser.js.map +1 -0
  203. package/dist/parsers/ReturningClauseParser.js +64 -0
  204. package/dist/parsers/ReturningClauseParser.js.map +1 -0
  205. package/dist/parsers/SelectClauseParser.js +244 -0
  206. package/dist/parsers/SelectClauseParser.js.map +1 -0
  207. package/dist/parsers/SelectQueryParser.js +564 -0
  208. package/dist/parsers/SelectQueryParser.js.map +1 -0
  209. package/dist/parsers/SequenceParser.js +245 -0
  210. package/dist/parsers/SequenceParser.js.map +1 -0
  211. package/dist/parsers/SetClauseParser.js +125 -0
  212. package/dist/parsers/SetClauseParser.js.map +1 -0
  213. package/dist/parsers/SourceAliasExpressionParser.js +60 -0
  214. package/dist/parsers/SourceAliasExpressionParser.js.map +1 -0
  215. package/dist/parsers/SourceExpressionParser.js +69 -0
  216. package/dist/parsers/SourceExpressionParser.js.map +1 -0
  217. package/dist/parsers/SourceParser.js +144 -0
  218. package/dist/parsers/SourceParser.js.map +1 -0
  219. package/dist/parsers/SqlParser.js +431 -0
  220. package/dist/parsers/SqlParser.js.map +1 -0
  221. package/dist/parsers/SqlPrintTokenParser.js +3289 -0
  222. package/dist/parsers/SqlPrintTokenParser.js.map +1 -0
  223. package/dist/parsers/SqlTokenizer.js +553 -0
  224. package/dist/parsers/SqlTokenizer.js.map +1 -0
  225. package/dist/parsers/StringSpecifierExpressionParser.js +22 -0
  226. package/dist/parsers/StringSpecifierExpressionParser.js.map +1 -0
  227. package/dist/parsers/UnaryExpressionParser.js +39 -0
  228. package/dist/parsers/UnaryExpressionParser.js.map +1 -0
  229. package/dist/parsers/UpdateClauseParser.js +21 -0
  230. package/dist/parsers/UpdateClauseParser.js.map +1 -0
  231. package/dist/parsers/UpdateQueryParser.js +98 -0
  232. package/dist/parsers/UpdateQueryParser.js.map +1 -0
  233. package/dist/parsers/UsingClauseParser.js +33 -0
  234. package/dist/parsers/UsingClauseParser.js.map +1 -0
  235. package/dist/parsers/ValueParser.js +562 -0
  236. package/dist/parsers/ValueParser.js.map +1 -0
  237. package/dist/parsers/ValuesQueryParser.js +112 -0
  238. package/dist/parsers/ValuesQueryParser.js.map +1 -0
  239. package/dist/parsers/WhereClauseParser.js +51 -0
  240. package/dist/parsers/WhereClauseParser.js.map +1 -0
  241. package/dist/parsers/WindowClauseParser.js +57 -0
  242. package/dist/parsers/WindowClauseParser.js.map +1 -0
  243. package/dist/parsers/WindowExpressionParser.js +163 -0
  244. package/dist/parsers/WindowExpressionParser.js.map +1 -0
  245. package/dist/parsers/WithClauseParser.js +165 -0
  246. package/dist/parsers/WithClauseParser.js.map +1 -0
  247. package/dist/parsers/utils/LexemeCommentUtils.js +29 -0
  248. package/dist/parsers/utils/LexemeCommentUtils.js.map +1 -0
  249. package/dist/reporting/models/DataFlowEdge.js +58 -0
  250. package/dist/reporting/models/DataFlowEdge.js.map +1 -0
  251. package/dist/reporting/models/DataFlowGraph.js +138 -0
  252. package/dist/reporting/models/DataFlowGraph.js.map +1 -0
  253. package/dist/reporting/models/DataFlowNode.js +148 -0
  254. package/dist/reporting/models/DataFlowNode.js.map +1 -0
  255. package/dist/reporting/services/CTEHandler.js +58 -0
  256. package/dist/reporting/services/CTEHandler.js.map +1 -0
  257. package/dist/reporting/services/DataSourceHandler.js +95 -0
  258. package/dist/reporting/services/DataSourceHandler.js.map +1 -0
  259. package/dist/reporting/services/JoinHandler.js +84 -0
  260. package/dist/reporting/services/JoinHandler.js.map +1 -0
  261. package/dist/reporting/services/ProcessHandler.js +26 -0
  262. package/dist/reporting/services/ProcessHandler.js.map +1 -0
  263. package/dist/src/index.d.ts +15 -0
  264. package/dist/src/index.js +13 -1
  265. package/dist/src/index.js.map +1 -1
  266. package/dist/src/models/Clause.d.ts +7 -3
  267. package/dist/src/models/Clause.js +16 -3
  268. package/dist/src/models/Clause.js.map +1 -1
  269. package/dist/src/models/DDLStatements.d.ts +97 -2
  270. package/dist/src/models/DDLStatements.js +14 -1
  271. package/dist/src/models/DDLStatements.js.map +1 -1
  272. package/dist/src/models/InsertQuery.d.ts +1 -4
  273. package/dist/src/models/InsertQuery.js +3 -5
  274. package/dist/src/models/InsertQuery.js.map +1 -1
  275. package/dist/src/models/SqlPrintToken.d.ts +6 -0
  276. package/dist/src/models/SqlPrintToken.js +1 -0
  277. package/dist/src/models/SqlPrintToken.js.map +1 -1
  278. package/dist/src/models/TableDefinitionModel.d.ts +41 -0
  279. package/dist/src/models/TableDefinitionModel.js +85 -0
  280. package/dist/src/models/TableDefinitionModel.js.map +1 -0
  281. package/dist/src/models/ValueComponent.d.ts +2 -1
  282. package/dist/src/models/ValuesQuery.d.ts +2 -0
  283. package/dist/src/models/ValuesQuery.js +1 -0
  284. package/dist/src/models/ValuesQuery.js.map +1 -1
  285. package/dist/src/parsers/AlterTableParser.d.ts +1 -0
  286. package/dist/src/parsers/AlterTableParser.js +26 -5
  287. package/dist/src/parsers/AlterTableParser.js.map +1 -1
  288. package/dist/src/parsers/FunctionExpressionParser.d.ts +1 -0
  289. package/dist/src/parsers/InsertQueryParser.js +4 -1
  290. package/dist/src/parsers/InsertQueryParser.js.map +1 -1
  291. package/dist/src/parsers/ReturningClauseParser.js +33 -47
  292. package/dist/src/parsers/ReturningClauseParser.js.map +1 -1
  293. package/dist/src/parsers/SequenceParser.d.ts +16 -0
  294. package/dist/src/parsers/SqlParser.d.ts +4 -3
  295. package/dist/src/parsers/SqlParser.js +44 -63
  296. package/dist/src/parsers/SqlParser.js.map +1 -1
  297. package/dist/src/parsers/SqlPrintTokenParser.d.ts +9 -0
  298. package/dist/src/parsers/SqlPrintTokenParser.js +22 -4
  299. package/dist/src/parsers/SqlPrintTokenParser.js.map +1 -1
  300. package/dist/src/parsers/SqlTokenizer.d.ts +1 -0
  301. package/dist/src/tokenReaders/LiteralTokenReader.js +7 -0
  302. package/dist/src/tokenReaders/LiteralTokenReader.js.map +1 -1
  303. package/dist/src/transformers/DDLDiffGenerator.d.ts +18 -0
  304. package/dist/src/transformers/DDLDiffGenerator.js +313 -0
  305. package/dist/src/transformers/DDLDiffGenerator.js.map +1 -0
  306. package/dist/src/transformers/DDLGeneralizer.d.ts +13 -0
  307. package/dist/src/transformers/DDLGeneralizer.js +119 -0
  308. package/dist/src/transformers/DDLGeneralizer.js.map +1 -0
  309. package/dist/src/transformers/DDLToFixtureConverter.d.ts +19 -0
  310. package/dist/src/transformers/DDLToFixtureConverter.js +206 -0
  311. package/dist/src/transformers/DDLToFixtureConverter.js.map +1 -0
  312. package/dist/src/transformers/DeleteResultSelectConverter.d.ts +53 -0
  313. package/dist/src/transformers/DeleteResultSelectConverter.js +398 -0
  314. package/dist/src/transformers/DeleteResultSelectConverter.js.map +1 -0
  315. package/dist/src/transformers/FixtureCteBuilder.d.ts +60 -0
  316. package/dist/src/transformers/FixtureCteBuilder.js +151 -0
  317. package/dist/src/transformers/FixtureCteBuilder.js.map +1 -0
  318. package/dist/src/transformers/InsertQuerySelectValuesConverter.js +5 -2
  319. package/dist/src/transformers/InsertQuerySelectValuesConverter.js.map +1 -1
  320. package/dist/src/transformers/InsertResultSelectConverter.d.ts +67 -0
  321. package/dist/src/transformers/InsertResultSelectConverter.js +499 -0
  322. package/dist/src/transformers/InsertResultSelectConverter.js.map +1 -0
  323. package/dist/src/transformers/MergeResultSelectConverter.d.ts +38 -0
  324. package/dist/src/transformers/MergeResultSelectConverter.js +310 -0
  325. package/dist/src/transformers/MergeResultSelectConverter.js.map +1 -0
  326. package/dist/src/transformers/QueryBuilder.d.ts +11 -0
  327. package/dist/src/transformers/QueryBuilder.js +19 -3
  328. package/dist/src/transformers/QueryBuilder.js.map +1 -1
  329. package/dist/src/transformers/SelectResultSelectConverter.d.ts +10 -0
  330. package/dist/src/transformers/SelectResultSelectConverter.js +36 -0
  331. package/dist/src/transformers/SelectResultSelectConverter.js.map +1 -0
  332. package/dist/src/transformers/SimulatedSelectConverter.d.ts +23 -0
  333. package/dist/src/transformers/SimulatedSelectConverter.js +65 -0
  334. package/dist/src/transformers/SimulatedSelectConverter.js.map +1 -0
  335. package/dist/src/transformers/UpdateResultSelectConverter.d.ts +51 -0
  336. package/dist/src/transformers/UpdateResultSelectConverter.js +344 -0
  337. package/dist/src/transformers/UpdateResultSelectConverter.js.map +1 -0
  338. package/dist/src/types/GenericFixture.d.ts +17 -0
  339. package/dist/src/utils/SelectQueryWithClauseHelper.d.ts +12 -0
  340. package/dist/src/utils/SelectQueryWithClauseHelper.js +47 -0
  341. package/dist/src/utils/SelectQueryWithClauseHelper.js.map +1 -0
  342. package/dist/src/utils/TableNameUtils.d.ts +10 -0
  343. package/dist/src/utils/ValueComponentRewriter.d.ts +3 -0
  344. package/dist/src/utils/ValueComponentRewriter.js +183 -0
  345. package/dist/src/utils/ValueComponentRewriter.js.map +1 -0
  346. package/dist/tokenReaders/BaseTokenReader.js +86 -0
  347. package/dist/tokenReaders/BaseTokenReader.js.map +1 -0
  348. package/dist/tokenReaders/CommandTokenReader.js +221 -0
  349. package/dist/tokenReaders/CommandTokenReader.js.map +1 -0
  350. package/dist/tokenReaders/EscapedIdentifierTokenReader.js +99 -0
  351. package/dist/tokenReaders/EscapedIdentifierTokenReader.js.map +1 -0
  352. package/dist/tokenReaders/FunctionTokenReader.js +47 -0
  353. package/dist/tokenReaders/FunctionTokenReader.js.map +1 -0
  354. package/dist/tokenReaders/IdentifierTokenReader.js +34 -0
  355. package/dist/tokenReaders/IdentifierTokenReader.js.map +1 -0
  356. package/dist/tokenReaders/LiteralTokenReader.js +329 -0
  357. package/dist/tokenReaders/LiteralTokenReader.js.map +1 -0
  358. package/dist/tokenReaders/OperatorTokenReader.js +152 -0
  359. package/dist/tokenReaders/OperatorTokenReader.js.map +1 -0
  360. package/dist/tokenReaders/ParameterTokenReader.js +190 -0
  361. package/dist/tokenReaders/ParameterTokenReader.js.map +1 -0
  362. package/dist/tokenReaders/StringSpecifierTokenReader.js +31 -0
  363. package/dist/tokenReaders/StringSpecifierTokenReader.js.map +1 -0
  364. package/dist/tokenReaders/SymbolTokenReader.js +35 -0
  365. package/dist/tokenReaders/SymbolTokenReader.js.map +1 -0
  366. package/dist/tokenReaders/TokenReaderManager.js +110 -0
  367. package/dist/tokenReaders/TokenReaderManager.js.map +1 -0
  368. package/dist/tokenReaders/TypeTokenReader.js +69 -0
  369. package/dist/tokenReaders/TypeTokenReader.js.map +1 -0
  370. package/dist/transformers/AliasRenamer.js +600 -0
  371. package/dist/transformers/AliasRenamer.js.map +1 -0
  372. package/dist/transformers/CTEBuilder.js +188 -0
  373. package/dist/transformers/CTEBuilder.js.map +1 -0
  374. package/dist/transformers/CTECollector.js +409 -0
  375. package/dist/transformers/CTECollector.js.map +1 -0
  376. package/dist/transformers/CTEComposer.js +302 -0
  377. package/dist/transformers/CTEComposer.js.map +1 -0
  378. package/dist/transformers/CTEDependencyAnalyzer.js +285 -0
  379. package/dist/transformers/CTEDependencyAnalyzer.js.map +1 -0
  380. package/dist/transformers/CTEDependencyTracer.js +253 -0
  381. package/dist/transformers/CTEDependencyTracer.js.map +1 -0
  382. package/dist/transformers/CTEDisabler.js +355 -0
  383. package/dist/transformers/CTEDisabler.js.map +1 -0
  384. package/dist/transformers/CTEInjector.js +83 -0
  385. package/dist/transformers/CTEInjector.js.map +1 -0
  386. package/dist/transformers/CTENormalizer.js +46 -0
  387. package/dist/transformers/CTENormalizer.js.map +1 -0
  388. package/dist/transformers/CTEQueryDecomposer.js +589 -0
  389. package/dist/transformers/CTEQueryDecomposer.js.map +1 -0
  390. package/dist/transformers/CTERenamer.js +486 -0
  391. package/dist/transformers/CTERenamer.js.map +1 -0
  392. package/dist/transformers/CTETableReferenceCollector.js +358 -0
  393. package/dist/transformers/CTETableReferenceCollector.js.map +1 -0
  394. package/dist/transformers/ColumnReferenceCollector.js +478 -0
  395. package/dist/transformers/ColumnReferenceCollector.js.map +1 -0
  396. package/dist/transformers/DDLDiffGenerator.js +313 -0
  397. package/dist/transformers/DDLDiffGenerator.js.map +1 -0
  398. package/dist/transformers/DDLGeneralizer.js +119 -0
  399. package/dist/transformers/DDLGeneralizer.js.map +1 -0
  400. package/dist/transformers/DDLToFixtureConverter.js +206 -0
  401. package/dist/transformers/DDLToFixtureConverter.js.map +1 -0
  402. package/dist/transformers/DeleteResultSelectConverter.js +414 -0
  403. package/dist/transformers/DeleteResultSelectConverter.js.map +1 -0
  404. package/dist/transformers/DynamicQueryBuilder.js +164 -0
  405. package/dist/transformers/DynamicQueryBuilder.js.map +1 -0
  406. package/dist/transformers/EnhancedJsonMapping.js +223 -0
  407. package/dist/transformers/EnhancedJsonMapping.js.map +1 -0
  408. package/dist/transformers/FilterableItemCollector.js +259 -0
  409. package/dist/transformers/FilterableItemCollector.js.map +1 -0
  410. package/dist/transformers/FixtureCteBuilder.js +151 -0
  411. package/dist/transformers/FixtureCteBuilder.js.map +1 -0
  412. package/dist/transformers/FormatOptionResolver.js +67 -0
  413. package/dist/transformers/FormatOptionResolver.js.map +1 -0
  414. package/dist/transformers/Formatter.js +38 -0
  415. package/dist/transformers/Formatter.js.map +1 -0
  416. package/dist/transformers/InsertQuerySelectValuesConverter.js +125 -0
  417. package/dist/transformers/InsertQuerySelectValuesConverter.js.map +1 -0
  418. package/dist/transformers/InsertResultSelectConverter.js +589 -0
  419. package/dist/transformers/InsertResultSelectConverter.js.map +1 -0
  420. package/dist/transformers/JoinAggregationDecomposer.js +497 -0
  421. package/dist/transformers/JoinAggregationDecomposer.js.map +1 -0
  422. package/dist/transformers/JsonMappingConverter.js +392 -0
  423. package/dist/transformers/JsonMappingConverter.js.map +1 -0
  424. package/dist/transformers/JsonMappingUnifier.js +216 -0
  425. package/dist/transformers/JsonMappingUnifier.js.map +1 -0
  426. package/dist/transformers/LinePrinter.js +148 -0
  427. package/dist/transformers/LinePrinter.js.map +1 -0
  428. package/dist/transformers/MergeResultSelectConverter.js +310 -0
  429. package/dist/transformers/MergeResultSelectConverter.js.map +1 -0
  430. package/dist/transformers/ModelDrivenJsonMapping.js +122 -0
  431. package/dist/transformers/ModelDrivenJsonMapping.js.map +1 -0
  432. package/dist/transformers/OnelineFormattingHelper.js +99 -0
  433. package/dist/transformers/OnelineFormattingHelper.js.map +1 -0
  434. package/dist/transformers/ParameterCollector.js +37 -0
  435. package/dist/transformers/ParameterCollector.js.map +1 -0
  436. package/dist/transformers/PostgresArrayEntityCteBuilder.js +458 -0
  437. package/dist/transformers/PostgresArrayEntityCteBuilder.js.map +1 -0
  438. package/dist/transformers/PostgresJsonQueryBuilder.js +245 -0
  439. package/dist/transformers/PostgresJsonQueryBuilder.js.map +1 -0
  440. package/dist/transformers/PostgresObjectEntityCteBuilder.js +347 -0
  441. package/dist/transformers/PostgresObjectEntityCteBuilder.js.map +1 -0
  442. package/dist/transformers/QueryBuilder.js +649 -0
  443. package/dist/transformers/QueryBuilder.js.map +1 -0
  444. package/dist/transformers/QueryFlowDiagramGenerator.js +157 -0
  445. package/dist/transformers/QueryFlowDiagramGenerator.js.map +1 -0
  446. package/dist/transformers/SchemaCollector.js +523 -0
  447. package/dist/transformers/SchemaCollector.js.map +1 -0
  448. package/dist/transformers/SelectResultSelectConverter.js +36 -0
  449. package/dist/transformers/SelectResultSelectConverter.js.map +1 -0
  450. package/dist/transformers/SelectValueCollector.js +244 -0
  451. package/dist/transformers/SelectValueCollector.js.map +1 -0
  452. package/dist/transformers/SelectableColumnCollector.js +674 -0
  453. package/dist/transformers/SelectableColumnCollector.js.map +1 -0
  454. package/dist/transformers/SimulatedSelectConverter.js +65 -0
  455. package/dist/transformers/SimulatedSelectConverter.js.map +1 -0
  456. package/dist/transformers/SmartRenamer.js +422 -0
  457. package/dist/transformers/SmartRenamer.js.map +1 -0
  458. package/dist/transformers/SqlFormatter.js +77 -0
  459. package/dist/transformers/SqlFormatter.js.map +1 -0
  460. package/dist/transformers/SqlIdentifierRenamer.js +504 -0
  461. package/dist/transformers/SqlIdentifierRenamer.js.map +1 -0
  462. package/dist/transformers/SqlOutputToken.js +13 -0
  463. package/dist/transformers/SqlOutputToken.js.map +1 -0
  464. package/dist/transformers/SqlPaginationInjector.js +108 -0
  465. package/dist/transformers/SqlPaginationInjector.js.map +1 -0
  466. package/dist/transformers/SqlParamInjector.js +802 -0
  467. package/dist/transformers/SqlParamInjector.js.map +1 -0
  468. package/dist/transformers/SqlParameterBinder.js +70 -0
  469. package/dist/transformers/SqlParameterBinder.js.map +1 -0
  470. package/dist/transformers/SqlPrinter.js +1478 -0
  471. package/dist/transformers/SqlPrinter.js.map +1 -0
  472. package/dist/transformers/SqlSortInjector.js +153 -0
  473. package/dist/transformers/SqlSortInjector.js.map +1 -0
  474. package/dist/transformers/TableColumnResolver.js +3 -0
  475. package/dist/transformers/TableColumnResolver.js.map +1 -0
  476. package/dist/transformers/TableSourceCollector.js +439 -0
  477. package/dist/transformers/TableSourceCollector.js.map +1 -0
  478. package/dist/transformers/TypeTransformationPostProcessor.js +363 -0
  479. package/dist/transformers/TypeTransformationPostProcessor.js.map +1 -0
  480. package/dist/transformers/UpdateResultSelectConverter.js +359 -0
  481. package/dist/transformers/UpdateResultSelectConverter.js.map +1 -0
  482. package/dist/transformers/UpstreamSelectQueryFinder.js +184 -0
  483. package/dist/transformers/UpstreamSelectQueryFinder.js.map +1 -0
  484. package/dist/tsconfig.tsbuildinfo +1 -1
  485. package/dist/types/Formatting.js +3 -0
  486. package/dist/types/Formatting.js.map +1 -0
  487. package/dist/types/GenericFixture.js +3 -0
  488. package/dist/types/GenericFixture.js.map +1 -0
  489. package/dist/utils/CTERegionDetector.js +464 -0
  490. package/dist/utils/CTERegionDetector.js.map +1 -0
  491. package/dist/utils/CommentEditor.js +345 -0
  492. package/dist/utils/CommentEditor.js.map +1 -0
  493. package/dist/utils/CommentUtils.js +69 -0
  494. package/dist/utils/CommentUtils.js.map +1 -0
  495. package/dist/utils/CursorContextAnalyzer.js +338 -0
  496. package/dist/utils/CursorContextAnalyzer.js.map +1 -0
  497. package/dist/utils/IntelliSenseApi.js +292 -0
  498. package/dist/utils/IntelliSenseApi.js.map +1 -0
  499. package/dist/utils/JsonSchemaValidator.js +215 -0
  500. package/dist/utils/JsonSchemaValidator.js.map +1 -0
  501. package/dist/utils/KeywordCache.js +206 -0
  502. package/dist/utils/KeywordCache.js.map +1 -0
  503. package/dist/utils/LexemeCursor.js +314 -0
  504. package/dist/utils/LexemeCursor.js.map +1 -0
  505. package/dist/utils/MultiQuerySplitter.js +292 -0
  506. package/dist/utils/MultiQuerySplitter.js.map +1 -0
  507. package/dist/utils/OperatorPrecedence.js +107 -0
  508. package/dist/utils/OperatorPrecedence.js.map +1 -0
  509. package/dist/utils/ParameterDetector.js +53 -0
  510. package/dist/utils/ParameterDetector.js.map +1 -0
  511. package/dist/utils/ParameterHelper.js +31 -0
  512. package/dist/utils/ParameterHelper.js.map +1 -0
  513. package/dist/utils/ParameterRemover.js +783 -0
  514. package/dist/utils/ParameterRemover.js.map +1 -0
  515. package/dist/utils/ParserStringUtils.js +31 -0
  516. package/dist/utils/ParserStringUtils.js.map +1 -0
  517. package/dist/utils/PositionAwareParser.js +363 -0
  518. package/dist/utils/PositionAwareParser.js.map +1 -0
  519. package/dist/utils/SchemaManager.js +217 -0
  520. package/dist/utils/SchemaManager.js.map +1 -0
  521. package/dist/utils/ScopeResolver.js +272 -0
  522. package/dist/utils/ScopeResolver.js.map +1 -0
  523. package/dist/utils/SelectQueryWithClauseHelper.js +47 -0
  524. package/dist/utils/SelectQueryWithClauseHelper.js.map +1 -0
  525. package/dist/utils/SqlSchemaValidator.js +55 -0
  526. package/dist/utils/SqlSchemaValidator.js.map +1 -0
  527. package/dist/utils/TableNameUtils.js +35 -0
  528. package/dist/utils/TableNameUtils.js.map +1 -0
  529. package/dist/utils/TextPositionUtils.js +128 -0
  530. package/dist/utils/TextPositionUtils.js.map +1 -0
  531. package/dist/utils/ValueComponentRewriter.js +187 -0
  532. package/dist/utils/ValueComponentRewriter.js.map +1 -0
  533. package/dist/utils/charLookupTable.js +73 -0
  534. package/dist/utils/charLookupTable.js.map +1 -0
  535. package/dist/utils/stringUtils.js +230 -0
  536. package/dist/utils/stringUtils.js.map +1 -0
  537. package/package.json +62 -62
@@ -0,0 +1,649 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueryBuilder = void 0;
4
+ const Clause_1 = require("../models/Clause");
5
+ const UpdateQuery_1 = require("../models/UpdateQuery");
6
+ const DeleteQuery_1 = require("../models/DeleteQuery");
7
+ const MergeQuery_1 = require("../models/MergeQuery");
8
+ const ValueComponent_1 = require("../models/ValueComponent");
9
+ const SelectValueCollector_1 = require("./SelectValueCollector");
10
+ const SelectQuery_1 = require("../models/SelectQuery");
11
+ const CTECollector_1 = require("./CTECollector");
12
+ const CTENormalizer_1 = require("./CTENormalizer");
13
+ const CreateTableQuery_1 = require("../models/CreateTableQuery");
14
+ const InsertQuery_1 = require("../models/InsertQuery");
15
+ const CTEDisabler_1 = require("./CTEDisabler");
16
+ const SourceExpressionParser_1 = require("../parsers/SourceExpressionParser");
17
+ const InsertQuerySelectValuesConverter_1 = require("./InsertQuerySelectValuesConverter");
18
+ const InsertResultSelectConverter_1 = require("./InsertResultSelectConverter");
19
+ const UpdateResultSelectConverter_1 = require("./UpdateResultSelectConverter");
20
+ const DeleteResultSelectConverter_1 = require("./DeleteResultSelectConverter");
21
+ const MergeResultSelectConverter_1 = require("./MergeResultSelectConverter");
22
+ /**
23
+ * QueryBuilder provides static methods to build or convert various SQL query objects.
24
+ */
25
+ class QueryBuilder {
26
+ /**
27
+ * Builds a BinarySelectQuery by combining an array of SelectQuery using the specified operator.
28
+ * Throws if less than two queries are provided.
29
+ * @param queries Array of SelectQuery to combine
30
+ * @param operator SQL operator to use (e.g. 'union', 'union all', 'intersect', 'except')
31
+ * @returns BinarySelectQuery
32
+ */
33
+ static buildBinaryQuery(queries, operator) {
34
+ if (!queries || queries.length === 0) {
35
+ throw new Error("No queries provided to combine.");
36
+ }
37
+ if (queries.length === 1) {
38
+ throw new Error("At least two queries are required to create a BinarySelectQuery.");
39
+ }
40
+ // Always create a new BinarySelectQuery instance (never mutate input)
41
+ // Note: ValuesQuery requires conversion to SimpleSelectQuery because it lacks SELECT clause structure
42
+ // BinarySelectQuery and SimpleSelectQuery can be used directly in binary operations
43
+ const wrap = (q) => q instanceof SelectQuery_1.ValuesQuery ? QueryBuilder.buildSimpleQuery(q) : q;
44
+ let result = new SelectQuery_1.BinarySelectQuery(wrap(queries[0]), operator, wrap(queries[1]));
45
+ CTENormalizer_1.CTENormalizer.normalize(result);
46
+ for (let i = 2; i < queries.length; i++) {
47
+ result.appendSelectQuery(operator, wrap(queries[i]));
48
+ }
49
+ return result;
50
+ }
51
+ constructor() {
52
+ // This class is not meant to be instantiated.
53
+ }
54
+ /**
55
+ * Converts a SELECT query to a standard SimpleSelectQuery form.
56
+ * @param query The query to convert
57
+ * @returns A SimpleSelectQuery
58
+ */
59
+ static buildSimpleQuery(query) {
60
+ if (query instanceof SelectQuery_1.SimpleSelectQuery) {
61
+ return query;
62
+ }
63
+ else if (query instanceof SelectQuery_1.BinarySelectQuery) {
64
+ return QueryBuilder.buildSimpleBinaryQuery(query);
65
+ }
66
+ else if (query instanceof SelectQuery_1.ValuesQuery) {
67
+ return QueryBuilder.buildSimpleValuesQuery(query);
68
+ }
69
+ throw new Error("Unsupported query type for buildSimpleQuery");
70
+ }
71
+ static buildSimpleBinaryQuery(query) {
72
+ // Extract ORDER BY from the rightmost query in the binary tree and remove it
73
+ const extractedOrderBy = QueryBuilder.extractAndRemoveOrderByFromBinaryQuery(query);
74
+ // Create a subquery source from the binary query (now without ORDER BY)
75
+ const subQuerySource = new Clause_1.SubQuerySource(query);
76
+ // Create a source expression with alias
77
+ const sourceExpr = new Clause_1.SourceExpression(subQuerySource, new Clause_1.SourceAliasExpression("bq", null));
78
+ // Create FROM clause with the source expression
79
+ const fromClause = new Clause_1.FromClause(sourceExpr, null);
80
+ // Create SELECT clause with * (all columns)
81
+ const selectClause = QueryBuilder.createSelectAllClause();
82
+ // Create the final simple select query with extracted ORDER BY
83
+ const q = new SelectQuery_1.SimpleSelectQuery({
84
+ selectClause,
85
+ fromClause,
86
+ orderByClause: extractedOrderBy
87
+ });
88
+ return CTENormalizer_1.CTENormalizer.normalize(q);
89
+ }
90
+ /**
91
+ * Extracts ORDER BY clause from the rightmost query in a binary query tree and removes it.
92
+ * This clarifies the semantics by moving the ORDER BY from the ambiguous position
93
+ * in the UNION to the explicit outer SimpleSelectQuery level.
94
+ *
95
+ * NOTE: ORDER BY in UNION context applies to the entire result set, not individual subqueries.
96
+ * Therefore, table prefixes (e.g., "a.column") in ORDER BY are invalid SQL and would cause
97
+ * syntax errors. Valid ORDER BY clauses should only reference column names without prefixes
98
+ * or use positional notation (ORDER BY 1, 2). Since we only process valid SQL, the current
99
+ * implementation correctly handles legitimate cases without additional prefix processing.
100
+ *
101
+ * @param query BinarySelectQuery to process
102
+ * @returns Extracted OrderByClause or null if none found
103
+ */
104
+ static extractAndRemoveOrderByFromBinaryQuery(query) {
105
+ return QueryBuilder.findAndRemoveRightmostOrderBy(query);
106
+ }
107
+ /**
108
+ * Recursively finds and removes ORDER BY from the rightmost query in a binary tree.
109
+ *
110
+ * @param query Current query being processed
111
+ * @returns Extracted OrderByClause or null
112
+ */
113
+ static findAndRemoveRightmostOrderBy(query) {
114
+ if (query instanceof SelectQuery_1.BinarySelectQuery) {
115
+ // For binary queries, check right side first (rightmost takes precedence)
116
+ const rightOrderBy = QueryBuilder.findAndRemoveRightmostOrderBy(query.right);
117
+ if (rightOrderBy) {
118
+ return rightOrderBy;
119
+ }
120
+ // If no ORDER BY on right side, check left side
121
+ return QueryBuilder.findAndRemoveRightmostOrderBy(query.left);
122
+ }
123
+ else if (query instanceof SelectQuery_1.SimpleSelectQuery) {
124
+ // Extract ORDER BY from SimpleSelectQuery and remove it
125
+ const orderBy = query.orderByClause;
126
+ if (orderBy) {
127
+ query.orderByClause = null;
128
+ return orderBy;
129
+ }
130
+ }
131
+ return null;
132
+ }
133
+ /**
134
+ * Converts a ValuesQuery to a SimpleSelectQuery with sequentially numbered columns or user-specified columns
135
+ *
136
+ * @param query The VALUES query to convert
137
+ * @param columns Optional: column names
138
+ * @returns A SimpleSelectQuery
139
+ */
140
+ static buildSimpleValuesQuery(query) {
141
+ // Figure out how many columns are in the VALUES clause
142
+ const columnCount = query.tuples.length > 0 ? query.tuples[0].values.length : 0;
143
+ if (query.tuples.length === 0) {
144
+ throw new Error("Empty VALUES clause cannot be converted to a SimpleSelectQuery");
145
+ }
146
+ if (!query.columnAliases) {
147
+ throw new Error("Column aliases are required to convert a VALUES clause to SimpleSelectQuery. Please specify column aliases.");
148
+ }
149
+ if (query.columnAliases.length !== columnCount) {
150
+ throw new Error(`The number of column aliases (${query.columnAliases.length}) does not match the number of columns in the first tuple (${columnCount}).`);
151
+ }
152
+ // Create a subquery source from the VALUES query
153
+ const subQuerySource = new Clause_1.SubQuerySource(query);
154
+ const sourceExpr = new Clause_1.SourceExpression(subQuerySource, new Clause_1.SourceAliasExpression("vq", query.columnAliases));
155
+ // Create FROM clause with the source expression
156
+ const fromClause = new Clause_1.FromClause(sourceExpr, null);
157
+ // Create SELECT clause with all columns
158
+ const selectItems = query.columnAliases.map(name => new Clause_1.SelectItem(new ValueComponent_1.ColumnReference("vq", name), name));
159
+ const selectClause = new Clause_1.SelectClause(selectItems, null);
160
+ // Create the final simple select query
161
+ return new SelectQuery_1.SimpleSelectQuery({
162
+ selectClause,
163
+ fromClause
164
+ });
165
+ }
166
+ /**
167
+ * Creates a SELECT clause with a single * (all columns) item
168
+ *
169
+ * @returns A SELECT clause with *
170
+ */
171
+ static createSelectAllClause() {
172
+ // Create a column reference for *
173
+ const columnRef = new ValueComponent_1.ColumnReference(null, "*");
174
+ // Create a SelectItem with the column reference
175
+ const selectItem = new Clause_1.SelectItem(columnRef, "*");
176
+ // Create and return a SelectClause with the item
177
+ return new Clause_1.SelectClause([selectItem], null);
178
+ }
179
+ /**
180
+ * Converts a SELECT query to a CREATE TABLE query (CREATE [TEMPORARY] TABLE ... AS SELECT ...)
181
+ * @param query The SELECT query to use as the source
182
+ * @param tableName The name of the table to create
183
+ * @param isTemporary If true, creates a temporary table
184
+ * @returns A CreateTableQuery instance
185
+ */
186
+ static buildCreateTableQuery(query, tableName, isTemporary = false, ifNotExists = false) {
187
+ return new CreateTableQuery_1.CreateTableQuery({
188
+ tableName,
189
+ isTemporary,
190
+ ifNotExists,
191
+ asSelectQuery: query
192
+ });
193
+ }
194
+ /**
195
+ * Converts a SELECT query to an INSERT query (INSERT INTO ... SELECT ...).
196
+ */
197
+ static buildInsertQuery(selectQuery, targetOrOptions, explicitColumns) {
198
+ var _a;
199
+ // Derive normalized options while preserving the legacy signature for backward compatibility.
200
+ const options = QueryBuilder.normalizeInsertOptions(targetOrOptions, explicitColumns);
201
+ // Determine the final column order either from user-provided options or by inferring from the select list.
202
+ const columnNames = QueryBuilder.prepareInsertColumns(selectQuery, (_a = options.columns) !== null && _a !== void 0 ? _a : null);
203
+ const sourceExpr = SourceExpressionParser_1.SourceExpressionParser.parse(options.target);
204
+ return new InsertQuery_1.InsertQuery({
205
+ insertClause: new Clause_1.InsertClause(sourceExpr, columnNames),
206
+ selectQuery
207
+ });
208
+ }
209
+ /**
210
+ * Converts an INSERT ... VALUES query into INSERT ... SELECT form using UNION ALL.
211
+ * @param insertQuery The VALUES-based InsertQuery to convert.
212
+ * @returns A new InsertQuery that selects rows instead of using VALUES.
213
+ */
214
+ static convertInsertValuesToSelect(insertQuery) {
215
+ return InsertQuerySelectValuesConverter_1.InsertQuerySelectValuesConverter.toSelectUnion(insertQuery);
216
+ }
217
+ /**
218
+ * Converts an INSERT ... SELECT (optionally with UNION ALL) into INSERT ... VALUES form.
219
+ * @param insertQuery The SELECT-based InsertQuery to convert.
220
+ * @returns A new InsertQuery that uses VALUES tuples.
221
+ */
222
+ static convertInsertSelectToValues(insertQuery) {
223
+ return InsertQuerySelectValuesConverter_1.InsertQuerySelectValuesConverter.toValues(insertQuery);
224
+ }
225
+ /**
226
+ * Builds a SELECT query that reflects the INSERT's RETURNING output (or count when RETURNING is absent).
227
+ */
228
+ static convertInsertToReturningSelect(insertQuery, options) {
229
+ return InsertResultSelectConverter_1.InsertResultSelectConverter.toSelectQuery(insertQuery, options);
230
+ }
231
+ static convertUpdateToReturningSelect(updateQuery, options) {
232
+ return UpdateResultSelectConverter_1.UpdateResultSelectConverter.toSelectQuery(updateQuery, options);
233
+ }
234
+ static convertDeleteToReturningSelect(deleteQuery, options) {
235
+ return DeleteResultSelectConverter_1.DeleteResultSelectConverter.toSelectQuery(deleteQuery, options);
236
+ }
237
+ static convertMergeToReturningSelect(mergeQuery, options) {
238
+ return MergeResultSelectConverter_1.MergeResultSelectConverter.toSelectQuery(mergeQuery, options);
239
+ }
240
+ /**
241
+ * Builds an UPDATE query from a SELECT query and conversion options.
242
+ */
243
+ static buildUpdateQuery(selectQuery, selectSourceOrOptions, updateTableExprRaw, primaryKeys) {
244
+ var _a;
245
+ // Normalize the function arguments into a single configuration object.
246
+ const options = QueryBuilder.normalizeUpdateOptions(selectSourceOrOptions, updateTableExprRaw, primaryKeys);
247
+ // Collect select-list metadata and align columns before mutating the query during WITH extraction.
248
+ const updateColumns = QueryBuilder.prepareUpdateColumns(selectQuery, options.primaryKeys, (_a = options.columns) !== null && _a !== void 0 ? _a : null);
249
+ const updateClause = new Clause_1.UpdateClause(SourceExpressionParser_1.SourceExpressionParser.parse(options.target));
250
+ const targetAlias = updateClause.getSourceAliasName();
251
+ if (!targetAlias) {
252
+ throw new Error(`Source expression does not have an alias. Please provide an alias for the source expression.`);
253
+ }
254
+ // Move CTE definitions to the UPDATE statement for cleaner SQL.
255
+ const withClause = QueryBuilder.extractWithClause(selectQuery);
256
+ const setItems = updateColumns.map(column => new Clause_1.SetClauseItem(column, QueryBuilder.toColumnReference(options.sourceAlias, column)));
257
+ if (setItems.length === 0) {
258
+ throw new Error(`No updatable columns found. Ensure the select list contains at least one column other than the specified primary keys.`);
259
+ }
260
+ const setClause = new Clause_1.SetClause(setItems);
261
+ const fromClause = new Clause_1.FromClause(selectQuery.toSource(options.sourceAlias), null);
262
+ const whereClause = new Clause_1.WhereClause(QueryBuilder.buildEqualityPredicate(targetAlias, options.sourceAlias, options.primaryKeys));
263
+ return new UpdateQuery_1.UpdateQuery({
264
+ updateClause,
265
+ setClause,
266
+ fromClause,
267
+ whereClause,
268
+ withClause: withClause !== null && withClause !== void 0 ? withClause : undefined
269
+ });
270
+ }
271
+ /**
272
+ * Builds a DELETE query that deletes the rows matched by the SELECT query output.
273
+ */
274
+ static buildDeleteQuery(selectQuery, options) {
275
+ var _a;
276
+ // Normalise options to guarantee arrays and alias defaults.
277
+ const normalized = QueryBuilder.normalizeDeleteOptions(options);
278
+ const predicateColumns = QueryBuilder.prepareDeleteColumns(selectQuery, normalized.primaryKeys, (_a = normalized.columns) !== null && _a !== void 0 ? _a : null);
279
+ const deleteClause = new Clause_1.DeleteClause(SourceExpressionParser_1.SourceExpressionParser.parse(normalized.target));
280
+ const targetAlias = deleteClause.getSourceAliasName();
281
+ if (!targetAlias) {
282
+ throw new Error(`Source expression does not have an alias. Please provide an alias for the delete target.`);
283
+ }
284
+ const withClause = QueryBuilder.extractWithClause(selectQuery);
285
+ // Build correlated EXISTS predicate instead of Postgres-specific USING clause.
286
+ const predicate = QueryBuilder.buildEqualityPredicate(targetAlias, normalized.sourceAlias, predicateColumns);
287
+ const sourceExpression = selectQuery.toSource(normalized.sourceAlias);
288
+ const existsSelectClause = new Clause_1.SelectClause([new Clause_1.SelectItem(new ValueComponent_1.LiteralValue(1))]);
289
+ const existsSubquery = new SelectQuery_1.SimpleSelectQuery({
290
+ selectClause: existsSelectClause,
291
+ fromClause: new Clause_1.FromClause(sourceExpression, null),
292
+ whereClause: new Clause_1.WhereClause(predicate)
293
+ });
294
+ const whereClause = new Clause_1.WhereClause(new ValueComponent_1.UnaryExpression('exists', new ValueComponent_1.InlineQuery(existsSubquery)));
295
+ return new DeleteQuery_1.DeleteQuery({
296
+ deleteClause,
297
+ whereClause,
298
+ withClause: withClause !== null && withClause !== void 0 ? withClause : undefined
299
+ });
300
+ }
301
+ /**
302
+ * Builds a MERGE query (upsert) that coordinates actions based on row matches.
303
+ */
304
+ static buildMergeQuery(selectQuery, options) {
305
+ var _a, _b, _c, _d, _e, _f, _g;
306
+ // Ensure the configuration is fully expanded before inspection.
307
+ const normalized = QueryBuilder.normalizeMergeOptions(options);
308
+ const mergeColumnPlan = QueryBuilder.prepareMergeColumns(selectQuery, normalized.primaryKeys, (_a = normalized.updateColumns) !== null && _a !== void 0 ? _a : null, (_b = normalized.insertColumns) !== null && _b !== void 0 ? _b : null, (_c = normalized.matchedAction) !== null && _c !== void 0 ? _c : 'update', (_d = normalized.notMatchedAction) !== null && _d !== void 0 ? _d : 'insert');
309
+ const targetExpression = SourceExpressionParser_1.SourceExpressionParser.parse(normalized.target);
310
+ const targetAlias = targetExpression.getAliasName();
311
+ if (!targetAlias) {
312
+ throw new Error(`Source expression does not have an alias. Please provide an alias for the merge target.`);
313
+ }
314
+ const withClause = QueryBuilder.extractWithClause(selectQuery);
315
+ const onCondition = QueryBuilder.buildEqualityPredicate(targetAlias, normalized.sourceAlias, normalized.primaryKeys);
316
+ const sourceExpression = selectQuery.toSource(normalized.sourceAlias);
317
+ const whenClauses = [];
318
+ const matchedAction = (_e = normalized.matchedAction) !== null && _e !== void 0 ? _e : 'update';
319
+ if (matchedAction === 'update') {
320
+ if (mergeColumnPlan.updateColumns.length === 0) {
321
+ throw new Error(`No columns available for MERGE update action. Provide updateColumns or ensure the select list includes non-key columns.`);
322
+ }
323
+ const setItems = mergeColumnPlan.updateColumns.map(column => new Clause_1.SetClauseItem(column, QueryBuilder.toColumnReference(normalized.sourceAlias, column)));
324
+ whenClauses.push(new MergeQuery_1.MergeWhenClause("matched", new MergeQuery_1.MergeUpdateAction(new Clause_1.SetClause(setItems))));
325
+ }
326
+ else if (matchedAction === 'delete') {
327
+ whenClauses.push(new MergeQuery_1.MergeWhenClause("matched", new MergeQuery_1.MergeDeleteAction()));
328
+ }
329
+ else if (matchedAction === 'doNothing') {
330
+ whenClauses.push(new MergeQuery_1.MergeWhenClause("matched", new MergeQuery_1.MergeDoNothingAction()));
331
+ }
332
+ const notMatchedAction = (_f = normalized.notMatchedAction) !== null && _f !== void 0 ? _f : 'insert';
333
+ if (notMatchedAction === 'insert') {
334
+ if (mergeColumnPlan.insertColumns.length === 0) {
335
+ throw new Error('Unable to infer MERGE insert columns. Provide insertColumns explicitly.');
336
+ }
337
+ const insertValues = new ValueComponent_1.ValueList(mergeColumnPlan.insertColumns.map(column => QueryBuilder.toColumnReference(normalized.sourceAlias, column)));
338
+ whenClauses.push(new MergeQuery_1.MergeWhenClause("not_matched", new MergeQuery_1.MergeInsertAction({
339
+ columns: mergeColumnPlan.insertColumns,
340
+ values: insertValues
341
+ })));
342
+ }
343
+ else if (notMatchedAction === 'doNothing') {
344
+ whenClauses.push(new MergeQuery_1.MergeWhenClause("not_matched", new MergeQuery_1.MergeDoNothingAction()));
345
+ }
346
+ const notMatchedBySourceAction = (_g = normalized.notMatchedBySourceAction) !== null && _g !== void 0 ? _g : 'doNothing';
347
+ if (notMatchedBySourceAction === 'delete') {
348
+ whenClauses.push(new MergeQuery_1.MergeWhenClause("not_matched_by_source", new MergeQuery_1.MergeDeleteAction()));
349
+ }
350
+ else if (notMatchedBySourceAction === 'doNothing') {
351
+ whenClauses.push(new MergeQuery_1.MergeWhenClause("not_matched_by_source", new MergeQuery_1.MergeDoNothingAction()));
352
+ }
353
+ if (whenClauses.length === 0) {
354
+ throw new Error(`At least one MERGE action must be generated. Adjust the merge conversion options.`);
355
+ }
356
+ return new MergeQuery_1.MergeQuery({
357
+ withClause: withClause !== null && withClause !== void 0 ? withClause : undefined,
358
+ target: targetExpression,
359
+ source: sourceExpression,
360
+ onCondition,
361
+ whenClauses
362
+ });
363
+ }
364
+ static normalizeInsertOptions(targetOrOptions, explicitColumns) {
365
+ if (typeof targetOrOptions === 'string') {
366
+ return {
367
+ target: targetOrOptions,
368
+ columns: explicitColumns
369
+ };
370
+ }
371
+ if (explicitColumns && explicitColumns.length > 0) {
372
+ return {
373
+ ...targetOrOptions,
374
+ columns: explicitColumns
375
+ };
376
+ }
377
+ return { ...targetOrOptions };
378
+ }
379
+ static normalizeUpdateOptions(selectSourceOrOptions, updateTableExprRaw, primaryKeys) {
380
+ var _a;
381
+ if (typeof selectSourceOrOptions === 'string') {
382
+ if (!updateTableExprRaw) {
383
+ throw new Error('updateTableExprRaw is required when using the legacy buildUpdateQuery signature.');
384
+ }
385
+ if (primaryKeys === undefined) {
386
+ throw new Error('primaryKeys are required when using the legacy buildUpdateQuery signature.');
387
+ }
388
+ return {
389
+ target: updateTableExprRaw,
390
+ primaryKeys: QueryBuilder.normalizeColumnArray(primaryKeys),
391
+ sourceAlias: selectSourceOrOptions
392
+ };
393
+ }
394
+ return {
395
+ target: selectSourceOrOptions.target,
396
+ primaryKeys: QueryBuilder.normalizeColumnArray(selectSourceOrOptions.primaryKeys),
397
+ sourceAlias: (_a = selectSourceOrOptions.sourceAlias) !== null && _a !== void 0 ? _a : 'src',
398
+ columns: selectSourceOrOptions.columns
399
+ };
400
+ }
401
+ static normalizeDeleteOptions(options) {
402
+ var _a;
403
+ return {
404
+ ...options,
405
+ primaryKeys: QueryBuilder.normalizeColumnArray(options.primaryKeys),
406
+ sourceAlias: (_a = options.sourceAlias) !== null && _a !== void 0 ? _a : 'src'
407
+ };
408
+ }
409
+ static normalizeMergeOptions(options) {
410
+ var _a;
411
+ return {
412
+ ...options,
413
+ primaryKeys: QueryBuilder.normalizeColumnArray(options.primaryKeys),
414
+ sourceAlias: (_a = options.sourceAlias) !== null && _a !== void 0 ? _a : 'src'
415
+ };
416
+ }
417
+ static normalizeColumnArray(columns) {
418
+ const array = Array.isArray(columns) ? columns : [columns];
419
+ const normalized = array.map(col => col.trim()).filter(col => col.length > 0);
420
+ if (!normalized.length) {
421
+ throw new Error('At least one column must be specified.');
422
+ }
423
+ return normalized;
424
+ }
425
+ static collectSelectItems(selectQuery) {
426
+ const collector = new SelectValueCollector_1.SelectValueCollector();
427
+ return collector.collect(selectQuery);
428
+ }
429
+ static collectSelectColumnNames(selectQuery) {
430
+ const items = QueryBuilder.collectSelectItems(selectQuery);
431
+ const names = [];
432
+ for (const item of items) {
433
+ if (!item.name || item.name === '*') {
434
+ throw new Error(`Columns cannot be inferred from the selectQuery. ` +
435
+ `Make sure you are not using wildcards or unnamed columns.`);
436
+ }
437
+ if (!names.includes(item.name)) {
438
+ names.push(item.name);
439
+ }
440
+ }
441
+ if (!names.length) {
442
+ throw new Error('Unable to determine any column names from selectQuery.');
443
+ }
444
+ return names;
445
+ }
446
+ static ensurePrimaryKeys(selectColumns, primaryKeys) {
447
+ const available = new Set(selectColumns);
448
+ for (const pk of primaryKeys) {
449
+ if (!available.has(pk)) {
450
+ throw new Error(`Primary key column '${pk}' is not present in selectQuery select list.`);
451
+ }
452
+ }
453
+ }
454
+ static prepareInsertColumns(selectQuery, optionColumns) {
455
+ const selectColumns = QueryBuilder.collectSelectColumnNames(selectQuery);
456
+ if (optionColumns && optionColumns.length > 0) {
457
+ const normalized = QueryBuilder.normalizeColumnArray(optionColumns);
458
+ const uniqueNormalized = normalized.filter((name, idx) => normalized.indexOf(name) === idx);
459
+ const missing = uniqueNormalized.filter(name => !selectColumns.includes(name));
460
+ if (missing.length > 0) {
461
+ throw new Error(`Columns specified in conversion options were not found in selectQuery select list: [${missing.join(', ')}].`);
462
+ }
463
+ QueryBuilder.rebuildSelectClause(selectQuery, uniqueNormalized);
464
+ QueryBuilder.ensureSelectClauseSize(selectQuery, uniqueNormalized.length);
465
+ return uniqueNormalized;
466
+ }
467
+ QueryBuilder.ensureSelectClauseSize(selectQuery, selectColumns.length);
468
+ return selectColumns;
469
+ }
470
+ static prepareUpdateColumns(selectQuery, primaryKeys, explicitColumns) {
471
+ const selectColumns = QueryBuilder.collectSelectColumnNames(selectQuery);
472
+ QueryBuilder.ensurePrimaryKeys(selectColumns, primaryKeys);
473
+ const primaryKeySet = new Set(primaryKeys);
474
+ const updateCandidates = selectColumns.filter(name => !primaryKeySet.has(name));
475
+ let updateColumnsOrdered;
476
+ if (explicitColumns && explicitColumns.length > 0) {
477
+ const normalized = QueryBuilder.normalizeColumnArray(explicitColumns);
478
+ const uniqueNormalized = normalized.filter((name, idx) => normalized.indexOf(name) === idx);
479
+ const missing = uniqueNormalized.filter(name => primaryKeySet.has(name) || !updateCandidates.includes(name));
480
+ if (missing.length > 0) {
481
+ throw new Error(`Provided update columns were not found in selectQuery output or are primary keys: [${missing.join(', ')}].`);
482
+ }
483
+ updateColumnsOrdered = uniqueNormalized;
484
+ }
485
+ else {
486
+ updateColumnsOrdered = Array.from(new Set(updateCandidates));
487
+ }
488
+ const desiredOrder = Array.from(new Set([
489
+ ...primaryKeys,
490
+ ...updateColumnsOrdered
491
+ ]));
492
+ QueryBuilder.rebuildSelectClause(selectQuery, desiredOrder);
493
+ QueryBuilder.ensureSelectClauseSize(selectQuery, desiredOrder.length);
494
+ return updateColumnsOrdered;
495
+ }
496
+ static prepareDeleteColumns(selectQuery, primaryKeys, explicitColumns) {
497
+ const selectColumns = QueryBuilder.collectSelectColumnNames(selectQuery);
498
+ QueryBuilder.ensurePrimaryKeys(selectColumns, primaryKeys);
499
+ const primaryKeySet = new Set(primaryKeys);
500
+ let matchColumns = [];
501
+ if (explicitColumns && explicitColumns.length > 0) {
502
+ const normalized = QueryBuilder.normalizeColumnArray(explicitColumns);
503
+ const preferred = new Set(normalized);
504
+ matchColumns = selectColumns.filter(name => preferred.has(name) && !primaryKeySet.has(name));
505
+ }
506
+ const requiredColumns = new Set();
507
+ primaryKeys.forEach(key => requiredColumns.add(key));
508
+ matchColumns.forEach(col => requiredColumns.add(col));
509
+ const desiredOrder = selectColumns.filter(name => requiredColumns.has(name));
510
+ QueryBuilder.rebuildSelectClause(selectQuery, desiredOrder);
511
+ QueryBuilder.ensureSelectClauseSize(selectQuery, desiredOrder.length);
512
+ return desiredOrder;
513
+ }
514
+ static prepareMergeColumns(selectQuery, primaryKeys, explicitUpdateColumns, explicitInsertColumns, matchedAction, notMatchedAction) {
515
+ const selectColumns = QueryBuilder.collectSelectColumnNames(selectQuery);
516
+ QueryBuilder.ensurePrimaryKeys(selectColumns, primaryKeys);
517
+ const primaryKeySet = new Set(primaryKeys);
518
+ let updateColumnsOrdered = [];
519
+ if (matchedAction === 'update') {
520
+ const candidates = selectColumns.filter(name => !primaryKeySet.has(name));
521
+ if (explicitUpdateColumns && explicitUpdateColumns.length > 0) {
522
+ const normalized = QueryBuilder.normalizeColumnArray(explicitUpdateColumns);
523
+ const uniqueNormalized = normalized.filter((name, idx) => normalized.indexOf(name) === idx);
524
+ const missing = uniqueNormalized.filter(name => primaryKeySet.has(name) || !candidates.includes(name));
525
+ if (missing.length > 0) {
526
+ throw new Error(`Provided update columns were not found in selectQuery output or are primary keys: [${missing.join(', ')}].`);
527
+ }
528
+ updateColumnsOrdered = uniqueNormalized;
529
+ }
530
+ else {
531
+ updateColumnsOrdered = Array.from(new Set(candidates));
532
+ }
533
+ }
534
+ let insertColumnsOrdered = [];
535
+ if (notMatchedAction === 'insert') {
536
+ if (explicitInsertColumns && explicitInsertColumns.length > 0) {
537
+ const normalized = QueryBuilder.normalizeColumnArray(explicitInsertColumns);
538
+ const uniqueNormalized = normalized.filter((name, idx) => normalized.indexOf(name) === idx);
539
+ const missing = uniqueNormalized.filter(name => !selectColumns.includes(name));
540
+ if (missing.length > 0) {
541
+ throw new Error(`Provided insert columns were not found in selectQuery output: [${missing.join(', ')}].`);
542
+ }
543
+ insertColumnsOrdered = uniqueNormalized;
544
+ }
545
+ else {
546
+ insertColumnsOrdered = Array.from(new Set(selectColumns));
547
+ }
548
+ }
549
+ const desiredOrder = Array.from(new Set([
550
+ ...primaryKeys,
551
+ ...updateColumnsOrdered,
552
+ ...insertColumnsOrdered,
553
+ ...selectColumns
554
+ ])).filter(name => selectColumns.includes(name));
555
+ QueryBuilder.rebuildSelectClause(selectQuery, desiredOrder);
556
+ QueryBuilder.ensureSelectClauseSize(selectQuery, desiredOrder.length);
557
+ const finalUpdateColumns = matchedAction === 'update'
558
+ ? updateColumnsOrdered
559
+ : [];
560
+ const finalInsertColumns = notMatchedAction === 'insert'
561
+ ? insertColumnsOrdered
562
+ : [];
563
+ return {
564
+ updateColumns: finalUpdateColumns,
565
+ insertColumns: finalInsertColumns
566
+ };
567
+ }
568
+ static rebuildSelectClause(selectQuery, desiredColumns) {
569
+ const itemMap = new Map();
570
+ for (const item of selectQuery.selectClause.items) {
571
+ const name = QueryBuilder.getSelectItemName(item);
572
+ if (!name) {
573
+ continue;
574
+ }
575
+ if (!itemMap.has(name)) {
576
+ itemMap.set(name, item);
577
+ }
578
+ }
579
+ const rebuiltItems = [];
580
+ const seen = new Set();
581
+ for (const column of desiredColumns) {
582
+ if (seen.has(column)) {
583
+ continue;
584
+ }
585
+ const item = itemMap.get(column);
586
+ if (!item) {
587
+ throw new Error(`Column '${column}' not found in select clause.`);
588
+ }
589
+ rebuiltItems.push(item);
590
+ seen.add(column);
591
+ }
592
+ if (!rebuiltItems.length) {
593
+ throw new Error('Unable to rebuild select clause with the requested columns.');
594
+ }
595
+ selectQuery.selectClause.items = rebuiltItems;
596
+ }
597
+ static getSelectItemName(item) {
598
+ if (item.identifier) {
599
+ return item.identifier.name;
600
+ }
601
+ if (item.value instanceof ValueComponent_1.ColumnReference) {
602
+ return item.value.column.name;
603
+ }
604
+ return null;
605
+ }
606
+ static ensureSelectClauseSize(selectQuery, expected) {
607
+ if (selectQuery.selectClause.items.length !== expected) {
608
+ throw new Error(`Select clause column count (${selectQuery.selectClause.items.length}) does not match expected count (${expected}).`);
609
+ }
610
+ }
611
+ static extractWithClause(selectQuery) {
612
+ const cteCollector = new CTECollector_1.CTECollector();
613
+ const collected = cteCollector.collect(selectQuery);
614
+ if (collected.length === 0) {
615
+ return null;
616
+ }
617
+ const cteDisabler = new CTEDisabler_1.CTEDisabler();
618
+ cteDisabler.execute(selectQuery);
619
+ return new Clause_1.WithClause(false, collected);
620
+ }
621
+ static buildEqualityPredicate(leftAlias, rightAlias, columns) {
622
+ const uniqueColumns = QueryBuilder.mergeUniqueColumns(columns);
623
+ if (!uniqueColumns.length) {
624
+ throw new Error('At least one column is required to build a comparison predicate.');
625
+ }
626
+ let predicate = null;
627
+ for (const column of uniqueColumns) {
628
+ const comparison = new ValueComponent_1.BinaryExpression(QueryBuilder.toColumnReference(leftAlias, column), '=', QueryBuilder.toColumnReference(rightAlias, column));
629
+ predicate = predicate ? new ValueComponent_1.BinaryExpression(predicate, 'and', comparison) : comparison;
630
+ }
631
+ return predicate;
632
+ }
633
+ static toColumnReference(alias, column) {
634
+ return new ValueComponent_1.ColumnReference(alias, column);
635
+ }
636
+ static mergeUniqueColumns(columns) {
637
+ const seen = new Set();
638
+ const result = [];
639
+ for (const column of columns) {
640
+ if (!seen.has(column)) {
641
+ seen.add(column);
642
+ result.push(column);
643
+ }
644
+ }
645
+ return result;
646
+ }
647
+ }
648
+ exports.QueryBuilder = QueryBuilder;
649
+ //# sourceMappingURL=QueryBuilder.js.map