@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.
Files changed (246) hide show
  1. package/README.md +90 -147
  2. package/dist/create-db-context.d.ts +10 -10
  3. package/dist/create-db-context.js +312 -276
  4. package/dist/create-db-context.js.map +1 -6
  5. package/dist/ddl/column-ddl.d.ts +4 -4
  6. package/dist/ddl/column-ddl.js +41 -35
  7. package/dist/ddl/column-ddl.js.map +1 -6
  8. package/dist/ddl/initialize.d.ts +17 -17
  9. package/dist/ddl/initialize.js +200 -142
  10. package/dist/ddl/initialize.js.map +1 -6
  11. package/dist/ddl/relation-ddl.d.ts +6 -6
  12. package/dist/ddl/relation-ddl.js +55 -48
  13. package/dist/ddl/relation-ddl.js.map +1 -6
  14. package/dist/ddl/schema-ddl.d.ts +4 -4
  15. package/dist/ddl/schema-ddl.js +21 -15
  16. package/dist/ddl/schema-ddl.js.map +1 -6
  17. package/dist/ddl/table-ddl.d.ts +20 -20
  18. package/dist/ddl/table-ddl.js +139 -93
  19. package/dist/ddl/table-ddl.js.map +1 -6
  20. package/dist/define-db-context.js +10 -13
  21. package/dist/define-db-context.js.map +1 -6
  22. package/dist/errors/db-transaction-error.d.ts +15 -15
  23. package/dist/errors/db-transaction-error.d.ts.map +1 -1
  24. package/dist/errors/db-transaction-error.js +53 -19
  25. package/dist/errors/db-transaction-error.js.map +1 -6
  26. package/dist/exec/executable.d.ts +23 -23
  27. package/dist/exec/executable.js +94 -40
  28. package/dist/exec/executable.js.map +1 -6
  29. package/dist/exec/queryable.d.ts +97 -97
  30. package/dist/exec/queryable.js +1310 -1204
  31. package/dist/exec/queryable.js.map +1 -6
  32. package/dist/exec/search-parser.d.ts +31 -31
  33. package/dist/exec/search-parser.d.ts.map +1 -1
  34. package/dist/exec/search-parser.js +158 -59
  35. package/dist/exec/search-parser.js.map +1 -6
  36. package/dist/expr/expr-unit.d.ts +4 -4
  37. package/dist/expr/expr-unit.js +24 -18
  38. package/dist/expr/expr-unit.js.map +1 -6
  39. package/dist/expr/expr.d.ts +108 -108
  40. package/dist/expr/expr.js +1872 -1844
  41. package/dist/expr/expr.js.map +1 -6
  42. package/dist/index.js +23 -1
  43. package/dist/index.js.map +1 -6
  44. package/dist/models/system-migration.js +7 -7
  45. package/dist/models/system-migration.js.map +1 -6
  46. package/dist/query-builder/base/expr-renderer-base.d.ts +10 -10
  47. package/dist/query-builder/base/expr-renderer-base.js +27 -21
  48. package/dist/query-builder/base/expr-renderer-base.js.map +1 -6
  49. package/dist/query-builder/base/query-builder-base.d.ts +21 -21
  50. package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
  51. package/dist/query-builder/base/query-builder-base.js +90 -80
  52. package/dist/query-builder/base/query-builder-base.js.map +1 -6
  53. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +5 -5
  54. package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
  55. package/dist/query-builder/mssql/mssql-expr-renderer.js +447 -420
  56. package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -6
  57. package/dist/query-builder/mssql/mssql-query-builder.d.ts +2 -2
  58. package/dist/query-builder/mssql/mssql-query-builder.d.ts.map +1 -1
  59. package/dist/query-builder/mssql/mssql-query-builder.js +483 -443
  60. package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -6
  61. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +5 -5
  62. package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
  63. package/dist/query-builder/mysql/mysql-expr-renderer.js +451 -419
  64. package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -6
  65. package/dist/query-builder/mysql/mysql-query-builder.d.ts +10 -10
  66. package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
  67. package/dist/query-builder/mysql/mysql-query-builder.js +570 -479
  68. package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -6
  69. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +5 -5
  70. package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
  71. package/dist/query-builder/postgresql/postgresql-expr-renderer.js +449 -422
  72. package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -6
  73. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +8 -8
  74. package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
  75. package/dist/query-builder/postgresql/postgresql-query-builder.js +511 -460
  76. package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -6
  77. package/dist/query-builder/query-builder.d.ts +1 -1
  78. package/dist/query-builder/query-builder.js +13 -13
  79. package/dist/query-builder/query-builder.js.map +1 -6
  80. package/dist/schema/factory/column-builder.d.ts +84 -84
  81. package/dist/schema/factory/column-builder.js +248 -185
  82. package/dist/schema/factory/column-builder.js.map +1 -6
  83. package/dist/schema/factory/index-builder.d.ts +38 -38
  84. package/dist/schema/factory/index-builder.js +144 -85
  85. package/dist/schema/factory/index-builder.js.map +1 -6
  86. package/dist/schema/factory/relation-builder.d.ts +99 -99
  87. package/dist/schema/factory/relation-builder.d.ts.map +1 -1
  88. package/dist/schema/factory/relation-builder.js +274 -136
  89. package/dist/schema/factory/relation-builder.js.map +1 -6
  90. package/dist/schema/procedure-builder.d.ts +51 -51
  91. package/dist/schema/procedure-builder.d.ts.map +1 -1
  92. package/dist/schema/procedure-builder.js +205 -131
  93. package/dist/schema/procedure-builder.js.map +1 -6
  94. package/dist/schema/table-builder.d.ts +55 -55
  95. package/dist/schema/table-builder.d.ts.map +1 -1
  96. package/dist/schema/table-builder.js +274 -205
  97. package/dist/schema/table-builder.js.map +1 -6
  98. package/dist/schema/view-builder.d.ts +44 -44
  99. package/dist/schema/view-builder.d.ts.map +1 -1
  100. package/dist/schema/view-builder.js +189 -116
  101. package/dist/schema/view-builder.js.map +1 -6
  102. package/dist/types/column.d.ts +21 -21
  103. package/dist/types/column.js +60 -30
  104. package/dist/types/column.js.map +1 -6
  105. package/dist/types/db-context-def.d.ts +9 -9
  106. package/dist/types/db-context-def.js +2 -1
  107. package/dist/types/db-context-def.js.map +1 -6
  108. package/dist/types/db.d.ts +47 -47
  109. package/dist/types/db.js +15 -5
  110. package/dist/types/db.js.map +1 -6
  111. package/dist/types/expr.d.ts +81 -81
  112. package/dist/types/expr.d.ts.map +1 -1
  113. package/dist/types/expr.js +3 -1
  114. package/dist/types/expr.js.map +1 -6
  115. package/dist/types/query-def.d.ts +46 -46
  116. package/dist/types/query-def.d.ts.map +1 -1
  117. package/dist/types/query-def.js +31 -24
  118. package/dist/types/query-def.js.map +1 -6
  119. package/dist/utils/result-parser.d.ts +11 -11
  120. package/dist/utils/result-parser.js +362 -221
  121. package/dist/utils/result-parser.js.map +1 -6
  122. package/docs/core.md +117 -145
  123. package/docs/expression.md +186 -203
  124. package/docs/query-builder.md +75 -42
  125. package/docs/queryable.md +189 -151
  126. package/docs/schema-builders.md +172 -283
  127. package/docs/types.md +229 -173
  128. package/package.json +7 -5
  129. package/src/create-db-context.ts +31 -31
  130. package/src/ddl/column-ddl.ts +4 -4
  131. package/src/ddl/initialize.ts +38 -38
  132. package/src/ddl/relation-ddl.ts +6 -6
  133. package/src/ddl/schema-ddl.ts +4 -4
  134. package/src/ddl/table-ddl.ts +24 -24
  135. package/src/errors/db-transaction-error.ts +13 -13
  136. package/src/exec/executable.ts +25 -25
  137. package/src/exec/queryable.ts +152 -152
  138. package/src/exec/search-parser.ts +50 -50
  139. package/src/expr/expr-unit.ts +4 -4
  140. package/src/expr/expr.ts +118 -118
  141. package/src/index.ts +8 -8
  142. package/src/models/system-migration.ts +1 -1
  143. package/src/query-builder/base/expr-renderer-base.ts +21 -21
  144. package/src/query-builder/base/query-builder-base.ts +33 -33
  145. package/src/query-builder/mssql/mssql-expr-renderer.ts +28 -28
  146. package/src/query-builder/mssql/mssql-query-builder.ts +37 -37
  147. package/src/query-builder/mysql/mysql-expr-renderer.ts +29 -29
  148. package/src/query-builder/mysql/mysql-query-builder.ts +70 -70
  149. package/src/query-builder/postgresql/postgresql-expr-renderer.ts +22 -22
  150. package/src/query-builder/postgresql/postgresql-query-builder.ts +54 -54
  151. package/src/query-builder/query-builder.ts +1 -1
  152. package/src/schema/factory/column-builder.ts +86 -86
  153. package/src/schema/factory/index-builder.ts +38 -38
  154. package/src/schema/factory/relation-builder.ts +102 -102
  155. package/src/schema/procedure-builder.ts +52 -52
  156. package/src/schema/table-builder.ts +56 -56
  157. package/src/schema/view-builder.ts +47 -47
  158. package/src/types/column.ts +24 -24
  159. package/src/types/db-context-def.ts +15 -15
  160. package/src/types/db.ts +50 -50
  161. package/src/types/expr.ts +103 -103
  162. package/src/types/query-def.ts +50 -50
  163. package/src/utils/result-parser.ts +88 -88
  164. package/docs/utilities.md +0 -27
  165. package/tests/db-context/create-db-context.spec.ts +0 -193
  166. package/tests/db-context/define-db-context.spec.ts +0 -17
  167. package/tests/ddl/basic.expected.ts +0 -341
  168. package/tests/ddl/basic.spec.ts +0 -557
  169. package/tests/ddl/column-builder.expected.ts +0 -310
  170. package/tests/ddl/column-builder.spec.ts +0 -525
  171. package/tests/ddl/index-builder.expected.ts +0 -38
  172. package/tests/ddl/index-builder.spec.ts +0 -148
  173. package/tests/ddl/procedure-builder.expected.ts +0 -52
  174. package/tests/ddl/procedure-builder.spec.ts +0 -128
  175. package/tests/ddl/relation-builder.expected.ts +0 -36
  176. package/tests/ddl/relation-builder.spec.ts +0 -171
  177. package/tests/ddl/table-builder.expected.ts +0 -113
  178. package/tests/ddl/table-builder.spec.ts +0 -399
  179. package/tests/ddl/view-builder.expected.ts +0 -38
  180. package/tests/ddl/view-builder.spec.ts +0 -116
  181. package/tests/dml/delete.expected.ts +0 -96
  182. package/tests/dml/delete.spec.ts +0 -127
  183. package/tests/dml/insert.expected.ts +0 -192
  184. package/tests/dml/insert.spec.ts +0 -210
  185. package/tests/dml/update.expected.ts +0 -176
  186. package/tests/dml/update.spec.ts +0 -222
  187. package/tests/dml/upsert.expected.ts +0 -215
  188. package/tests/dml/upsert.spec.ts +0 -190
  189. package/tests/errors/queryable-errors.spec.ts +0 -126
  190. package/tests/escape.spec.ts +0 -59
  191. package/tests/examples/pivot.expected.ts +0 -211
  192. package/tests/examples/pivot.spec.ts +0 -200
  193. package/tests/examples/sampling.expected.ts +0 -69
  194. package/tests/examples/sampling.spec.ts +0 -42
  195. package/tests/examples/unpivot.expected.ts +0 -120
  196. package/tests/examples/unpivot.spec.ts +0 -161
  197. package/tests/exec/search-parser.spec.ts +0 -267
  198. package/tests/executable/basic.expected.ts +0 -18
  199. package/tests/executable/basic.spec.ts +0 -54
  200. package/tests/expr/comparison.expected.ts +0 -282
  201. package/tests/expr/comparison.spec.ts +0 -334
  202. package/tests/expr/conditional.expected.ts +0 -134
  203. package/tests/expr/conditional.spec.ts +0 -249
  204. package/tests/expr/date.expected.ts +0 -332
  205. package/tests/expr/date.spec.ts +0 -459
  206. package/tests/expr/math.expected.ts +0 -62
  207. package/tests/expr/math.spec.ts +0 -59
  208. package/tests/expr/string.expected.ts +0 -218
  209. package/tests/expr/string.spec.ts +0 -300
  210. package/tests/expr/utility.expected.ts +0 -147
  211. package/tests/expr/utility.spec.ts +0 -155
  212. package/tests/select/basic.expected.ts +0 -322
  213. package/tests/select/basic.spec.ts +0 -433
  214. package/tests/select/filter.expected.ts +0 -357
  215. package/tests/select/filter.spec.ts +0 -954
  216. package/tests/select/group.expected.ts +0 -169
  217. package/tests/select/group.spec.ts +0 -159
  218. package/tests/select/join.expected.ts +0 -582
  219. package/tests/select/join.spec.ts +0 -692
  220. package/tests/select/order.expected.ts +0 -150
  221. package/tests/select/order.spec.ts +0 -140
  222. package/tests/select/recursive-cte.expected.ts +0 -244
  223. package/tests/select/recursive-cte.spec.ts +0 -514
  224. package/tests/select/result-meta.spec.ts +0 -270
  225. package/tests/select/subquery.expected.ts +0 -363
  226. package/tests/select/subquery.spec.ts +0 -441
  227. package/tests/select/view.expected.ts +0 -155
  228. package/tests/select/view.spec.ts +0 -235
  229. package/tests/select/window.expected.ts +0 -345
  230. package/tests/select/window.spec.ts +0 -433
  231. package/tests/setup/MockExecutor.ts +0 -18
  232. package/tests/setup/TestDbContext.ts +0 -59
  233. package/tests/setup/models/Company.ts +0 -13
  234. package/tests/setup/models/Employee.ts +0 -10
  235. package/tests/setup/models/MonthlySales.ts +0 -11
  236. package/tests/setup/models/Post.ts +0 -16
  237. package/tests/setup/models/Sales.ts +0 -10
  238. package/tests/setup/models/User.ts +0 -19
  239. package/tests/setup/procedure/GetAllUsers.ts +0 -9
  240. package/tests/setup/procedure/GetUserById.ts +0 -12
  241. package/tests/setup/test-utils.ts +0 -72
  242. package/tests/setup/views/ActiveUsers.ts +0 -8
  243. package/tests/setup/views/UserSummary.ts +0 -11
  244. package/tests/types/nullable-queryable-record.spec.ts +0 -97
  245. package/tests/utils/result-parser-perf.spec.ts +0 -143
  246. package/tests/utils/result-parser.spec.ts +0 -667
