@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
@@ -1,513 +1,513 @@
1
- import type { ColumnPrimitive, DataType } from "./column";
2
- import type { Expr, WhereExpr } from "./expr";
3
-
4
- //#region ========== 공통 ==========
5
-
6
- /**
7
- * DB 객체 이름 (테이블, 뷰, 프로시저 등)
8
- *
9
- * DBMS별 네임스페이스:
10
- * - MySQL: `database.name` (schema 무시)
11
- * - MSSQL: `database.schema.name` (schema 기본값: dbo)
12
- * - PostgreSQL: `schema.name` (database는 connection용)
13
- */
14
- export interface QueryDefObjectName {
15
- database?: string;
16
- schema?: string;
17
- name: string;
18
- }
19
-
20
- //#endregion
21
-
22
- //#region ========== DML ==========
23
-
24
- /**
25
- * CUD 쿼리의 OUTPUT 절 정의
26
- *
27
- * INSERT/UPDATE/DELETE 후 반환값 정의
28
- */
29
- export interface CudOutputDef {
30
- columns: string[];
31
- pkColNames: string[];
32
- aiColName?: string;
33
- }
34
-
35
- /**
36
- * SELECT 쿼리 정의
37
- *
38
- * @property type - 쿼리 타입 ("select")
39
- * @property from - FROM 절 (테이블/서브쿼리)
40
- * @property as - 테이블 별칭
41
- * @property select - SELECT 절 컬럼 매핑
42
- * @property distinct - DISTINCT 여부
43
- * @property top - TOP N (MSSQL)
44
- * @property lock - 락 여부
45
- * @property where - WHERE 조건 배열
46
- * @property joins - JOIN 정의 배열
47
- * @property orderBy - ORDER BY [컬럼, 방향] 배열
48
- * @property limit - LIMIT [offset, count]
49
- * @property groupBy - GROUP BY 표현식 배열
50
- * @property having - HAVING 조건 배열
51
- * @property with - 재귀 CTE 정의
52
- */
53
- export interface SelectQueryDef {
54
- type: "select";
55
- from?: QueryDefObjectName | SelectQueryDef | SelectQueryDef[] | string;
56
- as: string;
57
- select?: Record<string, Expr>;
58
- distinct?: boolean;
59
- top?: number;
60
- lock?: boolean;
61
- where?: WhereExpr[];
62
- joins?: SelectQueryDefJoin[];
63
- orderBy?: [Expr, ("ASC" | "DESC")?][];
64
- limit?: [number, number];
65
- groupBy?: Expr[];
66
- having?: WhereExpr[];
67
- with?: { name: string; base: SelectQueryDef; recursive: SelectQueryDef };
68
- }
69
-
70
- /**
71
- * JOIN 쿼리 정의
72
- *
73
- * SelectQueryDef 확장 + isSingle 플래그
74
- */
75
- export interface SelectQueryDefJoin extends SelectQueryDef {
76
- /** 단일 결과 여부 (1:1 관계) */
77
- isSingle?: boolean;
78
- }
79
-
80
- /**
81
- * INSERT 쿼리 정의
82
- *
83
- * @property records - 삽입할 레코드 배열
84
- * @property overrideIdentity - IDENTITY_INSERT 활성화 여부
85
- * @property output - OUTPUT 절 정의
86
- */
87
- export interface InsertQueryDef {
88
- type: "insert";
89
- table: QueryDefObjectName;
90
- records: Record<string, ColumnPrimitive>[];
91
- overrideIdentity?: boolean;
92
- output?: CudOutputDef;
93
- }
94
-
95
- /**
96
- * 조건부 INSERT 쿼리 정의
97
- *
98
- * 존재하지 않는 경우에만 삽입
99
- */
100
- export interface InsertIfNotExistsQueryDef {
101
- type: "insertIfNotExists";
102
- table: QueryDefObjectName;
103
- record: Record<string, ColumnPrimitive>;
104
- existsSelectQuery: SelectQueryDef;
105
- overrideIdentity?: boolean;
106
- output?: CudOutputDef;
107
- }
108
-
109
- /**
110
- * INSERT INTO SELECT 쿼리 정의
111
- *
112
- * 서브쿼리 결과를 삽입
113
- */
114
- export interface InsertIntoQueryDef {
115
- type: "insertInto";
116
- table: QueryDefObjectName;
117
- recordsSelectQuery: SelectQueryDef;
118
- overrideIdentity?: boolean;
119
- output?: CudOutputDef;
120
- }
121
-
122
- /**
123
- * UPDATE 쿼리 정의
124
- *
125
- * @property record - 업데이트할 컬럼/값 매핑
126
- * @property joins - UPDATE JOIN (지원 시)
127
- */
128
- export interface UpdateQueryDef {
129
- type: "update";
130
- table: QueryDefObjectName;
131
- as: string;
132
- record: Record<string, Expr>;
133
- top?: number;
134
- where?: WhereExpr[];
135
- joins?: SelectQueryDefJoin[];
136
- limit?: [number, number];
137
- output?: CudOutputDef;
138
- }
139
-
140
- /**
141
- * DELETE 쿼리 정의
142
- */
143
- export interface DeleteQueryDef {
144
- type: "delete";
145
- table: QueryDefObjectName;
146
- as: string;
147
- top?: number;
148
- where?: WhereExpr[];
149
- joins?: SelectQueryDefJoin[];
150
- limit?: [number, number];
151
- output?: CudOutputDef;
152
- }
153
-
154
- /**
155
- * UPSERT 쿼리 정의
156
- *
157
- * INSERT or UPDATE (MERGE 패턴)
158
- */
159
- export interface UpsertQueryDef {
160
- type: "upsert";
161
- table: QueryDefObjectName;
162
- existsSelectQuery: SelectQueryDef;
163
- insertRecord: Record<string, Expr>;
164
- updateRecord: Record<string, Expr>;
165
- overrideIdentity?: boolean;
166
- output?: CudOutputDef;
167
- }
168
-
169
- //#endregion
170
-
171
- //#region ========== Utils ==========
172
-
173
- /** FK 제약조건 활성화/비활성화 */
174
- export interface SwitchFkQueryDef {
175
- type: "switchFk";
176
- table: QueryDefObjectName;
177
- switch: "on" | "off";
178
- }
179
-
180
- //#endregion
181
-
182
- //#region ========== DDL - Schema ==========
183
-
184
- /** 스키마 초기화 (모든 객체 삭제) */
185
- export interface ClearSchemaQueryDef {
186
- type: "clearSchema";
187
- database: string;
188
- schema?: string;
189
- }
190
-
191
- //#endregion
192
-
193
- //#region ========== DDL - Table ==========
194
-
195
- /** CREATE TABLE */
196
- export interface CreateTableQueryDef {
197
- type: "createTable";
198
- table: QueryDefObjectName;
199
- columns: {
200
- name: string;
201
- dataType: DataType;
202
- autoIncrement?: boolean;
203
- nullable?: boolean;
204
- default?: ColumnPrimitive;
205
- }[];
206
- primaryKey?: string[];
207
- }
208
-
209
- /** DROP TABLE */
210
- export interface DropTableQueryDef {
211
- type: "dropTable";
212
- table: QueryDefObjectName;
213
- }
214
-
215
- /** RENAME TABLE */
216
- export interface RenameTableQueryDef {
217
- type: "renameTable";
218
- table: QueryDefObjectName;
219
- newName: string;
220
- }
221
-
222
- /** TRUNCATE TABLE */
223
- export interface TruncateQueryDef {
224
- type: "truncate";
225
- table: QueryDefObjectName;
226
- }
227
-
228
- //#endregion
229
-
230
- //#region ========== DDL - Column ==========
231
-
232
- /** ADD COLUMN */
233
- export interface AddColumnQueryDef {
234
- type: "addColumn";
235
- table: QueryDefObjectName;
236
- column: {
237
- name: string;
238
- dataType: DataType;
239
- autoIncrement?: boolean;
240
- nullable?: boolean;
241
- default?: ColumnPrimitive;
242
- };
243
- }
244
-
245
- /** DROP COLUMN */
246
- export interface DropColumnQueryDef {
247
- type: "dropColumn";
248
- table: QueryDefObjectName;
249
- column: string;
250
- }
251
-
252
- /** MODIFY COLUMN (타입/속성 변경) */
253
- export interface ModifyColumnQueryDef {
254
- type: "modifyColumn";
255
- table: QueryDefObjectName;
256
- column: {
257
- name: string;
258
- dataType: DataType;
259
- autoIncrement?: boolean;
260
- nullable?: boolean;
261
- default?: ColumnPrimitive;
262
- };
263
- }
264
-
265
- /** RENAME COLUMN */
266
- export interface RenameColumnQueryDef {
267
- type: "renameColumn";
268
- table: QueryDefObjectName;
269
- column: string;
270
- newName: string;
271
- }
272
-
273
- //#endregion
274
-
275
- //#region ========== DDL - PK/FK/Index ==========
276
-
277
- /** DROP PRIMARY KEY */
278
- export interface DropPkQueryDef {
279
- type: "dropPk";
280
- table: QueryDefObjectName;
281
- }
282
-
283
- /** ADD PRIMARY KEY */
284
- export interface AddPkQueryDef {
285
- type: "addPk";
286
- table: QueryDefObjectName;
287
- columns: string[];
288
- }
289
-
290
- /** ADD FOREIGN KEY */
291
- export interface AddFkQueryDef {
292
- type: "addFk";
293
- table: QueryDefObjectName;
294
- foreignKey: {
295
- name: string;
296
- fkColumns: string[];
297
- targetTable: QueryDefObjectName;
298
- targetPkColumns: string[];
299
- };
300
- }
301
-
302
- /** DROP FOREIGN KEY */
303
- export interface DropFkQueryDef {
304
- type: "dropFk";
305
- table: QueryDefObjectName;
306
- foreignKey: string;
307
- }
308
-
309
- /** CREATE INDEX */
310
- export interface AddIdxQueryDef {
311
- type: "addIdx";
312
- table: QueryDefObjectName;
313
- index: {
314
- name: string;
315
- columns: { name: string; orderBy: "ASC" | "DESC" }[];
316
- unique?: boolean;
317
- };
318
- }
319
-
320
- /** DROP INDEX */
321
- export interface DropIdxQueryDef {
322
- type: "dropIdx";
323
- table: QueryDefObjectName;
324
- index: string;
325
- }
326
-
327
- //#endregion
328
-
329
- //#region ========== DDL - View/Procedure ==========
330
-
331
- /** CREATE VIEW */
332
- export interface CreateViewQueryDef {
333
- type: "createView";
334
- view: QueryDefObjectName;
335
- queryDef: SelectQueryDef;
336
- }
337
-
338
- /** DROP VIEW */
339
- export interface DropViewQueryDef {
340
- type: "dropView";
341
- view: QueryDefObjectName;
342
- }
343
-
344
- /** CREATE PROCEDURE */
345
- export interface CreateProcQueryDef {
346
- type: "createProc";
347
- procedure: QueryDefObjectName;
348
- params?: Array<{
349
- name: string;
350
- dataType: DataType;
351
- nullable?: boolean;
352
- default?: unknown;
353
- }>;
354
- returns?: Array<{
355
- name: string;
356
- dataType: DataType;
357
- nullable?: boolean;
358
- }>;
359
- query: string;
360
- }
361
-
362
- /** DROP PROCEDURE */
363
- export interface DropProcQueryDef {
364
- type: "dropProc";
365
- procedure: QueryDefObjectName;
366
- }
367
-
368
- /** EXECUTE PROCEDURE */
369
- export interface ExecProcQueryDef {
370
- type: "execProc";
371
- procedure: QueryDefObjectName;
372
- params: Record<string, Expr> | undefined;
373
- }
374
-
375
- //#endregion
376
-
377
- //#region ========== Meta ==========
378
-
379
- /** 스키마 존재 여부 확인 */
380
- export interface SchemaExistsQueryDef {
381
- type: "schemaExists";
382
- database: string;
383
- schema?: string;
384
- }
385
-
386
- //#endregion
387
-
388
- //#region ========== DDL 타입 상수 ==========
389
-
390
- /**
391
- * DDL QueryDef 유니언 (컴파일 타임 검증용)
392
- *
393
- * @remarks
394
- * switchFk는 DDL이 아니므로 제외 (트랜잭션 내 사용 가능)
395
- */
396
- type DdlQueryDef =
397
- | ClearSchemaQueryDef
398
- | CreateTableQueryDef
399
- | DropTableQueryDef
400
- | RenameTableQueryDef
401
- | TruncateQueryDef
402
- | AddColumnQueryDef
403
- | DropColumnQueryDef
404
- | ModifyColumnQueryDef
405
- | RenameColumnQueryDef
406
- | DropPkQueryDef
407
- | AddPkQueryDef
408
- | AddFkQueryDef
409
- | DropFkQueryDef
410
- | AddIdxQueryDef
411
- | DropIdxQueryDef
412
- | CreateViewQueryDef
413
- | DropViewQueryDef
414
- | CreateProcQueryDef
415
- | DropProcQueryDef;
416
-
417
- /**
418
- * DDL (Data Definition Language) 타입 상수
419
- *
420
- * 트랜잭션 내 DDL 차단 및 DDL 타입 검증에 사용
421
- * satisfies 키워드로 DdlQueryDef와의 동기화를 컴파일 타임에 검증
422
- *
423
- * @remarks
424
- * switchFk는 DDL이 아니므로 제외 (트랜잭션 내 사용 가능)
425
- */
426
- export const DDL_TYPES = [
427
- "clearSchema",
428
- "createTable",
429
- "dropTable",
430
- "renameTable",
431
- "truncate",
432
- "addColumn",
433
- "dropColumn",
434
- "modifyColumn",
435
- "renameColumn",
436
- "dropPk",
437
- "addPk",
438
- "addFk",
439
- "dropFk",
440
- "addIdx",
441
- "dropIdx",
442
- "createView",
443
- "dropView",
444
- "createProc",
445
- "dropProc",
446
- ] as const satisfies readonly DdlQueryDef["type"][];
447
-
448
- /** DDL 타입 유니언 */
449
- export type DdlType = (typeof DDL_TYPES)[number];
450
-
451
- //#endregion
452
-
453
- //#region ========== 통합 Union Type ==========
454
-
455
- /**
456
- * 모든 쿼리 정의 유니언 타입
457
- *
458
- * DML (SELECT/INSERT/UPDATE/DELETE/UPSERT) +
459
- * DDL (Table/Column/PK/FK/Index/View/Procedure) +
460
- * Utils (SwitchFk) + Meta (SchemaExists)
461
- *
462
- * @see {@link SelectQueryDef} SELECT 쿼리
463
- * @see {@link InsertQueryDef} INSERT 쿼리
464
- * @see {@link UpdateQueryDef} UPDATE 쿼리
465
- * @see {@link DeleteQueryDef} DELETE 쿼리
466
- */
467
- export type QueryDef =
468
- // DML
469
- | SelectQueryDef
470
- | InsertQueryDef
471
- | InsertIfNotExistsQueryDef
472
- | InsertIntoQueryDef
473
- | UpdateQueryDef
474
- | DeleteQueryDef
475
- | UpsertQueryDef
476
-
477
- // DDL - Schema
478
- | ClearSchemaQueryDef
479
-
480
- // DDL - Table
481
- | CreateTableQueryDef
482
- | DropTableQueryDef
483
- | RenameTableQueryDef
484
- | TruncateQueryDef
485
-
486
- // DDL - Column
487
- | AddColumnQueryDef
488
- | DropColumnQueryDef
489
- | ModifyColumnQueryDef
490
- | RenameColumnQueryDef
491
-
492
- // DDL - PK/FK/Index
493
- | DropPkQueryDef
494
- | AddPkQueryDef
495
- | AddFkQueryDef
496
- | DropFkQueryDef
497
- | AddIdxQueryDef
498
- | DropIdxQueryDef
499
-
500
- // DDL - View/Procedure
501
- | CreateViewQueryDef
502
- | DropViewQueryDef
503
- | CreateProcQueryDef
504
- | DropProcQueryDef
505
- | ExecProcQueryDef
506
-
507
- // Utils
508
- | SwitchFkQueryDef
509
-
510
- // Meta
511
- | SchemaExistsQueryDef;
512
-
513
- //#endregion
1
+ import type { ColumnPrimitive, DataType } from "./column";
2
+ import type { Expr, WhereExpr } from "./expr";
3
+
4
+ //#region ========== 공통 ==========
5
+
6
+ /**
7
+ * DB object 이름 (table, View, Procedure 등)
8
+ *
9
+ * DBMS별 네임스페이스:
10
+ * - MySQL: `database.name` (schema 무시)
11
+ * - MSSQL: `database.schema.name` (schema Default value: dbo)
12
+ * - PostgreSQL: `schema.name` (database는 connection용)
13
+ */
14
+ export interface QueryDefObjectName {
15
+ database?: string;
16
+ schema?: string;
17
+ name: string;
18
+ }
19
+
20
+ //#endregion
21
+
22
+ //#region ========== DML ==========
23
+
24
+ /**
25
+ * CUD query의 OUTPUT 절 definition
26
+ *
27
+ * INSERT/UPDATE/DELETE 후 반환값 definition
28
+ */
29
+ export interface CudOutputDef {
30
+ columns: string[];
31
+ pkColNames: string[];
32
+ aiColName?: string;
33
+ }
34
+
35
+ /**
36
+ * SELECT Query definition
37
+ *
38
+ * @property type - Query type ("select")
39
+ * @property from - FROM 절 (table/Subquery)
40
+ * @property as - Table 별칭
41
+ * @property select - SELECT 절 column Mapping
42
+ * @property distinct - DISTINCT 여부
43
+ * @property top - TOP N (MSSQL)
44
+ * @property lock - 락 여부
45
+ * @property where - WHERE condition array
46
+ * @property joins - JOIN definition array
47
+ * @property orderBy - ORDER BY [column, 방향] array
48
+ * @property limit - LIMIT [offset, count]
49
+ * @property groupBy - GROUP BY expression array
50
+ * @property having - HAVING condition array
51
+ * @property with - recursive CTE definition
52
+ */
53
+ export interface SelectQueryDef {
54
+ type: "select";
55
+ from?: QueryDefObjectName | SelectQueryDef | SelectQueryDef[] | string;
56
+ as: string;
57
+ select?: Record<string, Expr>;
58
+ distinct?: boolean;
59
+ top?: number;
60
+ lock?: boolean;
61
+ where?: WhereExpr[];
62
+ joins?: SelectQueryDefJoin[];
63
+ orderBy?: [Expr, ("ASC" | "DESC")?][];
64
+ limit?: [number, number];
65
+ groupBy?: Expr[];
66
+ having?: WhereExpr[];
67
+ with?: { name: string; base: SelectQueryDef; recursive: SelectQueryDef };
68
+ }
69
+
70
+ /**
71
+ * JOIN Query definition
72
+ *
73
+ * SelectQueryDef 확장 + isSingle flag
74
+ */
75
+ export interface SelectQueryDefJoin extends SelectQueryDef {
76
+ /** 단일 result 여부 (1:1 relationship) */
77
+ isSingle?: boolean;
78
+ }
79
+
80
+ /**
81
+ * INSERT Query definition
82
+ *
83
+ * @property records - Insert할 레코드 array
84
+ * @property overrideIdentity - IDENTITY_INSERT Enable 여부
85
+ * @property output - OUTPUT 절 definition
86
+ */
87
+ export interface InsertQueryDef {
88
+ type: "insert";
89
+ table: QueryDefObjectName;
90
+ records: Record<string, ColumnPrimitive>[];
91
+ overrideIdentity?: boolean;
92
+ output?: CudOutputDef;
93
+ }
94
+
95
+ /**
96
+ * 조건부 INSERT Query definition
97
+ *
98
+ * 존재하지 않는 경우에만 삽입
99
+ */
100
+ export interface InsertIfNotExistsQueryDef {
101
+ type: "insertIfNotExists";
102
+ table: QueryDefObjectName;
103
+ record: Record<string, ColumnPrimitive>;
104
+ existsSelectQuery: SelectQueryDef;
105
+ overrideIdentity?: boolean;
106
+ output?: CudOutputDef;
107
+ }
108
+
109
+ /**
110
+ * INSERT INTO SELECT Query definition
111
+ *
112
+ * Subquery 결과를 삽입
113
+ */
114
+ export interface InsertIntoQueryDef {
115
+ type: "insertInto";
116
+ table: QueryDefObjectName;
117
+ recordsSelectQuery: SelectQueryDef;
118
+ overrideIdentity?: boolean;
119
+ output?: CudOutputDef;
120
+ }
121
+
122
+ /**
123
+ * UPDATE Query definition
124
+ *
125
+ * @property record - Update할 column/value Mapping
126
+ * @property joins - UPDATE JOIN (지원 시)
127
+ */
128
+ export interface UpdateQueryDef {
129
+ type: "update";
130
+ table: QueryDefObjectName;
131
+ as: string;
132
+ record: Record<string, Expr>;
133
+ top?: number;
134
+ where?: WhereExpr[];
135
+ joins?: SelectQueryDefJoin[];
136
+ limit?: [number, number];
137
+ output?: CudOutputDef;
138
+ }
139
+
140
+ /**
141
+ * DELETE Query definition
142
+ */
143
+ export interface DeleteQueryDef {
144
+ type: "delete";
145
+ table: QueryDefObjectName;
146
+ as: string;
147
+ top?: number;
148
+ where?: WhereExpr[];
149
+ joins?: SelectQueryDefJoin[];
150
+ limit?: [number, number];
151
+ output?: CudOutputDef;
152
+ }
153
+
154
+ /**
155
+ * UPSERT Query definition
156
+ *
157
+ * INSERT or UPDATE (MERGE Pattern)
158
+ */
159
+ export interface UpsertQueryDef {
160
+ type: "upsert";
161
+ table: QueryDefObjectName;
162
+ existsSelectQuery: SelectQueryDef;
163
+ insertRecord: Record<string, Expr>;
164
+ updateRecord: Record<string, Expr>;
165
+ overrideIdentity?: boolean;
166
+ output?: CudOutputDef;
167
+ }
168
+
169
+ //#endregion
170
+
171
+ //#region ========== Utils ==========
172
+
173
+ /** FK constraint Enable/Disable */
174
+ export interface SwitchFkQueryDef {
175
+ type: "switchFk";
176
+ table: QueryDefObjectName;
177
+ switch: "on" | "off";
178
+ }
179
+
180
+ //#endregion
181
+
182
+ //#region ========== DDL - Schema ==========
183
+
184
+ /** Clear schema (모든 object Delete) */
185
+ export interface ClearSchemaQueryDef {
186
+ type: "clearSchema";
187
+ database: string;
188
+ schema?: string;
189
+ }
190
+
191
+ //#endregion
192
+
193
+ //#region ========== DDL - Table ==========
194
+
195
+ /** CREATE TABLE */
196
+ export interface CreateTableQueryDef {
197
+ type: "createTable";
198
+ table: QueryDefObjectName;
199
+ columns: {
200
+ name: string;
201
+ dataType: DataType;
202
+ autoIncrement?: boolean;
203
+ nullable?: boolean;
204
+ default?: ColumnPrimitive;
205
+ }[];
206
+ primaryKey?: string[];
207
+ }
208
+
209
+ /** DROP TABLE */
210
+ export interface DropTableQueryDef {
211
+ type: "dropTable";
212
+ table: QueryDefObjectName;
213
+ }
214
+
215
+ /** RENAME TABLE */
216
+ export interface RenameTableQueryDef {
217
+ type: "renameTable";
218
+ table: QueryDefObjectName;
219
+ newName: string;
220
+ }
221
+
222
+ /** TRUNCATE TABLE */
223
+ export interface TruncateQueryDef {
224
+ type: "truncate";
225
+ table: QueryDefObjectName;
226
+ }
227
+
228
+ //#endregion
229
+
230
+ //#region ========== DDL - Column ==========
231
+
232
+ /** ADD COLUMN */
233
+ export interface AddColumnQueryDef {
234
+ type: "addColumn";
235
+ table: QueryDefObjectName;
236
+ column: {
237
+ name: string;
238
+ dataType: DataType;
239
+ autoIncrement?: boolean;
240
+ nullable?: boolean;
241
+ default?: ColumnPrimitive;
242
+ };
243
+ }
244
+
245
+ /** DROP COLUMN */
246
+ export interface DropColumnQueryDef {
247
+ type: "dropColumn";
248
+ table: QueryDefObjectName;
249
+ column: string;
250
+ }
251
+
252
+ /** MODIFY COLUMN (type/property Change) */
253
+ export interface ModifyColumnQueryDef {
254
+ type: "modifyColumn";
255
+ table: QueryDefObjectName;
256
+ column: {
257
+ name: string;
258
+ dataType: DataType;
259
+ autoIncrement?: boolean;
260
+ nullable?: boolean;
261
+ default?: ColumnPrimitive;
262
+ };
263
+ }
264
+
265
+ /** RENAME COLUMN */
266
+ export interface RenameColumnQueryDef {
267
+ type: "renameColumn";
268
+ table: QueryDefObjectName;
269
+ column: string;
270
+ newName: string;
271
+ }
272
+
273
+ //#endregion
274
+
275
+ //#region ========== DDL - PK/FK/Index ==========
276
+
277
+ /** DROP PRIMARY KEY */
278
+ export interface DropPkQueryDef {
279
+ type: "dropPk";
280
+ table: QueryDefObjectName;
281
+ }
282
+
283
+ /** ADD PRIMARY KEY */
284
+ export interface AddPkQueryDef {
285
+ type: "addPk";
286
+ table: QueryDefObjectName;
287
+ columns: string[];
288
+ }
289
+
290
+ /** ADD FOREIGN KEY */
291
+ export interface AddFkQueryDef {
292
+ type: "addFk";
293
+ table: QueryDefObjectName;
294
+ foreignKey: {
295
+ name: string;
296
+ fkColumns: string[];
297
+ targetTable: QueryDefObjectName;
298
+ targetPkColumns: string[];
299
+ };
300
+ }
301
+
302
+ /** DROP FOREIGN KEY */
303
+ export interface DropFkQueryDef {
304
+ type: "dropFk";
305
+ table: QueryDefObjectName;
306
+ foreignKey: string;
307
+ }
308
+
309
+ /** CREATE INDEX */
310
+ export interface AddIdxQueryDef {
311
+ type: "addIdx";
312
+ table: QueryDefObjectName;
313
+ index: {
314
+ name: string;
315
+ columns: { name: string; orderBy: "ASC" | "DESC" }[];
316
+ unique?: boolean;
317
+ };
318
+ }
319
+
320
+ /** DROP INDEX */
321
+ export interface DropIdxQueryDef {
322
+ type: "dropIdx";
323
+ table: QueryDefObjectName;
324
+ index: string;
325
+ }
326
+
327
+ //#endregion
328
+
329
+ //#region ========== DDL - View/Procedure ==========
330
+
331
+ /** CREATE VIEW */
332
+ export interface CreateViewQueryDef {
333
+ type: "createView";
334
+ view: QueryDefObjectName;
335
+ queryDef: SelectQueryDef;
336
+ }
337
+
338
+ /** DROP VIEW */
339
+ export interface DropViewQueryDef {
340
+ type: "dropView";
341
+ view: QueryDefObjectName;
342
+ }
343
+
344
+ /** CREATE PROCEDURE */
345
+ export interface CreateProcQueryDef {
346
+ type: "createProc";
347
+ procedure: QueryDefObjectName;
348
+ params?: Array<{
349
+ name: string;
350
+ dataType: DataType;
351
+ nullable?: boolean;
352
+ default?: unknown;
353
+ }>;
354
+ returns?: Array<{
355
+ name: string;
356
+ dataType: DataType;
357
+ nullable?: boolean;
358
+ }>;
359
+ query: string;
360
+ }
361
+
362
+ /** DROP PROCEDURE */
363
+ export interface DropProcQueryDef {
364
+ type: "dropProc";
365
+ procedure: QueryDefObjectName;
366
+ }
367
+
368
+ /** EXECUTE PROCEDURE */
369
+ export interface ExecProcQueryDef {
370
+ type: "execProc";
371
+ procedure: QueryDefObjectName;
372
+ params: Record<string, Expr> | undefined;
373
+ }
374
+
375
+ //#endregion
376
+
377
+ //#region ========== Meta ==========
378
+
379
+ /** Check schema existence */
380
+ export interface SchemaExistsQueryDef {
381
+ type: "schemaExists";
382
+ database: string;
383
+ schema?: string;
384
+ }
385
+
386
+ //#endregion
387
+
388
+ //#region ========== DDL type 상수 ==========
389
+
390
+ /**
391
+ * DDL QueryDef union (컴파일 타임 Validation용)
392
+ *
393
+ * @remarks
394
+ * switchFk는 DDL이 아니므로 exclude (transaction 내 사용 가능)
395
+ */
396
+ type DdlQueryDef =
397
+ | ClearSchemaQueryDef
398
+ | CreateTableQueryDef
399
+ | DropTableQueryDef
400
+ | RenameTableQueryDef
401
+ | TruncateQueryDef
402
+ | AddColumnQueryDef
403
+ | DropColumnQueryDef
404
+ | ModifyColumnQueryDef
405
+ | RenameColumnQueryDef
406
+ | DropPkQueryDef
407
+ | AddPkQueryDef
408
+ | AddFkQueryDef
409
+ | DropFkQueryDef
410
+ | AddIdxQueryDef
411
+ | DropIdxQueryDef
412
+ | CreateViewQueryDef
413
+ | DropViewQueryDef
414
+ | CreateProcQueryDef
415
+ | DropProcQueryDef;
416
+
417
+ /**
418
+ * DDL (Data Definition Language) type 상수
419
+ *
420
+ * Transaction 내 DDL 차단 및 DDL type Validation에 사용
421
+ * satisfies 키워드로 DdlQueryDef와의 synchronous화를 컴파일 타임에 Validation
422
+ *
423
+ * @remarks
424
+ * switchFk는 DDL이 아니므로 exclude (transaction 내 사용 가능)
425
+ */
426
+ export const DDL_TYPES = [
427
+ "clearSchema",
428
+ "createTable",
429
+ "dropTable",
430
+ "renameTable",
431
+ "truncate",
432
+ "addColumn",
433
+ "dropColumn",
434
+ "modifyColumn",
435
+ "renameColumn",
436
+ "dropPk",
437
+ "addPk",
438
+ "addFk",
439
+ "dropFk",
440
+ "addIdx",
441
+ "dropIdx",
442
+ "createView",
443
+ "dropView",
444
+ "createProc",
445
+ "dropProc",
446
+ ] as const satisfies readonly DdlQueryDef["type"][];
447
+
448
+ /** DDL type union */
449
+ export type DdlType = (typeof DDL_TYPES)[number];
450
+
451
+ //#endregion
452
+
453
+ //#region ========== 통합 Union Type ==========
454
+
455
+ /**
456
+ * 모든 Query definition union type
457
+ *
458
+ * DML (SELECT/INSERT/UPDATE/DELETE/UPSERT) +
459
+ * DDL (Table/Column/PK/FK/Index/View/Procedure) +
460
+ * Utils (SwitchFk) + Meta (SchemaExists)
461
+ *
462
+ * @see {@link SelectQueryDef} SELECT query
463
+ * @see {@link InsertQueryDef} INSERT query
464
+ * @see {@link UpdateQueryDef} UPDATE query
465
+ * @see {@link DeleteQueryDef} DELETE query
466
+ */
467
+ export type QueryDef =
468
+ // DML
469
+ | SelectQueryDef
470
+ | InsertQueryDef
471
+ | InsertIfNotExistsQueryDef
472
+ | InsertIntoQueryDef
473
+ | UpdateQueryDef
474
+ | DeleteQueryDef
475
+ | UpsertQueryDef
476
+
477
+ // DDL - Schema
478
+ | ClearSchemaQueryDef
479
+
480
+ // DDL - Table
481
+ | CreateTableQueryDef
482
+ | DropTableQueryDef
483
+ | RenameTableQueryDef
484
+ | TruncateQueryDef
485
+
486
+ // DDL - Column
487
+ | AddColumnQueryDef
488
+ | DropColumnQueryDef
489
+ | ModifyColumnQueryDef
490
+ | RenameColumnQueryDef
491
+
492
+ // DDL - PK/FK/Index
493
+ | DropPkQueryDef
494
+ | AddPkQueryDef
495
+ | AddFkQueryDef
496
+ | DropFkQueryDef
497
+ | AddIdxQueryDef
498
+ | DropIdxQueryDef
499
+
500
+ // DDL - View/Procedure
501
+ | CreateViewQueryDef
502
+ | DropViewQueryDef
503
+ | CreateProcQueryDef
504
+ | DropProcQueryDef
505
+ | ExecProcQueryDef
506
+
507
+ // Utils
508
+ | SwitchFkQueryDef
509
+
510
+ // Meta
511
+ | SchemaExistsQueryDef;
512
+
513
+ //#endregion