@simplysm/orm-common 13.0.68 → 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
@@ -1,89 +1,89 @@
1
- import type { ForeignKeyBuilder } from "../schema/factory/relation-builder";
2
- import type { IndexBuilder } from "../schema/factory/index-builder";
3
- import type {
4
- QueryDef,
5
- QueryDefObjectName,
6
- AddPkQueryDef,
7
- DropPkQueryDef,
8
- DropFkQueryDef,
9
- DropIdxQueryDef,
10
- } from "../types/query-def";
11
- import type { DbContextBase } from "../types/db-context-def";
12
- import { getMatchedPrimaryKeys } from "../exec/queryable";
13
- import { getQueryDefObjectName } from "./table-ddl";
14
-
15
- /**
16
- * DROP PRIMARY KEY QueryDef 생성
17
- */
18
- export function getDropPkQueryDef(table: QueryDefObjectName): DropPkQueryDef {
19
- return { type: "dropPk", table };
20
- }
21
-
22
- /**
23
- * ADD PRIMARY KEY QueryDef 생성
24
- */
25
- export function getAddPkQueryDef(table: QueryDefObjectName, columns: string[]): AddPkQueryDef {
26
- return { type: "addPk", table, columns };
27
- }
28
-
29
- /**
30
- * ADD FOREIGN KEY QueryDef 생성
31
- */
32
- export function getAddFkQueryDef(
33
- db: DbContextBase,
34
- table: QueryDefObjectName,
35
- relationName: string,
36
- relationDef: ForeignKeyBuilder<any, any>,
37
- ): QueryDef {
38
- const targetTable = relationDef.meta.targetFn();
39
- const fkColumns = relationDef.meta.columns;
40
- const pk = getMatchedPrimaryKeys(fkColumns, targetTable);
41
-
42
- return {
43
- type: "addFk",
44
- table,
45
- foreignKey: {
46
- name: `FK_${table.name}_${relationName}`,
47
- fkColumns,
48
- targetTable: getQueryDefObjectName(db, targetTable),
49
- targetPkColumns: pk,
50
- },
51
- };
52
- }
53
-
54
- /**
55
- * ADD INDEX QueryDef 생성
56
- */
57
- export function getAddIdxQueryDef(
58
- table: QueryDefObjectName,
59
- indexBuilder: IndexBuilder<string[]>,
60
- ): QueryDef {
61
- const indexMeta = indexBuilder.meta;
62
-
63
- return {
64
- type: "addIdx",
65
- table,
66
- index: {
67
- name: indexBuilder.meta.name ?? `IDX_${table.name}_${indexMeta.columns.join("_")}`,
68
- columns: indexMeta.columns.map((col, i) => ({
69
- name: col,
70
- orderBy: indexMeta.orderBy?.[i] ?? "ASC",
71
- })),
72
- unique: indexMeta.unique,
73
- },
74
- };
75
- }
76
-
77
- /**
78
- * DROP FOREIGN KEY QueryDef 생성
79
- */
80
- export function getDropFkQueryDef(table: QueryDefObjectName, relationName: string): DropFkQueryDef {
81
- return { type: "dropFk", table, foreignKey: `FK_${table.name}_${relationName}` };
82
- }
83
-
84
- /**
85
- * DROP INDEX QueryDef 생성
86
- */
87
- export function getDropIdxQueryDef(table: QueryDefObjectName, columns: string[]): DropIdxQueryDef {
88
- return { type: "dropIdx", table, index: `IDX_${table.name}_${columns.join("_")}` };
89
- }
1
+ import type { ForeignKeyBuilder } from "../schema/factory/relation-builder";
2
+ import type { IndexBuilder } from "../schema/factory/index-builder";
3
+ import type {
4
+ QueryDef,
5
+ QueryDefObjectName,
6
+ AddPkQueryDef,
7
+ DropPkQueryDef,
8
+ DropFkQueryDef,
9
+ DropIdxQueryDef,
10
+ } from "../types/query-def";
11
+ import type { DbContextBase } from "../types/db-context-def";
12
+ import { getMatchedPrimaryKeys } from "../exec/queryable";
13
+ import { getQueryDefObjectName } from "./table-ddl";
14
+
15
+ /**
16
+ * Generate DROP PRIMARY KEY QueryDef
17
+ */
18
+ export function getDropPkQueryDef(table: QueryDefObjectName): DropPkQueryDef {
19
+ return { type: "dropPk", table };
20
+ }
21
+
22
+ /**
23
+ * Generate ADD PRIMARY KEY QueryDef
24
+ */
25
+ export function getAddPkQueryDef(table: QueryDefObjectName, columns: string[]): AddPkQueryDef {
26
+ return { type: "addPk", table, columns };
27
+ }
28
+
29
+ /**
30
+ * Generate ADD FOREIGN KEY QueryDef
31
+ */
32
+ export function getAddFkQueryDef(
33
+ db: DbContextBase,
34
+ table: QueryDefObjectName,
35
+ relationName: string,
36
+ relationDef: ForeignKeyBuilder<any, any>,
37
+ ): QueryDef {
38
+ const targetTable = relationDef.meta.targetFn();
39
+ const fkColumns = relationDef.meta.columns;
40
+ const pk = getMatchedPrimaryKeys(fkColumns, targetTable);
41
+
42
+ return {
43
+ type: "addFk",
44
+ table,
45
+ foreignKey: {
46
+ name: `FK_${table.name}_${relationName}`,
47
+ fkColumns,
48
+ targetTable: getQueryDefObjectName(db, targetTable),
49
+ targetPkColumns: pk,
50
+ },
51
+ };
52
+ }
53
+
54
+ /**
55
+ * ADD INDEX QueryDef Generate
56
+ */
57
+ export function getAddIdxQueryDef(
58
+ table: QueryDefObjectName,
59
+ indexBuilder: IndexBuilder<string[]>,
60
+ ): QueryDef {
61
+ const indexMeta = indexBuilder.meta;
62
+
63
+ return {
64
+ type: "addIdx",
65
+ table,
66
+ index: {
67
+ name: indexBuilder.meta.name ?? `IDX_${table.name}_${indexMeta.columns.join("_")}`,
68
+ columns: indexMeta.columns.map((col, i) => ({
69
+ name: col,
70
+ orderBy: indexMeta.orderBy?.[i] ?? "ASC",
71
+ })),
72
+ unique: indexMeta.unique,
73
+ },
74
+ };
75
+ }
76
+
77
+ /**
78
+ * DROP FOREIGN KEY QueryDef Generate
79
+ */
80
+ export function getDropFkQueryDef(table: QueryDefObjectName, relationName: string): DropFkQueryDef {
81
+ return { type: "dropFk", table, foreignKey: `FK_${table.name}_${relationName}` };
82
+ }
83
+
84
+ /**
85
+ * DROP INDEX QueryDef Generate
86
+ */
87
+ export function getDropIdxQueryDef(table: QueryDefObjectName, columns: string[]): DropIdxQueryDef {
88
+ return { type: "dropIdx", table, index: `IDX_${table.name}_${columns.join("_")}` };
89
+ }
@@ -7,7 +7,7 @@ import type {
7
7
  } from "../types/query-def";