@@ -1,45 +1,166 @@
1
- # Expression
1
+ # Expression DSL
2
2
 
3
- ## `ExprUnit`
3
+ Dialect-independent SQL expression builder. Generates JSON AST (`Expr`) instead of SQL strings. The QueryBuilder transforms the AST to target DBMS syntax.
4
4
 
5
- Type-safe expression wrapper. Tracks expression return type using TypeScript generics.
5
+ ## expr
6
6
 
7
- ```typescript
8
- class ExprUnit<TPrimitive extends ColumnPrimitive> {
9
- readonly $infer!: TPrimitive;
10
- get n(): ExprUnit<NonNullable<TPrimitive>>;
11
- constructor(readonly dataType: ColumnPrimitiveStr, readonly expr: Expr);
12
- }
13
- ```
7
+ Constant object with all expression builder methods. Used inside Queryable callbacks for `where()`, `select()`, `orderBy()`, etc.
14
8
 
15
- | Property | Type | Description |
16
- |----------|------|-------------|
17
- | `$infer` | `TPrimitive` | Type inference marker (not used at runtime) |
18
- | `n` | `ExprUnit<NonNullable<TPrimitive>>` | Non-nullable version of this expression |
19
- | `dataType` | `ColumnPrimitiveStr` | Column data type name |
20
- | `expr` | `Expr` | Internal expression AST |
9
+ ### Value Generation
21
10
 
