@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.
- package/README.md +54 -1447
- package/dist/create-db-context.d.ts +10 -10
- package/dist/create-db-context.js +9 -9
- package/dist/create-db-context.js.map +1 -1
- package/dist/ddl/column-ddl.d.ts +4 -4
- package/dist/ddl/initialize.d.ts +17 -17
- package/dist/ddl/initialize.js +2 -2
- package/dist/ddl/initialize.js.map +1 -1
- package/dist/ddl/relation-ddl.d.ts +6 -6
- package/dist/ddl/schema-ddl.d.ts +4 -4
- package/dist/ddl/table-ddl.d.ts +24 -24
- package/dist/ddl/table-ddl.js +4 -4
- package/dist/ddl/table-ddl.js.map +1 -1
- package/dist/errors/db-transaction-error.d.ts +15 -15
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/exec/executable.d.ts +23 -23
- package/dist/exec/executable.js +3 -3
- package/dist/exec/executable.js.map +1 -1
- package/dist/exec/queryable.d.ts +160 -160
- package/dist/exec/queryable.js +119 -119
- package/dist/exec/queryable.js.map +1 -1
- package/dist/exec/search-parser.d.ts +37 -37
- package/dist/exec/search-parser.d.ts.map +1 -1
- package/dist/expr/expr-unit.d.ts +4 -4
- package/dist/expr/expr.d.ts +257 -257
- package/dist/expr/expr.js +265 -265
- package/dist/expr/expr.js.map +1 -1
- package/dist/query-builder/base/expr-renderer-base.d.ts +9 -9
- package/dist/query-builder/base/expr-renderer-base.js +2 -2
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -1
- package/dist/query-builder/base/query-builder-base.d.ts +26 -26
- package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.js +22 -22
- package/dist/query-builder/base/query-builder-base.js.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js +18 -18
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
- package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-query-builder.js +11 -11
- package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js +17 -17
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.d.ts +8 -8
- package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.js +5 -5
- package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +4 -4
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js +17 -17
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +5 -5
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js +8 -8
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -1
- package/dist/query-builder/query-builder.d.ts +1 -1
- package/dist/schema/factory/column-builder.d.ts +79 -79
- package/dist/schema/factory/column-builder.js +42 -42
- package/dist/schema/factory/index-builder.d.ts +39 -39
- package/dist/schema/factory/index-builder.js +26 -26
- package/dist/schema/factory/relation-builder.d.ts +99 -99
- package/dist/schema/factory/relation-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.js +38 -38
- package/dist/schema/procedure-builder.d.ts +49 -49
- package/dist/schema/procedure-builder.d.ts.map +1 -1
- package/dist/schema/procedure-builder.js +33 -33
- package/dist/schema/table-builder.d.ts +59 -59
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +43 -43
- package/dist/schema/view-builder.d.ts +49 -49
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +32 -32
- package/dist/types/column.d.ts +22 -22
- package/dist/types/column.js +1 -1
- package/dist/types/column.js.map +1 -1
- package/dist/types/db.d.ts +40 -40
- package/dist/types/expr.d.ts +59 -59
- package/dist/types/expr.d.ts.map +1 -1
- package/dist/types/query-def.d.ts +44 -44
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/utils/result-parser.d.ts +11 -11
- package/dist/utils/result-parser.js +3 -3
- package/dist/utils/result-parser.js.map +1 -1
- package/package.json +5 -5
- package/src/create-db-context.ts +20 -20
- package/src/ddl/column-ddl.ts +4 -4
- package/src/ddl/initialize.ts +259 -259
- package/src/ddl/relation-ddl.ts +89 -89
- package/src/ddl/schema-ddl.ts +4 -4
- package/src/ddl/table-ddl.ts +189 -189
- package/src/errors/db-transaction-error.ts +13 -13
- package/src/exec/executable.ts +25 -25
- package/src/exec/queryable.ts +2033 -2033
- package/src/exec/search-parser.ts +57 -57
- package/src/expr/expr-unit.ts +4 -4
- package/src/expr/expr.ts +2140 -2140
- package/src/query-builder/base/expr-renderer-base.ts +237 -237
- package/src/query-builder/base/query-builder-base.ts +213 -213
- package/src/query-builder/mssql/mssql-expr-renderer.ts +607 -607
- package/src/query-builder/mssql/mssql-query-builder.ts +650 -650
- package/src/query-builder/mysql/mysql-expr-renderer.ts +613 -613
- package/src/query-builder/mysql/mysql-query-builder.ts +759 -759
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +611 -611
- package/src/query-builder/postgresql/postgresql-query-builder.ts +686 -686
- package/src/query-builder/query-builder.ts +19 -19
- package/src/schema/factory/column-builder.ts +423 -423
- package/src/schema/factory/index-builder.ts +164 -164
- package/src/schema/factory/relation-builder.ts +453 -453
- package/src/schema/procedure-builder.ts +232 -232
- package/src/schema/table-builder.ts +319 -319
- package/src/schema/view-builder.ts +221 -221
- package/src/types/column.ts +188 -188
- package/src/types/db.ts +208 -208
- package/src/types/expr.ts +697 -697
- package/src/types/query-def.ts +513 -513
- package/src/utils/result-parser.ts +458 -458
- package/tests/db-context/create-db-context.spec.ts +224 -0
- package/tests/db-context/define-db-context.spec.ts +68 -0
- package/tests/ddl/basic.expected.ts +341 -0
- package/tests/ddl/basic.spec.ts +714 -0
- package/tests/ddl/column-builder.expected.ts +310 -0
- package/tests/ddl/column-builder.spec.ts +637 -0
- package/tests/ddl/index-builder.expected.ts +38 -0
- package/tests/ddl/index-builder.spec.ts +202 -0
- package/tests/ddl/procedure-builder.expected.ts +52 -0
- package/tests/ddl/procedure-builder.spec.ts +234 -0
- package/tests/ddl/relation-builder.expected.ts +36 -0
- package/tests/ddl/relation-builder.spec.ts +372 -0
- package/tests/ddl/table-builder.expected.ts +113 -0
- package/tests/ddl/table-builder.spec.ts +433 -0
- package/tests/ddl/view-builder.expected.ts +38 -0
- package/tests/ddl/view-builder.spec.ts +176 -0
- package/tests/dml/delete.expected.ts +96 -0
- package/tests/dml/delete.spec.ts +160 -0
- package/tests/dml/insert.expected.ts +192 -0
- package/tests/dml/insert.spec.ts +288 -0
- package/tests/dml/update.expected.ts +176 -0
- package/tests/dml/update.spec.ts +318 -0
- package/tests/dml/upsert.expected.ts +215 -0
- package/tests/dml/upsert.spec.ts +242 -0
- package/tests/errors/queryable-errors.spec.ts +177 -0
- package/tests/escape.spec.ts +100 -0
- package/tests/examples/pivot.expected.ts +211 -0
- package/tests/examples/pivot.spec.ts +533 -0
- package/tests/examples/sampling.expected.ts +69 -0
- package/tests/examples/sampling.spec.ts +104 -0
- package/tests/examples/unpivot.expected.ts +120 -0
- package/tests/examples/unpivot.spec.ts +226 -0
- package/tests/exec/search-parser.spec.ts +283 -0
- package/tests/executable/basic.expected.ts +18 -0
- package/tests/executable/basic.spec.ts +54 -0
- package/tests/expr/comparison.expected.ts +282 -0
- package/tests/expr/comparison.spec.ts +400 -0
- package/tests/expr/conditional.expected.ts +134 -0
- package/tests/expr/conditional.spec.ts +276 -0
- package/tests/expr/date.expected.ts +332 -0
- package/tests/expr/date.spec.ts +526 -0
- package/tests/expr/math.expected.ts +62 -0
- package/tests/expr/math.spec.ts +106 -0
- package/tests/expr/string.expected.ts +218 -0
- package/tests/expr/string.spec.ts +356 -0
- package/tests/expr/utility.expected.ts +147 -0
- package/tests/expr/utility.spec.ts +182 -0
- package/tests/select/basic.expected.ts +322 -0
- package/tests/select/basic.spec.ts +502 -0
- package/tests/select/filter.expected.ts +357 -0
- package/tests/select/filter.spec.ts +1068 -0
- package/tests/select/group.expected.ts +169 -0
- package/tests/select/group.spec.ts +244 -0
- package/tests/select/join.expected.ts +582 -0
- package/tests/select/join.spec.ts +805 -0
- package/tests/select/order.expected.ts +150 -0
- package/tests/select/order.spec.ts +189 -0
- package/tests/select/recursive-cte.expected.ts +244 -0
- package/tests/select/recursive-cte.spec.ts +514 -0
- package/tests/select/result-meta.spec.ts +270 -0
- package/tests/select/subquery.expected.ts +363 -0
- package/tests/select/subquery.spec.ts +537 -0
- package/tests/select/view.expected.ts +155 -0
- package/tests/select/view.spec.ts +235 -0
- package/tests/select/window.expected.ts +345 -0
- package/tests/select/window.spec.ts +618 -0
- package/tests/setup/MockExecutor.ts +18 -0
- package/tests/setup/TestDbContext.ts +59 -0
- package/tests/setup/models/Company.ts +13 -0
- package/tests/setup/models/Employee.ts +10 -0
- package/tests/setup/models/MonthlySales.ts +11 -0
- package/tests/setup/models/Post.ts +16 -0
- package/tests/setup/models/Sales.ts +10 -0
- package/tests/setup/models/User.ts +19 -0
- package/tests/setup/procedure/GetAllUsers.ts +9 -0
- package/tests/setup/procedure/GetUserById.ts +12 -0
- package/tests/setup/test-utils.ts +72 -0
- package/tests/setup/views/ActiveUsers.ts +8 -0
- package/tests/setup/views/UserSummary.ts +11 -0
- package/tests/types/nullable-queryable-record.spec.ts +145 -0
- package/tests/utils/result-parser-perf.spec.ts +210 -0
- package/tests/utils/result-parser.spec.ts +701 -0
- package/docs/expressions.md +0 -172
- package/docs/queries.md +0 -444
- package/docs/schema.md +0 -245
|
@@ -1,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%
|
|
75
|
-
* -
|
|
76
|
-
* -
|
|
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
|
-
*
|
|
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(
|
|
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 -
|
|
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
|
+
}
|