@simplysm/orm-common 13.0.69 → 13.0.71

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 (204) hide show
  1. package/README.md +54 -1447
  2. package/dist/create-db-context.d.ts +10 -10
  3. package/dist/create-db-context.js +9 -9
  4. package/dist/create-db-context.js.map +1 -1
  5. package/dist/ddl/column-ddl.d.ts +4 -4
  6. package/dist/ddl/initialize.d.ts +17 -17
  7. package/dist/ddl/initialize.js +2 -2
  8. package/dist/ddl/initialize.js.map +1 -1
  9. package/dist/ddl/relation-ddl.d.ts +6 -6
  10. package/dist/ddl/schema-ddl.d.ts +4 -4
  11. package/dist/ddl/table-ddl.d.ts +24 -24
  12. package/dist/ddl/table-ddl.js +4 -4
  13. package/dist/ddl/table-ddl.js.map +1 -1
  14. package/dist/errors/db-transaction-error.d.ts +15 -15
  15. package/dist/errors/db-transaction-error.d.ts.map +1 -1
  16. package/dist/exec/executable.d.ts +23 -23
  17. package/dist/exec/executable.js +3 -3
  18. package/dist/exec/executable.js.map +1 -1
  19. package/dist/exec/queryable.d.ts +160 -160
  20. package/dist/exec/queryable.js +119 -119
  21. package/dist/exec/queryable.js.map +1 -1
  22. package/dist/exec/search-parser.d.ts +37 -37
  23. package/dist/exec/search-parser.d.ts.map +1 -1
  24. package/dist/expr/expr-unit.d.ts +4 -4
  25. package/dist/expr/expr.d.ts +257 -257
  26. package/dist/expr/expr.js +265 -265
  27. package/dist/expr/expr.js.map +1 -1
  28. package/dist/query-builder/base/expr-renderer-base.d.ts +9 -9
  29. package/dist/query-builder/base/expr-renderer-base.js +2 -2
  30. package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
  31. package/dist/query-builder/base/query-builder-base.d.ts +26 -26
  32. package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
  33. package/dist/query-builder/base/query-builder-base.js +22 -22
  34. package/dist/query-builder/base/query-builder-base.js.map +1 -1
  35. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
  36. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
  37. package/dist/query-builder/mssql/mssql-expr-renderer.js +18 -18
  38. package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
  39. package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
  40. package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
  41. package/dist/query-builder/mssql/mssql-query-builder.js +11 -11
  42. package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
  43. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
  44. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
  45. package/dist/query-builder/mysql/mysql-expr-renderer.js +17 -17
  46. package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
  47. package/dist/query-builder/mysql/mysql-query-builder.d.ts +8 -8
  48. package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
  49. package/dist/query-builder/mysql/mysql-query-builder.js +5 -5
  50. package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
  51. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
  52. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
  53. package/dist/query-builder/postgresql/postgresql-expr-renderer.js +17 -17
  54. package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
  55. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +5 -5
  56. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
  57. package/dist/query-builder/postgresql/postgresql-query-builder.js +8 -8
  58. package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
  59. package/dist/query-builder/query-builder.d.ts +1 -1
  60. package/dist/schema/factory/column-builder.d.ts +79 -79
  61. package/dist/schema/factory/column-builder.js +42 -42
  62. package/dist/schema/factory/index-builder.d.ts +39 -39
  63. package/dist/schema/factory/index-builder.js +26 -26
  64. package/dist/schema/factory/relation-builder.d.ts +99 -99
  65. package/dist/schema/factory/relation-builder.d.ts.map +1 -1
  66. package/dist/schema/factory/relation-builder.js +38 -38
  67. package/dist/schema/procedure-builder.d.ts +49 -49
  68. package/dist/schema/procedure-builder.d.ts.map +1 -1
  69. package/dist/schema/procedure-builder.js +33 -33
  70. package/dist/schema/table-builder.d.ts +59 -59
  71. package/dist/schema/table-builder.d.ts.map +1 -1
  72. package/dist/schema/table-builder.js +43 -43
  73. package/dist/schema/view-builder.d.ts +49 -49
  74. package/dist/schema/view-builder.d.ts.map +1 -1
  75. package/dist/schema/view-builder.js +32 -32
  76. package/dist/types/column.d.ts +22 -22
  77. package/dist/types/column.js +1 -1
  78. package/dist/types/column.js.map +1 -1
  79. package/dist/types/db.d.ts +40 -40
  80. package/dist/types/expr.d.ts +59 -59
  81. package/dist/types/expr.d.ts.map +1 -1
  82. package/dist/types/query-def.d.ts +44 -44
  83. package/dist/types/query-def.d.ts.map +1 -1
  84. package/dist/utils/result-parser.d.ts +11 -11
  85. package/dist/utils/result-parser.js +3 -3
  86. package/dist/utils/result-parser.js.map +1 -1
  87. package/package.json +5 -5
  88. package/src/create-db-context.ts +20 -20
  89. package/src/ddl/column-ddl.ts +4 -4
  90. package/src/ddl/initialize.ts +259 -259
  91. package/src/ddl/relation-ddl.ts +89 -89
  92. package/src/ddl/schema-ddl.ts +4 -4
  93. package/src/ddl/table-ddl.ts +189 -189
  94. package/src/errors/db-transaction-error.ts +13 -13
  95. package/src/exec/executable.ts +25 -25
  96. package/src/exec/queryable.ts +2033 -2033
  97. package/src/exec/search-parser.ts +57 -57
  98. package/src/expr/expr-unit.ts +4 -4
  99. package/src/expr/expr.ts +2140 -2140
  100. package/src/query-builder/base/expr-renderer-base.ts +237 -237
  101. package/src/query-builder/base/query-builder-base.ts +213 -213
  102. package/src/query-builder/mssql/mssql-expr-renderer.ts +607 -607
  103. package/src/query-builder/mssql/mssql-query-builder.ts +650 -650
  104. package/src/query-builder/mysql/mysql-expr-renderer.ts +613 -613
  105. package/src/query-builder/mysql/mysql-query-builder.ts +759 -759
  106. package/src/query-builder/postgresql/postgresql-expr-renderer.ts +611 -611
  107. package/src/query-builder/postgresql/postgresql-query-builder.ts +686 -686
  108. package/src/query-builder/query-builder.ts +19 -19
  109. package/src/schema/factory/column-builder.ts +423 -423
  110. package/src/schema/factory/index-builder.ts +164 -164
  111. package/src/schema/factory/relation-builder.ts +453 -453
  112. package/src/schema/procedure-builder.ts +232 -232
  113. package/src/schema/table-builder.ts +319 -319
  114. package/src/schema/view-builder.ts +221 -221
  115. package/src/types/column.ts +188 -188
  116. package/src/types/db.ts +208 -208
  117. package/src/types/expr.ts +697 -697
  118. package/src/types/query-def.ts +513 -513
  119. package/src/utils/result-parser.ts +458 -458
  120. package/tests/db-context/create-db-context.spec.ts +224 -0
  121. package/tests/db-context/define-db-context.spec.ts +68 -0
  122. package/tests/ddl/basic.expected.ts +341 -0
  123. package/tests/ddl/basic.spec.ts +714 -0
  124. package/tests/ddl/column-builder.expected.ts +310 -0
  125. package/tests/ddl/column-builder.spec.ts +637 -0
  126. package/tests/ddl/index-builder.expected.ts +38 -0
  127. package/tests/ddl/index-builder.spec.ts +202 -0
  128. package/tests/ddl/procedure-builder.expected.ts +52 -0
  129. package/tests/ddl/procedure-builder.spec.ts +234 -0
  130. package/tests/ddl/relation-builder.expected.ts +36 -0
  131. package/tests/ddl/relation-builder.spec.ts +372 -0
  132. package/tests/ddl/table-builder.expected.ts +113 -0
  133. package/tests/ddl/table-builder.spec.ts +433 -0
  134. package/tests/ddl/view-builder.expected.ts +38 -0
  135. package/tests/ddl/view-builder.spec.ts +176 -0
  136. package/tests/dml/delete.expected.ts +96 -0
  137. package/tests/dml/delete.spec.ts +160 -0
  138. package/tests/dml/insert.expected.ts +192 -0
  139. package/tests/dml/insert.spec.ts +288 -0
  140. package/tests/dml/update.expected.ts +176 -0
  141. package/tests/dml/update.spec.ts +318 -0
  142. package/tests/dml/upsert.expected.ts +215 -0
  143. package/tests/dml/upsert.spec.ts +242 -0
  144. package/tests/errors/queryable-errors.spec.ts +177 -0
  145. package/tests/escape.spec.ts +100 -0
  146. package/tests/examples/pivot.expected.ts +211 -0
  147. package/tests/examples/pivot.spec.ts +533 -0
  148. package/tests/examples/sampling.expected.ts +69 -0
  149. package/tests/examples/sampling.spec.ts +105 -0
  150. package/tests/examples/unpivot.expected.ts +120 -0
  151. package/tests/examples/unpivot.spec.ts +226 -0
  152. package/tests/exec/search-parser.spec.ts +283 -0
  153. package/tests/executable/basic.expected.ts +18 -0
  154. package/tests/executable/basic.spec.ts +54 -0
  155. package/tests/expr/comparison.expected.ts +282 -0
  156. package/tests/expr/comparison.spec.ts +400 -0
  157. package/tests/expr/conditional.expected.ts +134 -0
  158. package/tests/expr/conditional.spec.ts +276 -0
  159. package/tests/expr/date.expected.ts +332 -0
  160. package/tests/expr/date.spec.ts +526 -0
  161. package/tests/expr/math.expected.ts +62 -0
  162. package/tests/expr/math.spec.ts +106 -0
  163. package/tests/expr/string.expected.ts +218 -0
  164. package/tests/expr/string.spec.ts +356 -0
  165. package/tests/expr/utility.expected.ts +147 -0
  166. package/tests/expr/utility.spec.ts +182 -0
  167. package/tests/select/basic.expected.ts +322 -0
  168. package/tests/select/basic.spec.ts +502 -0
  169. package/tests/select/filter.expected.ts +357 -0
  170. package/tests/select/filter.spec.ts +1068 -0
  171. package/tests/select/group.expected.ts +169 -0
  172. package/tests/select/group.spec.ts +244 -0
  173. package/tests/select/join.expected.ts +582 -0
  174. package/tests/select/join.spec.ts +805 -0
  175. package/tests/select/order.expected.ts +150 -0
  176. package/tests/select/order.spec.ts +189 -0
  177. package/tests/select/recursive-cte.expected.ts +244 -0
  178. package/tests/select/recursive-cte.spec.ts +514 -0
  179. package/tests/select/result-meta.spec.ts +270 -0
  180. package/tests/select/subquery.expected.ts +363 -0
  181. package/tests/select/subquery.spec.ts +537 -0
  182. package/tests/select/view.expected.ts +155 -0
  183. package/tests/select/view.spec.ts +235 -0
  184. package/tests/select/window.expected.ts +345 -0
  185. package/tests/select/window.spec.ts +618 -0
  186. package/tests/setup/MockExecutor.ts +18 -0
  187. package/tests/setup/TestDbContext.ts +59 -0
  188. package/tests/setup/models/Company.ts +13 -0
  189. package/tests/setup/models/Employee.ts +10 -0
  190. package/tests/setup/models/MonthlySales.ts +11 -0
  191. package/tests/setup/models/Post.ts +16 -0
  192. package/tests/setup/models/Sales.ts +10 -0
  193. package/tests/setup/models/User.ts +19 -0
  194. package/tests/setup/procedure/GetAllUsers.ts +9 -0
  195. package/tests/setup/procedure/GetUserById.ts +12 -0
  196. package/tests/setup/test-utils.ts +72 -0
  197. package/tests/setup/views/ActiveUsers.ts +8 -0
  198. package/tests/setup/views/UserSummary.ts +11 -0
  199. package/tests/types/nullable-queryable-record.spec.ts +145 -0
  200. package/tests/utils/result-parser-perf.spec.ts +210 -0
  201. package/tests/utils/result-parser.spec.ts +701 -0
  202. package/docs/expressions.md +0 -172
  203. package/docs/queries.md +0 -444
  204. package/docs/schema.md +0 -245
