@simplysm/orm-common 13.0.100 → 14.0.4
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 +90 -147
- package/dist/create-db-context.d.ts +10 -10
- package/dist/create-db-context.js +312 -276
- package/dist/create-db-context.js.map +1 -6
- package/dist/ddl/column-ddl.d.ts +4 -4
- package/dist/ddl/column-ddl.js +41 -35
- package/dist/ddl/column-ddl.js.map +1 -6
- package/dist/ddl/initialize.d.ts +17 -17
- package/dist/ddl/initialize.js +200 -142
- package/dist/ddl/initialize.js.map +1 -6
- package/dist/ddl/relation-ddl.d.ts +6 -6
- package/dist/ddl/relation-ddl.js +55 -48
- package/dist/ddl/relation-ddl.js.map +1 -6
- package/dist/ddl/schema-ddl.d.ts +4 -4
- package/dist/ddl/schema-ddl.js +21 -15
- package/dist/ddl/schema-ddl.js.map +1 -6
- package/dist/ddl/table-ddl.d.ts +20 -20
- package/dist/ddl/table-ddl.js +139 -93
- package/dist/ddl/table-ddl.js.map +1 -6
- package/dist/define-db-context.js +10 -13
- package/dist/define-db-context.js.map +1 -6
- package/dist/errors/db-transaction-error.d.ts +15 -15
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/errors/db-transaction-error.js +53 -19
- package/dist/errors/db-transaction-error.js.map +1 -6
- package/dist/exec/executable.d.ts +23 -23
- package/dist/exec/executable.js +94 -40
- package/dist/exec/executable.js.map +1 -6
- package/dist/exec/queryable.d.ts +97 -97
- package/dist/exec/queryable.js +1310 -1204
- package/dist/exec/queryable.js.map +1 -6
- package/dist/exec/search-parser.d.ts +31 -31
- package/dist/exec/search-parser.d.ts.map +1 -1
- package/dist/exec/search-parser.js +158 -59
- package/dist/exec/search-parser.js.map +1 -6
- package/dist/expr/expr-unit.d.ts +4 -4
- package/dist/expr/expr-unit.js +24 -18
- package/dist/expr/expr-unit.js.map +1 -6
- package/dist/expr/expr.d.ts +108 -108
- package/dist/expr/expr.js +1872 -1844
- package/dist/expr/expr.js.map +1 -6
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -6
- package/dist/models/system-migration.js +7 -7
- package/dist/models/system-migration.js.map +1 -6
- package/dist/query-builder/base/expr-renderer-base.d.ts +10 -10
- package/dist/query-builder/base/expr-renderer-base.js +27 -21
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -6
- package/dist/query-builder/base/query-builder-base.d.ts +21 -21
- package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.js +90 -80
- package/dist/query-builder/base/query-builder-base.js.map +1 -6
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js +447 -420
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -6
- 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 +483 -443
- package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -6
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js +451 -419
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -6
- package/dist/query-builder/mysql/mysql-query-builder.d.ts +10 -10
- package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.js +570 -479
- package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -6
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js +449 -422
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -6
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +8 -8
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js +511 -460
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -6
- package/dist/query-builder/query-builder.d.ts +1 -1
- package/dist/query-builder/query-builder.js +13 -13
- package/dist/query-builder/query-builder.js.map +1 -6
- package/dist/schema/factory/column-builder.d.ts +84 -84
- package/dist/schema/factory/column-builder.js +248 -185
- package/dist/schema/factory/column-builder.js.map +1 -6
- package/dist/schema/factory/index-builder.d.ts +38 -38
- package/dist/schema/factory/index-builder.js +144 -85
- package/dist/schema/factory/index-builder.js.map +1 -6
- 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 +274 -136
- package/dist/schema/factory/relation-builder.js.map +1 -6
- package/dist/schema/procedure-builder.d.ts +51 -51
- package/dist/schema/procedure-builder.d.ts.map +1 -1
- package/dist/schema/procedure-builder.js +205 -131
- package/dist/schema/procedure-builder.js.map +1 -6
- package/dist/schema/table-builder.d.ts +55 -55
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +274 -205
- package/dist/schema/table-builder.js.map +1 -6
- package/dist/schema/view-builder.d.ts +44 -44
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +189 -116
- package/dist/schema/view-builder.js.map +1 -6
- package/dist/types/column.d.ts +21 -21
- package/dist/types/column.js +60 -30
- package/dist/types/column.js.map +1 -6
- package/dist/types/db-context-def.d.ts +9 -9
- package/dist/types/db-context-def.js +2 -1
- package/dist/types/db-context-def.js.map +1 -6
- package/dist/types/db.d.ts +47 -47
- package/dist/types/db.js +15 -5
- package/dist/types/db.js.map +1 -6
- package/dist/types/expr.d.ts +81 -81
- package/dist/types/expr.d.ts.map +1 -1
- package/dist/types/expr.js +3 -1
- package/dist/types/expr.js.map +1 -6
- package/dist/types/query-def.d.ts +46 -46
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/types/query-def.js +31 -24
- package/dist/types/query-def.js.map +1 -6
- package/dist/utils/result-parser.d.ts +11 -11
- package/dist/utils/result-parser.js +362 -221
- package/dist/utils/result-parser.js.map +1 -6
- package/docs/core.md +117 -145
- package/docs/expression.md +186 -203
- package/docs/query-builder.md +75 -42
- package/docs/queryable.md +189 -151
- package/docs/schema-builders.md +172 -283
- package/docs/types.md +229 -173
- package/package.json +7 -5
- package/src/create-db-context.ts +31 -31
- package/src/ddl/column-ddl.ts +4 -4
- package/src/ddl/initialize.ts +38 -38
- package/src/ddl/relation-ddl.ts +6 -6
- package/src/ddl/schema-ddl.ts +4 -4
- package/src/ddl/table-ddl.ts +24 -24
- package/src/errors/db-transaction-error.ts +13 -13
- package/src/exec/executable.ts +25 -25
- package/src/exec/queryable.ts +152 -152
- package/src/exec/search-parser.ts +50 -50
- package/src/expr/expr-unit.ts +4 -4
- package/src/expr/expr.ts +118 -118
- package/src/index.ts +8 -8
- package/src/models/system-migration.ts +1 -1
- package/src/query-builder/base/expr-renderer-base.ts +21 -21
- package/src/query-builder/base/query-builder-base.ts +33 -33
- package/src/query-builder/mssql/mssql-expr-renderer.ts +28 -28
- package/src/query-builder/mssql/mssql-query-builder.ts +37 -37
- package/src/query-builder/mysql/mysql-expr-renderer.ts +29 -29
- package/src/query-builder/mysql/mysql-query-builder.ts +70 -70
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +22 -22
- package/src/query-builder/postgresql/postgresql-query-builder.ts +54 -54
- package/src/query-builder/query-builder.ts +1 -1
- package/src/schema/factory/column-builder.ts +86 -86
- package/src/schema/factory/index-builder.ts +38 -38
- package/src/schema/factory/relation-builder.ts +102 -102
- package/src/schema/procedure-builder.ts +52 -52
- package/src/schema/table-builder.ts +56 -56
- package/src/schema/view-builder.ts +47 -47
- package/src/types/column.ts +24 -24
- package/src/types/db-context-def.ts +15 -15
- package/src/types/db.ts +50 -50
- package/src/types/expr.ts +103 -103
- package/src/types/query-def.ts +50 -50
- package/src/utils/result-parser.ts +88 -88
- package/docs/utilities.md +0 -27
- package/tests/db-context/create-db-context.spec.ts +0 -193
- package/tests/db-context/define-db-context.spec.ts +0 -17
- package/tests/ddl/basic.expected.ts +0 -341
- package/tests/ddl/basic.spec.ts +0 -557
- package/tests/ddl/column-builder.expected.ts +0 -310
- package/tests/ddl/column-builder.spec.ts +0 -525
- package/tests/ddl/index-builder.expected.ts +0 -38
- package/tests/ddl/index-builder.spec.ts +0 -148
- package/tests/ddl/procedure-builder.expected.ts +0 -52
- package/tests/ddl/procedure-builder.spec.ts +0 -128
- package/tests/ddl/relation-builder.expected.ts +0 -36
- package/tests/ddl/relation-builder.spec.ts +0 -171
- package/tests/ddl/table-builder.expected.ts +0 -113
- package/tests/ddl/table-builder.spec.ts +0 -399
- package/tests/ddl/view-builder.expected.ts +0 -38
- package/tests/ddl/view-builder.spec.ts +0 -116
- package/tests/dml/delete.expected.ts +0 -96
- package/tests/dml/delete.spec.ts +0 -127
- package/tests/dml/insert.expected.ts +0 -192
- package/tests/dml/insert.spec.ts +0 -210
- package/tests/dml/update.expected.ts +0 -176
- package/tests/dml/update.spec.ts +0 -222
- package/tests/dml/upsert.expected.ts +0 -215
- package/tests/dml/upsert.spec.ts +0 -190
- package/tests/errors/queryable-errors.spec.ts +0 -126
- package/tests/escape.spec.ts +0 -59
- package/tests/examples/pivot.expected.ts +0 -211
- package/tests/examples/pivot.spec.ts +0 -200
- package/tests/examples/sampling.expected.ts +0 -69
- package/tests/examples/sampling.spec.ts +0 -42
- package/tests/examples/unpivot.expected.ts +0 -120
- package/tests/examples/unpivot.spec.ts +0 -161
- package/tests/exec/search-parser.spec.ts +0 -267
- package/tests/executable/basic.expected.ts +0 -18
- package/tests/executable/basic.spec.ts +0 -54
- package/tests/expr/comparison.expected.ts +0 -282
- package/tests/expr/comparison.spec.ts +0 -334
- package/tests/expr/conditional.expected.ts +0 -134
- package/tests/expr/conditional.spec.ts +0 -249
- package/tests/expr/date.expected.ts +0 -332
- package/tests/expr/date.spec.ts +0 -459
- package/tests/expr/math.expected.ts +0 -62
- package/tests/expr/math.spec.ts +0 -59
- package/tests/expr/string.expected.ts +0 -218
- package/tests/expr/string.spec.ts +0 -300
- package/tests/expr/utility.expected.ts +0 -147
- package/tests/expr/utility.spec.ts +0 -155
- package/tests/select/basic.expected.ts +0 -322
- package/tests/select/basic.spec.ts +0 -433
- package/tests/select/filter.expected.ts +0 -357
- package/tests/select/filter.spec.ts +0 -954
- package/tests/select/group.expected.ts +0 -169
- package/tests/select/group.spec.ts +0 -159
- package/tests/select/join.expected.ts +0 -582
- package/tests/select/join.spec.ts +0 -692
- package/tests/select/order.expected.ts +0 -150
- package/tests/select/order.spec.ts +0 -140
- package/tests/select/recursive-cte.expected.ts +0 -244
- package/tests/select/recursive-cte.spec.ts +0 -514
- package/tests/select/result-meta.spec.ts +0 -270
- package/tests/select/subquery.expected.ts +0 -363
- package/tests/select/subquery.spec.ts +0 -441
- package/tests/select/view.expected.ts +0 -155
- package/tests/select/view.spec.ts +0 -235
- package/tests/select/window.expected.ts +0 -345
- package/tests/select/window.spec.ts +0 -433
- package/tests/setup/MockExecutor.ts +0 -18
- package/tests/setup/TestDbContext.ts +0 -59
- package/tests/setup/models/Company.ts +0 -13
- package/tests/setup/models/Employee.ts +0 -10
- package/tests/setup/models/MonthlySales.ts +0 -11
- package/tests/setup/models/Post.ts +0 -16
- package/tests/setup/models/Sales.ts +0 -10
- package/tests/setup/models/User.ts +0 -19
- package/tests/setup/procedure/GetAllUsers.ts +0 -9
- package/tests/setup/procedure/GetUserById.ts +0 -12
- package/tests/setup/test-utils.ts +0 -72
- package/tests/setup/views/ActiveUsers.ts +0 -8
- package/tests/setup/views/UserSummary.ts +0 -11
- package/tests/types/nullable-queryable-record.spec.ts +0 -97
- package/tests/utils/result-parser-perf.spec.ts +0 -143
- package/tests/utils/result-parser.spec.ts +0 -667
|
@@ -7,13 +7,13 @@ import type { ViewBuilder } from "../view-builder";
|
|
|
7
7
|
// ============================================
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* Foreign Key
|
|
10
|
+
* Foreign Key 관계 builder (N:1)
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* 현재 Table에서 대상 Table로의 FK 관계를 정의
|
|
13
|
+
* DB에 실제 FK 제약조건을 생성
|
|
14
14
|
*
|
|
15
|
-
* @template TOwner -
|
|
16
|
-
* @template TTargetFn -
|
|
15
|
+
* @template TOwner - 소유 Table builder 타입
|
|
16
|
+
* @template TTargetFn - 대상 Table builder factory 타입
|
|
17
17
|
*
|
|
18
18
|
* @example
|
|
19
19
|
* ```typescript
|
|
@@ -29,19 +29,19 @@ import type { ViewBuilder } from "../view-builder";
|
|
|
29
29
|
* }));
|
|
30
30
|
* ```
|
|
31
31
|
*
|
|
32
|
-
* @see {@link ForeignKeyTargetBuilder}
|
|
33
|
-
* @see {@link RelationKeyBuilder}
|
|
32
|
+
* @see {@link ForeignKeyTargetBuilder} 역참조 builder
|
|
33
|
+
* @see {@link RelationKeyBuilder} DB FK 없는 관계
|
|
34
34
|
*/
|
|
35
35
|
export class ForeignKeyBuilder<
|
|
36
36
|
TOwner extends TableBuilder<any, any>,
|
|
37
37
|
TTargetFn extends () => TableBuilder<any, any>,
|
|
38
38
|
> {
|
|
39
39
|
/**
|
|
40
|
-
* @param meta - FK
|
|
41
|
-
* @param meta.ownerFn -
|
|
42
|
-
* @param meta.columns - FK column
|
|
43
|
-
* @param meta.targetFn -
|
|
44
|
-
* @param meta.description -
|
|
40
|
+
* @param meta - FK 메타데이터
|
|
41
|
+
* @param meta.ownerFn - 소유 Table factory
|
|
42
|
+
* @param meta.columns - FK column 이름 배열
|
|
43
|
+
* @param meta.targetFn - 대상 Table factory
|
|
44
|
+
* @param meta.description - 관계 설명
|
|
45
45
|
*/
|
|
46
46
|
constructor(
|
|
47
47
|
readonly meta: {
|
|
@@ -53,10 +53,10 @@ export class ForeignKeyBuilder<
|
|
|
53
53
|
) {}
|
|
54
54
|
|
|
55
55
|
/**
|
|
56
|
-
*
|
|
56
|
+
* 관계 설명 설정
|
|
57
57
|
*
|
|
58
|
-
* @param desc -
|
|
59
|
-
* @returns
|
|
58
|
+
* @param desc - 관계 설명
|
|
59
|
+
* @returns 새 ForeignKeyBuilder 인스턴스
|
|
60
60
|
*/
|
|
61
61
|
description(desc: string): ForeignKeyBuilder<TOwner, TTargetFn> {
|
|
62
62
|
return new ForeignKeyBuilder({ ...this.meta, description: desc });
|
|
@@ -64,13 +64,13 @@ export class ForeignKeyBuilder<
|
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
/**
|
|
67
|
-
* Foreign Key
|
|
67
|
+
* Foreign Key 역참조 builder (1:N)
|
|
68
68
|
*
|
|
69
|
-
*
|
|
70
|
-
*
|
|
69
|
+
* 다른 Table이 현재 Table을 참조하는 FK의 역참조를 정의
|
|
70
|
+
* include() 시 배열로 로드됨 (single() 호출 시 단일 객체)
|
|
71
71
|
*
|
|
72
|
-
* @template TTargetTableFn -
|
|
73
|
-
* @template TIsSingle -
|
|
72
|
+
* @template TTargetTableFn - 참조하는 Table builder factory 타입
|
|
73
|
+
* @template TIsSingle - 단일 객체 여부
|
|
74
74
|
*
|
|
75
75
|
* @example
|
|
76
76
|
* ```typescript
|
|
@@ -96,11 +96,11 @@ export class ForeignKeyTargetBuilder<
|
|
|
96
96
|
TIsSingle extends boolean,
|
|
97
97
|
> {
|
|
98
98
|
/**
|
|
99
|
-
* @param meta - FK
|
|
100
|
-
* @param meta.targetTableFn -
|
|
101
|
-
* @param meta.relationName -
|
|
102
|
-
* @param meta.description -
|
|
103
|
-
* @param meta.isSingle -
|
|
99
|
+
* @param meta - FK 역참조 메타데이터
|
|
100
|
+
* @param meta.targetTableFn - 참조하는 Table factory
|
|
101
|
+
* @param meta.relationName - 참조하는 Table의 FK 관계 이름
|
|
102
|
+
* @param meta.description - 관계 설명
|
|
103
|
+
* @param meta.isSingle - 단일 객체 여부
|
|
104
104
|
*/
|
|
105
105
|
constructor(
|
|
106
106
|
readonly meta: {
|
|
@@ -112,21 +112,21 @@ export class ForeignKeyTargetBuilder<
|
|
|
112
112
|
) {}
|
|
113
113
|
|
|
114
114
|
/**
|
|
115
|
-
*
|
|
115
|
+
* 관계 설명 설정
|
|
116
116
|
*
|
|
117
|
-
* @param desc -
|
|
118
|
-
* @returns
|
|
117
|
+
* @param desc - 관계 설명
|
|
118
|
+
* @returns 새 ForeignKeyTargetBuilder 인스턴스
|
|
119
119
|
*/
|
|
120
120
|
description(desc: string): ForeignKeyTargetBuilder<TTargetTableFn, TIsSingle> {
|
|
121
121
|
return new ForeignKeyTargetBuilder({ ...this.meta, description: desc });
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
/**
|
|
125
|
-
*
|
|
125
|
+
* 단일 객체 관계로 설정 (1:1)
|
|
126
126
|
*
|
|
127
|
-
*
|
|
127
|
+
* 기본값은 배열(1:N), single() 호출 시 단일 객체
|
|
128
128
|
*
|
|
129
|
-
* @returns
|
|
129
|
+
* @returns 새 ForeignKeyTargetBuilder 인스턴스 (isSingle=true)
|
|
130
130
|
*
|
|
131
131
|
* @example
|
|
132
132
|
* ```typescript
|
|
@@ -139,29 +139,29 @@ export class ForeignKeyTargetBuilder<
|
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
// ============================================
|
|
142
|
-
// RelationKeyBuilder (
|
|
142
|
+
// RelationKeyBuilder (FK와 동일하지만 DB에 FK를 등록하지 않음)
|
|
143
143
|
// ============================================
|
|
144
144
|
|
|
145
145
|
/**
|
|
146
|
-
*
|
|
146
|
+
* 논리적 관계 builder (N:1) - DB FK 미생성
|
|
147
147
|
*
|
|
148
|
-
*
|
|
149
|
-
*
|
|
148
|
+
* ForeignKeyBuilder와 동일하지만 DB에 FK 제약조건을 생성하지 않음
|
|
149
|
+
* View에서도 사용 가능
|
|
150
150
|
*
|
|
151
|
-
* @template TOwner -
|
|
152
|
-
* @template TTargetFn -
|
|
151
|
+
* @template TOwner - 소유 Table/View builder 타입
|
|
152
|
+
* @template TTargetFn - 대상 Table/View builder factory 타입
|
|
153
153
|
*
|
|
154
154
|
* @example
|
|
155
155
|
* ```typescript
|
|
156
|
-
* //
|
|
156
|
+
* // View에서 Table로의 관계 정의
|
|
157
157
|
* const UserSummary = View("UserSummary")
|
|
158
158
|
* .query((db: MyDb) => db.user().select(...))
|
|
159
159
|
* .relations((r) => ({
|
|
160
|
-
* // View → Table (
|
|
160
|
+
* // View → Table (FK 미생성)
|
|
161
161
|
* company: r.relationKey(["companyId"], () => Company),
|
|
162
162
|
* }));
|
|
163
163
|
*
|
|
164
|
-
* //
|
|
164
|
+
* // FK 없는 Table 관계 정의
|
|
165
165
|
* const Report = Table("Report")
|
|
166
166
|
* .columns((c) => ({ userId: c.bigint() }))
|
|
167
167
|
* .relations((r) => ({
|
|
@@ -169,18 +169,18 @@ export class ForeignKeyTargetBuilder<
|
|
|
169
169
|
* }));
|
|
170
170
|
* ```
|
|
171
171
|
*
|
|
172
|
-
* @see {@link ForeignKeyBuilder} DB FK
|
|
172
|
+
* @see {@link ForeignKeyBuilder} DB FK 생성 버전
|
|
173
173
|
*/
|
|
174
174
|
export class RelationKeyBuilder<
|
|
175
175
|
TOwner extends TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
176
176
|
TTargetFn extends () => TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
177
177
|
> {
|
|
178
178
|
/**
|
|
179
|
-
* @param meta -
|
|
180
|
-
* @param meta.ownerFn -
|
|
181
|
-
* @param meta.columns -
|
|
182
|
-
* @param meta.targetFn -
|
|
183
|
-
* @param meta.description -
|
|
179
|
+
* @param meta - 관계 메타데이터
|
|
180
|
+
* @param meta.ownerFn - 소유 Table/View factory
|
|
181
|
+
* @param meta.columns - 관계 column 이름 배열
|
|
182
|
+
* @param meta.targetFn - 대상 Table/View factory
|
|
183
|
+
* @param meta.description - 관계 설명
|
|
184
184
|
*/
|
|
185
185
|
constructor(
|
|
186
186
|
readonly meta: {
|
|
@@ -192,10 +192,10 @@ export class RelationKeyBuilder<
|
|
|
192
192
|
) {}
|
|
193
193
|
|
|
194
194
|
/**
|
|
195
|
-
*
|
|
195
|
+
* 관계 설명 설정
|
|
196
196
|
*
|
|
197
|
-
* @param desc -
|
|
198
|
-
* @returns
|
|
197
|
+
* @param desc - 관계 설명
|
|
198
|
+
* @returns 새 RelationKeyBuilder 인스턴스
|
|
199
199
|
*/
|
|
200
200
|
description(desc: string): RelationKeyBuilder<TOwner, TTargetFn> {
|
|
201
201
|
return new RelationKeyBuilder({ ...this.meta, description: desc });
|
|
@@ -203,36 +203,36 @@ export class RelationKeyBuilder<
|
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
/**
|
|
206
|
-
*
|
|
206
|
+
* 논리적 관계 역참조 builder (1:N) - DB FK 미생성
|
|
207
207
|
*
|
|
208
|
-
*
|
|
209
|
-
*
|
|
208
|
+
* ForeignKeyTargetBuilder와 동일하지만 DB에 FK 제약조건을 생성하지 않음
|
|
209
|
+
* View에서도 사용 가능
|
|
210
210
|
*
|
|
211
|
-
* @template TTargetTableFn -
|
|
212
|
-
* @template TIsSingle -
|
|
211
|
+
* @template TTargetTableFn - 참조하는 Table/View builder factory 타입
|
|
212
|
+
* @template TIsSingle - 단일 객체 여부
|
|
213
213
|
*
|
|
214
214
|
* @example
|
|
215
215
|
* ```typescript
|
|
216
216
|
* const Company = Table("Company")
|
|
217
217
|
* .columns((c) => ({ id: c.bigint() }))
|
|
218
218
|
* .relations((r) => ({
|
|
219
|
-
* //
|
|
219
|
+
* // 역참조 (FK 미생성)
|
|
220
220
|
* employees: r.relationKeyTarget(() => UserSummary, "company"),
|
|
221
221
|
* }));
|
|
222
222
|
* ```
|
|
223
223
|
*
|
|
224
|
-
* @see {@link ForeignKeyTargetBuilder} DB FK
|
|
224
|
+
* @see {@link ForeignKeyTargetBuilder} DB FK 생성 버전
|
|
225
225
|
*/
|
|
226
226
|
export class RelationKeyTargetBuilder<
|
|
227
227
|
TTargetTableFn extends () => TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
228
228
|
TIsSingle extends boolean,
|
|
229
229
|
> {
|
|
230
230
|
/**
|
|
231
|
-
* @param meta -
|
|
232
|
-
* @param meta.targetTableFn -
|
|
233
|
-
* @param meta.relationName -
|
|
234
|
-
* @param meta.description -
|
|
235
|
-
* @param meta.isSingle -
|
|
231
|
+
* @param meta - 관계 역참조 메타데이터
|
|
232
|
+
* @param meta.targetTableFn - 참조하는 Table/View factory
|
|
233
|
+
* @param meta.relationName - 참조하는 Table/View의 관계 이름
|
|
234
|
+
* @param meta.description - 관계 설명
|
|
235
|
+
* @param meta.isSingle - 단일 객체 여부
|
|
236
236
|
*/
|
|
237
237
|
constructor(
|
|
238
238
|
readonly meta: {
|
|
@@ -244,21 +244,21 @@ export class RelationKeyTargetBuilder<
|
|
|
244
244
|
) {}
|
|
245
245
|
|
|
246
246
|
/**
|
|
247
|
-
*
|
|
247
|
+
* 관계 설명 설정
|
|
248
248
|
*
|
|
249
|
-
* @param desc -
|
|
250
|
-
* @returns
|
|
249
|
+
* @param desc - 관계 설명
|
|
250
|
+
* @returns 새 RelationKeyTargetBuilder 인스턴스
|
|
251
251
|
*/
|
|
252
252
|
description(desc: string): RelationKeyTargetBuilder<TTargetTableFn, TIsSingle> {
|
|
253
253
|
return new RelationKeyTargetBuilder({ ...this.meta, description: desc });
|
|
254
254
|
}
|
|
255
255
|
|
|
256
256
|
/**
|
|
257
|
-
*
|
|
257
|
+
* 단일 객체 관계로 설정 (1:1)
|
|
258
258
|
*
|
|
259
|
-
*
|
|
259
|
+
* 기본값은 배열(1:N), single() 호출 시 단일 객체
|
|
260
260
|
*
|
|
261
|
-
* @returns
|
|
261
|
+
* @returns 새 RelationKeyTargetBuilder 인스턴스 (isSingle=true)
|
|
262
262
|
*/
|
|
263
263
|
single(): RelationKeyTargetBuilder<TTargetTableFn, true> {
|
|
264
264
|
return new RelationKeyTargetBuilder({ ...this.meta, isSingle: true });
|
|
@@ -266,18 +266,18 @@ export class RelationKeyTargetBuilder<
|
|
|
266
266
|
}
|
|
267
267
|
|
|
268
268
|
/**
|
|
269
|
-
* FK
|
|
269
|
+
* FK 관계 factory 타입 (table 전용)
|
|
270
270
|
*
|
|
271
|
-
* @template TOwner -
|
|
272
|
-
* @template TColumnKey - Column key
|
|
271
|
+
* @template TOwner - 소유 Table builder 타입
|
|
272
|
+
* @template TColumnKey - Column key 타입
|
|
273
273
|
*/
|
|
274
274
|
type RelationFkFactory<TOwner extends TableBuilder<any, any>, TColumnKey extends string> = {
|
|
275
|
-
/** N:1 FK
|
|
275
|
+
/** N:1 FK 관계 정의 (DB FK 생성) */
|
|
276
276
|
foreignKey<TTargetFn extends () => TableBuilder<any, any>>(
|
|
277
277
|
columns: TColumnKey[],
|
|
278
278
|
targetFn: TTargetFn,
|
|
279
279
|
): ForeignKeyBuilder<TOwner, TTargetFn>;
|
|
280
|
-
/** 1:N FK
|
|
280
|
+
/** 1:N FK 역참조 정의 */
|
|
281
281
|
foreignKeyTarget<TTargetTableFn extends () => TableBuilder<any, any>>(
|
|
282
282
|
targetTableFn: TTargetTableFn,
|
|
283
283
|
relationName: string,
|
|
@@ -285,21 +285,21 @@ type RelationFkFactory<TOwner extends TableBuilder<any, any>, TColumnKey extends
|
|
|
285
285
|
};
|
|
286
286
|
|
|
287
287
|
/**
|
|
288
|
-
*
|
|
288
|
+
* 논리적 관계 factory 타입 (table/View 공용)
|
|
289
289
|
*
|
|
290
|
-
* @template TOwner -
|
|
291
|
-
* @template TColumnKey - Column key
|
|
290
|
+
* @template TOwner - 소유 Table/View builder 타입
|
|
291
|
+
* @template TColumnKey - Column key 타입
|
|
292
292
|
*/
|
|
293
293
|
type RelationRkFactory<
|
|
294
294
|
TOwner extends TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
295
295
|
TColumnKey extends string,
|
|
296
296
|
> = {
|
|
297
|
-
/** N:1
|
|
297
|
+
/** N:1 논리적 관계 정의 (DB FK 미생성) */
|
|
298
298
|
relationKey<TTargetFn extends () => TableBuilder<any, any> | ViewBuilder<any, any, any>>(
|
|
299
299
|
columns: TColumnKey[],
|
|
300
300
|
targetFn: TTargetFn,
|
|
301
301
|
): RelationKeyBuilder<TOwner, TTargetFn>;
|
|
302
|
-
/** 1:N
|
|
302
|
+
/** 1:N 논리적 역참조 정의 */
|
|
303
303
|
relationKeyTarget<
|
|
304
304
|
TTargetTableFn extends () => TableBuilder<any, any> | ViewBuilder<any, any, any>,
|
|
305
305
|
>(
|
|
@@ -309,33 +309,33 @@ type RelationRkFactory<
|
|
|
309
309
|
};
|
|
310
310
|
|
|
311
311
|
/**
|
|
312
|
-
*
|
|
312
|
+
* 관계 builder factory 생성
|
|
313
313
|
*
|
|
314
|
-
*
|
|
315
|
-
* Table
|
|
314
|
+
* TableBuilder.relations()와 ViewBuilder.relations()에서 사용
|
|
315
|
+
* Table은 FK + RelationKey 모두 사용 가능, View는 RelationKey만 사용 가능
|
|
316
316
|
*
|
|
317
|
-
* @template TOwner -
|
|
318
|
-
* @template TColumnKey - Column key
|
|
319
|
-
* @param ownerFn -
|
|
320
|
-
* @returns
|
|
317
|
+
* @template TOwner - 소유 Table/View builder 타입
|
|
318
|
+
* @template TColumnKey - Column key 타입
|
|
319
|
+
* @param ownerFn - 소유 Table/View factory 함수
|
|
320
|
+
* @returns 관계 builder factory
|
|
321
321
|
*
|
|
322
322
|
* @example
|
|
323
323
|
* ```typescript
|
|
324
|
-
* // Table -
|
|
324
|
+
* // Table - FK와 RelationKey 모두 사용 가능
|
|
325
325
|
* const Post = Table("Post")
|
|
326
326
|
* .columns((c) => ({
|
|
327
327
|
* id: c.bigint(),
|
|
328
328
|
* authorId: c.bigint(),
|
|
329
329
|
* }))
|
|
330
330
|
* .relations((r) => ({
|
|
331
|
-
* author: r.foreignKey(["authorId"], () => User), // FK
|
|
331
|
+
* author: r.foreignKey(["authorId"], () => User), // FK 생성
|
|
332
332
|
* }));
|
|
333
333
|
*
|
|
334
|
-
* // View -
|
|
334
|
+
* // View - RelationKey만 사용 가능
|
|
335
335
|
* const UserSummary = View("UserSummary")
|
|
336
336
|
* .query(...)
|
|
337
337
|
* .relations((r) => ({
|
|
338
|
-
* posts: r.relationKeyTarget(() => Post, "author"), //
|
|
338
|
+
* posts: r.relationKeyTarget(() => Post, "author"), // FK 미생성
|
|
339
339
|
* }));
|
|
340
340
|
* ```
|
|
341
341
|
*/
|
|
@@ -374,13 +374,13 @@ export function createRelationFactory<
|
|
|
374
374
|
}
|
|
375
375
|
|
|
376
376
|
// ============================================
|
|
377
|
-
// builder
|
|
377
|
+
// builder 레코드
|
|
378
378
|
// ============================================
|
|
379
379
|
|
|
380
380
|
/**
|
|
381
|
-
*
|
|
381
|
+
* 관계 builder 레코드 타입
|
|
382
382
|
*
|
|
383
|
-
*
|
|
383
|
+
* TableBuilder.relations()와 ViewBuilder.relations()의 반환 타입
|
|
384
384
|
*/
|
|
385
385
|
export type RelationBuilderRecord = Record<
|
|
386
386
|
string,
|
|
@@ -391,15 +391,15 @@ export type RelationBuilderRecord = Record<
|
|
|
391
391
|
>;
|
|
392
392
|
|
|
393
393
|
// ============================================
|
|
394
|
-
// Infer -
|
|
394
|
+
// Infer - 관계 타입 추론
|
|
395
395
|
// ============================================
|
|
396
396
|
|
|
397
397
|
/**
|
|
398
|
-
*
|
|
398
|
+
* FK/RelationKey에서 대상 타입 추출 (단일 객체)
|
|
399
399
|
*
|
|
400
|
-
*
|
|
400
|
+
* N:1 관계의 대상 타입
|
|
401
401
|
*
|
|
402
|
-
* @template T - FK
|
|
402
|
+
* @template T - FK 또는 RelationKey builder 타입
|
|
403
403
|
*/
|
|
404
404
|
export type ExtractRelationTarget<TRelation> = TRelation extends
|
|
405
405
|
| ForeignKeyBuilder<any, infer TTargetFn>
|
|
@@ -412,12 +412,12 @@ export type ExtractRelationTarget<TRelation> = TRelation extends
|
|
|
412
412
|
: never;
|
|
413
413
|
|
|
414
414
|
/**
|
|
415
|
-
*
|
|
415
|
+
* FKTarget/RelationKeyTarget에서 대상 타입 추출 (배열 또는 단일 객체)
|
|
416
416
|
*
|
|
417
|
-
*
|
|
418
|
-
* TTargetTableFn:
|
|
417
|
+
* 1:N 관계의 대상 타입 (single() 호출 시 단일 객체)
|
|
418
|
+
* TTargetTableFn: 순환 참조 방지를 위한 지연 평가용 () => Post 형태
|
|
419
419
|
*
|
|
420
|
-
* @template T - FKTarget
|
|
420
|
+
* @template T - FKTarget 또는 RelationKeyTarget builder 타입
|
|
421
421
|
*/
|
|
422
422
|
export type ExtractRelationTargetResult<TRelation> = TRelation extends
|
|
423
423
|
| ForeignKeyTargetBuilder<infer TTargetTableFn, infer TIsSingle>
|
|
@@ -434,11 +434,11 @@ export type ExtractRelationTargetResult<TRelation> = TRelation extends
|
|
|
434
434
|
: never;
|
|
435
435
|
|
|
436
436
|
/**
|
|
437
|
-
*
|
|
437
|
+
* 관계 정의에서 심층 관계 타입 추론
|
|
438
438
|
*
|
|
439
|
-
*
|
|
439
|
+
* include() 없이 접근 시 undefined가 되도록 모든 관계를 optional로 설정
|
|
440
440
|
*
|
|
441
|
-
* @template TRelations -
|
|
441
|
+
* @template TRelations - 관계 builder 레코드 타입
|
|
442
442
|
*
|
|
443
443
|
* @example
|
|
444
444
|
* ```typescript
|
|
@@ -5,13 +5,13 @@ import { type ColumnBuilderRecord, createColumnFactory } from "./factory/column-
|
|
|
5
5
|
// ============================================
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* Stored Procedure
|
|
8
|
+
* Stored Procedure 정의 builder
|
|
9
9
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
10
|
+
* Fluent API로 Procedure 파라미터, 반환 타입, 본문을 정의
|
|
11
|
+
* DbContext의 executable()과 함께 사용하여 타입 안전한 Procedure 호출
|
|
12
12
|
*
|
|
13
|
-
* @template TParams -
|
|
14
|
-
* @template TReturns -
|
|
13
|
+
* @template TParams - 파라미터 Column 정의 타입
|
|
14
|
+
* @template TReturns - 반환 Column 정의 타입
|
|
15
15
|
*
|
|
16
16
|
* @example
|
|
17
17
|
* ```typescript
|
|
@@ -37,27 +37,27 @@ import { type ColumnBuilderRecord, createColumnFactory } from "./factory/column-
|
|
|
37
37
|
* const users = await db.getUserById({ userId: 1n }).execute();
|
|
38
38
|
* ```
|
|
39
39
|
*
|
|
40
|
-
* @see {@link Procedure} factory
|
|
41
|
-
* @see {@link executable} Executable
|
|
40
|
+
* @see {@link Procedure} factory 함수
|
|
41
|
+
* @see {@link executable} Executable 생성
|
|
42
42
|
*/
|
|
43
43
|
export class ProcedureBuilder<
|
|
44
44
|
TParams extends ColumnBuilderRecord,
|
|
45
45
|
TReturns extends ColumnBuilderRecord,
|
|
46
46
|
> {
|
|
47
|
-
/**
|
|
47
|
+
/** 파라미터 정의 (타입 추론용) */
|
|
48
48
|
readonly $params!: TParams;
|
|
49
|
-
/**
|
|
49
|
+
/** 반환 타입 정의 (타입 추론용) */
|
|
50
50
|
readonly $returns!: TReturns;
|
|
51
51
|
|
|
52
52
|
/**
|
|
53
|
-
* @param meta - Procedure
|
|
54
|
-
* @param meta.name - Procedure
|
|
55
|
-
* @param meta.description - Procedure
|
|
56
|
-
* @param meta.database - Database
|
|
57
|
-
* @param meta.schema - Schema
|
|
58
|
-
* @param meta.params -
|
|
59
|
-
* @param meta.returns -
|
|
60
|
-
* @param meta.query - Procedure
|
|
53
|
+
* @param meta - Procedure 메타데이터
|
|
54
|
+
* @param meta.name - Procedure 이름
|
|
55
|
+
* @param meta.description - Procedure 설명 (comment)
|
|
56
|
+
* @param meta.database - Database 이름
|
|
57
|
+
* @param meta.schema - Schema 이름 (MSSQL/PostgreSQL)
|
|
58
|
+
* @param meta.params - 파라미터 정의
|
|
59
|
+
* @param meta.returns - 반환 타입 정의
|
|
60
|
+
* @param meta.query - Procedure 본문 SQL
|
|
61
61
|
*/
|
|
62
62
|
constructor(
|
|
63
63
|
readonly meta: {
|
|
@@ -72,20 +72,20 @@ export class ProcedureBuilder<
|
|
|
72
72
|
) {}
|
|
73
73
|
|
|
74
74
|
/**
|
|
75
|
-
* Procedure
|
|
75
|
+
* Procedure 설명 설정
|
|
76
76
|
*
|
|
77
|
-
* @param desc - Procedure
|
|
78
|
-
* @returns
|
|
77
|
+
* @param desc - Procedure 설명 (DDL Comment로 사용됨)
|
|
78
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
79
79
|
*/
|
|
80
80
|
description(desc: string): ProcedureBuilder<TParams, TReturns> {
|
|
81
81
|
return new ProcedureBuilder({ ...this.meta, description: desc });
|
|
82
82
|
}
|
|
83
83
|
|
|
84
84
|
/**
|
|
85
|
-
* Database
|
|
85
|
+
* Database 이름 설정
|
|
86
86
|
*
|
|
87
|
-
* @param db - Database
|
|
88
|
-
* @returns
|
|
87
|
+
* @param db - Database 이름
|
|
88
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
89
89
|
*
|
|
90
90
|
* @example
|
|
91
91
|
* ```typescript
|
|
@@ -97,26 +97,26 @@ export class ProcedureBuilder<
|
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
/**
|
|
100
|
-
*
|
|
100
|
+
* Schema 이름 설정
|
|
101
101
|
*
|
|
102
|
-
* MSSQL,
|
|
102
|
+
* MSSQL, PostgreSQL에서 사용
|
|
103
103
|
*
|
|
104
|
-
* @param schema - Schema
|
|
105
|
-
* @returns
|
|
104
|
+
* @param schema - Schema 이름 (MSSQL: dbo, PostgreSQL: public)
|
|
105
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
106
106
|
*/
|
|
107
107
|
schema(schema: string): ProcedureBuilder<TParams, TReturns> {
|
|
108
108
|
return new ProcedureBuilder({ ...this.meta, schema });
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
/**
|
|
112
|
-
*
|
|
112
|
+
* 파라미터 정의
|
|
113
113
|
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
114
|
+
* Procedure 입력 파라미터를 정의
|
|
115
|
+
* DBMS별 파라미터 구문 차이에 주의 (MSSQL: @param, MySQL/PostgreSQL: param)
|
|
116
116
|
*
|
|
117
|
-
* @template T -
|
|
118
|
-
* @param fn -
|
|
119
|
-
* @returns
|
|
117
|
+
* @template T - 새 파라미터 정의 타입
|
|
118
|
+
* @param fn - Column factory를 받아 파라미터 정의를 반환하는 함수
|
|
119
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
120
120
|
*
|
|
121
121
|
* @example
|
|
122
122
|
* ```typescript
|
|
@@ -134,13 +134,13 @@ export class ProcedureBuilder<
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
/**
|
|
137
|
-
*
|
|
137
|
+
* 반환 타입 정의
|
|
138
138
|
*
|
|
139
|
-
*
|
|
139
|
+
* Procedure 반환 결과 column을 정의
|
|
140
140
|
*
|
|
141
|
-
* @template T -
|
|
142
|
-
* @param fn -
|
|
143
|
-
* @returns
|
|
141
|
+
* @template T - 새 반환 타입 정의
|
|
142
|
+
* @param fn - Column factory를 받아 column 정의를 반환하는 함수
|
|
143
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
144
144
|
*
|
|
145
145
|
* @example
|
|
146
146
|
* ```typescript
|
|
@@ -160,15 +160,15 @@ export class ProcedureBuilder<
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
/**
|
|
163
|
-
*
|
|
163
|
+
* Procedure 본문 SQL 설정
|
|
164
164
|
*
|
|
165
|
-
*
|
|
166
|
-
* - MySQL:
|
|
167
|
-
* - MSSQL: @
|
|
168
|
-
* - PostgreSQL: RETURN QUERY
|
|
165
|
+
* DBMS별 SQL 구문 차이에 주의:
|
|
166
|
+
* - MySQL: 파라미터 이름 그대로 (userId)
|
|
167
|
+
* - MSSQL: @ 접두사 (@userId)
|
|
168
|
+
* - PostgreSQL: RETURN QUERY 필요
|
|
169
169
|
*
|
|
170
|
-
* @param sql - Procedure
|
|
171
|
-
* @returns
|
|
170
|
+
* @param sql - Procedure 본문 SQL
|
|
171
|
+
* @returns 새 ProcedureBuilder 인스턴스
|
|
172
172
|
*
|
|
173
173
|
* @example
|
|
174
174
|
* ```typescript
|
|
@@ -189,16 +189,16 @@ export class ProcedureBuilder<
|
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
// ============================================
|
|
192
|
-
// Procedure
|
|
192
|
+
// Procedure 함수
|
|
193
193
|
// ============================================
|
|
194
194
|
|
|
195
195
|
/**
|
|
196
|
-
* Procedure builder factory
|
|
196
|
+
* Procedure builder factory 함수
|
|
197
197
|
*
|
|
198
|
-
*
|
|
198
|
+
* Fluent API로 stored Procedure schema를 정의하기 위한 ProcedureBuilder를 생성
|
|
199
199
|
*
|
|
200
|
-
* @param name - Procedure
|
|
201
|
-
* @returns ProcedureBuilder
|
|
200
|
+
* @param name - Procedure 이름
|
|
201
|
+
* @returns ProcedureBuilder 인스턴스
|
|
202
202
|
*
|
|
203
203
|
* @example
|
|
204
204
|
* ```typescript
|
|
@@ -215,7 +215,7 @@ export class ProcedureBuilder<
|
|
|
215
215
|
* }))
|
|
216
216
|
* .body("SELECT id, name, email FROM User WHERE id = userId");
|
|
217
217
|
*
|
|
218
|
-
* //
|
|
218
|
+
* // 파라미터 없는 Procedure
|
|
219
219
|
* const GetAllActiveUsers = Procedure("GetAllActiveUsers")
|
|
220
220
|
* .database("mydb")
|
|
221
221
|
* .returns((c) => ({
|
|
@@ -225,7 +225,7 @@ export class ProcedureBuilder<
|
|
|
225
225
|
* .body("SELECT id, name FROM User WHERE status = 'active'");
|
|
226
226
|
* ```
|
|
227
227
|
*
|
|
228
|
-
* @see {@link ProcedureBuilder} builder
|
|
228
|
+
* @see {@link ProcedureBuilder} builder 클래스
|
|
229
229
|
*/
|
|
230
230
|
export function Procedure(name: string): ProcedureBuilder<never, never> {
|
|
231
231
|
return new ProcedureBuilder({ name });
|