@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,237 +1,237 @@
1
- import type {
2
- Expr,
3
- WhereExpr,
4
- ExprColumn,
5
- ExprValue,
6
- ExprRaw,
7
- ExprEq,
8
- ExprGt,
9
- ExprLt,
10
- ExprGte,
11
- ExprLte,
12
- ExprBetween,
13
- ExprIsNull,
14
- ExprLike,
15
- ExprRegexp,
16
- ExprIn,
17
- ExprInQuery,
18
- ExprExists,
19
- ExprNot,
20
- ExprAnd,
21
- ExprOr,
22
- ExprConcat,
23
- ExprLeft,
24
- ExprRight,
25
- ExprTrim,
26
- ExprPadStart,
27
- ExprReplace,
28
- ExprUpper,
29
- ExprLower,
30
- ExprLength,
31
- ExprByteLength,
32
- ExprSubstring,
33
- ExprIndexOf,
34
- ExprAbs,
35
- ExprRound,
36
- ExprCeil,
37
- ExprFloor,
38
- ExprYear,
39
- ExprMonth,
40
- ExprDay,
41
- ExprHour,
42
- ExprMinute,
43
- ExprSecond,
44
- ExprIsoWeek,
45
- ExprIsoWeekStartDate,
46
- ExprIsoYearMonth,
47
- ExprDateDiff,
48
- ExprDateAdd,
49
- ExprFormatDate,
50
- ExprIfNull,
51
- ExprNullIf,
52
- ExprIs,
53
- ExprSwitch,
54
- ExprIf,
55
- ExprCount,
56
- ExprSum,
57
- ExprAvg,
58
- ExprMax,
59
- ExprMin,
60
- ExprGreatest,
61
- ExprLeast,
62
- ExprRowNum,
63
- ExprRandom,
64
- ExprCast,
65
- ExprWindow,
66
- ExprSubquery,
67
- } from "../../types/expr";
68
- import type { SelectQueryDef } from "../../types/query-def";
69
-
70
- /**
71
- * Expr → SQL 렌더링 추상 기본 클래스
72
- *
73
- * Base 원칙:
74
- * - 100% 모든 dialect가 동일한 로직만 구현 (dispatch)
75
- * - 조금이라도 다르면 전부 abstract
76
- * - 메서드명은 expr.type과 동일 (동적 dispatch 가능)
77
- */
78
- export abstract class ExprRendererBase {
79
- constructor(protected buildSelect: (def: SelectQueryDef) => string) {}
80
-
81
- //#region ========== Public Utilities ==========
82
-
83
- /**
84
- * 식별자 감싸기 (테이블명, 컬럼명 등)
85
- * MySQL: `name`, MSSQL: [name], PostgreSQL: "name"
86
- */
87
- abstract wrap(name: string): string;
88
-
89
- /**
90
- * SQL 문자열 리터럴용 이스케이프
91
- * 동적 SQL이나 시스템 쿼리에서 문자열 값으로 사용될 때 호출
92
- * 예: WHERE schema_name = 'escaped_value'
93
- */
94
- abstract escapeString(value: string): string;
95
-
96
- /**
97
- * 이스케이프 (타입에 따라 적절한 SQL 리터럴로 변환)
98
- */
99
- abstract escapeValue(value: unknown): string;
100
-
101
- //#endregion
102
-
103
- //#region ========== Dispatch (100% 동일) ==========
104
-
105
- render(expr: Expr | WhereExpr): string {
106
- const method = this[expr.type as keyof this];
107
- if (typeof method !== "function") {
108
- throw new Error(`알 수 없는 Expr 타입: ${expr.type}`);
109
- }
110
- return (method as (e: Expr | WhereExpr) => string).call(this, expr);
111
- }
112
-
113
- renderWhere(exprs: WhereExpr[]): string {
114
- if (exprs.length === 0) return "";
115
- return exprs.map((e) => this.render(e)).join(" AND ");
116
- }
117
-
118
- //#endregion
119
-
120
- //#region ========== Abstract - ==========
121
-
122
- protected abstract column(expr: ExprColumn): string;
123
- protected abstract value(expr: ExprValue): string;
124
- protected abstract raw(expr: ExprRaw): string;
125
-
126
- //#endregion
127
-
128
- //#region ========== Abstract - 비교 (null-safe 필수) ==========
129
-
130
- protected abstract eq(expr: ExprEq): string;
131
- protected abstract gt(expr: ExprGt): string;
132
- protected abstract lt(expr: ExprLt): string;
133
- protected abstract gte(expr: ExprGte): string;
134
- protected abstract lte(expr: ExprLte): string;
135
- protected abstract between(expr: ExprBetween): string;
136
- protected abstract null(expr: ExprIsNull): string;
137
- protected abstract like(expr: ExprLike): string;
138
- protected abstract regexp(expr: ExprRegexp): string;
139
- protected abstract in(expr: ExprIn): string;
140
- protected abstract inQuery(expr: ExprInQuery): string;
141
- protected abstract exists(expr: ExprExists): string;
142
-
143
- //#endregion
144
-
145
- //#region ========== Abstract - 논리 ==========
146
-
147
- protected abstract not(expr: ExprNot): string;
148
- protected abstract and(expr: ExprAnd): string;
149
- protected abstract or(expr: ExprOr): string;
150
-
151
- //#endregion
152
-
153
- //#region ========== Abstract - 문자열 (null 처리 필수) ==========
154
-
155
- protected abstract concat(expr: ExprConcat): string;
156
- protected abstract left(expr: ExprLeft): string;
157
- protected abstract right(expr: ExprRight): string;
158
- protected abstract trim(expr: ExprTrim): string;
159
- protected abstract padStart(expr: ExprPadStart): string;
160
- protected abstract replace(expr: ExprReplace): string;
161
- protected abstract upper(expr: ExprUpper): string;
162
- protected abstract lower(expr: ExprLower): string;
163
- protected abstract length(expr: ExprLength): string;
164
- protected abstract byteLength(expr: ExprByteLength): string;
165
- protected abstract substring(expr: ExprSubstring): string;
166
- protected abstract indexOf(expr: ExprIndexOf): string;
167
-
168
- //#endregion
169
-
170
- //#region ========== Abstract - 숫자 ==========
171
-
172
- protected abstract abs(expr: ExprAbs): string;
173
- protected abstract round(expr: ExprRound): string;
174
- protected abstract ceil(expr: ExprCeil): string;
175
- protected abstract floor(expr: ExprFloor): string;
176
-
177
- //#endregion
178
-
179
- //#region ========== Abstract - 날짜 ==========
180
-
181
- protected abstract year(expr: ExprYear): string;
182
- protected abstract month(expr: ExprMonth): string;
183
- protected abstract day(expr: ExprDay): string;
184
- protected abstract hour(expr: ExprHour): string;
185
- protected abstract minute(expr: ExprMinute): string;
186
- protected abstract second(expr: ExprSecond): string;
187
- protected abstract isoWeek(expr: ExprIsoWeek): string;
188
- protected abstract isoWeekStartDate(expr: ExprIsoWeekStartDate): string;
189
- protected abstract isoYearMonth(expr: ExprIsoYearMonth): string;
190
- protected abstract dateDiff(expr: ExprDateDiff): string;
191
- protected abstract dateAdd(expr: ExprDateAdd): string;
192
- protected abstract formatDate(expr: ExprFormatDate): string;
193
-
194
- //#endregion
195
-
196
- //#region ========== Abstract - 조건 ==========
197
-
198
- protected abstract ifNull(expr: ExprIfNull): string;
199
- protected abstract nullIf(expr: ExprNullIf): string;
200
- protected abstract is(expr: ExprIs): string;
201
- protected abstract switch(expr: ExprSwitch): string;
202
- protected abstract if(expr: ExprIf): string;
203
-
204
- //#endregion
205
-
206
- //#region ========== Abstract - 집계 ==========
207
-
208
- protected abstract count(expr: ExprCount): string;
209
- protected abstract sum(expr: ExprSum): string;
210
- protected abstract avg(expr: ExprAvg): string;
211
- protected abstract max(expr: ExprMax): string;
212
- protected abstract min(expr: ExprMin): string;
213
-
214
- //#endregion
215
-
216
- //#region ========== Abstract - 기타 ==========
217
-
218
- protected abstract greatest(expr: ExprGreatest): string;
219
- protected abstract least(expr: ExprLeast): string;
220
- protected abstract rowNum(expr: ExprRowNum): string;
221
- protected abstract random(expr: ExprRandom): string;
222
- protected abstract cast(expr: ExprCast): string;
223
-
224
- //#endregion
225
-
226
- //#region ========== Abstract - 윈도우 ==========
227
-
228
- protected abstract window(expr: ExprWindow): string;
229
-
230
- //#endregion
231
-
232
- //#region ========== Abstract - 시스템 ==========
233
-
234
- protected abstract subquery(expr: ExprSubquery): string;
235
-
236
- //#endregion
237
- }
1
+ import type {
2
+ Expr,
3
+ WhereExpr,
4
+ ExprColumn,
5
+ ExprValue,
6
+ ExprRaw,
7
+ ExprEq,
8
+ ExprGt,
9
+ ExprLt,
10
+ ExprGte,
11
+ ExprLte,
12
+ ExprBetween,
13
+ ExprIsNull,
14
+ ExprLike,
15
+ ExprRegexp,
16
+ ExprIn,
17
+ ExprInQuery,
18
+ ExprExists,
19
+ ExprNot,
20
+ ExprAnd,
21
+ ExprOr,
22
+ ExprConcat,
23
+ ExprLeft,
24
+ ExprRight,
25
+ ExprTrim,
26
+ ExprPadStart,
27
+ ExprReplace,
28
+ ExprUpper,
29
+ ExprLower,
30
+ ExprLength,
31
+ ExprByteLength,
32
+ ExprSubstring,
33
+ ExprIndexOf,
34
+ ExprAbs,
35
+ ExprRound,
36
+ ExprCeil,
37
+ ExprFloor,
38
+ ExprYear,
39
+ ExprMonth,
40
+ ExprDay,
41
+ ExprHour,
42
+ ExprMinute,
43
+ ExprSecond,
44
+ ExprIsoWeek,
45
+ ExprIsoWeekStartDate,
46
+ ExprIsoYearMonth,
47
+ ExprDateDiff,
48
+ ExprDateAdd,
49
+ ExprFormatDate,
50
+ ExprIfNull,
51
+ ExprNullIf,
52
+ ExprIs,
53
+ ExprSwitch,
54
+ ExprIf,
55
+ ExprCount,
56
+ ExprSum,
57
+ ExprAvg,
58
+ ExprMax,
59
+ ExprMin,
60
+ ExprGreatest,
61
+ ExprLeast,
62
+ ExprRowNum,
63
+ ExprRandom,
64
+ ExprCast,
65
+ ExprWindow,
66
+ ExprSubquery,
67
+ } from "../../types/expr";
68
+ import type { SelectQueryDef } from "../../types/query-def";
69
+
70
+ /**
71
+ * Expr → SQL Render 추상 Basic class
72
+ *
73
+ * Base principles:
74
+ * - Implement only 100% identical logic across all dialects (dispatch)
75
+ * - If different at all, make it abstract
76
+ * - Method명은 expr.type과 동일 (동적 dispatch 가능)
77
+ */
78
+ export abstract class ExprRendererBase {
79
+ constructor(protected buildSelect: (def: SelectQueryDef) => string) {}
80
+
81
+ //#region ========== Public Utilities ==========
82
+
83
+ /**
84
+ * 식별자 감싸기 (table명, column명 등)
85
+ * MySQL: `name`, MSSQL: [name], PostgreSQL: "name"
86
+ */
87
+ abstract wrap(name: string): string;
88
+
89
+ /**
90
+ * SQL 문자열 리터럴용 escape
91
+ * 동적 SQL이나 System query에서 문자열 값으로 사용될 때 호출
92
+ * 예: WHERE schema_name = 'escaped_value'
93
+ */
94
+ abstract escapeString(value: string): string;
95
+
96
+ /**
97
+ * value escape (타입에 따라 적절한 SQL 리터럴로 Transform)
98
+ */
99
+ abstract escapeValue(value: unknown): string;
100
+
101
+ //#endregion
102
+
103
+ //#region ========== Dispatch (100% identical) ==========
104
+
105
+ render(expr: Expr | WhereExpr): string {
106
+ const method = this[expr.type as keyof this];
107
+ if (typeof method !== "function") {
108
+ throw new Error(`Unknown Expr type: ${expr.type}`);
109
+ }
110
+ return (method as (e: Expr | WhereExpr) => string).call(this, expr);
111
+ }
112
+
113
+ renderWhere(exprs: WhereExpr[]): string {
114
+ if (exprs.length === 0) return "";
115
+ return exprs.map((e) => this.render(e)).join(" AND ");
116
+ }
117
+
118
+ //#endregion
119
+
120
+ //#region ========== Abstract - Value ==========
121
+
122
+ protected abstract column(expr: ExprColumn): string;
123
+ protected abstract value(expr: ExprValue): string;
124
+ protected abstract raw(expr: ExprRaw): string;
125
+
126
+ //#endregion
127
+
128
+ //#region ========== Abstract - comparison (null-safe required) ==========
129
+
130
+ protected abstract eq(expr: ExprEq): string;
131
+ protected abstract gt(expr: ExprGt): string;
132
+ protected abstract lt(expr: ExprLt): string;
133
+ protected abstract gte(expr: ExprGte): string;
134
+ protected abstract lte(expr: ExprLte): string;
135
+ protected abstract between(expr: ExprBetween): string;
136
+ protected abstract null(expr: ExprIsNull): string;
137
+ protected abstract like(expr: ExprLike): string;
138
+ protected abstract regexp(expr: ExprRegexp): string;
139
+ protected abstract in(expr: ExprIn): string;
140
+ protected abstract inQuery(expr: ExprInQuery): string;
141
+ protected abstract exists(expr: ExprExists): string;
142
+
143
+ //#endregion
144
+
145
+ //#region ========== Abstract - logic ==========
146
+
147
+ protected abstract not(expr: ExprNot): string;
148
+ protected abstract and(expr: ExprAnd): string;
149
+ protected abstract or(expr: ExprOr): string;
150
+
151
+ //#endregion
152
+
153
+ //#region ========== Abstract - 문자열 (null processing required) ==========
154
+
155
+ protected abstract concat(expr: ExprConcat): string;
156
+ protected abstract left(expr: ExprLeft): string;
157
+ protected abstract right(expr: ExprRight): string;
158
+ protected abstract trim(expr: ExprTrim): string;
159
+ protected abstract padStart(expr: ExprPadStart): string;
160
+ protected abstract replace(expr: ExprReplace): string;
161
+ protected abstract upper(expr: ExprUpper): string;
162
+ protected abstract lower(expr: ExprLower): string;
163
+ protected abstract length(expr: ExprLength): string;
164
+ protected abstract byteLength(expr: ExprByteLength): string;
165
+ protected abstract substring(expr: ExprSubstring): string;
166
+ protected abstract indexOf(expr: ExprIndexOf): string;
167
+
168
+ //#endregion
169
+
170
+ //#region ========== Abstract - Number ==========
171
+
172
+ protected abstract abs(expr: ExprAbs): string;
173
+ protected abstract round(expr: ExprRound): string;
174
+ protected abstract ceil(expr: ExprCeil): string;
175
+ protected abstract floor(expr: ExprFloor): string;
176
+
177
+ //#endregion
178
+
179
+ //#region ========== Abstract - Date ==========
180
+
181
+ protected abstract year(expr: ExprYear): string;
182
+ protected abstract month(expr: ExprMonth): string;
183
+ protected abstract day(expr: ExprDay): string;
184
+ protected abstract hour(expr: ExprHour): string;
185
+ protected abstract minute(expr: ExprMinute): string;
186
+ protected abstract second(expr: ExprSecond): string;
187
+ protected abstract isoWeek(expr: ExprIsoWeek): string;
188
+ protected abstract isoWeekStartDate(expr: ExprIsoWeekStartDate): string;
189
+ protected abstract isoYearMonth(expr: ExprIsoYearMonth): string;
190
+ protected abstract dateDiff(expr: ExprDateDiff): string;
191
+ protected abstract dateAdd(expr: ExprDateAdd): string;
192
+ protected abstract formatDate(expr: ExprFormatDate): string;
193
+
194
+ //#endregion
195
+
196
+ //#region ========== Abstract - Condition ==========
197
+
198
+ protected abstract ifNull(expr: ExprIfNull): string;
199
+ protected abstract nullIf(expr: ExprNullIf): string;
200
+ protected abstract is(expr: ExprIs): string;
201
+ protected abstract switch(expr: ExprSwitch): string;
202
+ protected abstract if(expr: ExprIf): string;
203
+
204
+ //#endregion
205
+
206
+ //#region ========== Abstract - Aggregate ==========
207
+
208
+ protected abstract count(expr: ExprCount): string;
209
+ protected abstract sum(expr: ExprSum): string;
210
+ protected abstract avg(expr: ExprAvg): string;
211
+ protected abstract max(expr: ExprMax): string;
212
+ protected abstract min(expr: ExprMin): string;
213
+
214
+ //#endregion
215
+
216
+ //#region ========== Abstract - Other ==========
217
+
218
+ protected abstract greatest(expr: ExprGreatest): string;
219
+ protected abstract least(expr: ExprLeast): string;
220
+ protected abstract rowNum(expr: ExprRowNum): string;
221
+ protected abstract random(expr: ExprRandom): string;
222
+ protected abstract cast(expr: ExprCast): string;
223
+
224
+ //#endregion
225
+
226
+ //#region ========== Abstract - Window ==========
227
+
228
+ protected abstract window(expr: ExprWindow): string;
229
+
230
+ //#endregion
231
+
232
+ //#region ========== Abstract - System ==========
233
+
234
+ protected abstract subquery(expr: ExprSubquery): string;
235
+
236
+ //#endregion
237
+ }