@simplysm/orm-common 13.0.69 → 13.0.70

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 +104 -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
package/src/types/db.ts CHANGED
@@ -1,208 +1,208 @@
1
- import type { ColumnPrimitive, ColumnPrimitiveStr } from "./column";
2
- import type { QueryDef } from "./query-def";
3
- import type { DbContextBase, DbContextDdlMethods } from "./db-context-def";
4
-
5
- // ============================================
6
- // Database Types
7
- // ============================================
8
-
9
- /**
10
- * 지원하는 데이터베이스 방언
11
- *
12
- * - `mysql`: MySQL 8.0.14+
13
- * - `mssql`: Microsoft SQL Server 2012+
14
- * - `postgresql`: PostgreSQL 9.0+
15
- */
16
- export type Dialect = "mysql" | "mssql" | "postgresql";
17
-
18
- /**
19
- * 지원하는 모든 데이터베이스 방언 목록
20
- *
21
- * 테스트에서 dialect별 검증 시 사용
22
- *
23
- * @example
24
- * ```typescript
25
- * it.each(dialects)("[%s] SQL 검증", (dialect) => {
26
- * const builder = createQueryBuilder(dialect);
27
- * expect(builder.build(def)).toMatchSql(expected[dialect]);
28
- * });
29
- * ```
30
- */
31
- export const dialects: Dialect[] = ["mysql", "mssql", "postgresql"];
32
-
33
- /**
34
- * QueryBuilder.build() 반환 타입
35
- *
36
- * 빌드된 SQL 문자열과 다중 결과셋 처리를 위한 메타데이터
37
- *
38
- * @property sql - 빌드된 SQL 문자열
39
- * @property resultSetIndex - 결과를 가져올 결과셋 인덱스 (기본: 0)
40
- * - MySQL INSERT with OUTPUT: 1 (INSERT + SELECT 중 SELECT)
41
- * @property resultSetStride - 다중 결과에서 N번째마다 결과셋 추출
42
- * - 예: index=1, stride=2 → 1, 3, 5, 7... 의 결과셋 반환
43
- * - MySQL 다중 INSERT: INSERT;SELECT; × N → 1, 3, 5...
44
- */
45
- export interface QueryBuildResult {
46
- sql: string;
47
- resultSetIndex?: number;
48
- resultSetStride?: number;
49
- }
50
-
51
- /**
52
- * 트랜잭션 격리 수준
53
- *
54
- * - `READ_UNCOMMITTED`: 커밋되지 않은 데이터 읽기 가능 (Dirty Read)
55
- * - `READ_COMMITTED`: 커밋된 데이터만 읽기 (기본값)
56
- * - `REPEATABLE_READ`: 트랜잭션 내 동일 쿼리 동일 결과 보장
57
- * - `SERIALIZABLE`: 완전 직렬화 (가장 엄격)
58
- */
59
- export type IsolationLevel =
60
- | "READ_UNCOMMITTED"
61
- | "READ_COMMITTED"
62
- | "REPEATABLE_READ"
63
- | "SERIALIZABLE";
64
-
65
- // ============================================
66
- // DataRecord - 결과 데이터 타입 (재귀적, 중첩 허용)
67
- // ============================================
68
-
69
- /**
70
- * 쿼리 결과 데이터 레코드 타입
71
- *
72
- * 재귀적 구조로 중첩 관계(include) 결과 표현
73
- *
74
- * @example
75
- * ```typescript
76
- * // 단순 레코드
77
- * type User = { id: number; name: string; }
78
- *
79
- * // 중첩 관계 포함
80
- * type UserWithPosts = {
81
- * id: number;
82
- * name: string;
83
- * posts: { id: number; title: string; }[] // 1:N 관계
84
- * company: { id: number; name: string; } // N:1 관계
85
- * }
86
- * ```
87
- */
88
- export type DataRecord = {
89
- [key: string]: ColumnPrimitive | DataRecord | DataRecord[];
90
- };
91
-
92
- // ============================================
93
- // Executor Interface
94
- // ============================================
95
-
96
- /**
97
- * DbContext 실행기 인터페이스
98
- *
99
- * 실제 DB 연결과 쿼리 실행을 담당
100
- * NodeDbContextExecutor (서버) 또는 SdOrmServiceClientDbContextExecutor (클라이언트) 구현
101
- *
102
- * @example
103
- * ```typescript
104
- * // 서버 측 구현 예시
105
- * class NodeDbContextExecutor implements IDbContextExecutor {
106
- * async connect(): Promise<void> {
107
- * await this.connection.connect();
108
- * }
109
- * // ...
110
- * }
111
- * ```
112
- *
113
- * @see {@link DbContext} DbContext에서 사용
114
- */
115
- export interface DbContextExecutor {
116
- /**
117
- * DB 연결 수립
118
- */
119
- connect(): Promise<void>;
120
-
121
- /**
122
- * DB 연결 종료
123
- */
124
- close(): Promise<void>;
125
-
126
- /**
127
- * 트랜잭션 시작
128
- *
129
- * @param isolationLevel - 격리 수준 (선택)
130
- */
131
- beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
132
-
133
- /**
134
- * 트랜잭션 커밋
135
- */
136
- commitTransaction(): Promise<void>;
137
-
138
- /**
139
- * 트랜잭션 롤백
140
- */
141
- rollbackTransaction(): Promise<void>;
142
-
143
- /**
144
- * QueryDef 배열 실행
145
- *
146
- * @template T - 결과 레코드 타입
147
- * @param defs - 실행할 QueryDef 배열
148
- * @param resultMetas - 결과 변환을 위한 메타데이터 (선택)
149
- * @returns 각 QueryDef별 결과 배열의 배열
150
- */
151
- executeDefs<T = DataRecord>(
152
- defs: QueryDef[],
153
- resultMetas?: (ResultMeta | undefined)[],
154
- ): Promise<T[][]>;
155
- }
156
-
157
- /**
158
- * 쿼리 결과 변환을 위한 메타데이터
159
- *
160
- * SELECT 결과를 TypeScript 객체로 변환 시 사용
161
- *
162
- * @property columns - 컬럼명 → ColumnPrimitiveStr 매핑
163
- * @property joins - JOIN 별칭 → 단일/배열 여부
164
- */
165
- export interface ResultMeta {
166
- columns: Record<string, ColumnPrimitiveStr>;
167
- joins: Record<string, { isSingle: boolean }>;
168
- }
169
-
170
- // ============================================
171
- // Migration
172
- // ============================================
173
-
174
- /**
175
- * 데이터베이스 마이그레이션 정의
176
- *
177
- * 스키마 변경을 버전 관리
178
- *
179
- * @property name - 마이그레이션 고유 이름 (타임스탬프 권장)
180
- * @property up - 마이그레이션 실행 함수
181
- *
182
- * @example
183
- * ```typescript
184
- * const migrations: Migration[] = [
185
- * {
186
- * name: "20260105_001_create_user_table",
187
- * up: async (db) => {
188
- * await db.createTable(User);
189
- * },
190
- * },
191
- * {
192
- * name: "20260105_002_add_email_column",
193
- * up: async (db) => {
194
- * await db.addColumn(User, "email", {
195
- * type: "varchar",
196
- * length: 200,
197
- * });
198
- * },
199
- * },
200
- * ];
201
- * ```
202
- *
203
- * @see {@link DbContext.initialize} 마이그레이션 실행
204
- */
205
- export interface Migration {
206
- name: string;
207
- up: (db: DbContextBase & DbContextDdlMethods) => Promise<void>;
208
- }
1
+ import type { ColumnPrimitive, ColumnPrimitiveStr } from "./column";
2
+ import type { QueryDef } from "./query-def";
3
+ import type { DbContextBase, DbContextDdlMethods } from "./db-context-def";
4
+
5
+ // ============================================
6
+ // Database Types
7
+ // ============================================
8
+
9
+ /**
10
+ * 지원하는 Database 방언
11
+ *
12
+ * - `mysql`: MySQL 8.0.14+
13
+ * - `mssql`: Microsoft SQL Server 2012+
14
+ * - `postgresql`: PostgreSQL 9.0+
15
+ */
16
+ export type Dialect = "mysql" | "mssql" | "postgresql";
17
+
18
+ /**
19
+ * 지원하는 모든 Database 방언 목록
20
+ *
21
+ * testing에서 dialect별 Validation 시 사용
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * it.each(dialects)("[%s] SQL Validation", (dialect) => {
26
+ * const builder = createQueryBuilder(dialect);
27
+ * expect(builder.build(def)).toMatchSql(expected[dialect]);
28
+ * });
29
+ * ```
30
+ */
31
+ export const dialects: Dialect[] = ["mysql", "mssql", "postgresql"];
32
+
33
+ /**
34
+ * QueryBuilder.build() return type
35
+ *
36
+ * 빌드된 SQL 문자열과 다중 결과셋 processing를 위한 Metadata
37
+ *
38
+ * @property sql - 빌드된 SQL 문자열
39
+ * @property resultSetIndex - Result를 가져올 결과셋 Index (Basic: 0)
40
+ * - MySQL INSERT with OUTPUT: 1 (INSERT + SELECT 중 SELECT)
41
+ * @property resultSetStride - 다중 결과에서 N번째마다 결과셋 추출
42
+ * - 예: index=1, stride=2 → 1, 3, 5, 7... 의 결과셋 return
43
+ * - MySQL 다중 INSERT: INSERT;SELECT; × N → 1, 3, 5...
44
+ */
45
+ export interface QueryBuildResult {
46
+ sql: string;
47
+ resultSetIndex?: number;
48
+ resultSetStride?: number;
49
+ }
50
+
51
+ /**
52
+ * Transaction isolation level
53
+ *
54
+ * - `READ_UNCOMMITTED`: commit되지 않은 data read 가능 (Dirty Read)
55
+ * - `READ_COMMITTED`: commit된 data만 read (default)
56
+ * - `REPEATABLE_READ`: Transaction 내 동일 query 동일 result 보장
57
+ * - `SERIALIZABLE`: 완전 serialize (가장 엄격)
58
+ */
59
+ export type IsolationLevel =
60
+ | "READ_UNCOMMITTED"
61
+ | "READ_COMMITTED"
62
+ | "REPEATABLE_READ"
63
+ | "SERIALIZABLE";
64
+
65
+ // ============================================
66
+ // DataRecord - Result data type (재귀적, 중첩 allow)
67
+ // ============================================
68
+
69
+ /**
70
+ * Query result data record type
71
+ *
72
+ * 재귀적 structure로 중첩 관계(include) result 표현
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * // 단순 레코드
77
+ * type User = { id: number; name: string; }
78
+ *
79
+ * // 중첩 relationship include
80
+ * type UserWithPosts = {
81
+ * id: number;
82
+ * name: string;
83
+ * posts: { id: number; title: string; }[] // 1:N relationship
84
+ * company: { id: number; name: string; } // N:1 relationship
85
+ * }
86
+ * ```
87
+ */
88
+ export type DataRecord = {
89
+ [key: string]: ColumnPrimitive | DataRecord | DataRecord[];
90
+ };
91
+
92
+ // ============================================
93
+ // Executor Interface
94
+ // ============================================
95
+
96
+ /**
97
+ * DbContext 실행기 interface
98
+ *
99
+ * 실제 DB 연결과 Execute query을 담당
100
+ * NodeDbContextExecutor (서버) 또는 SdOrmServiceClientDbContextExecutor (클라이언트) 구현
101
+ *
102
+ * @example
103
+ * ```typescript
104
+ * // 서버 측 구현 예시
105
+ * class NodeDbContextExecutor implements IDbContextExecutor {
106
+ * async connect(): Promise<void> {
107
+ * await this.connection.connect();
108
+ * }
109
+ * // ...
110
+ * }
111
+ * ```
112
+ *
113
+ * @see {@link DbContext} DbContextused in
114
+ */
115
+ export interface DbContextExecutor {
116
+ /**
117
+ * DB 연결 수립
118
+ */
119
+ connect(): Promise<void>;
120
+
121
+ /**
122
+ * DB 연결 end
123
+ */
124
+ close(): Promise<void>;
125
+
126
+ /**
127
+ * Transaction start
128
+ *
129
+ * @param isolationLevel - isolation level (Select)
130
+ */
131
+ beginTransaction(isolationLevel?: IsolationLevel): Promise<void>;
132
+
133
+ /**
134
+ * Transaction commit
135
+ */
136
+ commitTransaction(): Promise<void>;
137
+
138
+ /**
139
+ * Transaction rollback
140
+ */
141
+ rollbackTransaction(): Promise<void>;
142
+
143
+ /**
144
+ * QueryDef array 실행
145
+ *
146
+ * @template T - Result record type
147
+ * @param defs - Execute할 QueryDef array
148
+ * @param resultMetas - Result Transform을 위한 Metadata (Select)
149
+ * @returns 각 QueryDef별 result 배열의 array
150
+ */
151
+ executeDefs<T = DataRecord>(
152
+ defs: QueryDef[],
153
+ resultMetas?: (ResultMeta | undefined)[],
154
+ ): Promise<T[][]>;
155
+ }
156
+
157
+ /**
158
+ * Query result Transform을 위한 Metadata
159
+ *
160
+ * SELECT 결과를 TypeScript 객체로 Transform 시 사용
161
+ *
162
+ * @property columns - Column명 → ColumnPrimitiveStr Mapping
163
+ * @property joins - JOIN 별칭 → 단일/array 여부
164
+ */
165
+ export interface ResultMeta {
166
+ columns: Record<string, ColumnPrimitiveStr>;
167
+ joins: Record<string, { isSingle: boolean }>;
168
+ }
169
+
170
+ // ============================================
171
+ // Migration
172
+ // ============================================
173
+
174
+ /**
175
+ * Database migration definition
176
+ *
177
+ * schema 변경을 version control
178
+ *
179
+ * @property name - Migration 고유 이름 (타임스탬프 권장)
180
+ * @property up - Migration 실행 function
181
+ *
182
+ * @example
183
+ * ```typescript
184
+ * const migrations: Migration[] = [
185
+ * {
186
+ * name: "20260105_001_create_user_table",
187
+ * up: async (db) => {
188
+ * await db.createTable(User);
189
+ * },
190
+ * },
191
+ * {
192
+ * name: "20260105_002_add_email_column",
193
+ * up: async (db) => {
194
+ * await db.addColumn(User, "email", {
195
+ * type: "varchar",
196
+ * length: 200,
197
+ * });
198
+ * },
199
+ * },
200
+ * ];
201
+ * ```
202
+ *
203
+ * @see {@link DbContext.initialize} migration 실행
204
+ */
205
+ export interface Migration {
206
+ name: string;
207
+ up: (db: DbContextBase & DbContextDdlMethods) => Promise<void>;
208
+ }