22
- ## `WhereExprUnit`
11
+ | Method | Signature | Description |
12
+ |---|---|---|
13
+ | `val` | `(dataType: ColumnPrimitiveStr, value) => ExprUnit` | Wrap literal value as ExprUnit |
14
+ | `col` | `(dataType, ...path: string[]) => ExprUnit` | Generate column reference (internal use) |
15
+ | `raw` | `(dataType) => tagged template => ExprUnit` | Raw SQL expression (escape hatch). Interpolated values are auto-parameterized. |
23
16
 
24
- Expression wrapper for WHERE clause conditions.
17
+ **Example:**
25
18
 
26
19
  ```typescript
27
- class WhereExprUnit {
28
- constructor(readonly expr: WhereExpr);
29
- }
20
+ expr.val("string", "active")
21
+ expr.val("number", 100)
22
+ expr.val("DateOnly", DateOnly.today())
23
+ expr.raw("string")`JSON_EXTRACT(${u.metadata}, '$.email')`
30
24
  ```
31
25
 
32
- ## `ExprInput`
26
+ ### Comparison Operators (WHERE)
27
+
28
+ | Method | Signature | Description |
29
+ |---|---|---|
30
+ | `eq` | `(source, target) => WhereExprUnit` | Equality (NULL-safe: MySQL `<=>`) |
31
+ | `gt` | `(source, target) => WhereExprUnit` | Greater than (`>`) |
32
+ | `lt` | `(source, target) => WhereExprUnit` | Less than (`<`) |
33
+ | `gte` | `(source, target) => WhereExprUnit` | Greater than or equal (`>=`) |
34
+ | `lte` | `(source, target) => WhereExprUnit` | Less than or equal (`<=`) |
35
+ | `between` | `(source, from?, to?) => WhereExprUnit` | Range (BETWEEN). Undefined bounds are unbounded. |
36
+
37
+ ### NULL Check
38
+
39
+ | Method | Signature | Description |
40
+ |---|---|---|
41
+ | `null` | `(source) => WhereExprUnit` | IS NULL check |
42
+
43
+ ### String Search
44
+
45
+ | Method | Signature | Description |
46
+ |---|---|---|
47
+ | `like` | `(source, pattern) => WhereExprUnit` | LIKE pattern matching (`%`, `_` wildcards) |
48
+ | `regexp` | `(source, pattern) => WhereExprUnit` | Regular expression matching |
49
+
50
+ ### IN / EXISTS
51
+
52
+ | Method | Signature | Description |
53
+ |---|---|---|
54
+ | `in` | `(source, values[]) => WhereExprUnit` | IN value list |
55
+ | `inQuery` | `(source, query: Queryable) => WhereExprUnit` | IN subquery (single-column SELECT) |
56
+ | `exists` | `(query: Queryable) => WhereExprUnit` | EXISTS subquery |
57
+
58
+ ### Logical Operators
59
+
60
+ | Method | Signature | Description |
61
+ |---|---|---|
62
+ | `not` | `(arg: WhereExprUnit) => WhereExprUnit` | NOT |
63
+ | `and` | `(conditions: WhereExprUnit[]) => WhereExprUnit` | AND (all must match) |
64
+ | `or` | `(conditions: WhereExprUnit[]) => WhereExprUnit` | OR (any must match) |
65
+
66
+ ### String Functions (SELECT)
67
+
68
+ | Method | Signature | Description |
69
+ |---|---|---|
70
+ | `concat` | `(...args) => ExprUnit<string>` | String concatenation (CONCAT) |
71
+ | `left` | `(source, length) => ExprUnit` | Left N characters |
72
+ | `right` | `(source, length) => ExprUnit` | Right N characters |
73
+ | `trim` | `(source) => ExprUnit` | Trim whitespace |
74
+ | `padStart` | `(source, length, fillString) => ExprUnit` | Left padding (LPAD) |
75
+ | `replace` | `(source, from, to) => ExprUnit` | String replacement |
76
+ | `upper` | `(source) => ExprUnit` | Uppercase |
77
+ | `lower` | `(source) => ExprUnit` | Lowercase |
78
+ | `length` | `(source) => ExprUnit<number>` | Character length |
79
+ | `byteLength` | `(source) => ExprUnit<number>` | Byte length |
80
+ | `substring` | `(source, start, length?) => ExprUnit` | Substring (1-based index) |
81
+ | `indexOf` | `(source, search) => ExprUnit<number>` | Find position (1-based, 0 if not found) |
82
+
83
+ ### Number Functions (SELECT)
84
+
85
+ | Method | Signature | Description |
86
+ |---|---|---|
87
+ | `abs` | `(source) => ExprUnit` | Absolute value |
88
+ | `round` | `(source, digits) => ExprUnit` | Round |
89
+ | `ceil` | `(source) => ExprUnit` | Ceiling |
90
+ | `floor` | `(source) => ExprUnit` | Floor |
91
+
92
+ ### Date/Time Functions (SELECT)
93
+
94
+ | Method | Signature | Description |
95
+ |---|---|---|
96
+ | `year` | `(source) => ExprUnit<number>` | Extract year |
97
+ | `month` | `(source) => ExprUnit<number>` | Extract month |
98
+ | `day` | `(source) => ExprUnit<number>` | Extract day |
99
+ | `hour` | `(source) => ExprUnit<number>` | Extract hour |
100
+ | `minute` | `(source) => ExprUnit<number>` | Extract minute |
101
+ | `second` | `(source) => ExprUnit<number>` | Extract second |
102
+ | `isoWeek` | `(source) => ExprUnit<number>` | ISO week number |
103
+ | `isoWeekStartDate` | `(source) => ExprUnit<DateOnly>` | ISO week start date (Monday) |
104
+ | `isoYearMonth` | `(source) => ExprUnit<DateOnly>` | ISO year-month (YYYYMM format) |
105
+ | `dateDiff` | `(unit: DateUnit, from, to) => ExprUnit<number>` | Date difference |
106
+ | `dateAdd` | `(unit: DateUnit, source, value) => ExprUnit` | Date arithmetic |
107
+ | `formatDate` | `(source, format: string) => ExprUnit<string>` | Date formatting |
108
+
109
+ ### Conditional
110
+
111
+ | Method | Signature | Description |
112
+ |---|---|---|
113
+ | `coalesce` | `(...args) => ExprUnit` | First non-null value (COALESCE) |
114
+ | `nullIf` | `(source, value) => ExprUnit` | NULL if equal (NULLIF) |
115
+ | `is` | `(condition: WhereExprUnit) => ExprUnit<boolean>` | Convert condition to boolean (0/1) |
116
+ | `switch` | `() => SwitchExprBuilder` | CASE WHEN expression (chain `.case().default()`) |
117
+ | `if` | `(condition, then, else?) => ExprUnit` | IIF conditional expression |
118
+
119
+ ### Aggregate Functions
33
120
 