@@ -0,0 +1,714 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createTestDb } from "../setup/TestDbContext";
3
+ import { User } from "../setup/models/User";
4
+ import { Post } from "../setup/models/Post";
5
+ import { GetUserById } from "../setup/procedure/GetUserById";
6
+ import { ActiveUsers } from "../setup/views/ActiveUsers";
7
+ import { ForeignKeyBuilder } from "../../src/schema/factory/relation-builder";
8
+ import { createColumnFactory } from "../../src/schema/factory/column-builder";
9
+ import { IndexBuilder } from "../../src/schema/factory/index-builder";
10
+ import { createQueryBuilder } from "../../src/query-builder/query-builder";
11
+ import { dialects } from "../setup/test-utils";
12
+ import "../setup/test-utils"; // toMatchSql matcher
13
+ import * as expected from "./basic.expected";
14
+
15
+ const Column = createColumnFactory();
16
+
17
+ describe("DDL - Database", () => {
18
+ describe("getClearSchemaQueryDef", () => {
19
+ const db = createTestDb();
20
+ const def = db.getClearSchemaQueryDef({ database: "TestDb", schema: "TestSchema" });
21
+
22
+ it("should validate QueryDef", () => {
23
+ expect(def).toEqual({
24
+ type: "clearSchema",
25
+ database: "TestDb",
26
+ schema: "TestSchema",
27
+ });
28
+ });
29
+
30
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
31
+ const builder = createQueryBuilder(dialect);
32
+ expect(builder.build(def)).toMatchSql(expected.clearSchema[dialect]);
33
+ });
34
+ });
35
+
36
+ describe("getSchemaExistsQueryDef", () => {
37
+ const db = createTestDb();
38
+ const def = db.getSchemaExistsQueryDef("TestDb", "TestSchema");
39
+
40
+ it("should validate QueryDef", () => {
41
+ expect(def).toEqual({
42
+ type: "schemaExists",
43
+ database: "TestDb",
44
+ schema: "TestSchema",
45
+ });
46
+ });
47
+
48
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
49
+ const builder = createQueryBuilder(dialect);
50
+ expect(builder.build(def)).toMatchSql(expected.schemaExists[dialect]);
51
+ });
52
+ });
53
+ });
54
+
55
+ describe("DDL - Table", () => {
56
+ describe("getCreateTableQueryDef", () => {
57
+ const db = createTestDb();
58
+ const def = db.getCreateTableQueryDef(User);
59
+
60
+ it("should validate QueryDef", () => {
61
+ expect(def).toEqual({
62
+ type: "createTable",
63
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
64
+ columns: [
65
+ {
66
+ name: "id",
67
+ dataType: { type: "bigint" },
68
+ autoIncrement: true,
69
+ nullable: undefined,
70
+ default: undefined,
71
+ },
72
+ {
73
+ name: "name",
74
+ dataType: { type: "varchar", length: 100 },
75
+ autoIncrement: undefined,
76
+ nullable: undefined,
77
+ default: undefined,
78
+ },
79
+ {
80
+ name: "email",
81
+ dataType: { type: "varchar", length: 200 },
82
+ autoIncrement: undefined,
83
+ nullable: true,
84
+ default: undefined,
85
+ },
86
+ {
87
+ name: "age",
88
+ dataType: { type: "int" },
89
+ autoIncrement: undefined,
90
+ nullable: true,
91
+ default: undefined,
92
+ },
93
+ {
94
+ name: "isActive",
95
+ dataType: { type: "boolean" },
96
+ autoIncrement: undefined,
97
+ nullable: undefined,
98
+ default: true,
99
+ },
100
+ {
101
+ name: "companyId",
102
+ dataType: { type: "bigint" },
103
+ autoIncrement: undefined,
104
+ nullable: true,
105
+ default: undefined,
106
+ },
107
+ {
108
+ name: "createdAt",
109
+ dataType: { type: "datetime" },
110
+ autoIncrement: undefined,
111
+ nullable: undefined,
112
+ default: undefined,
113
+ },
114
+ ],
115
+ primaryKey: ["id"],
116
+ });
117
+ });
118
+
119
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
120
+ const builder = createQueryBuilder(dialect);
121
+ expect(builder.build(def)).toMatchSql(expected.createTable[dialect]);
122
+ });
123
+ });
124
+
125
+ describe("getTruncateQueryDef", () => {
126
+ const db = createTestDb();
127
+ const def = db.getTruncateQueryDef({ database: "TestDb", schema: "TestSchema", name: "User" });
128
+
129
+ it("should validate QueryDef", () => {
130
+ expect(def).toEqual({
131
+ type: "truncate",
132
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
133
+ });
134
+ });
135
+
136
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
137
+ const builder = createQueryBuilder(dialect);
138
+ expect(builder.build(def)).toMatchSql(expected.truncate[dialect]);
139
+ });
140
+ });
141
+
142
+ describe("getSwitchFkQueryDef - on", () => {
143
+ const db = createTestDb();
144
+ const def = db.getSwitchFkQueryDef(
145
+ { database: "TestDb", schema: "TestSchema", name: "User" },
146
+ "on",
147
+ );
148
+
149
+ it("should validate QueryDef", () => {
150
+ expect(def).toEqual({
151
+ type: "switchFk",
152
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
153
+ switch: "on",
154
+ });
155
+ });
156
+
157
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
158
+ const builder = createQueryBuilder(dialect);
159
+ expect(builder.build(def)).toMatchSql(expected.switchFkOn[dialect]);
160
+ });
161
+ });
162
+
163
+ describe("getSwitchFkQueryDef - off", () => {
164
+ const db = createTestDb();
165
+ const def = db.getSwitchFkQueryDef(
166
+ { database: "TestDb", schema: "TestSchema", name: "User" },
167
+ "off",
168
+ );
169
+
170
+ it("should validate QueryDef", () => {
171
+ expect(def).toEqual({
172
+ type: "switchFk",
173
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
174
+ switch: "off",
175
+ });
176
+ });
177
+
178
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
179
+ const builder = createQueryBuilder(dialect);
180
+ expect(builder.build(def)).toMatchSql(expected.switchFkOff[dialect]);
181
+ });
182
+ });
183
+
184
+ describe("getDropTableQueryDef", () => {
185
+ const db = createTestDb();
186
+ const def = db.getDropTableQueryDef({ database: "TestDb", schema: "TestSchema", name: "User" });
187
+
188
+ it("should validate QueryDef", () => {
189
+ expect(def).toEqual({
190
+ type: "dropTable",
191
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
192
+ });
193
+ });
194
+
195
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
196
+ const builder = createQueryBuilder(dialect);
197
+ expect(builder.build(def)).toMatchSql(expected.dropTable[dialect]);
198
+ });
199
+ });
200
+
201
+ describe("getRenameTableQueryDef", () => {
202
+ const db = createTestDb();
203
+ const def = db.getRenameTableQueryDef(
204
+ { database: "TestDb", schema: "TestSchema", name: "User" },
205
+ "Member",
206
+ );
207
+
208
+ it("should validate QueryDef", () => {
209
+ expect(def).toEqual({
210
+ type: "renameTable",
211
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
212
+ newName: "Member",
213
+ });
214
+ });
215
+
216
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
217
+ const builder = createQueryBuilder(dialect);
218
+ expect(builder.build(def)).toMatchSql(expected.renameTable[dialect]);
219
+ });
220
+ });
221
+ });
222
+
223
+ describe("DDL - Column", () => {
224
+ describe("getAddColumnQueryDef", () => {
225
+ const db = createTestDb();
226
+ const column = Column.varchar(50).nullable();
227
+ const def = db.getAddColumnQueryDef(
228
+ { database: "TestDb", schema: "TestSchema", name: "User" },
229
+ "nickname",
230
+ column,
231
+ );
232
+
233
+ it("should validate QueryDef", () => {
234
+ expect(def).toEqual({
235
+ type: "addColumn",
236
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
237
+ column: {
238
+ name: "nickname",
239
+ dataType: { type: "varchar", length: 50 },
240
+ autoIncrement: undefined,
241
+ nullable: true,
242
+ default: undefined,
243
+ },
244
+ });
245
+ });
246
+
247
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
248
+ const builder = createQueryBuilder(dialect);
249
+ expect(builder.build(def)).toMatchSql(expected.addColumn[dialect]);
250
+ });
251
+ });
252
+
253
+ describe("getAddColumnQueryDef - with default", () => {
254
+ const db = createTestDb();
255
+ const column = Column.int().default(0);
256
+ const def = db.getAddColumnQueryDef(
257
+ { database: "TestDb", schema: "TestSchema", name: "User" },
258
+ "score",
259
+ column,
260
+ );
261
+
262
+ it("should validate QueryDef", () => {
263
+ expect(def).toEqual({
264
+ type: "addColumn",
265
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
266
+ column: {
267
+ name: "score",
268
+ dataType: { type: "int" },
269
+ autoIncrement: undefined,
270
+ nullable: undefined,
271
+ default: 0,
272
+ },
273
+ });
274
+ });
275
+
276
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
277
+ const builder = createQueryBuilder(dialect);
278
+ expect(builder.build(def)).toMatchSql(expected.addColumnWithDefault[dialect]);
279
+ });
280
+ });
281
+
282
+ describe("getAddColumnQueryDef - with autoIncrement", () => {
283
+ const db = createTestDb();
284
+ const column = Column.bigint().autoIncrement();
285
+ const def = db.getAddColumnQueryDef(
286
+ { database: "TestDb", schema: "TestSchema", name: "User" },
287
+ "seq",
288
+ column,
289
+ );
290
+
291
+ it("should validate QueryDef", () => {
292
+ expect(def).toEqual({
293
+ type: "addColumn",
294
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
295
+ column: {
296
+ name: "seq",
297
+ dataType: { type: "bigint" },
298
+ autoIncrement: true,
299
+ nullable: undefined,
300
+ default: undefined,
301
+ },
302
+ });
303
+ });
304
+
305
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
306
+ const builder = createQueryBuilder(dialect);
307
+ expect(builder.build(def)).toMatchSql(expected.addColumnWithAutoIncrement[dialect]);
308
+ });
309
+ });
310
+
311
+ describe("getDropColumnQueryDef", () => {
312
+ const db = createTestDb();
313
+ const def = db.getDropColumnQueryDef(
314
+ { database: "TestDb", schema: "TestSchema", name: "User" },
315
+ "email",
316
+ );
317
+
318
+ it("should validate QueryDef", () => {
319
+ expect(def).toEqual({
320
+ type: "dropColumn",
321
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
322
+ column: "email",
323
+ });
324
+ });
325
+
326
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
327
+ const builder = createQueryBuilder(dialect);
328
+ expect(builder.build(def)).toMatchSql(expected.dropColumn[dialect]);
329
+ });
330
+ });
331
+
332
+ describe("getModifyColumnQueryDef", () => {
333
+ const db = createTestDb();
334
+ const column = Column.varchar(200).nullable();
335
+ const def = db.getModifyColumnQueryDef(
336
+ { database: "TestDb", schema: "TestSchema", name: "User" },
337
+ "name",
338
+ column,
339
+ );
340
+
341
+ it("should validate QueryDef", () => {
342
+ expect(def).toEqual({
343
+ type: "modifyColumn",
344
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
345
+ column: {
346
+ name: "name",
347
+ dataType: { type: "varchar", length: 200 },
348
+ autoIncrement: undefined,
349
+ nullable: true,
350
+ default: undefined,
351
+ },
352
+ });
353
+ });
354
+
355
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
356
+ const builder = createQueryBuilder(dialect);
357
+ expect(builder.build(def)).toMatchSql(expected.modifyColumn[dialect]);
358
+ });
359
+ });
360
+
361
+ describe("getModifyColumnQueryDef - change TYPE + DEFAULT simultaneously", () => {
362
+ const db = createTestDb();
363
+ const column = Column.int().default(100);
364
+ const def = db.getModifyColumnQueryDef(
365
+ { database: "TestDb", schema: "TestSchema", name: "User" },
366
+ "score",
367
+ column,
368
+ );
369
+
370
+ it("should validate QueryDef", () => {
371
+ expect(def).toEqual({
372
+ type: "modifyColumn",
373
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
374
+ column: {
375
+ name: "score",
376
+ dataType: { type: "int" },
377
+ autoIncrement: undefined,
378
+ nullable: undefined,
379
+ default: 100,
380
+ },
381
+ });
382
+ });
383
+
384
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
385
+ const builder = createQueryBuilder(dialect);
386
+ expect(builder.build(def)).toMatchSql(expected.modifyColumnTypeAndDefault[dialect]);
387
+ });
388
+ });
389
+
390
+ describe("getRenameColumnQueryDef", () => {
391
+ const db = createTestDb();
392
+ const def = db.getRenameColumnQueryDef(
393
+ { database: "TestDb", schema: "TestSchema", name: "User" },
394
+ "name",
395
+ "fullName",
396
+ );
397
+
398
+ it("should validate QueryDef", () => {
399
+ expect(def).toEqual({
400
+ type: "renameColumn",
401
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
402
+ column: "name",
403
+ newName: "fullName",
404
+ });
405
+ });
406
+
407
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
408
+ const builder = createQueryBuilder(dialect);
409
+ expect(builder.build(def)).toMatchSql(expected.renameColumn[dialect]);
410
+ });
411
+ });
412
+ });
413
+
414
+ describe("DDL - Primary Key", () => {
415
+ describe("getDropPkQueryDef", () => {
416
+ const db = createTestDb();
417
+ const def = db.getDropPkQueryDef({ database: "TestDb", schema: "TestSchema", name: "User" });
418
+
419
+ it("should validate QueryDef", () => {
420
+ expect(def).toEqual({
421
+ type: "dropPk",
422
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
423
+ });
424
+ });
425
+
426
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
427
+ const builder = createQueryBuilder(dialect);
428
+ expect(builder.build(def)).toMatchSql(expected.dropPk[dialect]);
429
+ });
430
+ });
431
+
432
+ describe("getAddPkQueryDef", () => {
433
+ const db = createTestDb();
434
+ const def = db.getAddPkQueryDef({ database: "TestDb", schema: "TestSchema", name: "User" }, [
435
+ "id",
436
+ ]);
437
+
438
+ it("should validate QueryDef", () => {
439
+ expect(def).toEqual({
440
+ type: "addPk",
441
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
442
+ columns: ["id"],
443
+ });
444
+ });
445
+
446
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
447
+ const builder = createQueryBuilder(dialect);
448
+ expect(builder.build(def)).toMatchSql(expected.addPk[dialect]);
449
+ });
450
+ });
451
+
452
+ describe("getAddPkQueryDef - composite key", () => {
453
+ const db = createTestDb();
454
+ const def = db.getAddPkQueryDef(
455
+ { database: "TestDb", schema: "TestSchema", name: "UserRole" },
456
+ ["userId", "roleId"],
457
+ );
458
+
459
+ it("should validate QueryDef", () => {
460
+ expect(def).toEqual({
461
+ type: "addPk",
462
+ table: { database: "TestDb", schema: "TestSchema", name: "UserRole" },
463
+ columns: ["userId", "roleId"],
464
+ });
465
+ });
466
+
467
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
468
+ const builder = createQueryBuilder(dialect);
469
+ expect(builder.build(def)).toMatchSql(expected.addPkComposite[dialect]);
470
+ });
471
+ });
472
+ });
473
+
474
+ describe("DDL - Foreign Key / Index", () => {
475
+ describe("getAddFkQueryDef", () => {
476
+ const db = createTestDb();
477
+ const userRelation = Post.meta.relations?.["user"];
478
+ if (!(userRelation instanceof ForeignKeyBuilder)) {
479
+ throw new Error("user relation not found");
480
+ }
481
+
482
+ const def = db.getAddFkQueryDef(
483
+ { database: "TestDb", schema: "TestSchema", name: "Post" },
484
+ "user",
485
+ userRelation,
486
+ );
487
+
488
+ it("should validate QueryDef", () => {
489
+ expect(def).toEqual({
490
+ type: "addFk",
491
+ table: { database: "TestDb", schema: "TestSchema", name: "Post" },
492
+ foreignKey: {
493
+ name: "FK_Post_user",
494
+ fkColumns: ["userId"],
495
+ targetTable: { database: "TestDb", schema: "TestSchema", name: "User" },
496
+ targetPkColumns: ["id"],
497
+ },
498
+ });
499
+ });
500
+
501
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
502
+ const builder = createQueryBuilder(dialect);
503
+ expect(builder.build(def)).toMatchSql(expected.addFk[dialect]);
504
+ });
505
+ });
506
+
507
+ describe("getDropFkQueryDef", () => {
508
+ const db = createTestDb();
509
+ const def = db.getDropFkQueryDef(
510
+ { database: "TestDb", schema: "TestSchema", name: "Post" },
511
+ "user",
512
+ );
513
+
514
+ it("should validate QueryDef", () => {
515
+ expect(def).toEqual({
516
+ type: "dropFk",
517
+ table: { database: "TestDb", schema: "TestSchema", name: "Post" },
518
+ foreignKey: "FK_Post_user",
519
+ });
520
+ });
521
+
522
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
523
+ const builder = createQueryBuilder(dialect);
524
+ expect(builder.build(def)).toMatchSql(expected.dropFk[dialect]);
525
+ });
526
+ });
527
+
528
+ describe("getAddIdxQueryDef", () => {
529
+ const db = createTestDb();
530
+ const indexBuilder = new IndexBuilder({ columns: ["email"] as string[], unique: true });
531
+
532
+ const def = db.getAddIdxQueryDef(
533
+ { database: "TestDb", schema: "TestSchema", name: "User" },
534
+ indexBuilder,
535
+ );
536
+
537
+ it("should validate QueryDef", () => {
538
+ expect(def).toEqual({
539
+ type: "addIdx",
540
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
541
+ index: {
542
+ name: "IDX_User_email",
543
+ columns: [{ name: "email", orderBy: "ASC" }],
544
+ unique: true,
545
+ },
546
+ });
547
+ });
548
+
549
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
550
+ const builder = createQueryBuilder(dialect);
551
+ expect(builder.build(def)).toMatchSql(expected.addIdx[dialect]);
552
+ });
553
+ });
554
+
555
+ describe("getDropIdxQueryDef", () => {
556
+ const db = createTestDb();
557
+ const def = db.getDropIdxQueryDef({ database: "TestDb", schema: "TestSchema", name: "User" }, [
558
+ "email",
559
+ ]);
560
+
561
+ it("should validate QueryDef", () => {
562
+ expect(def).toEqual({
563
+ type: "dropIdx",
564
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
565
+ index: "IDX_User_email",
566
+ });
567
+ });
568
+
569
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
570
+ const builder = createQueryBuilder(dialect);
571
+ expect(builder.build(def)).toMatchSql(expected.dropIdx[dialect]);
572
+ });
573
+ });
574
+
575
+ describe("getDropIdxQueryDef - composite", () => {
576
+ const db = createTestDb();
577
+ const def = db.getDropIdxQueryDef({ database: "TestDb", schema: "TestSchema", name: "User" }, [
578
+ "name",
579
+ "email",
580
+ ]);
581
+
582
+ it("should validate QueryDef", () => {
583
+ expect(def).toEqual({
584
+ type: "dropIdx",
585
+ table: { database: "TestDb", schema: "TestSchema", name: "User" },
586
+ index: "IDX_User_name_email",
587
+ });
588
+ });
589
+
590
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
591
+ const builder = createQueryBuilder(dialect);
592
+ expect(builder.build(def)).toMatchSql(expected.dropIdxComposite[dialect]);
593
+ });
594
+ });
595
+ });
596
+
597
+ describe("DDL - View", () => {
598
+ describe("getCreateViewQueryDef", () => {
599
+ const db = createTestDb();
600
+
601
+ const def = db.getCreateViewQueryDef(ActiveUsers);
602
+
603
+ it("should validate QueryDef", () => {
604
+ expect(def).toEqual({
605
+ type: "createView",
606
+ view: { database: "TestDb", schema: "TestSchema", name: "ActiveUsers" },
607
+ queryDef: {
608
+ type: "select",
609
+ from: { database: "TestDb", schema: "TestSchema", name: "User" },
610
+ as: "T1",
611
+ where: [
612
+ {
613
+ type: "eq",
614
+ source: { type: "column", path: ["T1", "isActive"] },
615
+ target: { type: "value", value: true },
616
+ },
617
+ ],
618
+ },
619
+ });
620
+ });
621
+
622
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
623
+ const builder = createQueryBuilder(dialect);
624
+ expect(builder.build(def)).toMatchSql(expected.createView[dialect]);
625
+ });
626
+ });
627
+
628
+ describe("getDropViewQueryDef", () => {
629
+ const db = createTestDb();
630
+ const def = db.getDropViewQueryDef({
631
+ database: "TestDb",
632
+ schema: "TestSchema",
633
+ name: "ActiveUsers",
634
+ });
635
+
636
+ it("should validate QueryDef", () => {
637
+ expect(def).toEqual({
638
+ type: "dropView",
639
+ view: { database: "TestDb", schema: "TestSchema", name: "ActiveUsers" },
640
+ });
641
+ });
642
+
643
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
644
+ const builder = createQueryBuilder(dialect);
645
+ expect(builder.build(def)).toMatchSql(expected.dropView[dialect]);
646
+ });
647
+ });
648
+ });
649
+
650
+ describe("DDL - Procedure", () => {
651
+ describe("getCreateProcQueryDef", () => {
652
+ const db = createTestDb();
653
+ const def = db.getCreateProcQueryDef(GetUserById);
654
+
655
+ it("should validate QueryDef", () => {
656
+ expect(def).toEqual({
657
+ type: "createProc",
658
+ procedure: { database: "TestDb", schema: "TestSchema", name: "GetUserById" },
659
+ params: [
660
+ {
661
+ name: "userId",
662
+ dataType: { type: "bigint" },
663
+ nullable: undefined,
664
+ default: undefined,
665
+ },
666
+ ],
667
+ returns: [
668
+ {
669
+ name: "id",
670
+ dataType: { type: "bigint" },
671
+ nullable: undefined,
672
+ },
673
+ {
674
+ name: "name",
675
+ dataType: { type: "varchar", length: 100 },
676
+ nullable: undefined,
677
+ },
678
+ {
679
+ name: "email",
680
+ dataType: { type: "varchar", length: 200 },
681
+ nullable: true,
682
+ },
683
+ ],
684
+ query: "-- DBMSwrite matching query --",
685
+ });
686
+ });
687
+
688
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
689
+ const builder = createQueryBuilder(dialect);
690
+ expect(builder.build(def)).toMatchSql(expected.createProc[dialect]);
691
+ });
692
+ });
693
+
694
+ describe("getDropProcQueryDef", () => {
695
+ const db = createTestDb();
696
+ const def = db.getDropProcQueryDef({
697
+ database: "TestDb",
698
+ schema: "TestSchema",
699
+ name: "GetUserById",
700
+ });
701
+
702
+ it("should validate QueryDef", () => {
703
+ expect(def).toEqual({
704
+ type: "dropProc",
705
+ procedure: { database: "TestDb", schema: "TestSchema", name: "GetUserById" },
706
+ });
707
+ });
708
+
709
+ it.each(dialects)("[%s] should validate SQL", (dialect) => {
710
+ const builder = createQueryBuilder(dialect);
711
+ expect(builder.build(def)).toMatchSql(expected.dropProc[dialect]);
712
+ });
713
+ });
714
+ });