@simplysm/sd-cli 10.0.4 → 10.0.21

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 (282) hide show
  1. package/.eslintrc.cjs +1 -1
  2. package/dist/SdLinter.d.ts +5 -0
  3. package/dist/SdLinter.js.map +1 -0
  4. package/dist/SdLinter.mjs +37 -0
  5. package/dist/SdTsIncrementalBuilder.d.ts +16 -0
  6. package/dist/SdTsIncrementalBuilder.js.map +1 -0
  7. package/dist/SdTsIncrementalBuilder.mjs +54 -0
  8. package/dist/build-cluster.js.map +1 -1
  9. package/dist/build-cluster.mjs +124 -0
  10. package/dist/builders/SdCliClientBuilder.d.ts +13 -0
  11. package/dist/builders/SdCliClientBuilder.js.map +1 -0
  12. package/dist/builders/SdCliClientBuilder.mjs +167 -0
  13. package/dist/builders/SdCliJsLibLinter.d.ts +3 -7
  14. package/dist/builders/SdCliJsLibLinter.js.map +1 -1
  15. package/dist/builders/{SdCliJsLibLinter.js → SdCliJsLibLinter.mjs} +8 -17
  16. package/dist/builders/SdCliServerBuilder.d.ts +14 -0
  17. package/dist/builders/SdCliServerBuilder.js.map +1 -0
  18. package/dist/builders/SdCliServerBuilder.mjs +171 -0
  19. package/dist/builders/SdCliTsLibBuilder.d.ts +3 -10
  20. package/dist/builders/SdCliTsLibBuilder.js.map +1 -1
  21. package/dist/builders/SdCliTsLibBuilder.mjs +75 -0
  22. package/dist/commons.d.ts +27 -2
  23. package/dist/entry/SdCliProject.d.ts +1 -0
  24. package/dist/entry/SdCliProject.js.map +1 -1
  25. package/dist/entry/{SdCliProject.js → SdCliProject.mjs} +94 -10
  26. package/dist/sd-cli.js.map +1 -1
  27. package/dist/{sd-cli.js → sd-cli.mjs} +1 -0
  28. package/dist/sd-core-common/src/decorators/NotifyPropertyChange.d.ts +20 -0
  29. package/dist/sd-core-common/src/decorators/NotifyPropertyChange.js.map +1 -0
  30. package/dist/sd-core-common/src/decorators/NotifyPropertyChange.mjs +12 -0
  31. package/dist/sd-core-common/src/decorators/PropertyGetSetDecoratorBase.d.ts +43 -0
  32. package/dist/sd-core-common/src/decorators/PropertyGetSetDecoratorBase.js.map +1 -0
  33. package/dist/sd-core-common/src/decorators/PropertyGetSetDecoratorBase.mjs +54 -0
  34. package/dist/sd-core-common/src/decorators/PropertyValidate.d.ts +16 -0
  35. package/dist/sd-core-common/src/decorators/PropertyValidate.js.map +1 -0
  36. package/dist/sd-core-common/src/decorators/PropertyValidate.mjs +26 -0
  37. package/dist/sd-core-common/src/decorators/decorator-return-types.d.ts +14 -0
  38. package/dist/sd-core-common/src/decorators/decorator-return-types.js.map +1 -0
  39. package/dist/sd-core-common/src/decorators/decorator-return-types.mjs +2 -0
  40. package/dist/sd-core-common/src/errors/ArgumentError.d.ts +10 -0
  41. package/dist/sd-core-common/src/errors/ArgumentError.js.map +1 -0
  42. package/dist/sd-core-common/src/errors/ArgumentError.mjs +13 -0
  43. package/dist/sd-core-common/src/errors/NeverEntryError.d.ts +10 -0
  44. package/dist/sd-core-common/src/errors/NeverEntryError.js.map +1 -0
  45. package/dist/sd-core-common/src/errors/NeverEntryError.mjs +13 -0
  46. package/dist/sd-core-common/src/errors/NotImplementError.d.ts +10 -0
  47. package/dist/sd-core-common/src/errors/NotImplementError.js.map +1 -0
  48. package/dist/sd-core-common/src/errors/NotImplementError.mjs +13 -0
  49. package/dist/sd-core-common/src/errors/SdError.d.ts +23 -0
  50. package/dist/sd-core-common/src/errors/SdError.js.map +1 -0
  51. package/dist/sd-core-common/src/errors/SdError.mjs +40 -0
  52. package/dist/sd-core-common/src/errors/TimeoutError.d.ts +11 -0
  53. package/dist/sd-core-common/src/errors/TimeoutError.js.map +1 -0
  54. package/dist/sd-core-common/src/errors/TimeoutError.mjs +16 -0
  55. package/dist/sd-core-common/src/extensions/ArrayExtension.d.ts +147 -0
  56. package/dist/sd-core-common/src/extensions/ArrayExtension.js.map +1 -0
  57. package/dist/sd-core-common/src/extensions/ArrayExtension.mjs +448 -0
  58. package/dist/sd-core-common/src/extensions/MapExtension.d.ts +4 -0
  59. package/dist/sd-core-common/src/extensions/MapExtension.js.map +1 -0
  60. package/dist/sd-core-common/src/extensions/MapExtension.mjs +15 -0
  61. package/dist/sd-core-common/src/extensions/SetExtension.d.ts +3 -0
  62. package/dist/sd-core-common/src/extensions/SetExtension.js.map +1 -0
  63. package/dist/sd-core-common/src/extensions/SetExtension.mjs +10 -0
  64. package/dist/sd-core-common/src/index.d.ts +32 -0
  65. package/dist/sd-core-common/src/index.js.map +1 -0
  66. package/dist/sd-core-common/src/index.mjs +33 -0
  67. package/dist/sd-core-common/src/types/DateOnly.d.ts +135 -0
  68. package/dist/sd-core-common/src/types/DateOnly.js.map +1 -0
  69. package/dist/sd-core-common/src/types/DateOnly.mjs +220 -0
  70. package/dist/sd-core-common/src/types/DateTime.d.ts +42 -0
  71. package/dist/sd-core-common/src/types/DateTime.js.map +1 -0
  72. package/dist/sd-core-common/src/types/DateTime.mjs +156 -0
  73. package/dist/sd-core-common/src/types/DeepPartial.d.ts +3 -0
  74. package/dist/sd-core-common/src/types/DeepPartial.js.map +1 -0
  75. package/dist/sd-core-common/src/types/DeepPartial.mjs +2 -0
  76. package/dist/sd-core-common/src/types/ObjectSet.d.ts +4 -0
  77. package/dist/sd-core-common/src/types/ObjectSet.js.map +1 -0
  78. package/dist/sd-core-common/src/types/ObjectSet.mjs +18 -0
  79. package/dist/sd-core-common/src/types/Time.d.ts +27 -0
  80. package/dist/sd-core-common/src/types/Time.js.map +1 -0
  81. package/dist/sd-core-common/src/types/Time.mjs +108 -0
  82. package/dist/sd-core-common/src/types/Type.d.ts +7 -0
  83. package/dist/sd-core-common/src/types/Type.js.map +1 -0
  84. package/dist/sd-core-common/src/types/Type.mjs +2 -0
  85. package/dist/sd-core-common/src/types/UnwrappedType.d.ts +1 -0
  86. package/dist/sd-core-common/src/types/UnwrappedType.js.map +1 -0
  87. package/dist/sd-core-common/src/types/UnwrappedType.mjs +2 -0
  88. package/dist/sd-core-common/src/types/Uuid.d.ts +8 -0
  89. package/dist/sd-core-common/src/types/Uuid.js.map +1 -0
  90. package/dist/sd-core-common/src/types/Uuid.mjs +26 -0
  91. package/dist/sd-core-common/src/types/WrappedType.d.ts +1 -0
  92. package/dist/sd-core-common/src/types/WrappedType.js.map +1 -0
  93. package/dist/sd-core-common/src/types/WrappedType.mjs +2 -0
  94. package/dist/sd-core-common/src/utils/DateTimeFormatUtil.d.ts +12 -0
  95. package/dist/sd-core-common/src/utils/DateTimeFormatUtil.js.map +1 -0
  96. package/dist/sd-core-common/src/utils/DateTimeFormatUtil.mjs +67 -0
  97. package/dist/sd-core-common/src/utils/FunctionQueue.d.ts +8 -0
  98. package/dist/sd-core-common/src/utils/FunctionQueue.js.map +1 -0
  99. package/dist/sd-core-common/src/utils/FunctionQueue.mjs +46 -0
  100. package/dist/sd-core-common/src/utils/FunctionUtil.d.ts +6 -0
  101. package/dist/sd-core-common/src/utils/FunctionUtil.js.map +1 -0
  102. package/dist/sd-core-common/src/utils/FunctionUtil.mjs +31 -0
  103. package/dist/sd-core-common/src/utils/JsonConvert.d.ts +8 -0
  104. package/dist/sd-core-common/src/utils/JsonConvert.js.map +1 -0
  105. package/dist/sd-core-common/src/utils/JsonConvert.mjs +78 -0
  106. package/dist/sd-core-common/src/utils/MathUtil.d.ts +3 -0
  107. package/dist/sd-core-common/src/utils/MathUtil.js.map +1 -0
  108. package/dist/sd-core-common/src/utils/MathUtil.mjs +6 -0
  109. package/dist/sd-core-common/src/utils/NumberUtil.d.ts +6 -0
  110. package/dist/sd-core-common/src/utils/NumberUtil.js.map +1 -0
  111. package/dist/sd-core-common/src/utils/NumberUtil.mjs +32 -0
  112. package/dist/sd-core-common/src/utils/ObjectUtil.d.ts +80 -0
  113. package/dist/sd-core-common/src/utils/ObjectUtil.js.map +1 -0
  114. package/dist/sd-core-common/src/utils/ObjectUtil.mjs +452 -0
  115. package/dist/sd-core-common/src/utils/SdSyncEventEmitter.d.ts +6 -0
  116. package/dist/sd-core-common/src/utils/SdSyncEventEmitter.js.map +1 -0
  117. package/dist/sd-core-common/src/utils/SdSyncEventEmitter.mjs +27 -0
  118. package/dist/sd-core-common/src/utils/StringUtil.d.ts +8 -0
  119. package/dist/sd-core-common/src/utils/StringUtil.js.map +1 -0
  120. package/dist/sd-core-common/src/utils/StringUtil.mjs +77 -0
  121. package/dist/sd-core-common/src/utils/Wait.d.ts +4 -0
  122. package/dist/sd-core-common/src/utils/Wait.js.map +1 -0
  123. package/dist/sd-core-common/src/utils/Wait.mjs +23 -0
  124. package/dist/sd-core-node/src/index.d.ts +6 -0
  125. package/dist/sd-core-node/src/index.js.map +1 -0
  126. package/dist/sd-core-node/src/index.mjs +7 -0
  127. package/dist/sd-core-node/src/utils/FsUtil.d.ts +44 -0
  128. package/dist/sd-core-node/src/utils/FsUtil.js.map +1 -0
  129. package/dist/sd-core-node/src/utils/FsUtil.mjs +493 -0
  130. package/dist/sd-core-node/src/utils/Logger.d.ts +91 -0
  131. package/dist/sd-core-node/src/utils/Logger.js.map +1 -0
  132. package/dist/sd-core-node/src/utils/Logger.mjs +185 -0
  133. package/dist/sd-core-node/src/utils/PathUtil.d.ts +6 -0
  134. package/dist/sd-core-node/src/utils/PathUtil.js.map +1 -0
  135. package/dist/sd-core-node/src/utils/PathUtil.mjs +24 -0
  136. package/dist/sd-core-node/src/utils/SdFsWatcher.d.ts +15 -0
  137. package/dist/sd-core-node/src/utils/SdFsWatcher.js.map +1 -0
  138. package/dist/sd-core-node/src/utils/SdFsWatcher.mjs +43 -0
  139. package/dist/sd-core-node/src/utils/SdProcess.d.ts +5 -0
  140. package/dist/sd-core-node/src/utils/SdProcess.js.map +1 -0
  141. package/dist/sd-core-node/src/utils/SdProcess.mjs +36 -0
  142. package/dist/sd-orm-common/src/CaseQueryHelper.d.ts +12 -0
  143. package/dist/sd-orm-common/src/CaseQueryHelper.js.map +1 -0
  144. package/dist/sd-orm-common/src/CaseQueryHelper.mjs +19 -0
  145. package/dist/sd-orm-common/src/CaseWhenQueryHelper.d.ts +12 -0
  146. package/dist/sd-orm-common/src/CaseWhenQueryHelper.js.map +1 -0
  147. package/dist/sd-orm-common/src/CaseWhenQueryHelper.mjs +20 -0
  148. package/dist/sd-orm-common/src/DbContext.d.ts +81 -0
  149. package/dist/sd-orm-common/src/DbContext.js.map +1 -0
  150. package/dist/sd-orm-common/src/DbContext.mjs +635 -0
  151. package/dist/sd-orm-common/src/IDbConnection.d.ts +15 -0
  152. package/dist/sd-orm-common/src/IDbConnection.js.map +1 -0
  153. package/dist/sd-orm-common/src/IDbConnection.mjs +2 -0
  154. package/dist/sd-orm-common/src/IDbContextExecutor.d.ts +17 -0
  155. package/dist/sd-orm-common/src/IDbContextExecutor.js.map +1 -0
  156. package/dist/sd-orm-common/src/IDbContextExecutor.mjs +2 -0
  157. package/dist/sd-orm-common/src/IDbMigration.d.ts +4 -0
  158. package/dist/sd-orm-common/src/IDbMigration.js.map +1 -0
  159. package/dist/sd-orm-common/src/IDbMigration.mjs +2 -0
  160. package/dist/sd-orm-common/src/QueryBuilder.d.ts +48 -0
  161. package/dist/sd-orm-common/src/QueryBuilder.js.map +1 -0
  162. package/dist/sd-orm-common/src/QueryBuilder.mjs +1022 -0
  163. package/dist/sd-orm-common/src/QueryHelper.d.ts +75 -0
  164. package/dist/sd-orm-common/src/QueryHelper.js.map +1 -0
  165. package/dist/sd-orm-common/src/QueryHelper.mjs +627 -0
  166. package/dist/sd-orm-common/src/QueryUnit.d.ts +10 -0
  167. package/dist/sd-orm-common/src/QueryUnit.js.map +1 -0
  168. package/dist/sd-orm-common/src/QueryUnit.mjs +16 -0
  169. package/dist/sd-orm-common/src/Queryable.d.ts +105 -0
  170. package/dist/sd-orm-common/src/Queryable.js.map +1 -0
  171. package/dist/sd-orm-common/src/Queryable.mjs +1375 -0
  172. package/dist/sd-orm-common/src/SdOrmDataType.d.ts +21 -0
  173. package/dist/sd-orm-common/src/SdOrmDataType.js.map +1 -0
  174. package/dist/sd-orm-common/src/SdOrmDataType.mjs +2 -0
  175. package/dist/sd-orm-common/src/commons.d.ts +400 -0
  176. package/dist/sd-orm-common/src/commons.js.map +1 -0
  177. package/dist/sd-orm-common/src/commons.mjs +8 -0
  178. package/dist/sd-orm-common/src/decorators.d.ts +29 -0
  179. package/dist/sd-orm-common/src/decorators.js.map +1 -0
  180. package/dist/sd-orm-common/src/decorators.mjs +89 -0
  181. package/dist/sd-orm-common/src/index.d.ts +17 -0
  182. package/dist/sd-orm-common/src/index.js.map +1 -0
  183. package/dist/sd-orm-common/src/index.mjs +18 -0
  184. package/dist/sd-orm-common/src/models/SystemMigration.d.ts +3 -0
  185. package/dist/sd-orm-common/src/models/SystemMigration.js.map +1 -0
  186. package/dist/sd-orm-common/src/models/SystemMigration.mjs +13 -0
  187. package/dist/sd-orm-common/src/utils/DbDefinitionUtil.d.ts +14 -0
  188. package/dist/sd-orm-common/src/utils/DbDefinitionUtil.js.map +1 -0
  189. package/dist/sd-orm-common/src/utils/DbDefinitionUtil.mjs +66 -0
  190. package/dist/sd-orm-common/src/utils/SdOrmUtil.d.ts +8 -0
  191. package/dist/sd-orm-common/src/utils/SdOrmUtil.js.map +1 -0
  192. package/dist/sd-orm-common/src/utils/SdOrmUtil.mjs +248 -0
  193. package/dist/sd-orm-node/src/DbConnectionFactory.d.ts +4 -0
  194. package/dist/sd-orm-node/src/DbConnectionFactory.js.map +1 -0
  195. package/dist/sd-orm-node/src/DbConnectionFactory.mjs +17 -0
  196. package/dist/sd-orm-node/src/NodeDbContextExecutor.d.ts +19 -0
  197. package/dist/sd-orm-node/src/NodeDbContextExecutor.js.map +1 -0
  198. package/dist/sd-orm-node/src/NodeDbContextExecutor.mjs +71 -0
  199. package/dist/sd-orm-node/src/SdOrm.d.ts +10 -0
  200. package/dist/sd-orm-node/src/SdOrm.js.map +1 -0
  201. package/dist/sd-orm-node/src/SdOrm.mjs +25 -0
  202. package/dist/sd-orm-node/src/index.d.ts +4 -0
  203. package/dist/sd-orm-node/src/index.js.map +1 -0
  204. package/dist/sd-orm-node/src/index.mjs +5 -0
  205. package/dist/sd-orm-node-mssql/src/MssqlDbConnection.d.ts +25 -0
  206. package/dist/sd-orm-node-mssql/src/MssqlDbConnection.js.map +1 -0
  207. package/dist/sd-orm-node-mssql/src/MssqlDbConnection.mjs +321 -0
  208. package/dist/sd-orm-node-mssql/src/index.d.ts +2 -0
  209. package/dist/sd-orm-node-mssql/src/index.js.map +1 -0
  210. package/dist/sd-orm-node-mssql/src/index.mjs +3 -0
  211. package/dist/sd-orm-node-mysql/src/MysqlDbConnection.d.ts +22 -0
  212. package/dist/sd-orm-node-mysql/src/MysqlDbConnection.js.map +1 -0
  213. package/dist/sd-orm-node-mysql/src/MysqlDbConnection.mjs +200 -0
  214. package/dist/sd-orm-node-mysql/src/index.d.ts +2 -0
  215. package/dist/sd-orm-node-mysql/src/index.js.map +1 -0
  216. package/dist/sd-orm-node-mysql/src/index.mjs +3 -0
  217. package/dist/sd-orm-node-sqlite/src/SqliteDbConnection.d.ts +22 -0
  218. package/dist/sd-orm-node-sqlite/src/SqliteDbConnection.js.map +1 -0
  219. package/dist/sd-orm-node-sqlite/src/SqliteDbConnection.mjs +172 -0
  220. package/dist/sd-orm-node-sqlite/src/index.d.ts +2 -0
  221. package/dist/sd-orm-node-sqlite/src/index.js.map +1 -0
  222. package/dist/sd-orm-node-sqlite/src/index.mjs +3 -0
  223. package/dist/sd-service-common/src/commons-orm.d.ts +4 -0
  224. package/dist/sd-service-common/src/commons-orm.js.map +1 -0
  225. package/dist/sd-service-common/src/commons-orm.mjs +2 -0
  226. package/dist/sd-service-common/src/commons-smtp.d.ts +29 -0
  227. package/dist/sd-service-common/src/commons-smtp.js.map +1 -0
  228. package/dist/sd-service-common/src/commons-smtp.mjs +2 -0
  229. package/dist/sd-service-common/src/commons.d.ts +57 -0
  230. package/dist/sd-service-common/src/commons.js.map +1 -0
  231. package/dist/sd-service-common/src/commons.mjs +3 -0
  232. package/dist/sd-service-common/src/index.d.ts +3 -0
  233. package/dist/sd-service-common/src/index.js.map +1 -0
  234. package/dist/sd-service-common/src/index.mjs +4 -0
  235. package/dist/sd-service-server/src/ApiServiceError.d.ts +12 -0
  236. package/dist/sd-service-server/src/ApiServiceError.js.map +1 -0
  237. package/dist/sd-service-server/src/ApiServiceError.mjs +15 -0
  238. package/dist/sd-service-server/src/SdServiceServer.d.ts +39 -0
  239. package/dist/sd-service-server/src/SdServiceServer.js.map +1 -0
  240. package/dist/sd-service-server/src/SdServiceServer.mjs +513 -0
  241. package/dist/sd-service-server/src/commons.d.ts +23 -0
  242. package/dist/sd-service-server/src/commons.js.map +1 -0
  243. package/dist/sd-service-server/src/commons.mjs +3 -0
  244. package/dist/sd-service-server/src/index.d.ts +8 -0
  245. package/dist/sd-service-server/src/index.js.map +1 -0
  246. package/dist/sd-service-server/src/index.mjs +9 -0
  247. package/dist/sd-service-server/src/services/SdAutoUpdateService.d.ts +4 -0
  248. package/dist/sd-service-server/src/services/SdAutoUpdateService.js.map +1 -0
  249. package/dist/sd-service-server/src/services/SdAutoUpdateService.mjs +20 -0
  250. package/dist/sd-service-server/src/services/SdCryptoService.d.ts +7 -0
  251. package/dist/sd-service-server/src/services/SdCryptoService.js.map +1 -0
  252. package/dist/sd-service-server/src/services/SdCryptoService.mjs +39 -0
  253. package/dist/sd-service-server/src/services/SdOrmService.d.ts +22 -0
  254. package/dist/sd-service-server/src/services/SdOrmService.js.map +1 -0
  255. package/dist/sd-service-server/src/services/SdOrmService.mjs +115 -0
  256. package/dist/sd-service-server/src/services/SdSmtpClientService.d.ts +6 -0
  257. package/dist/sd-service-server/src/services/SdSmtpClientService.js.map +1 -0
  258. package/dist/sd-service-server/src/services/SdSmtpClientService.mjs +44 -0
  259. package/dist/sd-service-server/src/utils/SdServiceServerConfigUtil.d.ts +4 -0
  260. package/dist/sd-service-server/src/utils/SdServiceServerConfigUtil.js.map +1 -0
  261. package/dist/sd-service-server/src/utils/SdServiceServerConfigUtil.mjs +36 -0
  262. package/dist/server-worker.d.ts +1 -0
  263. package/dist/server-worker.js.map +1 -0
  264. package/dist/server-worker.mjs +36 -0
  265. package/package.json +11 -4
  266. package/src/SdLinter.ts +41 -0
  267. package/src/SdTsIncrementalBuilder.ts +75 -0
  268. package/src/build-cluster.ts +69 -18
  269. package/src/builders/SdCliClientBuilder.ts +189 -0
  270. package/src/builders/SdCliJsLibLinter.ts +11 -23
  271. package/src/builders/SdCliServerBuilder.ts +191 -0
  272. package/src/builders/SdCliTsLibBuilder.ts +33 -202
  273. package/src/commons.ts +32 -2
  274. package/src/entry/SdCliProject.ts +133 -17
  275. package/src/sd-cli.ts +1 -0
  276. package/src/server-worker.ts +45 -0
  277. package/tsconfig.json +1 -10
  278. package/dist/build-cluster.js +0 -75
  279. package/dist/builders/SdCliTsLibBuilder.js +0 -205
  280. /package/dist/{commons.js → commons.mjs} +0 -0
  281. /package/dist/utils/{SdCliBuildResultUtil.js → SdCliBuildResultUtil.mjs} +0 -0
  282. /package/dist/utils/{SdCliConfigUtil.js → SdCliConfigUtil.mjs} +0 -0