34
- Input type that accepts `ExprUnit` or literal values.
121
+ | Method | Signature | Description |
122
+ |---|---|---|
123
+ | `count` | `(arg?, distinct?) => ExprUnit<number>` | COUNT |
124
+ | `sum` | `(arg) => ExprUnit<number \| undefined>` | SUM |
125
+ | `avg` | `(arg) => ExprUnit<number \| undefined>` | AVG |
126
+ | `max` | `(arg) => ExprUnit<T \| undefined>` | MAX |
127
+ | `min` | `(arg) => ExprUnit<T \| undefined>` | MIN |
128
+
129
+ ### Utility
130
+
131
+ | Method | Signature | Description |
132
+ |---|---|---|
133
+ | `greatest` | `(...args) => ExprUnit` | Greatest of values |
134
+ | `least` | `(...args) => ExprUnit` | Least of values |
135
+ | `rowNum` | `() => ExprUnit<number>` | Simple row number |
136
+ | `random` | `() => ExprUnit<number>` | Random number (RAND/RANDOM) |
137
+ | `cast` | `(source, targetType: DataType) => ExprUnit` | Type cast |
138
+ | `subquery` | `(dataType, queryDef: SelectQueryDef) => ExprUnit` | Scalar subquery |
139
+ | `toExpr` | `(value: ExprInput) => Expr` | Convert ExprInput to raw Expr AST |
35
140
 