8
8
 
9
9
  /**
10
- * CLEAR SCHEMA QueryDef 생성
10
+ * Generate CLEAR SCHEMA QueryDef
11
11
  */
12
12
  export function getClearSchemaQueryDef(params: {
13
13
  database: string;
@@ -17,21 +17,21 @@ export function getClearSchemaQueryDef(params: {
17
17
  }
18
18
 
19
19
  /**
20
- * SCHEMA EXISTS QueryDef 생성
20
+ * Generate SCHEMA EXISTS QueryDef
21
21
  */
22
22
  export function getSchemaExistsQueryDef(database: string, schema?: string): SchemaExistsQueryDef {
23
23
  return { type: "schemaExists", database, schema };
24
24
  }
25
25
 
26
26
  /**
27
- * TRUNCATE TABLE QueryDef 생성
27
+ * Generate TRUNCATE TABLE QueryDef
28
28
  */
29
29
  export function getTruncateQueryDef(table: QueryDefObjectName): TruncateQueryDef {
30
30
  return { type: "truncate", table };
31
31
  }
32
32
 
33
33
  /**
34
- * SWITCH FK QueryDef 생성
34
+ * Generate SWITCH FK QueryDef
35
35
  */
36
36
  export function getSwitchFkQueryDef(
37
37
  table: QueryDefObjectName,
@@ -1,189 +1,189 @@
1
- import { TableBuilder } from "../schema/table-builder";
2
- import { ViewBuilder } from "../schema/view-builder";
3
- import { ProcedureBuilder } from "../schema/procedure-builder";
4
- import type { ColumnBuilderRecord } from "../schema/factory/column-builder";
5
- import type {
6
- QueryDef,
7
- QueryDefObjectName,
8
- DropTableQueryDef,
9
- RenameTableQueryDef,
10
- DropViewQueryDef,
11
- DropProcQueryDef,
12
- } from "../types/query-def";
13
- import type { DbContextBase } from "../types/db-context-def";
14
- import { objClearUndefined } from "@simplysm/core-common";
15
-
16
- /**
17
- * Builder를 CREATE QueryDef로 변환
18
- *
19
- * @param db - DbContext 인스턴스
20
- * @param builder - Table/View/Procedure 빌더
21
- * @returns CREATE TABLE/VIEW/PROCEDURE QueryDef
22
- * @throws {Error} 없는 빌더 타입일 때
23
- */
24
- export function getCreateObjectQueryDef(
25
- db: DbContextBase,
26
- builder: TableBuilder<any, any> | ViewBuilder<any, any, any> | ProcedureBuilder<any, any>,
27
- ): QueryDef {
28
- if (builder instanceof TableBuilder) {
29
- return getCreateTableQueryDef(db, builder);
30
- } else if (builder instanceof ViewBuilder) {
31
- return getCreateViewQueryDef(db, builder);
32
- } else if (builder instanceof ProcedureBuilder) {
33
- return getCreateProcQueryDef(db, builder);
34
- }
35
-
36
- throw new Error(`알 없는 빌더 타입: ${typeof builder}`);
37
- }
38
-
39
- /**
40
- * CREATE TABLE QueryDef 생성
41
- *
42
- * @param db - DbContext 인스턴스
43
- * @param table - 테이블 빌더
44
- * @returns CREATE TABLE QueryDef
45
- * @throws {Error} 테이블에 컬럼이 없을
46
- */
47
- export function getCreateTableQueryDef(db: DbContextBase, table: TableBuilder<any, any>): QueryDef {
48
- const columns = table.meta.columns as ColumnBuilderRecord | undefined;
49
- if (columns == null) {
50
- throw new Error(`테이블 '${table.meta.name}' 컬럼이 없습니다.`);
51
- }
52
-
53
- return {
54
- type: "createTable",
55
- table: getQueryDefObjectName(db, table),
56
- columns: Object.entries(columns).map(([key, col]) => ({
57
- name: key,
58
- dataType: col.meta.dataType,
59
- autoIncrement: col.meta.autoIncrement,
60
- nullable: col.meta.nullable,
61
- default: col.meta.default,
62
- })),
63
- primaryKey: table.meta.primaryKey,
64
- };
65
- }
66
-
67
- /**
68
- * CREATE VIEW QueryDef 생성
69
- *
70
- * @param db - DbContext 인스턴스
71
- * @param view - 빌더
72
- * @returns CREATE VIEW QueryDef
73
- * @throws {Error} 뷰에 viewFn이 없을
74
- */
75
- export function getCreateViewQueryDef(
76
- db: DbContextBase,
77
- view: ViewBuilder<any, any, any>,
78
- ): QueryDef {
79
- if (view.meta.viewFn == null) {
80
- throw new Error(`뷰 '${view.meta.name}' viewFn이 없습니다.`);
81
- }
82
-
83
- const qr = view.meta.viewFn(db);
84
- const selectDef = qr.getSelectQueryDef();
85
-
86
- return {
87
- type: "createView",
88
- view: {
89
- database: view.meta.database ?? db.database,
90
- schema: view.meta.schema ?? db.schema,
91
- name: view.meta.name,
92
- },
93
- queryDef: selectDef,
94
- };
95
- }
96
-
97
- /**
98
- * CREATE PROCEDURE QueryDef 생성
99
- *
100
- * @param db - DbContext 인스턴스
101
- * @param procedure - 프로시저 빌더
102
- * @returns CREATE PROCEDURE QueryDef
103
- * @throws {Error} 프로시저에 본문이 없을
104
- */
105
- export function getCreateProcQueryDef(
106
- db: DbContextBase,
107
- procedure: ProcedureBuilder<any, any>,
108
- ): QueryDef {
109
- if (procedure.meta.query == null) {
110
- throw new Error(`프로시저 '${procedure.meta.name}' 본문이 없습니다.`);
111
- }
112
-
113
- const params = procedure.meta.params as ColumnBuilderRecord | undefined;
114
- const returns = procedure.meta.returns as ColumnBuilderRecord | undefined;
115
-
116
- return {
117
- type: "createProc",
118
- procedure: {
119
- database: procedure.meta.database ?? db.database,
120
- schema: procedure.meta.schema ?? db.schema,
121
- name: procedure.meta.name,
122
- },
123
- params: params
124
- ? Object.entries(params).map(([key, col]) => ({
125
- name: key,
126
- dataType: col.meta.dataType,
127
- nullable: col.meta.nullable,
128
- default: col.meta.default,
129
- }))
130
- : undefined,
131
- returns: returns
132
- ? Object.entries(returns).map(([key, col]) => ({
133
- name: key,
134
- dataType: col.meta.dataType,
135
- nullable: col.meta.nullable,
136
- }))
137
- : undefined,
138
- query: procedure.meta.query,
139
- };
140
- }
141
-
142
- /**
143
- * DROP TABLE QueryDef 생성
144
- */
145
- export function getDropTableQueryDef(table: QueryDefObjectName): DropTableQueryDef {
146
- return { type: "dropTable", table };
147
- }
148
-
149
- /**
150
- * RENAME TABLE QueryDef 생성
151
- */
152
- export function getRenameTableQueryDef(
153
- table: QueryDefObjectName,
154
- newName: string,
155
- ): RenameTableQueryDef {
156
- return { type: "renameTable", table, newName };
157
- }
158
-
159
- /**
160
- * DROP VIEW QueryDef 생성
161
- */
162
- export function getDropViewQueryDef(view: QueryDefObjectName): DropViewQueryDef {
163
- return { type: "dropView", view };
164
- }
165
-
166
- /**
167
- * DROP PROCEDURE QueryDef 생성
168
- */
169
- export function getDropProcQueryDef(procedure: QueryDefObjectName): DropProcQueryDef {
170
- return { type: "dropProc", procedure };
171
- }
172
-
173
- /**
174
- * TableBuilder/ViewBuilder QueryDefObjectName으로 변환
175
- *
176
- * @param db - DbContext 인스턴스
177
- * @param tableOrView - 테이블 또는 빌더
178
- * @returns QueryDef에서 사용할 객체 이름 정보
179
- */
180
- export function getQueryDefObjectName(
181
- db: DbContextBase,
182
- tableOrView: TableBuilder<any, any> | ViewBuilder<any, any, any>,
183
- ): QueryDefObjectName {
184
- return objClearUndefined({
185
- database: tableOrView.meta.database ?? db.database,
186
- schema: tableOrView.meta.schema ?? db.schema,
187
- name: tableOrView.meta.name,
188
- });
189
- }
1
+ import { TableBuilder } from "../schema/table-builder";
2
+ import { ViewBuilder } from "../schema/view-builder";
3
+ import { ProcedureBuilder } from "../schema/procedure-builder";
4
+ import type { ColumnBuilderRecord } from "../schema/factory/column-builder";
5
+ import type {
6
+ QueryDef,
7
+ QueryDefObjectName,
8
+ DropTableQueryDef,
9
+ RenameTableQueryDef,
10
+ DropViewQueryDef,
11
+ DropProcQueryDef,
12
+ } from "../types/query-def";
13
+ import type { DbContextBase } from "../types/db-context-def";
14
+ import { objClearUndefined } from "@simplysm/core-common";
15
+
16
+ /**
17
+ * Builder를 CREATE QueryDef로 Transform
18
+ *
19
+ * @param db - DbContext instance
20
+ * @param builder - Table/View/Procedure builder
21
+ * @returns CREATE TABLE/VIEW/PROCEDURE QueryDef
22
+ * @throws {Error} When unknown builder type
23
+ */
24
+ export function getCreateObjectQueryDef(
25
+ db: DbContextBase,
26
+ builder: TableBuilder<any, any> | ViewBuilder<any, any, any> | ProcedureBuilder<any, any>,
27
+ ): QueryDef {
28
+ if (builder instanceof TableBuilder) {
29
+ return getCreateTableQueryDef(db, builder);
30
+ } else if (builder instanceof ViewBuilder) {
31
+ return getCreateViewQueryDef(db, builder);
32
+ } else if (builder instanceof ProcedureBuilder) {
33
+ return getCreateProcQueryDef(db, builder);
34
+ }
35
+
36
+ throw new Error(`Unknown builder type: ${typeof builder}`);
37
+ }
38
+
39
+ /**
40
+ * CREATE TABLE QueryDef Generate
41
+ *
42
+ * @param db - DbContext instance
43
+ * @param table - Table builder
44
+ * @returns CREATE TABLE QueryDef
45
+ * @throws {Error} When table has no columns
46
+ */
47
+ export function getCreateTableQueryDef(db: DbContextBase, table: TableBuilder<any, any>): QueryDef {
48
+ const columns = table.meta.columns as ColumnBuilderRecord | undefined;
49
+ if (columns == null) {
50
+ throw new Error(`Table '${table.meta.name}' has no columns.`);
51
+ }
52
+
53
+ return {
54
+ type: "createTable",
55
+ table: getQueryDefObjectName(db, table),
56
+ columns: Object.entries(columns).map(([key, col]) => ({
57
+ name: key,
58
+ dataType: col.meta.dataType,
59
+ autoIncrement: col.meta.autoIncrement,
60
+ nullable: col.meta.nullable,
61
+ default: col.meta.default,
62
+ })),
63
+ primaryKey: table.meta.primaryKey,
64
+ };
65
+ }
66
+
67
+ /**
68
+ * CREATE VIEW QueryDef Generate
69
+ *
70
+ * @param db - DbContext instance
71
+ * @param view - View builder
72
+ * @returns CREATE VIEW QueryDef
73
+ * @throws {Error} When view has no viewFn
74
+ */
75
+ export function getCreateViewQueryDef(
76
+ db: DbContextBase,
77
+ view: ViewBuilder<any, any, any>,
78
+ ): QueryDef {
79
+ if (view.meta.viewFn == null) {
80
+ throw new Error(`View '${view.meta.name}' has no viewFn.`);
81
+ }
82
+
83
+ const qr = view.meta.viewFn(db);
84
+ const selectDef = qr.getSelectQueryDef();
85
+
86
+ return {
87
+ type: "createView",
88
+ view: {
89
+ database: view.meta.database ?? db.database,
90
+ schema: view.meta.schema ?? db.schema,
91
+ name: view.meta.name,
92
+ },
93
+ queryDef: selectDef,
94
+ };
95
+ }
96
+
97
+ /**
98
+ * CREATE PROCEDURE QueryDef Generate
99
+ *
100
+ * @param db - DbContext instance
101
+ * @param procedure - Procedure builder
102
+ * @returns CREATE PROCEDURE QueryDef
103
+ * @throws {Error} When procedure has no body
104
+ */
105
+ export function getCreateProcQueryDef(
106
+ db: DbContextBase,
107
+ procedure: ProcedureBuilder<any, any>,
108
+ ): QueryDef {
109
+ if (procedure.meta.query == null) {
110
+ throw new Error(`Procedure '${procedure.meta.name}' has no body.`);
111
+ }
112
+
113
+ const params = procedure.meta.params as ColumnBuilderRecord | undefined;
114
+ const returns = procedure.meta.returns as ColumnBuilderRecord | undefined;
115
+
116
+ return {
117
+ type: "createProc",
118
+ procedure: {
119
+ database: procedure.meta.database ?? db.database,
120
+ schema: procedure.meta.schema ?? db.schema,
121
+ name: procedure.meta.name,
122
+ },
123
+ params: params
124
+ ? Object.entries(params).map(([key, col]) => ({
125
+ name: key,
126
+ dataType: col.meta.dataType,
127
+ nullable: col.meta.nullable,
128
+ default: col.meta.default,
129
+ }))
130
+ : undefined,
131
+ returns: returns
132
+ ? Object.entries(returns).map(([key, col]) => ({
133
+ name: key,
134
+ dataType: col.meta.dataType,
135
+ nullable: col.meta.nullable,
136
+ }))
137
+ : undefined,
138
+ query: procedure.meta.query,
139
+ };
140
+ }
141
+
142
+ /**
143
+ * DROP TABLE QueryDef Generate
144
+ */
145
+ export function getDropTableQueryDef(table: QueryDefObjectName): DropTableQueryDef {
146
+ return { type: "dropTable", table };
147
+ }
148
+
149
+ /**
150
+ * RENAME TABLE QueryDef Generate
151
+ */
152
+ export function getRenameTableQueryDef(
153
+ table: QueryDefObjectName,
154
+ newName: string,
155
+ ): RenameTableQueryDef {
156
+ return { type: "renameTable", table, newName };
157
+ }
158
+
159
+ /**
160
+ * DROP VIEW QueryDef Generate
161
+ */
162
+ export function getDropViewQueryDef(view: QueryDefObjectName): DropViewQueryDef {
163
+ return { type: "dropView", view };
164
+ }
165
+
166
+ /**
167
+ * DROP PROCEDURE QueryDef Generate
168
+ */
169
+ export function getDropProcQueryDef(procedure: QueryDefObjectName): DropProcQueryDef {
170
+ return { type: "dropProc", procedure };
171
+ }
172
+
173
+ /**
174
+ * Transform TableBuilder/ViewBuilder to QueryDefObjectName
175
+ *
176
+ * @param db - DbContext instance
177
+ * @param tableOrView - Table or View builder
178
+ * @returns Object name information for use in QueryDef
179
+ */
180
+ export function getQueryDefObjectName(
181
+ db: DbContextBase,
182
+ tableOrView: TableBuilder<any, any> | ViewBuilder<any, any, any>,
183
+ ): QueryDefObjectName {
184
+ return objClearUndefined({
185
+ database: tableOrView.meta.database ?? db.database,
186
+ schema: tableOrView.meta.schema ?? db.schema,
187
+ name: tableOrView.meta.name,
188
+ });
189
+ }
@@ -1,27 +1,27 @@
1
1
  /**
2
- * 트랜잭션 관련 에러 코드
2
+ * Transaction-related error codes
3
3
  *
4
- * DBMS native 에러 코드를 추상화하여 DBMS 독립적인 에러 처리 가능
4
+ * Abstracts DBMS-specific native error codes for DBMS-independent error handling
5
5
  */
6
6
  export enum DbErrorCode {
7
- /** 활성 트랜잭션이 없음 (ROLLBACK 트랜잭션 없음) */
7
+ /** No active transaction (no transaction during ROLLBACK) */
8
8
  NO_ACTIVE_TRANSACTION = "NO_ACTIVE_TRANSACTION",
9
9
 
10
- /** 트랜잭션이 이미 시작됨 */
10
+ /** Transaction already started */
11
11
  TRANSACTION_ALREADY_STARTED = "TRANSACTION_ALREADY_STARTED",
12
12
 
13
- /** 데드락 발생 */
13
+ /** Deadlock occurred */
14
14
  DEADLOCK = "DEADLOCK",
15
15
 
16
- /** 타임아웃 */
16
+ /** Lock timeout */
17
17
  LOCK_TIMEOUT = "LOCK_TIMEOUT",
18
18
  }
19
19
 
20
20
  /**
21
- * 데이터베이스 트랜잭션 에러
21
+ * Database transaction error
22
22
  *
23
- * DBMS native 에러를 표준화된 에러 코드로 래핑하여
24
- * DBMS 독립적인 에러 처리 가능
23
+ * Wraps DBMS-specific native errors with standardized error codes for
24
+ * DBMS-independent error handling
25
25
  *
26
26
  * @example
27
27
  * ```typescript
@@ -30,7 +30,7 @@ export enum DbErrorCode {
30
30
  * } catch (err) {
31
31
  * if (err instanceof DbTransactionError) {
32
32
  * if (err.code === DbErrorCode.NO_ACTIVE_TRANSACTION) {
33
- * // 이미 롤백된 경우 무시
33
+ * // Ignore if already rolled back
34
34
  * return;
35
35
  * }
36
36
  * }
@@ -42,11 +42,11 @@ export class DbTransactionError extends Error {
42
42
  override readonly name = "DbTransactionError";
43
43
 
44
44
  constructor(
45
- /** 표준화된 에러 코드 */
45
+ /** Standardized error code */
46
46
  public readonly code: DbErrorCode,
47
- /** 에러 메시지 */
47
+ /** Error message */
48
48
  message: string,
49
- /** 원본 DBMS 에러 (디버깅용) */
49
+ /** Original DBMS error (for debugging) */
50
50
  public readonly originalError?: unknown,
51
51
  ) {
52
52
  super(message);