@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.
- package/README.md +54 -1447
- package/dist/create-db-context.d.ts +10 -10
- package/dist/create-db-context.js +9 -9
- package/dist/create-db-context.js.map +1 -1
- package/dist/ddl/column-ddl.d.ts +4 -4
- package/dist/ddl/initialize.d.ts +17 -17
- package/dist/ddl/initialize.js +2 -2
- package/dist/ddl/initialize.js.map +1 -1
- package/dist/ddl/relation-ddl.d.ts +6 -6
- package/dist/ddl/schema-ddl.d.ts +4 -4
- package/dist/ddl/table-ddl.d.ts +24 -24
- package/dist/ddl/table-ddl.js +4 -4
- package/dist/ddl/table-ddl.js.map +1 -1
- package/dist/errors/db-transaction-error.d.ts +15 -15
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/exec/executable.d.ts +23 -23
- package/dist/exec/executable.js +3 -3
- package/dist/exec/executable.js.map +1 -1
- package/dist/exec/queryable.d.ts +160 -160
- package/dist/exec/queryable.js +119 -119
- package/dist/exec/queryable.js.map +1 -1
- package/dist/exec/search-parser.d.ts +37 -37
- package/dist/exec/search-parser.d.ts.map +1 -1
- package/dist/expr/expr-unit.d.ts +4 -4
- package/dist/expr/expr.d.ts +257 -257
- package/dist/expr/expr.js +265 -265
- package/dist/expr/expr.js.map +1 -1
- package/dist/query-builder/base/expr-renderer-base.d.ts +9 -9
- package/dist/query-builder/base/expr-renderer-base.js +2 -2
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
- package/dist/query-builder/base/query-builder-base.d.ts +26 -26
- package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.js +22 -22
- package/dist/query-builder/base/query-builder-base.js.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js +18 -18
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
- package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.js +11 -11
- package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js +17 -17
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.d.ts +8 -8
- package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.js +5 -5
- package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js +17 -17
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +5 -5
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js +8 -8
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
- package/dist/query-builder/query-builder.d.ts +1 -1
- package/dist/schema/factory/column-builder.d.ts +79 -79
- package/dist/schema/factory/column-builder.js +42 -42
- package/dist/schema/factory/index-builder.d.ts +39 -39
- package/dist/schema/factory/index-builder.js +26 -26
- package/dist/schema/factory/relation-builder.d.ts +99 -99
- package/dist/schema/factory/relation-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.js +38 -38
- package/dist/schema/procedure-builder.d.ts +49 -49
- package/dist/schema/procedure-builder.d.ts.map +1 -1
- package/dist/schema/procedure-builder.js +33 -33
- package/dist/schema/table-builder.d.ts +59 -59
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +43 -43
- package/dist/schema/view-builder.d.ts +49 -49
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +32 -32
- package/dist/types/column.d.ts +22 -22
- package/dist/types/column.js +1 -1
- package/dist/types/column.js.map +1 -1
- package/dist/types/db.d.ts +40 -40
- package/dist/types/expr.d.ts +59 -59
- package/dist/types/expr.d.ts.map +1 -1
- package/dist/types/query-def.d.ts +44 -44
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/utils/result-parser.d.ts +11 -11
- package/dist/utils/result-parser.js +3 -3
- package/dist/utils/result-parser.js.map +1 -1
- package/package.json +5 -5
- package/src/create-db-context.ts +20 -20
- package/src/ddl/column-ddl.ts +4 -4
- package/src/ddl/initialize.ts +259 -259
- package/src/ddl/relation-ddl.ts +89 -89
- package/src/ddl/schema-ddl.ts +4 -4
- package/src/ddl/table-ddl.ts +189 -189
- package/src/errors/db-transaction-error.ts +13 -13
- package/src/exec/executable.ts +25 -25
- package/src/exec/queryable.ts +2033 -2033
- package/src/exec/search-parser.ts +57 -57
- package/src/expr/expr-unit.ts +4 -4
- package/src/expr/expr.ts +2140 -2140
- package/src/query-builder/base/expr-renderer-base.ts +237 -237
- package/src/query-builder/base/query-builder-base.ts +213 -213
- package/src/query-builder/mssql/mssql-expr-renderer.ts +607 -607
- package/src/query-builder/mssql/mssql-query-builder.ts +650 -650
- package/src/query-builder/mysql/mysql-expr-renderer.ts +613 -613
- package/src/query-builder/mysql/mysql-query-builder.ts +759 -759
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +611 -611
- package/src/query-builder/postgresql/postgresql-query-builder.ts +686 -686
- package/src/query-builder/query-builder.ts +19 -19
- package/src/schema/factory/column-builder.ts +423 -423
- package/src/schema/factory/index-builder.ts +164 -164
- package/src/schema/factory/relation-builder.ts +453 -453
- package/src/schema/procedure-builder.ts +232 -232
- package/src/schema/table-builder.ts +319 -319
- package/src/schema/view-builder.ts +221 -221
- package/src/types/column.ts +188 -188
- package/src/types/db.ts +208 -208
- package/src/types/expr.ts +697 -697
- package/src/types/query-def.ts +513 -513
- package/src/utils/result-parser.ts +458 -458
- package/tests/db-context/create-db-context.spec.ts +224 -0
- package/tests/db-context/define-db-context.spec.ts +68 -0
- package/tests/ddl/basic.expected.ts +341 -0
- package/tests/ddl/basic.spec.ts +714 -0
- package/tests/ddl/column-builder.expected.ts +310 -0
- package/tests/ddl/column-builder.spec.ts +637 -0
- package/tests/ddl/index-builder.expected.ts +38 -0
- package/tests/ddl/index-builder.spec.ts +202 -0
- package/tests/ddl/procedure-builder.expected.ts +52 -0
- package/tests/ddl/procedure-builder.spec.ts +234 -0
- package/tests/ddl/relation-builder.expected.ts +36 -0
- package/tests/ddl/relation-builder.spec.ts +372 -0
- package/tests/ddl/table-builder.expected.ts +113 -0
- package/tests/ddl/table-builder.spec.ts +433 -0
- package/tests/ddl/view-builder.expected.ts +38 -0
- package/tests/ddl/view-builder.spec.ts +176 -0
- package/tests/dml/delete.expected.ts +96 -0
- package/tests/dml/delete.spec.ts +160 -0
- package/tests/dml/insert.expected.ts +192 -0
- package/tests/dml/insert.spec.ts +288 -0
- package/tests/dml/update.expected.ts +176 -0
- package/tests/dml/update.spec.ts +318 -0
- package/tests/dml/upsert.expected.ts +215 -0
- package/tests/dml/upsert.spec.ts +242 -0
- package/tests/errors/queryable-errors.spec.ts +177 -0
- package/tests/escape.spec.ts +100 -0
- package/tests/examples/pivot.expected.ts +211 -0
- package/tests/examples/pivot.spec.ts +533 -0
- package/tests/examples/sampling.expected.ts +69 -0
- package/tests/examples/sampling.spec.ts +104 -0
- package/tests/examples/unpivot.expected.ts +120 -0
- package/tests/examples/unpivot.spec.ts +226 -0
- package/tests/exec/search-parser.spec.ts +283 -0
- package/tests/executable/basic.expected.ts +18 -0
- package/tests/executable/basic.spec.ts +54 -0
- package/tests/expr/comparison.expected.ts +282 -0
- package/tests/expr/comparison.spec.ts +400 -0
- package/tests/expr/conditional.expected.ts +134 -0
- package/tests/expr/conditional.spec.ts +276 -0
- package/tests/expr/date.expected.ts +332 -0
- package/tests/expr/date.spec.ts +526 -0
- package/tests/expr/math.expected.ts +62 -0
- package/tests/expr/math.spec.ts +106 -0
- package/tests/expr/string.expected.ts +218 -0
- package/tests/expr/string.spec.ts +356 -0
- package/tests/expr/utility.expected.ts +147 -0
- package/tests/expr/utility.spec.ts +182 -0
- package/tests/select/basic.expected.ts +322 -0
- package/tests/select/basic.spec.ts +502 -0
- package/tests/select/filter.expected.ts +357 -0
- package/tests/select/filter.spec.ts +1068 -0
- package/tests/select/group.expected.ts +169 -0
- package/tests/select/group.spec.ts +244 -0
- package/tests/select/join.expected.ts +582 -0
- package/tests/select/join.spec.ts +805 -0
- package/tests/select/order.expected.ts +150 -0
- package/tests/select/order.spec.ts +189 -0
- package/tests/select/recursive-cte.expected.ts +244 -0
- package/tests/select/recursive-cte.spec.ts +514 -0
- package/tests/select/result-meta.spec.ts +270 -0
- package/tests/select/subquery.expected.ts +363 -0
- package/tests/select/subquery.spec.ts +537 -0
- package/tests/select/view.expected.ts +155 -0
- package/tests/select/view.spec.ts +235 -0
- package/tests/select/window.expected.ts +345 -0
- package/tests/select/window.spec.ts +618 -0
- package/tests/setup/MockExecutor.ts +18 -0
- package/tests/setup/TestDbContext.ts +59 -0
- package/tests/setup/models/Company.ts +13 -0
- package/tests/setup/models/Employee.ts +10 -0
- package/tests/setup/models/MonthlySales.ts +11 -0
- package/tests/setup/models/Post.ts +16 -0
- package/tests/setup/models/Sales.ts +10 -0
- package/tests/setup/models/User.ts +19 -0
- package/tests/setup/procedure/GetAllUsers.ts +9 -0
- package/tests/setup/procedure/GetUserById.ts +12 -0
- package/tests/setup/test-utils.ts +72 -0
- package/tests/setup/views/ActiveUsers.ts +8 -0
- package/tests/setup/views/UserSummary.ts +11 -0
- package/tests/types/nullable-queryable-record.spec.ts +145 -0
- package/tests/utils/result-parser-perf.spec.ts +210 -0
- package/tests/utils/result-parser.spec.ts +701 -0
- package/docs/expressions.md +0 -172
- package/docs/queries.md +0 -444
- package/docs/schema.md +0 -245
|
@@ -1,232 +1,232 @@
|
|
|
1
|
-
import { type ColumnBuilderRecord, createColumnFactory } from "./factory/column-builder";
|
|
2
|
-
|
|
3
|
-
// ============================================
|
|
4
|
-
// ProcedureBuilder
|
|
5
|
-
// ============================================
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* 저장
|
|
9
|
-
*
|
|
10
|
-
* Fluent API를 통해
|
|
11
|
-
* DbContext의 executable()과 함께 사용하여
|
|
12
|
-
*
|
|
13
|
-
* @template TParams - 파라미터
|
|
14
|
-
* @template TReturns -
|
|
15
|
-
*
|
|
16
|
-
* @example
|
|
17
|
-
* ```typescript
|
|
18
|
-
* //
|
|
19
|
-
* const GetUserById = Procedure("GetUserById")
|
|
20
|
-
* .database("mydb")
|
|
21
|
-
* .params((c) => ({
|
|
22
|
-
* userId: c.bigint(),
|
|
23
|
-
* }))
|
|
24
|
-
* .returns((c) => ({
|
|
25
|
-
* id: c.bigint(),
|
|
26
|
-
* name: c.varchar(100),
|
|
27
|
-
* email: c.varchar(200),
|
|
28
|
-
* }))
|
|
29
|
-
* .body("SELECT id, name, email FROM User WHERE id = userId");
|
|
30
|
-
*
|
|
31
|
-
* //
|
|
32
|
-
* class MyDb extends DbContext {
|
|
33
|
-
* readonly getUserById = executable(this, GetUserById);
|
|
34
|
-
* }
|
|
35
|
-
*
|
|
36
|
-
* // 호출
|
|
37
|
-
* const users = await db.getUserById({ userId: 1n }).result();
|
|
38
|
-
* ```
|
|
39
|
-
*
|
|
40
|
-
* @see {@link Procedure}
|
|
41
|
-
* @see {@link executable} Executable
|
|
42
|
-
*/
|
|
43
|
-
export class ProcedureBuilder<
|
|
44
|
-
TParams extends ColumnBuilderRecord,
|
|
45
|
-
TReturns extends ColumnBuilderRecord,
|
|
46
|
-
> {
|
|
47
|
-
/** 파라미터
|
|
48
|
-
readonly $params!: TParams;
|
|
49
|
-
/**
|
|
50
|
-
readonly $returns!: TReturns;
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* @param meta -
|
|
54
|
-
* @param meta.name -
|
|
55
|
-
* @param meta.description -
|
|
56
|
-
* @param meta.database -
|
|
57
|
-
* @param meta.schema -
|
|
58
|
-
* @param meta.params - 파라미터
|
|
59
|
-
* @param meta.returns -
|
|
60
|
-
* @param meta.query -
|
|
61
|
-
*/
|
|
62
|
-
constructor(
|
|
63
|
-
readonly meta: {
|
|
64
|
-
name: string;
|
|
65
|
-
description?: string;
|
|
66
|
-
database?: string;
|
|
67
|
-
schema?: string;
|
|
68
|
-
params?: TParams;
|
|
69
|
-
returns?: TReturns;
|
|
70
|
-
query?: string;
|
|
71
|
-
},
|
|
72
|
-
) {}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
*
|
|
76
|
-
*
|
|
77
|
-
* @param desc -
|
|
78
|
-
* @returns
|
|
79
|
-
*/
|
|
80
|
-
description(desc: string): ProcedureBuilder<TParams, TReturns> {
|
|
81
|
-
return new ProcedureBuilder({ ...this.meta, description: desc });
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* @param db -
|
|
88
|
-
* @returns
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```typescript
|
|
92
|
-
* const GetUser = Procedure("GetUser").database("mydb");
|
|
93
|
-
* ```
|
|
94
|
-
*/
|
|
95
|
-
database(db: string): ProcedureBuilder<TParams, TReturns> {
|
|
96
|
-
return new ProcedureBuilder({ ...this.meta, database: db });
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
* MSSQL,
|
|
103
|
-
*
|
|
104
|
-
* @param schema -
|
|
105
|
-
* @returns
|
|
106
|
-
*/
|
|
107
|
-
schema(schema: string): ProcedureBuilder<TParams, TReturns> {
|
|
108
|
-
return new ProcedureBuilder({ ...this.meta, schema });
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* 파라미터
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
* DBMS별 파라미터 문법 차이 주의 (MSSQL: @param, MySQL/PostgreSQL: param)
|
|
116
|
-
*
|
|
117
|
-
* @template T - 새 파라미터
|
|
118
|
-
* @param fn -
|
|
119
|
-
* @returns
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* ```typescript
|
|
123
|
-
* const GetUserById = Procedure("GetUserById")
|
|
124
|
-
* .params((c) => ({
|
|
125
|
-
* userId: c.bigint(),
|
|
126
|
-
* includeDeleted: c.boolean().default(false),
|
|
127
|
-
* }));
|
|
128
|
-
* ```
|
|
129
|
-
*/
|
|
130
|
-
params<T extends ColumnBuilderRecord>(
|
|
131
|
-
fn: (c: ReturnType<typeof createColumnFactory>) => T,
|
|
132
|
-
): ProcedureBuilder<T, TReturns> {
|
|
133
|
-
return new ProcedureBuilder({ ...this.meta, params: fn(createColumnFactory()) });
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
* @template T - 새
|
|
142
|
-
* @param fn -
|
|
143
|
-
* @returns
|
|
144
|
-
*
|
|
145
|
-
* @example
|
|
146
|
-
* ```typescript
|
|
147
|
-
* const GetUserById = Procedure("GetUserById")
|
|
148
|
-
* .params((c) => ({ userId: c.bigint() }))
|
|
149
|
-
* .returns((c) => ({
|
|
150
|
-
* id: c.bigint(),
|
|
151
|
-
* name: c.varchar(100),
|
|
152
|
-
* email: c.varchar(200).nullable(),
|
|
153
|
-
* }));
|
|
154
|
-
* ```
|
|
155
|
-
*/
|
|
156
|
-
returns<T extends ColumnBuilderRecord>(
|
|
157
|
-
fn: (c: ReturnType<typeof createColumnFactory>) => T,
|
|
158
|
-
): ProcedureBuilder<TParams, T> {
|
|
159
|
-
return new ProcedureBuilder({ ...this.meta, returns: fn(createColumnFactory()) });
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
* DBMS별 SQL 문법 차이 주의:
|
|
166
|
-
* - MySQL: 파라미터명 그대로 (userId)
|
|
167
|
-
* - MSSQL: @ 접두사 (@userId)
|
|
168
|
-
* - PostgreSQL: RETURN QUERY 필요
|
|
169
|
-
*
|
|
170
|
-
* @param sql -
|
|
171
|
-
* @returns
|
|
172
|
-
*
|
|
173
|
-
* @example
|
|
174
|
-
* ```typescript
|
|
175
|
-
* // MySQL/PostgreSQL
|
|
176
|
-
* const GetUser = Procedure("GetUser")
|
|
177
|
-
* .params((c) => ({ userId: c.bigint() }))
|
|
178
|
-
* .body("SELECT * FROM User WHERE id = userId");
|
|
179
|
-
*
|
|
180
|
-
* // MSSQL
|
|
181
|
-
* const GetUser = Procedure("GetUser")
|
|
182
|
-
* .params((c) => ({ userId: c.bigint() }))
|
|
183
|
-
* .body("SELECT * FROM [User] WHERE id = @userId");
|
|
184
|
-
* ```
|
|
185
|
-
*/
|
|
186
|
-
body(sql: string): ProcedureBuilder<TParams, TReturns> {
|
|
187
|
-
return new ProcedureBuilder({ ...this.meta, query: sql });
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
// ============================================
|
|
192
|
-
// Procedure
|
|
193
|
-
// ============================================
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
* ProcedureBuilder를 생성하여 Fluent API로 저장
|
|
199
|
-
*
|
|
200
|
-
* @param name -
|
|
201
|
-
* @returns ProcedureBuilder
|
|
202
|
-
*
|
|
203
|
-
* @example
|
|
204
|
-
* ```typescript
|
|
205
|
-
* //
|
|
206
|
-
* const GetUserById = Procedure("GetUserById")
|
|
207
|
-
* .database("mydb")
|
|
208
|
-
* .params((c) => ({
|
|
209
|
-
* userId: c.bigint(),
|
|
210
|
-
* }))
|
|
211
|
-
* .returns((c) => ({
|
|
212
|
-
* id: c.bigint(),
|
|
213
|
-
* name: c.varchar(100),
|
|
214
|
-
* email: c.varchar(200),
|
|
215
|
-
* }))
|
|
216
|
-
* .body("SELECT id, name, email FROM User WHERE id = userId");
|
|
217
|
-
*
|
|
218
|
-
* // 파라미터 없는
|
|
219
|
-
* const GetAllActiveUsers = Procedure("GetAllActiveUsers")
|
|
220
|
-
* .database("mydb")
|
|
221
|
-
* .returns((c) => ({
|
|
222
|
-
* id: c.bigint(),
|
|
223
|
-
* name: c.varchar(100),
|
|
224
|
-
* }))
|
|
225
|
-
* .body("SELECT id, name FROM User WHERE status = 'active'");
|
|
226
|
-
* ```
|
|
227
|
-
*
|
|
228
|
-
* @see {@link ProcedureBuilder}
|
|
229
|
-
*/
|
|
230
|
-
export function Procedure(name: string): ProcedureBuilder<never, never> {
|
|
231
|
-
return new ProcedureBuilder({ name });
|
|
232
|
-
}
|
|
1
|
+
import { type ColumnBuilderRecord, createColumnFactory } from "./factory/column-builder";
|
|
2
|
+
|
|
3
|
+
// ============================================
|
|
4
|
+
// ProcedureBuilder
|
|
5
|
+
// ============================================
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* 저장 Procedure definition builder
|
|
9
|
+
*
|
|
10
|
+
* Fluent API를 통해 Procedure의 파라미터, return type, 본문을 definition
|
|
11
|
+
* DbContext의 executable()과 함께 사용하여 type 안전한 Procedure 호출
|
|
12
|
+
*
|
|
13
|
+
* @template TParams - 파라미터 Column definition type
|
|
14
|
+
* @template TReturns - return Column definition type
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Procedure definition
|
|
19
|
+
* const GetUserById = Procedure("GetUserById")
|
|
20
|
+
* .database("mydb")
|
|
21
|
+
* .params((c) => ({
|
|
22
|
+
* userId: c.bigint(),
|
|
23
|
+
* }))
|
|
24
|
+
* .returns((c) => ({
|
|
25
|
+
* id: c.bigint(),
|
|
26
|
+
* name: c.varchar(100),
|
|
27
|
+
* email: c.varchar(200),
|
|
28
|
+
* }))
|
|
29
|
+
* .body("SELECT id, name, email FROM User WHERE id = userId");
|
|
30
|
+
*
|
|
31
|
+
* // DbContextused in
|
|
32
|
+
* class MyDb extends DbContext {
|
|
33
|
+
* readonly getUserById = executable(this, GetUserById);
|
|
34
|
+
* }
|
|
35
|
+
*
|
|
36
|
+
* // 호출
|
|
37
|
+
* const users = await db.getUserById({ userId: 1n }).result();
|
|
38
|
+
* ```
|
|
39
|
+
*
|
|
40
|
+
* @see {@link Procedure} factory function
|
|
41
|
+
* @see {@link executable} Executable Generate
|
|
42
|
+
*/
|
|
43
|
+
export class ProcedureBuilder<
|
|
44
|
+
TParams extends ColumnBuilderRecord,
|
|
45
|
+
TReturns extends ColumnBuilderRecord,
|
|
46
|
+
> {
|
|
47
|
+
/** 파라미터 definition (type for inference) */
|
|
48
|
+
readonly $params!: TParams;
|
|
49
|
+
/** return type definition (type for inference) */
|
|
50
|
+
readonly $returns!: TReturns;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @param meta - Procedure Metadata
|
|
54
|
+
* @param meta.name - Procedure 이름
|
|
55
|
+
* @param meta.description - Procedure description (주석)
|
|
56
|
+
* @param meta.database - Database 이름
|
|
57
|
+
* @param meta.schema - Schema 이름 (MSSQL/PostgreSQL)
|
|
58
|
+
* @param meta.params - 파라미터 definition
|
|
59
|
+
* @param meta.returns - return type definition
|
|
60
|
+
* @param meta.query - Procedure 본문 SQL
|
|
61
|
+
*/
|
|
62
|
+
constructor(
|
|
63
|
+
readonly meta: {
|
|
64
|
+
name: string;
|
|
65
|
+
description?: string;
|
|
66
|
+
database?: string;
|
|
67
|
+
schema?: string;
|
|
68
|
+
params?: TParams;
|
|
69
|
+
returns?: TReturns;
|
|
70
|
+
query?: string;
|
|
71
|
+
},
|
|
72
|
+
) {}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Procedure set description
|
|
76
|
+
*
|
|
77
|
+
* @param desc - Procedure description (DDL Comment으로 사용)
|
|
78
|
+
* @returns new ProcedureBuilder instance
|
|
79
|
+
*/
|
|
80
|
+
description(desc: string): ProcedureBuilder<TParams, TReturns> {
|
|
81
|
+
return new ProcedureBuilder({ ...this.meta, description: desc });
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Database set name
|
|
86
|
+
*
|
|
87
|
+
* @param db - Database 이름
|
|
88
|
+
* @returns new ProcedureBuilder instance
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const GetUser = Procedure("GetUser").database("mydb");
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
database(db: string): ProcedureBuilder<TParams, TReturns> {
|
|
96
|
+
return new ProcedureBuilder({ ...this.meta, database: db });
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* schema set name
|
|
101
|
+
*
|
|
102
|
+
* MSSQL, PostgreSQLused in
|
|
103
|
+
*
|
|
104
|
+
* @param schema - Schema 이름 (MSSQL: dbo, PostgreSQL: public)
|
|
105
|
+
* @returns new ProcedureBuilder instance
|
|
106
|
+
*/
|
|
107
|
+
schema(schema: string): ProcedureBuilder<TParams, TReturns> {
|
|
108
|
+
return new ProcedureBuilder({ ...this.meta, schema });
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* 파라미터 definition
|
|
113
|
+
*
|
|
114
|
+
* Procedure 입력 파라미터 definition
|
|
115
|
+
* DBMS별 파라미터 문법 차이 주의 (MSSQL: @param, MySQL/PostgreSQL: param)
|
|
116
|
+
*
|
|
117
|
+
* @template T - 새 파라미터 definition type
|
|
118
|
+
* @param fn - Column factory를 받아 파라미터 정의를 반환하는 function
|
|
119
|
+
* @returns new ProcedureBuilder instance
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* const GetUserById = Procedure("GetUserById")
|
|
124
|
+
* .params((c) => ({
|
|
125
|
+
* userId: c.bigint(),
|
|
126
|
+
* includeDeleted: c.boolean().default(false),
|
|
127
|
+
* }));
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
params<T extends ColumnBuilderRecord>(
|
|
131
|
+
fn: (c: ReturnType<typeof createColumnFactory>) => T,
|
|
132
|
+
): ProcedureBuilder<T, TReturns> {
|
|
133
|
+
return new ProcedureBuilder({ ...this.meta, params: fn(createColumnFactory()) });
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* return type definition
|
|
138
|
+
*
|
|
139
|
+
* Procedure return result Column definition
|
|
140
|
+
*
|
|
141
|
+
* @template T - 새 return type definition
|
|
142
|
+
* @param fn - Column factory를 받아 return Column definition를 반환하는 function
|
|
143
|
+
* @returns new ProcedureBuilder instance
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* const GetUserById = Procedure("GetUserById")
|
|
148
|
+
* .params((c) => ({ userId: c.bigint() }))
|
|
149
|
+
* .returns((c) => ({
|
|
150
|
+
* id: c.bigint(),
|
|
151
|
+
* name: c.varchar(100),
|
|
152
|
+
* email: c.varchar(200).nullable(),
|
|
153
|
+
* }));
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
returns<T extends ColumnBuilderRecord>(
|
|
157
|
+
fn: (c: ReturnType<typeof createColumnFactory>) => T,
|
|
158
|
+
): ProcedureBuilder<TParams, T> {
|
|
159
|
+
return new ProcedureBuilder({ ...this.meta, returns: fn(createColumnFactory()) });
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Procedure 본문 SQL 설정
|
|
164
|
+
*
|
|
165
|
+
* DBMS별 SQL 문법 차이 주의:
|
|
166
|
+
* - MySQL: 파라미터명 그대로 (userId)
|
|
167
|
+
* - MSSQL: @ 접두사 (@userId)
|
|
168
|
+
* - PostgreSQL: RETURN QUERY 필요
|
|
169
|
+
*
|
|
170
|
+
* @param sql - Procedure 본문 SQL
|
|
171
|
+
* @returns new ProcedureBuilder instance
|
|
172
|
+
*
|
|
173
|
+
* @example
|
|
174
|
+
* ```typescript
|
|
175
|
+
* // MySQL/PostgreSQL
|
|
176
|
+
* const GetUser = Procedure("GetUser")
|
|
177
|
+
* .params((c) => ({ userId: c.bigint() }))
|
|
178
|
+
* .body("SELECT * FROM User WHERE id = userId");
|
|
179
|
+
*
|
|
180
|
+
* // MSSQL
|
|
181
|
+
* const GetUser = Procedure("GetUser")
|
|
182
|
+
* .params((c) => ({ userId: c.bigint() }))
|
|
183
|
+
* .body("SELECT * FROM [User] WHERE id = @userId");
|
|
184
|
+
* ```
|
|
185
|
+
*/
|
|
186
|
+
body(sql: string): ProcedureBuilder<TParams, TReturns> {
|
|
187
|
+
return new ProcedureBuilder({ ...this.meta, query: sql });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// ============================================
|
|
192
|
+
// Procedure function
|
|
193
|
+
// ============================================
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Procedure builder Generate factory function
|
|
197
|
+
*
|
|
198
|
+
* ProcedureBuilder를 생성하여 Fluent API로 저장 Procedure schema definition
|
|
199
|
+
*
|
|
200
|
+
* @param name - Procedure 이름
|
|
201
|
+
* @returns ProcedureBuilder instance
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```typescript
|
|
205
|
+
* // Basic 사용
|
|
206
|
+
* const GetUserById = Procedure("GetUserById")
|
|
207
|
+
* .database("mydb")
|
|
208
|
+
* .params((c) => ({
|
|
209
|
+
* userId: c.bigint(),
|
|
210
|
+
* }))
|
|
211
|
+
* .returns((c) => ({
|
|
212
|
+
* id: c.bigint(),
|
|
213
|
+
* name: c.varchar(100),
|
|
214
|
+
* email: c.varchar(200),
|
|
215
|
+
* }))
|
|
216
|
+
* .body("SELECT id, name, email FROM User WHERE id = userId");
|
|
217
|
+
*
|
|
218
|
+
* // 파라미터 없는 Procedure
|
|
219
|
+
* const GetAllActiveUsers = Procedure("GetAllActiveUsers")
|
|
220
|
+
* .database("mydb")
|
|
221
|
+
* .returns((c) => ({
|
|
222
|
+
* id: c.bigint(),
|
|
223
|
+
* name: c.varchar(100),
|
|
224
|
+
* }))
|
|
225
|
+
* .body("SELECT id, name FROM User WHERE status = 'active'");
|
|
226
|
+
* ```
|
|
227
|
+
*
|
|
228
|
+
* @see {@link ProcedureBuilder} builder class
|
|
229
|
+
*/
|
|
230
|
+
export function Procedure(name: string): ProcedureBuilder<never, never> {
|
|
231
|
+
return new ProcedureBuilder({ name });
|
|
232
|
+
}
|