36
- ```typescript
37
- type ExprInput<TPrimitive extends ColumnPrimitive> = ExprUnit<TPrimitive> | TPrimitive;
38
- ```
141
+ ### Window Functions
39
142
 
40
- ## `SwitchExprBuilder`
143
+ All window functions accept a `WinSpecInput: { partitionBy?: ExprInput[]; orderBy?: [ExprInput, ("ASC" | "DESC")?][] }`.
41
144
 
42
- CASE/WHEN expression builder interface.
145
+ | Method | Signature | Description |
146
+ |---|---|---|
147
+ | `rowNumber` | `(spec) => ExprUnit<number>` | ROW_NUMBER() OVER(...) |
148
+ | `rank` | `(spec) => ExprUnit<number>` | RANK() OVER(...) |
149
+ | `denseRank` | `(spec) => ExprUnit<number>` | DENSE_RANK() OVER(...) |
150
+ | `ntile` | `(n, spec) => ExprUnit<number>` | NTILE(n) OVER(...) |
151
+ | `lag` | `(column, spec, offset?, defaultValue?) => ExprUnit` | Previous row value |
152
+ | `lead` | `(column, spec, offset?, defaultValue?) => ExprUnit` | Next row value |
153
+ | `firstValue` | `(column, spec) => ExprUnit` | First value in partition |
154
+ | `lastValue` | `(column, spec) => ExprUnit` | Last value in partition |
155
+ | `sumOver` | `(column, spec) => ExprUnit<number \| undefined>` | Window SUM |
156
+ | `avgOver` | `(column, spec) => ExprUnit<number \| undefined>` | Window AVG |
157
+ | `countOver` | `(spec, column?) => ExprUnit<number>` | Window COUNT |
158
+ | `minOver` | `(column, spec) => ExprUnit` | Window MIN |
159
+ | `maxOver` | `(column, spec) => ExprUnit` | Window MAX |
160
+
161
+ ## SwitchExprBuilder
162
+
163
+ Builder interface for CASE WHEN expressions. Created by `expr.switch()`.
43
164
 
44
165
  ```typescript
45
166
  interface SwitchExprBuilder<TPrimitive extends ColumnPrimitive> {
@@ -48,187 +169,49 @@ interface SwitchExprBuilder<TPrimitive extends ColumnPrimitive> {
48
169
  }
49
170
  ```
50
171
 
51
- ## `expr`
172
+ **Example:**
173
+
174
+ ```typescript
175
+ db.user().select((u) => ({
176
+ tier: expr.switch<string>()
177
+ .case(expr.gte(u.score, 90), "gold")
178
+ .case(expr.gte(u.score, 70), "silver")
179
+ .default("bronze"),
180
+ }))
181
+ ```
182
+
183
+ ## ExprUnit
52
184
 
53
- Dialect-independent SQL expression builder. Generates JSON AST (`Expr`) instead of SQL strings, which `QueryBuilder` converts to each DBMS (MySQL, MSSQL, PostgreSQL).
185
+ Type-safe expression wrapper that tracks the return type through TypeScript generics.
54
186
 