@@ -0,0 +1,1022 @@
1
+ import { NeverEntryError, Uuid } from "@simplysm/sd-core-common";
2
+ import { QueryHelper } from "./QueryHelper";
3
+ export class QueryBuilder {
4
+ constructor(_dialect) {
5
+ this._dialect = _dialect;
6
+ this.qh = new QueryHelper(this._dialect);
7
+ }
8
+ // ----------------------------------------------------
9
+ // DATABASE
10
+ // ----------------------------------------------------
11
+ // region DATABASE
12
+ createDatabaseIfNotExists(def) {
13
+ if (this._dialect === "mysql") {
14
+ return `
15
+ CREATE DATABASE IF NOT EXISTS ${this.wrap(def.database)};
16
+ ALTER DATABASE ${this.wrap(def.database)} CHARACTER SET utf8 COLLATE utf8_bin;`.trim();
17
+ }
18
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
19
+ else if (this._dialect === "mssql-azure") {
20
+ return `IF NOT EXISTS(SELECT * FROM sys.databases WHERE name='${def.database}') CREATE DATABASE ${this.wrap(def.database)} COLLATE Korean_Wansung_CS_AS (EDITION='Basic', SERVICE_OBJECTIVE='Basic', MAXSIZE = 2 GB)`.trim();
21
+ }
22
+ else {
23
+ return `IF NOT EXISTS(SELECT * FROM sys.databases WHERE name = '${def.database}') CREATE DATABASE ${this.wrap(def.database)} COLLATE Korean_Wansung_CS_AS`;
24
+ }
25
+ }
26
+ clearDatabaseIfExists(def) {
27
+ if (this._dialect === "mysql") {
28
+ return `
29
+ DROP DATABASE IF EXISTS ${this.wrap(def.database)};
30
+ CREATE DATABASE IF NOT EXISTS ${this.wrap(def.database)};
31
+ ALTER DATABASE ${this.wrap(def.database)} CHARACTER SET utf8 COLLATE utf8_bin;`;
32
+ }
33
+ else if (this._dialect === "mssql-azure") {
34
+ return `
35
+ IF EXISTS(select * from sys.databases WHERE name='${def.database}')
36
+ BEGIN
37
+ DECLARE @sql NVARCHAR(MAX);
38
+ SET @sql = N'';
39
+
40
+ -- 프록시저 초기화
41
+ SELECT @sql = @sql + 'DROP PROCEDURE ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(o.name) +';' + CHAR(13) + CHAR(10)
42
+ FROM sys.sql_modules m
43
+ INNER JOIN sys.objects o ON m.object_id=o.object_id
44
+ WHERE type_desc like '%PROCEDURE%'
45
+ AND SCHEMA_NAME(schema_id) <> 'sys'
46
+
47
+ -- 함수 초기화
48
+ SELECT @sql = @sql + 'DROP FUNCTION ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(o.name) + N';' + CHAR(13) + CHAR(10)
49
+ FROM sys.sql_modules m
50
+ INNER JOIN sys.objects o ON m.object_id=o.object_id
51
+ WHERE type_desc like '%function%'
52
+ AND SCHEMA_NAME(schema_id) <> 'sys'
53
+
54
+ -- 뷰 초기화
55
+ SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(v.name) + N';' + CHAR(13) + CHAR(10)
56
+ FROM sys.views v
57
+ WHERE SCHEMA_NAME(schema_id) <> 'sys'
58
+
59
+ -- 테이블 FK 끊기 초기화
60
+ SELECT @sql = @sql + N'ALTER TABLE ' + QUOTENAME(SCHEMA_NAME([tbl].schema_id)) + '.' + QUOTENAME([tbl].[name]) + N' DROP CONSTRAINT ' + QUOTENAME([obj].[name]) + N';' + CHAR(13) + CHAR(10)
61
+ FROM sys.tables [tbl]
62
+ INNER JOIN sys.objects AS [obj] ON [obj].[parent_object_id] = [tbl].[object_id] AND [obj].[type] = 'F'
63
+
64
+ -- 테이블 삭제
65
+ SELECT @sql = @sql + N'DROP TABLE ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME([tbl].[name]) + N';' + CHAR(13) + CHAR(10)
66
+ FROM sys.tables [tbl]
67
+ WHERE [type]= 'U'
68
+
69
+ EXEC(@sql);
70
+ END`.trim();
71
+ }
72
+ else {
73
+ return `
74
+ IF EXISTS(select * from sys.databases WHERE name='${def.database}')
75
+ BEGIN
76
+ DECLARE @sql NVARCHAR(MAX);
77
+ SET @sql = N'';
78
+
79
+ -- 프록시저 초기화
80
+ SELECT @sql = @sql + 'DROP PROCEDURE ${this.wrap(def.database)}.' + QUOTENAME(sch.name) + '.' + QUOTENAME(o.name) +';' + CHAR(13) + CHAR(10)
81
+ FROM ${this.wrap(def.database)}.sys.sql_modules m
82
+ INNER JOIN ${this.wrap(def.database)}.sys.objects o ON m.object_id=o.object_id
83
+ INNER JOIN ${this.wrap(def.database)}.sys.schemas sch ON sch.schema_id = [o].schema_id
84
+ WHERE type_desc like '%PROCEDURE%'
85
+
86
+ -- 함수 초기화
87
+ SELECT @sql = @sql + 'DROP FUNCTION ${this.wrap(def.database)}.' + QUOTENAME(sch.name) + '.' + QUOTENAME(o.name) + N';' + CHAR(13) + CHAR(10)
88
+ FROM ${this.wrap(def.database)}.sys.sql_modules m
89
+ INNER JOIN ${this.wrap(def.database)}.sys.objects o ON m.object_id=o.object_id
90
+ INNER JOIN ${this.wrap(def.database)}.sys.schemas sch ON sch.schema_id = [o].schema_id
91
+ WHERE type_desc like '%function%' AND sch.name <> 'sys'
92
+
93
+ -- 뷰 초기화
94
+ SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(sch.name) + '.' + QUOTENAME(v.name) + N';' + CHAR(13) + CHAR(10)
95
+ FROM ${this.wrap(def.database)}.sys.views v
96
+ INNER JOIN ${this.wrap(def.database)}.sys.schemas sch ON sch.schema_id = [v].schema_id
97
+ WHERE sch.name <> 'sys'
98
+
99
+ -- 테이블 FK 끊기 초기화
100
+ SELECT @sql = @sql + N'ALTER TABLE ${this.wrap(def.database)}.' + QUOTENAME(sch.name) + '.' + QUOTENAME([tbl].[name]) + N' DROP CONSTRAINT ' + QUOTENAME([obj].[name]) + N';' + CHAR(13) + CHAR(10)
101
+ FROM ${this.wrap(def.database)}.sys.tables [tbl]
102
+ INNER JOIN ${this.wrap(def.database)}.sys.objects AS [obj] ON [obj].[parent_object_id] = [tbl].[object_id] AND [obj].[type] = 'F'
103
+ INNER JOIN ${this.wrap(def.database)}.sys.schemas sch ON sch.schema_id = [tbl].schema_id
104
+
105
+ -- 테이블 삭제
106
+ SELECT @sql = @sql + N'DROP TABLE ${this.wrap(def.database)}.' + QUOTENAME(sch.name) + '.' + QUOTENAME([tbl].[name]) + N';' + CHAR(13) + CHAR(10)
107
+ FROM ${this.wrap(def.database)}.sys.tables [tbl]
108
+ INNER JOIN ${this.wrap(def.database)}.sys.schemas sch ON sch.schema_id = [tbl].schema_id
109
+ WHERE [type]= 'U'
110
+
111
+ EXEC(@sql);
112
+ END`.trim();
113
+ }
114
+ }
115
+ getDatabaseInfo(def) {
116
+ if (this._dialect === "mysql") {
117
+ return `SELECT * FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='${def.database}'`.trim();
118
+ }
119
+ else {
120
+ return `SELECT * FROM dbo.sysdatabases WHERE name='${def.database}'`.trim();
121
+ }
122
+ }
123
+ getTableInfos(def) {
124
+ if (this._dialect === "mysql") {
125
+ if (def?.database === undefined)
126
+ throw new NeverEntryError();
127
+ return `SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='${def.database}'`.trim();
128
+ }
129
+ else if (this._dialect === "mssql-azure") {
130
+ return `SELECT * FROM [INFORMATION_SCHEMA].[TABLES]${def?.schema !== undefined ? ` WHERE TABLE_SCHEMA='${def.schema}'` : ""}`.trim();
131
+ }
132
+ else {
133
+ if (def?.database === undefined)
134
+ throw new NeverEntryError();
135
+ return `SELECT * FROM ${this.wrap(def.database)}.[INFORMATION_SCHEMA].[TABLES]${def.schema !== undefined ? ` WHERE TABLE_SCHEMA='${def.schema}'` : ""}`.trim();
136
+ }
137
+ }
138
+ getTableInfo(def) {
139
+ if (this._dialect === "sqlite") {
140
+ return `SELECT * FROM sqlite_master WHERE type='table' AND name='${def.table.name}'`.trim();
141
+ }
142
+ else if (this._dialect === "mysql") {
143
+ if (def.table.database === undefined)
144
+ throw new NeverEntryError();
145
+ return `SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='${def.table.database}' AND TABLE_NAME='${def.table.name}'`.trim();
146
+ }
147
+ else if (this._dialect === "mssql-azure") {
148
+ if (def.table.schema === undefined)
149
+ throw new NeverEntryError();
150
+ return `SELECT * FROM [INFORMATION_SCHEMA].[TABLES] WHERE TABLE_SCHEMA='${def.table.schema}' AND TABLE_NAME='${def.table.name}'`.trim();
151
+ }
152
+ else {
153
+ if (def.table.database === undefined || def.table.schema === undefined)
154
+ throw new NeverEntryError();
155
+ return `SELECT * FROM ${this.wrap(def.table.database)}.[INFORMATION_SCHEMA].[TABLES] WHERE TABLE_SCHEMA='${def.table.schema}' AND TABLE_NAME='${def.table.name}'`.trim();
156
+ }
157
+ }
158
+ getTableColumnInfos(def) {
159
+ if (this._dialect === "mysql") {
160
+ throw new Error("MYSQL 미구현");
161
+ }
162
+ else {
163
+ const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
164
+ const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
165
+ return `
166
+ SELECT
167
+ c2.COLUMN_NAME as name,
168
+ c2.DATA_TYPE as dataType,
169
+ c2.CHARACTER_MAXIMUM_LENGTH as length,
170
+ c2.NUMERIC_PRECISION as precision,
171
+ c2.NUMERIC_SCALE as digits,
172
+ c.is_nullable as nullable,
173
+ c.is_identity as autoIncrement
174
+ FROM ${databaseDot}sys.columns c
175
+ INNER JOIN ${databaseDot}[INFORMATION_SCHEMA].[COLUMNS] c2 ON OBJECT_ID(c2.TABLE_CATALOG + '.' + c2.TABLE_SCHEMA + '.' + c2.TABLE_NAME) = c.object_id AND c2.ORDINAL_POSITION = c.column_id
176
+ WHERE c.object_id = OBJECT_ID('${databaseDot}${schemaDot}${def.table.name}')
177
+ `.trim();
178
+ }
179
+ }
180
+ getTablePrimaryKeys(def) {
181
+ if (this._dialect === "mysql") {
182
+ throw new Error("MYSQL 미구현");
183
+ }
184
+ else {
185
+ const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
186
+ const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
187
+ return `
188
+ SELECT c.name as name
189
+ FROM ${databaseDot}sys.indexes i
190
+ INNER JOIN ${databaseDot}sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
191
+ INNER JOIN ${databaseDot}sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id
192
+ WHERE i.type = 1 AND i.object_id = OBJECT_ID('${databaseDot}${schemaDot}${def.table.name}')
193
+ ORDER BY ic.key_ordinal;
194
+ `.trim();
195
+ }
196
+ }
197
+ getTableForeignKeys(def) {
198
+ if (this._dialect === "mysql") {
199
+ throw new Error("MYSQL 미구현");
200
+ }
201
+ else {
202
+ const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
203
+ const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
204
+ return `
205
+ SELECT
206
+ f.name as name,
207
+ sc.name as sourceColumnName,
208
+ ts.name as targetSchemaName,
209
+ tt.name as targetTableName
210
+ FROM SIMPLYSM_TS.sys.foreign_keys f
211
+ INNER JOIN SIMPLYSM_TS.sys.foreign_key_columns fc ON f.object_id = fc.constraint_object_id
212
+ INNER JOIN SIMPLYSM_TS.sys.columns sc ON sc.object_id = fc.parent_object_id AND sc.column_id = fc.parent_column_id
213
+ INNER JOIN SIMPLYSM_TS.sys.tables tt ON tt.object_id = f.referenced_object_id
214
+ INNER JOIN SIMPLYSM_TS.sys.schemas ts ON ts.schema_id = tt.schema_id
215
+ WHERE f.parent_object_id = OBJECT_ID('${databaseDot}${schemaDot}${def.table.name}')
216
+ ORDER BY f.object_id, fc.constraint_column_id
217
+ `.trim();
218
+ }
219
+ }
220
+ getTableIndexes(def) {
221
+ if (this._dialect === "mysql") {
222
+ throw new Error("MYSQL 미구현");
223
+ }
224
+ else {
225
+ const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
226
+ const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
227
+ return `
228
+ SELECT
229
+ i.name as name,
230
+ c.name as columnName,
231
+ ic.is_descending_key as isDesc
232
+ FROM ${databaseDot}sys.indexes i
233
+ INNER JOIN ${databaseDot}sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
234
+ INNER JOIN ${databaseDot}sys.columns c ON ic.object_id = c.object_id AND c.column_id = ic.column_id
235
+ WHERE i.type = 2 AND i.object_id = OBJECT_ID('${databaseDot}${schemaDot}${def.table.name}')
236
+ ORDER BY i.index_id, ic.key_ordinal;
237
+ `.trim();
238
+ }
239
+ }
240
+ createTable(def) {
241
+ const tableName = this.getTableName(def.table);
242
+ let query = "";
243
+ query += `CREATE TABLE ${tableName}
244
+ ( `;
245
+ const colDefs = def.columns.map((colDef) => ({
246
+ ...colDef,
247
+ pkOrderBy: def.primaryKeys.single((pk) => pk.columnName === colDef.name)?.orderBy
248
+ }));
249
+ query += colDefs.map((colDef) => " " + this._getQueryOfColDef(colDef)).join(",\n");
250
+ if (this._dialect === "sqlite") {
251
+ }
252
+ else if (def.primaryKeys.length > 0) {
253
+ query += ",\n";
254
+ if (this._dialect === "mysql") {
255
+ query += ` PRIMARY KEY (${def.primaryKeys.map((item) => `${this.wrap(item.columnName) + (item.orderBy === "ASC" ? "" : ` ${item.orderBy}`)}`).join(", ")})\n`;
256
+ }
257
+ else {
258
+ const pkName = this.wrap(`PK_${def.table.name}`);
259
+ query += ` CONSTRAINT ${pkName} PRIMARY KEY (${def.primaryKeys.map((item) => (this.wrap(item.columnName) + (item.orderBy === "ASC" ? "" : ` ${item.orderBy}`))).join(", ")})\n`;
260
+ }
261
+ }
262
+ else {
263
+ query += "\n";
264
+ }
265
+ query += ");";
266
+ return query.trim();
267
+ }
268
+ createView(def) {
269
+ const tableName = this.getTableNameWithoutDatabase(def.table);
270
+ return `CREATE VIEW ${tableName} AS\n${this.query({ type: "select", ...def.queryDef })}`.trim();
271
+ }
272
+ dropTable(def) {
273
+ const tableName = this.getTableName(def.table);
274
+ return `DROP TABLE ${tableName}`;
275
+ }
276
+ addColumn(def) {
277
+ const tableName = this.getTableName(def.table);
278
+ const queries = [];
279
+ if (!def.column.nullable && def.column.defaultValue !== undefined) {
280
+ queries.push(`ALTER TABLE ${tableName}
281
+ ADD ${this._getQueryOfColDef({
282
+ ...def.column,
283
+ nullable: true
284
+ })}`);
285
+ queries.push(`UPDATE ${tableName}
286
+ SET ${this.wrap(def.column.name)} = ${this.getQueryOfQueryValue(def.column.defaultValue)}`);
287
+ queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${this._getQueryOfColDef(def.column)}`);
288
+ }
289
+ else {
290
+ queries.push(`ALTER TABLE ${tableName}
291
+ ADD ${this._getQueryOfColDef(def.column)}`);
292
+ }
293
+ return queries;
294
+ }
295
+ removeColumn(def) {
296
+ const tableName = this.getTableName(def.table);
297
+ return `ALTER TABLE ${tableName} DROP COLUMN ${this.wrap(def.column)}`;
298
+ }
299
+ modifyColumn(def) {
300
+ if (this._dialect === "mysql") {
301
+ const tableName = this.getTableName(def.table);
302
+ const queries = [];
303
+ if (!def.column.nullable && def.column.defaultValue !== undefined) {
304
+ queries.push(`ALTER TABLE ${tableName} MODIFY COLUMN ${this._getQueryOfColDef({
305
+ ...def.column,
306
+ nullable: true
307
+ })}`);
308
+ queries.push(`UPDATE ${tableName}
309
+ SET ${this.wrap(def.column.name)} = ${this.getQueryOfQueryValue(def.column.defaultValue)}
310
+ WHERE ${this.wrap(def.column.name)} IS NULL`);
311
+ }
312
+ queries.push(`ALTER TABLE ${tableName} MODIFY COLUMN ${this._getQueryOfColDef(def.column)}`);
313
+ return queries;
314
+ }
315
+ else {
316
+ const tableName = this.getTableName(def.table);
317
+ const queries = [];
318
+ if (!def.column.nullable && def.column.defaultValue !== undefined) {
319
+ queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${this._getQueryOfColDef({
320
+ ...def.column,
321
+ nullable: true
322
+ })}`);
323
+ queries.push(`UPDATE ${tableName}
324
+ SET ${this.wrap(def.column.name)} = ${this.getQueryOfQueryValue(def.column.defaultValue)}
325
+ WHERE ${this.wrap(def.column.name)} IS NULL`);
326
+ }
327
+ queries.push(`ALTER TABLE ${tableName} ALTER COLUMN ${this._getQueryOfColDef(def.column)}`);
328
+ return queries;
329
+ }
330
+ }
331
+ renameColumn(def) {
332
+ if (this._dialect === "mysql") {
333
+ const tableName = this.getTableName(def.table);
334
+ return `ALTER TABLE ${tableName} RENAME COLUMN ${this.wrap(def.prevName)} TO ${this.wrap(def.nextName)}`;
335
+ }
336
+ else if (this._dialect === "mssql-azure") {
337
+ if (def.table.schema === undefined)
338
+ throw new NeverEntryError();
339
+ return `EXECUTE sp_rename N'${def.table.schema}.${def.table.name}.${this.wrap(def.prevName)}', N'${def.nextName}', 'COLUMN'`;
340
+ }
341
+ else {
342
+ if (def.table.database === undefined || def.table.schema === undefined)
343
+ throw new NeverEntryError();
344
+ return `EXECUTE ${def.table.database}..sp_rename N'${def.table.schema}.${def.table.name}.${this.wrap(def.prevName)}', N'${def.nextName}', 'COLUMN'`;
345
+ }
346
+ }
347
+ dropPrimaryKey(def) {
348
+ if (this._dialect === "mysql") {
349
+ throw new Error("MYSQL 미구현");
350
+ }
351
+ else {
352
+ const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
353
+ const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
354
+ return `ALTER TABLE ${databaseDot}${schemaDot}${def.table.name} DROP CONSTRAINT PK_${def.table.name}`;
355
+ }
356
+ }
357
+ addPrimaryKey(def) {
358
+ if (this._dialect === "mysql") {
359
+ throw new Error("MYSQL 미구현");
360
+ }
361
+ else {
362
+ const databaseDot = def.table.database !== undefined ? def.table.database + "." : "";
363
+ const schemaDot = def.table.schema !== undefined ? def.table.schema + "." : "";
364
+ return `ALTER TABLE ${databaseDot}${schemaDot}${def.table.name} ADD CONSTRAINT PK_${def.table.name} PRIMARY KEY (${def.columns.map((item) => this.wrap(item)).join(", ")})`;
365
+ }
366
+ }
367
+ addForeignKey(def) {
368
+ if (this._dialect === "sqlite") {
369
+ const tableName = this.getTableNameChain(def.table).join(".");
370
+ const tableNameChain = this.getTableNameChain(def.table);
371
+ const tableKey = tableNameChain.join("_").length > 30
372
+ ? tableNameChain.join("_").replace(/[a-z]/g, "")
373
+ : tableNameChain.join("_");
374
+ const fkName = this.wrap(`FK_${tableKey}_${def.foreignKey.name}`);
375
+ const targetTableName = this.getTableName(def.foreignKey.targetTable);
376
+ return `
377
+ pragma writable_schema=1;
378
+ UPDATE sqlite_master
379
+ SET sql = SUBSTR(sql, 1, LENGTH(sql) - 1) || ',
380
+ CONSTRAINT ${fkName} FOREIGN KEY (${def.foreignKey.fkColumns.map((columnName) => `${this.wrap(columnName)}`).join(", ")})
381
+ REFERENCES ${targetTableName}(${def.foreignKey.targetPkColumns.map((columnName) => `${this.wrap(columnName)}`).join(", ")})
382
+ ON UPDATE RESTRICT
383
+ ON DELETE RESTRICT
384
+ )'
385
+ WHERE name = '${tableName}' AND type = 'table'
386
+ RETURNING *;
387
+ pragma writable_schema=0;`.trim();
388
+ }
389
+ else {
390
+ const tableName = this.getTableName(def.table);
391
+ const tableNameChain = this.getTableNameChain(def.table);
392
+ const tableKey = this._dialect === "mysql" && tableNameChain.join("_").length > 30
393
+ ? tableNameChain.join("_").replace(/[a-z]/g, "")
394
+ : tableNameChain.join("_");
395
+ const fkName = this.wrap(`FK_${tableKey}_${def.foreignKey.name}`);
396
+ const targetTableName = this.getTableName(def.foreignKey.targetTable);
397
+ let query = "";
398
+ query += `ALTER TABLE ${tableName}
399
+ ADD CONSTRAINT ${fkName} FOREIGN KEY (${def.foreignKey.fkColumns.map((columnName) => `${this.wrap(columnName)}`).join(", ")}) `;
400
+ query += ` REFERENCES ${targetTableName} (${def.foreignKey.targetPkColumns.map((columnName) => `${this.wrap(columnName)}`).join(", ")})\n`;
401
+ query += " ON DELETE NO ACTION\n";
402
+ query += " ON UPDATE NO ACTION;";
403
+ return query.trim();
404
+ }
405
+ }
406
+ removeForeignKey(def) {
407
+ const tableName = this.getTableName(def.table);
408
+ const tableNameChain = this.getTableNameChain(def.table);
409
+ const tableKey = this._dialect === "mysql" && tableNameChain.join("_").length > 30
410
+ ? tableNameChain.join("_").replace(/[a-z]/g, "")
411
+ : tableNameChain.join("_");
412
+ const fkName = this.wrap(`FK_${tableKey}_${def.foreignKey}`);
413
+ return `ALTER TABLE ${tableName} DROP CONSTRAINT ${fkName};`;
414
+ }
415
+ createIndex(def) {
416
+ const tableName = this.getTableName(def.table);
417
+ const tableNameChain = this._dialect === "mysql" ? this.getTableNameChain(def.table) : this.getTableNameChain(def.table).slice(-2);
418
+ const tableKey = this._dialect === "mysql" && tableNameChain.join("_").length > 30
419
+ ? tableNameChain.join("_").replace(/[a-z]/g, "")
420
+ : tableNameChain.join("_");
421
+ const isUnique = def.index.columns.some((item) => item.unique);
422
+ const idxName = this.wrap(`${isUnique ? "UDX" : "IDX"}_${tableKey}_${def.index.name}`);
423
+ return `CREATE
424
+ ${isUnique ? "UNIQUE " : ""}INDEX
425
+ ${idxName}
426
+ ON
427
+ ${tableName}
428
+ (
429
+ ${def.index.columns.map((item) => `${this.wrap(item.name)} ${item.orderBy}`).join(", ")}
430
+ );`;
431
+ }
432
+ dropIndex(def) {
433
+ const tableName = this.getTableName(def.table);
434
+ const tableNameChain = this._dialect === "mysql" ? this.getTableNameChain(def.table) : this.getTableNameChain(def.table).slice(-2);
435
+ const tableKey = this._dialect === "mysql" && tableNameChain.join("_").length > 30
436
+ ? tableNameChain.join("_").replace(/[a-z]/g, "")
437
+ : tableNameChain.join("_");
438
+ const idxName = this.wrap(`IDX_${tableKey}_${def.index}`);
439
+ return `DROP INDEX ${idxName} ON ${tableName};`;
440
+ }
441
+ configIdentityInsert(def) {
442
+ const tableName = this.getTableName(def.table);
443
+ return `SET IDENTITY_INSERT ${tableName} ${def.state.toUpperCase()}`;
444
+ }
445
+ configForeignKeyCheck(def) {
446
+ if (this._dialect === "mysql") {
447
+ return `SET foreign_key_checks=${def.useCheck ? 1 : 0};`;
448
+ }
449
+ else {
450
+ const tableName = this.getTableName(def.table);
451
+ return `ALTER TABLE ${tableName} ${def.useCheck ? "" : "NO"} CHECK CONSTRAINT ALL;`;
452
+ }
453
+ }
454
+ // endregion
455
+ // ----------------------------------------------------
456
+ // TABLE
457
+ // ----------------------------------------------------
458
+ // region TABLE
459
+ select(def) {
460
+ if (def.top !== undefined && def.limit) {
461
+ throw new Error("TOP과 LIMIT은 함께사용할 수 없습니다.");
462
+ }
463
+ let q = "SELECT";
464
+ if (def.distinct) {
465
+ q += " DISTINCT";
466
+ }
467
+ if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
468
+ if (def.top !== undefined) {
469
+ q += ` TOP ${def.top}`;
470
+ }
471
+ }
472
+ // SELECT FIELDS
473
+ if (def.select) {
474
+ q += "\n";
475
+ const selectFieldQueryStrings = [];
476
+ for (const selectKey of Object.keys(def.select)) {
477
+ const selectValue = def.select[selectKey];
478
+ if (selectValue?.["from"] !== undefined) {
479
+ const selectQueryDef = selectValue;
480
+ let subQuery = " (\n";
481
+ subQuery += " " + this.select(selectQueryDef).replace(/\n/g, "\n ") + "\n";
482
+ subQuery += ` ) as ${selectKey}`;
483
+ selectFieldQueryStrings.push(subQuery);
484
+ }
485
+ else {
486
+ selectFieldQueryStrings.push(` ${this.getQueryOfQueryValue(def.select[selectKey])} as ${selectKey}`);
487
+ }
488
+ }
489
+ q += selectFieldQueryStrings.join(",\n");
490
+ q += "\n";
491
+ }
492
+ else {
493
+ q += " *\n";
494
+ }
495
+ // FROM
496
+ if (def.from instanceof Array) {
497
+ q += "FROM (\n";
498
+ for (const from of def.from) {
499
+ q += " " + this.select(from).replace(/\n/g, "\n ");
500
+ q += "\n\n UNION ALL\n\n";
501
+ }
502
+ q = q.slice(0, -14);
503
+ q += ")";
504
+ }
505
+ else if (def.from?.["from"] !== undefined) {
506
+ const fromQueryDef = def.from;
507
+ q += "FROM (\n";
508
+ q += " " + this.select(fromQueryDef).replace(/\n/g, "\n ") + "\n";
509
+ q += ")";
510
+ }
511
+ else if (def.from !== undefined) {
512
+ q += `FROM ${def.from}`;
513
+ }
514
+ if (def.from !== undefined && def.as !== undefined) {
515
+ q += ` as ${def.as}`;
516
+ }
517
+ if (typeof def.from === "string" && def.lock) {
518
+ q += " with (XLOCK)";
519
+ }
520
+ q += "\n";
521
+ // PIVOT
522
+ if (this._dialect !== "mysql") {
523
+ if (def.pivot) {
524
+ let valueCol = this.getQueryOfQueryValue(def.pivot.valueColumn);
525
+ valueCol = valueCol.startsWith("(") && valueCol.endsWith(")") ? valueCol.slice(1, -1) : valueCol;
526
+ q += `PIVOT (${valueCol} FOR ${this.getQueryOfQueryValue(def.pivot.pivotColumn)}`;
527
+ q += ` IN (${def.pivot.pivotKeys.map((key) => this.wrap(key)).join(", ")}))${def.as !== undefined ? ` as ${def.as}` : ""}`;
528
+ q += "\n";
529
+ }
530
+ }
531
+ // UNPIVOT
532
+ if (def.unpivot) {
533
+ let valueCol = this.getQueryOfQueryValue(def.unpivot.valueColumn);
534
+ valueCol = valueCol.startsWith("(") && valueCol.endsWith(")") ? valueCol.slice(1, -1) : valueCol;
535
+ q += `UNPIVOT (${valueCol} FOR ${this.getQueryOfQueryValue(def.unpivot.pivotColumn)}`;
536
+ q += ` IN (${def.unpivot.pivotKeys.map((key) => this.wrap(key)).join(", ")}))${def.as !== undefined ? ` as ${def.as}` : ""}`;
537
+ q += "\n";
538
+ }
539
+ // JOIN
540
+ if (def.join && def.join.length > 0) {
541
+ for (const joinDef of def.join) {
542
+ q += this._getQueryOfJoinDef(joinDef);
543
+ q += "\n";
544
+ }
545
+ }
546
+ // WHERE
547
+ if (def.where) {
548
+ q += `WHERE ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
549
+ q += "\n";
550
+ }
551
+ // GROUP BY
552
+ if (def.groupBy && def.groupBy.length > 0) {
553
+ q += `GROUP BY ${def.groupBy.map((item) => this.getQueryOfQueryValue(item)).join(", ")}`;
554
+ q += "\n";
555
+ }
556
+ // HAVING
557
+ if (def.having) {
558
+ if (!(def.groupBy && def.groupBy.length > 0)) {
559
+ throw new Error("'HAVING'을 사용하려면, 'GROUP BY'를 반드시 설정해야 합니다.");
560
+ }
561
+ q += `HAVING ${def.having.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
562
+ q += "\n";
563
+ }
564
+ // ORDER BY
565
+ if (def.orderBy && def.orderBy.length > 0) {
566
+ q += `ORDER BY ${def.orderBy.map((item) => this.getQueryOfQueryValue(item[0]) + " " + item[1]).join(", ")}`;
567
+ q += "\n";
568
+ }
569
+ // LIMIT
570
+ if (def.limit) {
571
+ if (!(def.orderBy && def.orderBy.length > 0)) {
572
+ throw new Error("'LIMIT'을 사용하려면, 'ORDER BY'를 반드시 설정해야 합니다.");
573
+ }
574
+ if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
575
+ q += `OFFSET ${def.limit[0]} ROWS FETCH NEXT ${def.limit[1]} ROWS ONLY`;
576
+ q += "\n";
577
+ }
578
+ else {
579
+ q += `LIMIT ${def.limit[0]}, ${def.limit[1]}`;
580
+ q += "\n";
581
+ }
582
+ }
583
+ if (this._dialect !== "mssql" && this._dialect !== "mssql-azure") {
584
+ if (def.top !== undefined) {
585
+ q += `LIMIT ${def.top}`;
586
+ q += "\n";
587
+ }
588
+ }
589
+ // SAMPLE
590
+ if (def.sample !== undefined) {
591
+ if (this._dialect === "mssql") {
592
+ q += `TABLESAMPLE (${def.sample} ROWS)`;
593
+ q += "\n";
594
+ }
595
+ else {
596
+ throw new Error("'select > sample'의 경우 mssql만 구현되어 있습니다.");
597
+ }
598
+ }
599
+ return q.trim();
600
+ }
601
+ insertInto(def) {
602
+ let q = "";
603
+ q += `INSERT INTO ${def.target} (${Object.keys(def.select).join(", ")})`;
604
+ q += "\n";
605
+ q += this.select(def);
606
+ return q.trim() + ";";
607
+ }
608
+ insert(def) {
609
+ let q = "";
610
+ q += `INSERT INTO ${def.from} (${Object.keys(def.record).join(", ")})`;
611
+ q += "\n";
612
+ if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
613
+ if (def.output) {
614
+ q += `OUTPUT ${def.output.map((item) => "INSERTED." + item).join(", ")}`;
615
+ q += "\n";
616
+ }
617
+ }
618
+ q += `VALUES (${Object.values(def.record).map((val) => this.getQueryOfQueryValue(val)).join(", ")})`;
619
+ q += "\n";
620
+ if (this._dialect === "sqlite") {
621
+ if (def.output) {
622
+ q += `RETURNING ${def.output.join(", ")}`;
623
+ q += "\n";
624
+ }
625
+ }
626
+ return q.trim() + ";";
627
+ }
628
+ update(def) {
629
+ if (this._dialect === "sqlite") {
630
+ if (def.join && def.join.length > 0) {
631
+ throw new Error("sqlite - update - join 미구현");
632
+ }
633
+ else if (def.limit || def.top !== undefined) {
634
+ throw new Error("sqlite - update - limit, top 미구현");
635
+ }
636
+ }
637
+ if (def.as === undefined)
638
+ throw new NeverEntryError();
639
+ if (def.top !== undefined && def.limit) {
640
+ throw new Error("TOP과 LIMIT은 함께사용할 수 없습니다.");
641
+ }
642
+ let q = "";
643
+ // LINE 1
644
+ q += "UPDATE";
645
+ if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
646
+ if (def.top !== undefined) {
647
+ q += ` TOP (${def.top})`;
648
+ }
649
+ }
650
+ if (this._dialect !== "mssql" && this._dialect !== "mssql-azure") {
651
+ // FROM, AS
652
+ q += ` ${def.from} as ${def.as}`;
653
+ q += "\n";
654
+ // JOIN
655
+ if (def.join && def.join.length > 0) {
656
+ for (const joinDef of def.join) {
657
+ q += this._getQueryOfJoinDef(joinDef);
658
+ q += "\n";
659
+ }
660
+ }
661
+ q += "SET";
662
+ q += "\n";
663
+ }
664
+ else {
665
+ q += ` ${def.as} SET`;
666
+ q += "\n";
667
+ }
668
+ // FIELD = VALUE
669
+ q += Object.keys(def.record).map((key) => ` ${this._dialect === "sqlite" ? "" : def.as + "."}${key} = ${this.getQueryOfQueryValue(def.record[key])}`).join(",\n");
670
+ q += "\n";
671
+ // OUTPUT
672
+ if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
673
+ if (def.output) {
674
+ q += `OUTPUT ${def.output.map((item) => "INSERTED." + item).join(", ")}`;
675
+ q += "\n";
676
+ }
677
+ }
678
+ if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
679
+ // FROM, AS
680
+ q += `FROM ${def.from} as ${def.as}`;
681
+ q += "\n";
682
+ // JOIN
683
+ if (def.join && def.join.length > 0) {
684
+ for (const joinDef of def.join) {
685
+ q += this._getQueryOfJoinDef(joinDef);
686
+ q += "\n";
687
+ }
688
+ }
689
+ }
690
+ // WHERE
691
+ if (def.where) {
692
+ q += `WHERE ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
693
+ q += "\n";
694
+ }
695
+ if (this._dialect !== "mssql" && this._dialect !== "mssql-azure") {
696
+ if (def.top !== undefined) {
697
+ q += `LIMIT ${def.top}`;
698
+ q += "\n";
699
+ }
700
+ }
701
+ if (this._dialect === "sqlite") {
702
+ if (def.output) {
703
+ q += `RETURNING ${def.output.join(", ")}`;
704
+ q += "\n";
705
+ }
706
+ }
707
+ return q.trim() + ";";
708
+ }
709
+ insertIfNotExists(def) {
710
+ if (this._dialect === "mysql") {
711
+ throw new Error("MYSQL 미구현");
712
+ }
713
+ else {
714
+ let q = "";
715
+ // LINE 1
716
+ q += `MERGE ${def.from} as ${def.as}`;
717
+ q += "\n";
718
+ // USING
719
+ q += "USING (SELECT 0 as _using) as _using";
720
+ q += "\n";
721
+ // WHERE
722
+ q += `ON ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
723
+ q += "\n";
724
+ // INSERT
725
+ q += "WHEN NOT MATCHED THEN\n";
726
+ q += ` INSERT (${Object.keys(def.insertRecord).join(", ")})\n`;
727
+ q += ` VALUES (${Object.values(def.insertRecord).map((val) => this.getQueryOfQueryValue(val)).join(", ")})`;
728
+ q += "\n";
729
+ if (def.output) {
730
+ if (this._dialect === "sqlite") {
731
+ q += `RETURNING ${def.output.join(", ")}`;
732
+ q += "\n";
733
+ }
734
+ else {
735
+ q += `OUTPUT ${def.output.map((item) => "INSERTED." + item).join(", ")}`;
736
+ q += "\n";
737
+ }
738
+ }
739
+ return q.trim() + ";";
740
+ }
741
+ }
742
+ upsert(def) {
743
+ if (this._dialect === "sqlite") {
744
+ throw new Error("sqlite - upsert 미구현");
745
+ }
746
+ else if (this._dialect === "mysql") {
747
+ const procName = this.wrap("SD" + Uuid.new().toString().replace(/-/g, ""));
748
+ const q = `
749
+ USE ${def.from.split(".")[0]};
750
+
751
+ CREATE PROCEDURE ${procName}()
752
+ proc_label:BEGIN
753
+
754
+ IF EXISTS (
755
+ ${this.select(def).replace(/\n/g, "\n ")}
756
+ ) THEN
757
+
758
+ ${Object.keys(def.updateRecord).length > 0 ? this.update({ ...def, record: def.updateRecord }) : "LEAVE proc_label;"}
759
+
760
+ ELSE
761
+
762
+ ${Object.keys(def.insertRecord).length > 0 ? this.insert({ ...def, record: def.insertRecord }) : "LEAVE proc_label;"}
763
+
764
+ END IF;
765
+
766
+ END;
767
+ CALL ${procName};
768
+ DROP PROCEDURE ${procName};`;
769
+ return q.trim() + ";";
770
+ }
771
+ else {
772
+ let q = "";
773
+ // LINE 1
774
+ q += `MERGE ${def.from} as ${def.as}`;
775
+ q += "\n";
776
+ // USING
777
+ q += "USING (SELECT 0 as _using) as _using";
778
+ q += "\n";
779
+ // WHERE
780
+ q += `ON ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
781
+ q += "\n";
782
+ // UPDATE
783
+ if (typeof def.updateRecord !== "undefined" && Object.keys(def.updateRecord).length > 0) {
784
+ q += "WHEN MATCHED THEN\n";
785
+ q += " UPDATE SET\n";
786
+ q += Object.keys(def.updateRecord).map((key) => ` ${key} = ${this.getQueryOfQueryValue(def.updateRecord[key])}`).join(",\n");
787
+ q += "\n";
788
+ }
789
+ // INSERT
790
+ q += "WHEN NOT MATCHED THEN\n";
791
+ q += ` INSERT (${Object.keys(def.insertRecord).join(", ")})\n`;
792
+ q += ` VALUES (${Object.values(def.insertRecord).map((val) => this.getQueryOfQueryValue(val)).join(", ")})`;
793
+ q += "\n";
794
+ if (def.output) {
795
+ q += `OUTPUT ${def.output.map((item) => "INSERTED." + item).join(", ")}`;
796
+ q += "\n";
797
+ }
798
+ return q.trim() + ";";
799
+ }
800
+ }
801
+ delete(def) {
802
+ if (def.as === undefined)
803
+ throw new NeverEntryError();
804
+ if (this._dialect === "mysql") {
805
+ // TODO: 일반적인 경우엔 그냥 DELETE 쿼리 사용
806
+ return `
807
+ USE ${def.from.split(".")[0]};
808
+
809
+ SET foreign_key_checks=0;
810
+
811
+ SET @cols = NULL;
812
+
813
+ SELECT GROUP_CONCAT('${"`_" + def.as.slice(1)}.\`', COLUMN_NAME, '\`', ' = ', '${def.as}.\`', COLUMN_NAME, '\`' separator ' AND ') INTO @cols
814
+ FROM INFORMATION_SCHEMA.COLUMNS
815
+ WHERE CONCAT('\`', TABLE_SCHEMA, '\`.\`', TABLE_NAME, '\`') = '${def.from}' AND COLUMN_KEY='PRI';
816
+
817
+ SET @sql = CONCAT('${`DELETE ${def.as} FROM ${def.from} as ${def.as} JOIN (
818
+ ${this.select(def).replace(/\n/g, "\n ").replace("*", def.as + ".*")}
819
+ ) ${"`_" + def.as.slice(1)} ON 1 = 1 WHERE `.replace(/'/g, "''")}', @cols, ';');
820
+ SELECT @sql;
821
+
822
+ PREPARE stmt FROM @sql;
823
+ EXECUTE stmt;
824
+ DEALLOCATE PREPARE stmt;
825
+
826
+ SET foreign_key_checks=1;`.trim();
827
+ }
828
+ else {
829
+ if (this._dialect === "sqlite") {
830
+ if (def.join && def.join.length > 0) {
831
+ throw new Error("sqlite - update - join 미구현");
832
+ }
833
+ else if (def.limit || def.top !== undefined) {
834
+ throw new Error("sqlite - update - limit, top 미구현");
835
+ }
836
+ }
837
+ let q = "";
838
+ // LINE 1
839
+ q += "DELETE";
840
+ if (def.top !== undefined) {
841
+ q += ` TOP (${def.top})`;
842
+ }
843
+ q += "\n";
844
+ if (this._dialect !== "sqlite") {
845
+ q += ` ${def.as}`;
846
+ q += "\n";
847
+ }
848
+ // OUTPUT
849
+ if (def.output) {
850
+ if (this._dialect === "sqlite") {
851
+ q += `RETURNING ${def.output.map((item) => "DELETED." + item).join(", ")}`;
852
+ q += "\n";
853
+ }
854
+ else {
855
+ q += `OUTPUT ${def.output.map((item) => "DELETED." + item).join(", ")}`;
856
+ q += "\n";
857
+ }
858
+ }
859
+ // FROM, AS
860
+ q += `FROM ${def.from} as ${def.as}`;
861
+ q += "\n";
862
+ // JOIN
863
+ if (def.join && def.join.length > 0) {
864
+ for (const joinDef of def.join) {
865
+ q += this._getQueryOfJoinDef(joinDef);
866
+ q += "\n";
867
+ }
868
+ }
869
+ // WHERE
870
+ if (def.where) {
871
+ q += `WHERE ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
872
+ q += "\n";
873
+ }
874
+ return q.trim() + ";";
875
+ }
876
+ }
877
+ truncateTable(def) {
878
+ const tableName = this.getTableName(def.table);
879
+ return `TRUNCATE TABLE ${tableName}`;
880
+ }
881
+ // endregion
882
+ // ----------------------------------------------------
883
+ // HELPERS
884
+ // ----------------------------------------------------
885
+ // region HELPERS
886
+ query(def) {
887
+ return this[def.type](def);
888
+ }
889
+ wrap(name) {
890
+ return this._dialect === "mysql" ? "`" + name + "`"
891
+ : "[" + name + "]";
892
+ }
893
+ getTableName(def) {
894
+ return this.getTableNameChain(def).map((item) => this.wrap(item)).join(".");
895
+ }
896
+ getTableNameWithoutDatabase(def) {
897
+ return this.getTableNameChain(def).slice(1).map((item) => this.wrap(item)).join(".");
898
+ }
899
+ getTableNameChain(def) {
900
+ if (this._dialect === "mysql") {
901
+ if (def.database !== undefined) {
902
+ return [def.database, def.name];
903
+ }
904
+ else {
905
+ return [def.name];
906
+ }
907
+ }
908
+ else if (this._dialect === "mssql-azure") {
909
+ if (def.schema !== undefined) {
910
+ return [def.schema, def.name];
911
+ }
912
+ else {
913
+ return [def.name];
914
+ }
915
+ }
916
+ else {
917
+ if (def.database !== undefined) {
918
+ if (def.schema === undefined) {
919
+ throw new Error(`SCHEMA가 지정되어있지 않습니다. (DB: ${def.database}, TABLE: ${def.name})`);
920
+ }
921
+ return [def.database, def.schema, def.name];
922
+ }
923
+ else if (def.schema !== undefined) {
924
+ return [def.schema, def.name];
925
+ }
926
+ else {
927
+ return [def.name];
928
+ }
929
+ }
930
+ }
931
+ getQueryOfQueryValue(queryValue) {
932
+ if (queryValue instanceof Array) {
933
+ return "(" + queryValue.map((item) => this.getQueryOfQueryValue(item)).join("") + ")";
934
+ }
935
+ else if (queryValue["from"] !== undefined) {
936
+ let subQuery = "(\n";
937
+ subQuery += " " + this.select(queryValue).replace(/\n/g, "\n ") + "\n";
938
+ subQuery += ")";
939
+ return subQuery;
940
+ }
941
+ else {
942
+ return queryValue;
943
+ }
944
+ }
945
+ _getQueryOfColDef(colDef) {
946
+ let q = "";
947
+ if (this._dialect === "sqlite") {
948
+ q += this.wrap(colDef.name) + " ";
949
+ q += this.qh.type(colDef.dataType) + " ";
950
+ q += colDef.pkOrderBy ? `PRIMARY KEY ${colDef.pkOrderBy} ` : "";
951
+ q += colDef.autoIncrement ? this.qh.type(colDef.dataType) === "UNIQUEIDENTIFIER" ? "default NEWID() " : "AUTOINCREMENT " : "";
952
+ q += colDef.autoIncrement ? "" : colDef.nullable ? "NULL " : "NOT NULL ";
953
+ }
954
+ else if (this._dialect === "mysql") {
955
+ q += this.wrap(colDef.name) + " ";
956
+ q += this.qh.type(colDef.dataType) + " ";
957
+ q += colDef.nullable ? "NULL " : "NOT NULL ";
958
+ q += colDef.autoIncrement ? this.qh.type(colDef.dataType) === "CHAR(38)" ? "default (REPLACE(UUID(), '-', '')) " : "AUTO_INCREMENT" : "";
959
+ }
960
+ else {
961
+ q += this.wrap(colDef.name) + " ";
962
+ q += this.qh.type(colDef.dataType) + " ";
963
+ q += colDef.autoIncrement ? this.qh.type(colDef.dataType) === "UNIQUEIDENTIFIER" ? "default NEWID() " : "IDENTITY(1,1) " : "";
964
+ q += colDef.nullable ? "NULL" : "NOT NULL";
965
+ }
966
+ return q.trim();
967
+ }
968
+ _getQueryOfJoinDef(def) {
969
+ let q = "";
970
+ if (Object.keys(def).every((key) => def[key] === undefined || (["from", "as", "where", "select", "isCustomSelect"].includes(key))) && !def.isCustomSelect) {
971
+ q += "LEFT OUTER JOIN ";
972
+ if (def.from instanceof Array) {
973
+ if (def.as === undefined)
974
+ throw new NeverEntryError();
975
+ q += "(\n";
976
+ for (const from of def.from) {
977
+ q += " " + this.select(from).replace(/\n/g, "\n ");
978
+ q += "\n\n UNION ALL\n\n";
979
+ }
980
+ q = q.slice(0, -14);
981
+ q += `) as ${def.as}`;
982
+ }
983
+ else if (def.from?.["from"] !== undefined) {
984
+ if (def.as === undefined)
985
+ throw new NeverEntryError();
986
+ q += "(\n";
987
+ q += " " + this.select(def.from).replace(/\n/g, "\n ") + "\n";
988
+ q += `) as ${def.as}`;
989
+ }
990
+ else {
991
+ if (def.as === undefined)
992
+ throw new NeverEntryError();
993
+ q += `${def.from} as ${def.as}`;
994
+ }
995
+ if (def.where) {
996
+ q += ` ON ${def.where.map((item) => this.getQueryOfQueryValue(item)).join("")}`;
997
+ }
998
+ else {
999
+ q += " ON 1 = 1";
1000
+ }
1001
+ }
1002
+ else {
1003
+ if (this._dialect === "sqlite") {
1004
+ q += "LEFT OUTER JOIN (\n";
1005
+ q += " " + this.select(def).replace(/\n/g, "\n ") + "\n";
1006
+ q += ") as " + def.as;
1007
+ }
1008
+ else if (this._dialect === "mssql" || this._dialect === "mssql-azure") {
1009
+ q += "OUTER APPLY (\n";
1010
+ q += " " + this.select(def).replace(/\n/g, "\n ") + "\n";
1011
+ q += ") as " + def.as;
1012
+ }
1013
+ else {
1014
+ q += "LEFT OUTER JOIN LATERAL (\n";
1015
+ q += " " + this.select(def).replace(/\n/g, "\n ") + "\n";
1016
+ q += ") as " + def.as + " ON 1 = 1";
1017
+ }
1018
+ }
1019
+ return q.trim();
1020
+ }
1021
+ }
1022
+ //# sourceMappingURL=QueryBuilder.js.map