55
187
  ```typescript
56
- const expr: {
57
- // Value creation
58
- val<TStr extends ColumnPrimitiveStr>(dataType: TStr, value): ExprUnit<...>;
59
- col<TStr extends ColumnPrimitiveStr>(dataType: ColumnPrimitiveStr, ...path: string[]): ExprUnit<...>;
60
- raw<T extends ColumnPrimitiveStr>(dataType: T): (strings: TemplateStringsArray, ...values: ExprInput<ColumnPrimitive>[]) => ExprUnit<...>;
61
-
62
- // Comparison (WHERE)
63
- eq<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
64
- gt<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
65
- lt<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
66
- gte<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
67
- lte<T extends ColumnPrimitive>(source: ExprUnit<T>, target: ExprInput<T>): WhereExprUnit;
68
- between<T extends ColumnPrimitive>(source: ExprUnit<T>, from?: ExprInput<T>, to?: ExprInput<T>): WhereExprUnit;
69
- isNull(arg: ExprUnit<ColumnPrimitive>): WhereExprUnit;
70
- like(source: ExprUnit<string | undefined>, pattern: ExprInput<string>): WhereExprUnit;
71
- regexp(source: ExprUnit<string | undefined>, pattern: ExprInput<string>): WhereExprUnit;
72
- in<T extends ColumnPrimitive>(source: ExprUnit<T>, values: ExprInput<T>[]): WhereExprUnit;
73
- inQuery<T extends ColumnPrimitive>(source: ExprUnit<T>, query: Queryable<any, any>): WhereExprUnit;
74
- exists(query: Queryable<any, any>): WhereExprUnit;
75
-
76
- // Logical
77
- not(condition: WhereExprUnit): WhereExprUnit;
78
- and(...conditions: WhereExprUnit[]): WhereExprUnit;
79
- or(...conditions: WhereExprUnit[]): WhereExprUnit;
80
-
81
- // String
82
- concat(...args: ExprInput<string | undefined>[]): ExprUnit<string>;
83
- left(source: ExprInput<string | undefined>, length: ExprInput<number>): ExprUnit<string>;
84
- right(source: ExprInput<string | undefined>, length: ExprInput<number>): ExprUnit<string>;
85
- trim(arg: ExprInput<string | undefined>): ExprUnit<string>;
86
- padStart(source: ExprInput<string | undefined>, length: ExprInput<number>, fillString: ExprInput<string>): ExprUnit<string>;
87
- replace(source: ExprInput<string | undefined>, from: ExprInput<string>, to: ExprInput<string>): ExprUnit<string>;
88
- upper(arg: ExprInput<string | undefined>): ExprUnit<string>;
89
- lower(arg: ExprInput<string | undefined>): ExprUnit<string>;
90
- length(arg: ExprInput<string | undefined>): ExprUnit<number>;
91
- byteLength(arg: ExprInput<string | undefined>): ExprUnit<number>;
92
- substring(source: ExprInput<string | undefined>, start: ExprInput<number>, length?: ExprInput<number>): ExprUnit<string>;
93
- indexOf(source: ExprInput<string | undefined>, search: ExprInput<string>): ExprUnit<number>;
94
-
95
- // Numeric
96
- abs(arg: ExprInput<number | undefined>): ExprUnit<number>;
97
- round(arg: ExprInput<number | undefined>, digits: number): ExprUnit<number>;
98
- ceil(arg: ExprInput<number | undefined>): ExprUnit<number>;
99
- floor(arg: ExprInput<number | undefined>): ExprUnit<number>;
100
-
101
- // Date
102
- year(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<number>;
103
- month(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<number>;
104
- day(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<number>;
105
- hour(arg: ExprInput<DateTime | undefined>): ExprUnit<number>;
106
- minute(arg: ExprInput<DateTime | undefined>): ExprUnit<number>;
107
- second(arg: ExprInput<DateTime | undefined>): ExprUnit<number>;
108
- isoWeek(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<number>;
109
- isoWeekStartDate(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<DateOnly>;
110
- isoYearMonth(arg: ExprInput<DateTime | DateOnly | undefined>): ExprUnit<string>;
111
- dateDiff(unit: DateUnit, from: ExprInput<ColumnPrimitive>, to: ExprInput<ColumnPrimitive>): ExprUnit<number>;
112
- dateAdd(unit: DateUnit, source: ExprInput<ColumnPrimitive>, value: ExprInput<number>): ExprUnit<DateTime>;
113
- formatDate(source: ExprInput<ColumnPrimitive>, format: string): ExprUnit<string>;
114
-
115
- // Conditional
116
- coalesce<T extends ColumnPrimitive>(...args: ExprInput<T | undefined>[]): ExprUnit<T>;
117
- nullIf<T extends ColumnPrimitive>(source: ExprInput<T>, value: ExprInput<T>): ExprUnit<T | undefined>;
118
- is(condition: WhereExprUnit): ExprUnit<number>;
119
- switch<T extends ColumnPrimitive>(dataType: ColumnPrimitiveStr): SwitchExprBuilder<T>;
120
- if<T extends ColumnPrimitive>(condition: WhereExprUnit, then: ExprInput<T>, elseVal?: ExprInput<T>): ExprUnit<T>;
121
-
122
- // Aggregate
123
- count(arg?: ExprUnit<ColumnPrimitive>, distinct?: boolean): ExprUnit<number>;
124
- sum(arg: ExprUnit<number | undefined>): ExprUnit<number>;
125
- avg(arg: ExprUnit<number | undefined>): ExprUnit<number>;
126
- max<T extends ColumnPrimitive>(arg: ExprUnit<T>): ExprUnit<T>;
127
- min<T extends ColumnPrimitive>(arg: ExprUnit<T>): ExprUnit<T>;
128
-
129
- // Other
130
- greatest<T extends ColumnPrimitive>(...args: ExprInput<T>[]): ExprUnit<T>;
131
- least<T extends ColumnPrimitive>(...args: ExprInput<T>[]): ExprUnit<T>;
132
- rowNum(): ExprUnit<number>;
133
- random(): ExprUnit<number>;
134
- cast<TDataType extends DataType>(source: ExprInput<ColumnPrimitive>, targetType: TDataType): ExprUnit<InferColumnPrimitiveFromDataType<TDataType>>;
135
-
136
- // Window
137
- window(fn: WinFn, spec?: WinSpecInput): ExprUnit<number>;
138
-
139
- // Subquery
140
- subquery<T extends ColumnPrimitive>(query: Queryable<any, any>, selectFn: (q: ...) => ExprUnit<T>): ExprUnit<T>;
141
- };
188
+ class ExprUnit<TPrimitive extends ColumnPrimitive> {
189
+ readonly $infer!: TPrimitive;
190
+ readonly dataType: ColumnPrimitiveStr;
191
+ readonly expr: Expr;
192
+
193
+ /** Non-nullable assertion accessor */
194
+ get n(): ExprUnit<NonNullable<TPrimitive>>;
195
+
196
+ constructor(dataType: ColumnPrimitiveStr, expr: Expr);
197
+ }
142
198
  ```
143
199
 
144
- ### Value Creation
145
-
146
- | Method | Description |
147
- |--------|-------------|
148
- | `val()` | Wrap literal value as ExprUnit |
149
- | `col()` | Generate column reference |
150
- | `raw()` | Raw SQL expression (escape hatch, tagged template literal) |
151
-
152
- ### Comparison (WHERE)
153
-
154
- | Method | SQL | Description |
155
- |--------|-----|-------------|
156
- | `eq()` | `=` | Equality comparison (NULL-safe) |
157
- | `gt()` | `>` | Greater than |
158
- | `lt()` | `<` | Less than |
159
- | `gte()` | `>=` | Greater than or equal |
160
- | `lte()` | `<=` | Less than or equal |
161
- | `between()` | `BETWEEN` | Range comparison |
162
- | `isNull()` | `IS NULL` | NULL check |
163
- | `like()` | `LIKE` | Pattern matching |
164
- | `regexp()` | `REGEXP` | Regular expression matching |
165
- | `in()` | `IN` | Value list inclusion |
166
- | `inQuery()` | `IN (SELECT)` | Subquery inclusion |
167
- | `exists()` | `EXISTS` | Subquery existence |
168
-
169
- ### Logical
170
-
171
- | Method | SQL | Description |
172
- |--------|-----|-------------|
173
- | `not()` | `NOT` | Logical negation |
174
- | `and()` | `AND` | Logical conjunction |
175
- | `or()` | `OR` | Logical disjunction |
176
-
177
- ### String Functions
178
-
179
- | Method | SQL | Description |
180
- |--------|-----|-------------|
181
- | `concat()` | `CONCAT` | String concatenation |
182
- | `left()` | `LEFT` | Extract left N characters |
183
- | `right()` | `RIGHT` | Extract right N characters |
184
- | `trim()` | `TRIM` | Remove leading/trailing whitespace |
185
- | `padStart()` | `LPAD` | Left padding |
186
- | `replace()` | `REPLACE` | String replacement |
187
- | `upper()` | `UPPER` | Uppercase |
188
- | `lower()` | `LOWER` | Lowercase |
189
- | `length()` | `CHAR_LENGTH` | Character length |
190
- | `byteLength()` | `LENGTH/DATALENGTH` | Byte length |
191
- | `substring()` | `SUBSTRING` | Substring extraction |
192
- | `indexOf()` | `LOCATE/CHARINDEX` | Find string position |
193
-
194
- ### Numeric Functions
195
-
196
- | Method | SQL | Description |
197
- |--------|-----|-------------|
198
- | `abs()` | `ABS` | Absolute value |
199
- | `round()` | `ROUND` | Rounding |
200
- | `ceil()` | `CEIL` | Ceiling |
201
- | `floor()` | `FLOOR` | Floor |
202
-
203
- ### Date Functions
204
-
205
- | Method | SQL | Description |
206
- |--------|-----|-------------|
207
- | `year()` | `YEAR` | Extract year |
208
- | `month()` | `MONTH` | Extract month |
209
- | `day()` | `DAY` | Extract day |
210
- | `hour()` | `HOUR` | Extract hour |
211
- | `minute()` | `MINUTE` | Extract minute |
212
- | `second()` | `SECOND` | Extract second |
213
- | `isoWeek()` | `WEEK` | ISO week number |
214
- | `isoWeekStartDate()` | - | ISO week start date |
215
- | `isoYearMonth()` | - | ISO year-month (YYYYMM) |
216
- | `dateDiff()` | `DATEDIFF` | Date difference |
217
- | `dateAdd()` | `DATEADD` | Date arithmetic |
218
- | `formatDate()` | `FORMAT/DATE_FORMAT` | Date formatting |
200
+ ## WhereExprUnit
219
201
 
220
- ### Aggregate Functions
202
+ WHERE clause expression wrapper.
221
203
 
222
- | Method | SQL | Description |
223
- |--------|-----|-------------|
224
- | `count()` | `COUNT` | Record count |
225
- | `sum()` | `SUM` | Sum |
226
- | `avg()` | `AVG` | Average |
227
- | `max()` | `MAX` | Maximum |
228
- | `min()` | `MIN` | Minimum |
204
+ ```typescript
205
+ class WhereExprUnit {
206
+ readonly expr: WhereExpr;
207
+ constructor(expr: WhereExpr);
208
+ }
209
+ ```
229
210
 
230
- ### Window Functions
211
+ ## ExprInput
231
212
 
232
- | Method | SQL | Description |
233
- |--------|-----|-------------|
234
- | `window()` | `OVER(...)` | Window function (rowNumber, rank, denseRank, ntile, lag, lead, firstValue, lastValue, sum, avg, count, min, max) |
213
+ Union type accepting either an `ExprUnit` or a literal value.
214
+
215
+ ```typescript
216
+ type ExprInput<TPrimitive extends ColumnPrimitive> = ExprUnit<TPrimitive> | TPrimitive;
217
+ ```
@@ -1,36 +1,62 @@
1
1
  # Query Builder
2
2
 
3
- ## `createQueryBuilder`
3
+ Transforms `QueryDef` AST into dialect-specific SQL strings.
4
4
 
5
- Generate a `QueryBuilderBase` instance matching the given dialect.
5
+ ## createQueryBuilder
6
+
7
+ Factory function that creates the appropriate `QueryBuilderBase` for a given dialect.
6
8
 
7
9
  ```typescript
8
10
  function createQueryBuilder(dialect: Dialect): QueryBuilderBase;
9
11
  ```
10
12
 
13
+ **Parameters:**
14
+
11
15
  | Parameter | Type | Description |
12
- |-----------|------|-------------|
13
- | `dialect` | `Dialect` | Database dialect (`"mysql"`, `"mssql"`, `"postgresql"`) |
16
+ |---|---|---|
17
+ | `dialect` | `"mysql" \| "mssql" \| "postgresql"` | Target database dialect |
18
+
19
+ **Returns:** `QueryBuilderBase` instance (`MysqlQueryBuilder`, `MssqlQueryBuilder`, or `PostgresqlQueryBuilder`)
20
+
21
+ **Example:**
22
+
23
+ ```typescript
24
+ const builder = createQueryBuilder("mysql");
25
+ const result = builder.build(selectQueryDef);
26
+ console.log(result.sql);
27
+ ```
14
28
 
15
- ## `QueryBuilderBase`
29
+ ## QueryBuilderBase
16
30
 
17
- Abstract base class that renders `QueryDef` JSON AST to dialect-specific SQL strings. Implements dispatch logic identical across all dialects; dialect-specific rendering is handled by subclasses.
31
+ Abstract base class for QueryDef-to-SQL rendering. Implements dispatch logic shared across all dialects. Dialect-specific differences are delegated to abstract methods.
18
32
 
19
33
  ```typescript
20
34
  abstract class QueryBuilderBase {
21
- protected abstract expr: ExprRendererBase;
35
+ abstract readonly exprRenderer: ExprRendererBase;
22
36
 
23
37
  build(def: QueryDef): QueryBuildResult;
24
38
  }
25
39
  ```
26
40
 
27
- | Method | Description |
28
- |--------|-------------|
29
- | `build()` | Render a `QueryDef` to SQL. Dispatches to the appropriate method by `def.type`. |
41
+ ### build
30
42
 
31
- ## `ExprRendererBase`
43
+ The main entry point. Accepts any `QueryDef` (SELECT, INSERT, UPDATE, DELETE, UPSERT, DDL, etc.) and returns a `QueryBuildResult` containing the SQL string and optional result set metadata.
32
44
 
33
- Abstract base class for rendering `Expr` and `WhereExpr` JSON AST nodes to dialect-specific SQL strings. Each dialect (MySQL, MSSQL, PostgreSQL) extends this class with its own implementations.
45
+ ```typescript
46
+ build(def: QueryDef): QueryBuildResult;
47
+ ```
48
+
49
+ **Returns:** `QueryBuildResult` with:
50
+
51
+ | Field | Type | Description |
52
+ |---|---|---|
53
+ | `sql` | `string` | Generated SQL |
54
+ | `resultSetIndex?` | `number` | Which result set to read (default: 0) |
55
+ | `resultSetStride?` | `number` | For multi-result sets, read every Nth |
56
+
57
+ ## ExprRendererBase
58
+
59
+ Abstract base class for rendering `Expr` and `WhereExpr` AST nodes to SQL strings. Each dialect implements its own renderer for DBMS-specific syntax.
34
60
 
35
61
  ```typescript
36
62
  abstract class ExprRendererBase {
@@ -39,55 +65,62 @@ abstract class ExprRendererBase {
39
65
  }
40
66
  ```
41
67
 
42
- | Method | Description |
43
- |--------|-------------|
44
- | `render()` | Render a value expression to SQL |
45
- | `renderWhere()` | Render a WHERE expression to SQL |
46
-
47
- ## `MysqlQueryBuilder`
68
+ ## MysqlQueryBuilder
48
69
 
49
70
  MySQL-specific query builder. Extends `QueryBuilderBase`.
50
71
 
51
72
  ```typescript
52
- class MysqlQueryBuilder extends QueryBuilderBase { ... }
73
+ class MysqlQueryBuilder extends QueryBuilderBase {
74
+ readonly exprRenderer: MysqlExprRenderer;
75
+ }
53
76
  ```
54
77
 
55
- ## `MysqlExprRenderer`
56
-
57
- MySQL-specific expression renderer. Extends `ExprRendererBase`.
78
+ MySQL-specific behaviors:
79
+ - Uses `<=>` for NULL-safe equality
80
+ - Uses backtick quoting for identifiers
81
+ - INSERT OUTPUT via separate SELECT with `LAST_INSERT_ID()`
82
+ - UPSERT via `INSERT ... ON DUPLICATE KEY UPDATE`
58
83
 
59
- ```typescript
60
- class MysqlExprRenderer extends ExprRendererBase { ... }
61
- ```
62
-
63
- ## `MssqlQueryBuilder`
84
+ ## MssqlQueryBuilder
64
85
 
65
86
  MSSQL-specific query builder. Extends `QueryBuilderBase`.
66
87
 
67
88
  ```typescript
68
- class MssqlQueryBuilder extends QueryBuilderBase { ... }
89
+ class MssqlQueryBuilder extends QueryBuilderBase {
90
+ readonly exprRenderer: MssqlExprRenderer;
91
+ }
69
92
  ```
70
93
 
71
- ## `MssqlExprRenderer`
72
-
73
- MSSQL-specific expression renderer. Extends `ExprRendererBase`.
94
+ MSSQL-specific behaviors:
95
+ - Uses `[` `]` for identifier quoting
96
+ - TOP instead of LIMIT
97
+ - OUTPUT clause for INSERT/UPDATE/DELETE
98
+ - `IDENTITY_INSERT` for auto-increment override
99
+ - `OFFSET...FETCH` for pagination
74
100
 
75
- ```typescript
76
- class MssqlExprRenderer extends ExprRendererBase { ... }
77
- ```
78
-
79
- ## `PostgresqlQueryBuilder`
101
+ ## PostgresqlQueryBuilder
80
102
 
81
103
  PostgreSQL-specific query builder. Extends `QueryBuilderBase`.
82
104
 
83
105
  ```typescript
84
- class PostgresqlQueryBuilder extends QueryBuilderBase { ... }
106
+ class PostgresqlQueryBuilder extends QueryBuilderBase {
107
+ readonly exprRenderer: PostgresqlExprRenderer;
108
+ }
85
109
  ```
86
110
 
87
- ## `PostgresqlExprRenderer`
111
+ PostgreSQL-specific behaviors:
112
+ - Uses `"` for identifier quoting
113
+ - `RETURNING` clause for INSERT/UPDATE/DELETE output
114
+ - `LIMIT...OFFSET` for pagination
115
+ - `LATERAL` subquery JOINs
116
+ - `IS NOT DISTINCT FROM` for NULL-safe equality
88
117
 
89
- PostgreSQL-specific expression renderer. Extends `ExprRendererBase`.
118
+ ## Dialect-Specific Expression Renderers
90
119
 
91
- ```typescript
92
- class PostgresqlExprRenderer extends ExprRendererBase { ... }
93
- ```
120
+ | Class | Dialect | Description |
121
+ |---|---|---|
122
+ | `MysqlExprRenderer` | MySQL | Renders Expr AST to MySQL SQL syntax |
123
+ | `MssqlExprRenderer` | MSSQL | Renders Expr AST to MSSQL SQL syntax |
124
+ | `PostgresqlExprRenderer` | PostgreSQL | Renders Expr AST to PostgreSQL SQL syntax |
125
+
126
+ Each renderer extends `ExprRendererBase` and overrides methods for dialect-specific expression rendering (e.g., date functions, string functions, type casting).