@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
package/docs/queryable.md CHANGED
@@ -1,198 +1,236 @@
1
1
  # Queryable / Executable
2
2
 
3
- ## `Queryable`
3
+ Type-safe query builder and stored procedure executor.
4
4
 
5
- Type-safe query builder class. Constructs SELECT, INSERT, UPDATE, DELETE queries on tables/views in a chaining manner.
5
+ ## Queryable
6
+
7
+ Chainable query builder class for constructing SELECT, INSERT, UPDATE, DELETE, and UPSERT queries against tables/views.
6
8
 
7
9
  ```typescript
8
- class Queryable<
9
- TData extends DataRecord,
10
- TFrom extends TableBuilder<any, any> | never,
11
- > {
10
+ class Queryable<TData extends DataRecord, TFrom extends TableBuilder | never> {
12
11
  constructor(readonly meta: QueryableMeta<TData>);
13
-
14
- // SELECT / DISTINCT / LOCK
15
- select<R extends Record<string, any>>(
16
- fn: (columns: QueryableRecord<TData>) => R,
17
- ): Queryable<UnwrapQueryableRecord<R>, never>;
18
- distinct(): Queryable<TData, never>;
19
- lock(): Queryable<TData, TFrom>;
20
-
21
- // TOP / LIMIT
22
- top(count: number): Queryable<TData, TFrom>;
23
- limit(skip: number, take: number): Queryable<TData, TFrom>;
24
-
25
- // ORDER BY
26
- orderBy(
27
- fn: (columns: QueryableRecord<TData>) => ExprUnit<ColumnPrimitive>,
28
- orderBy?: "ASC" | "DESC",
29
- ): Queryable<TData, TFrom>;
30
-
31
- // WHERE
32
- where(predicate: (columns: QueryableRecord<TData>) => WhereExprUnit[]): Queryable<TData, TFrom>;
33
- search(
34
- fn: (columns: QueryableRecord<TData>) => ExprUnit<string | undefined>[],
35
- searchText: string,
36
- ): Queryable<TData, TFrom>;
37
-
38
- // GROUP BY / HAVING
39
- groupBy<R extends Record<string, any>>(
40
- fn: (columns: QueryableRecord<TData>) => R,
41
- ): Queryable<UnwrapQueryableRecord<R>, never>;
42
- having(predicate: (columns: QueryableRecord<TData>) => WhereExprUnit[]): Queryable<TData, TFrom>;
43
-
44
- // JOIN
45
- join<TKey extends string, TJoinData extends DataRecord>(
46
- key: TKey,
47
- joinFn: (j: JoinQueryable) => Queryable<TJoinData, any>,
48
- on?: (own: QueryableRecord<TData>, join: QueryableRecord<TJoinData>) => WhereExprUnit[],
49
- ): Queryable<TData & { [K in TKey]?: TJoinData[] }, TFrom>;
50
- joinSingle<TKey extends string, TJoinData extends DataRecord>(
51
- key: TKey,
52
- joinFn: (j: JoinQueryable) => Queryable<TJoinData, any>,
53
- on?: (own: QueryableRecord<TData>, join: QueryableRecord<TJoinData>) => WhereExprUnit[],
54
- ): Queryable<TData & { [K in TKey]?: TJoinData }, TFrom>;
55
- include<TKey extends string & keyof TData>(key: TKey): Queryable<TData, TFrom>;
56
-
57
- // RECURSIVE
58
- recursive<TBaseData extends DataRecord>(
59
- baseQueryFn: (q: Queryable<TData, TFrom>) => Queryable<TBaseData, any>,
60
- recursiveBodyFn: (cte: RecursiveQueryable<TBaseData>) => Queryable<any, any>,
61
- ): Queryable<TBaseData, never>;
62
-
63
- // EXECUTE (SELECT)
64
- execute(): Promise<TData[]>;
65
- single(): Promise<TData | undefined>;
66
- count(): Promise<number>;
67
- exists(): Promise<boolean>;
68
-
69
- // QueryDef generation
70
- getSelectQueryDef(): SelectQueryDef;
71
- getResultMeta(): ResultMeta;
72
-
73
- // CUD (requires TFrom to be TableBuilder)
74
- insert(records: TFrom["$inferInsert"][], options?: { overrideIdentity?: boolean }): Promise<TFrom["$inferColumns"][]>;
75
- insertIfNotExists(record: TFrom["$inferInsert"][]): Promise<TFrom["$inferColumns"][]>;
76
- insertInto(subQuery: Queryable<any, any>, options?: { overrideIdentity?: boolean }): Promise<TFrom["$inferColumns"][]>;
77
- update(fn: (columns: QueryableRecord<TData>) => Partial<...>): Promise<TFrom["$inferColumns"][]>;
78
- upsert(insertRecord: TFrom["$inferInsert"], updateFn: (columns: ...) => Partial<...>): Promise<TFrom["$inferColumns"][]>;
79
- delete(): Promise<TFrom["$inferColumns"][]>;
80
12
  }
81
13
  ```
82
14
 
83
- ### Key Methods
84
-
85
- | Method | Description |
86
- |--------|-------------|
87
- | `select()` | Specify columns to SELECT |
88
- | `distinct()` | Remove duplicate rows |
89
- | `lock()` | Apply row lock (FOR UPDATE) |
90
- | `top()` | Select only top N rows |
91
- | `limit()` | Set LIMIT/OFFSET for pagination (requires `orderBy()`) |
92
- | `orderBy()` | Add sorting condition (multiple calls apply in order) |
93
- | `where()` | Add WHERE condition (multiple calls combined with AND) |
94
- | `search()` | Perform text search with LIKE patterns |
95
- | `groupBy()` | Group results |
96
- | `having()` | Add HAVING condition |
97
- | `join()` | LEFT JOIN with 1:N result (array) |
98
- | `joinSingle()` | LEFT JOIN with 1:1 result (single object) |
99
- | `include()` | Include pre-defined relation from schema |
100
- | `recursive()` | Build recursive CTE query |
101
- | `execute()` | Execute SELECT and return results |
102
- | `single()` | Execute SELECT and return first result |
103
- | `count()` | Return record count |
104
- | `exists()` | Check if records exist |
105
- | `insert()` | INSERT records |
106
- | `insertIfNotExists()` | INSERT only if not exists |
107
- | `insertInto()` | INSERT from subquery |
108
- | `update()` | UPDATE matching records |
109
- | `upsert()` | INSERT or UPDATE |
110
- | `delete()` | DELETE matching records |
111
-
112
- ## `queryable`
113
-
114
- Factory function to create a Queryable accessor for DbContext.
15
+ **Type Parameters:**
16
+
17
+ | Parameter | Description |
18
+ |---|---|
19
+ | `TData` | Query result data type |
20
+ | `TFrom` | Source table builder type. `never` for views/subqueries (no CUD operations). |
21
+
22
+ ### SELECT / Options
23
+
24
+ | Method | Signature | Description |
25
+ |---|---|---|
26
+ | `select` | `(fn: (cols) => R) => Queryable<UnwrapQueryableRecord<R>, never>` | Project specific columns. Replaces the default column set. |
27
+ | `distinct` | `() => Queryable<TData, never>` | Apply DISTINCT to remove duplicate rows. |
28
+ | `lock` | `() => Queryable<TData, TFrom>` | Apply row lock (FOR UPDATE) within a transaction. |
29
+
30
+ ### Filtering
31
+
32
+ | Method | Signature | Description |
33
+ |---|---|---|
34
+ | `where` | `(predicate: (cols) => WhereExprUnit[]) => Queryable<TData, TFrom>` | Add WHERE conditions. Multiple calls are combined with AND. |
35
+ | `search` | `(fn: (cols) => ExprUnit<string>[], searchText: string) => Queryable<TData, TFrom>` | Full-text search across columns. Supports `+required`, `-excluded`, `"exact phrase"`, and `*` wildcards. See `parseSearchQuery`. |
36
+
37
+ ### Sorting / Pagination
38
+
39
+ | Method | Signature | Description |
40
+ |---|---|---|
41
+ | `orderBy` | `(fn: (cols) => ExprUnit, orderBy?: "ASC" \| "DESC") => Queryable<TData, TFrom>` | Add ORDER BY. Multiple calls append in order. Default: ASC. |
42
+ | `top` | `(count: number) => Queryable<TData, TFrom>` | Limit to N rows (works without ORDER BY). |
43
+ | `limit` | `(skip: number, take: number) => Queryable<TData, TFrom>` | Pagination (OFFSET/LIMIT). Requires `orderBy()` first. |
44
+
45
+ ### Grouping
46
+
47
+ | Method | Signature | Description |
48
+ |---|---|---|
49
+ | `groupBy` | `(fn: (cols) => ExprUnit[]) => Queryable<TData, never>` | GROUP BY columns. |
50
+ | `having` | `(predicate: (cols) => WhereExprUnit[]) => Queryable<TData, never>` | HAVING filter (after GROUP BY). |
51
+
52
+ ### JOIN
53
+
54
+ | Method | Signature | Description |
55
+ |---|---|---|
56
+ | `join` | `(as, fn: (qr, cols) => Queryable<R>) => Queryable<TData & { [as]?: R[] }, TFrom>` | LEFT OUTER JOIN (1:N). Result added as array property. |
57
+ | `joinSingle` | `(as, fn: (qr, cols) => Queryable<R>) => Queryable<TData & { [as]?: R }, TFrom>` | LEFT OUTER JOIN (N:1 or 1:1). Result added as single object. |
58
+ | `include` | `(fn: (item: PathProxy) => PathProxy) => Queryable<TData, TFrom>` | Auto-JOIN based on FK/relation definitions. Supports nested paths (e.g., `p.author.company`). |
59
+
60
+ ### Subquery / UNION / Recursive
61
+
62
+ | Method | Signature | Description |
63
+ |---|---|---|
64
+ | `wrap` | `() => Queryable<TData, never>` | Wrap current query as subquery. Required before `count()` after `distinct()`/`groupBy()`. |
65
+ | `static union` | `(...queries: Queryable[]) => Queryable<TData, never>` | Combine 2+ Queryables with UNION. |
66
+ | `recursive` | `(fn: (cte: RecursiveQueryable) => Queryable) => Queryable<TData, never>` | Generate a recursive CTE (WITH RECURSIVE). For hierarchical data. |
67
+
68
+ ### Execution (SELECT)
69
+
70
+ | Method | Signature | Description |
71
+ |---|---|---|
72
+ | `execute` | `() => Promise<TData[]>` | Execute SELECT and return result array. |
73
+ | `single` | `() => Promise<TData \| undefined>` | Return single result. Throws if more than one. |
74
+ | `first` | `() => Promise<TData \| undefined>` | Return first result (even if multiple exist). |
75
+ | `count` | `(fn?) => Promise<number>` | Return row count. Throws after `distinct()`/`groupBy()` (use `wrap()` first). |
76
+ | `exists` | `() => Promise<boolean>` | Check if any matching data exists. |
77
+
78
+ ### Execution (INSERT)
79
+
80
+ | Method | Signature | Description |
81
+ |---|---|---|
82
+ | `insert` | `(records: TFrom["$inferInsert"][]) => Promise<void>` | Insert records. Auto-chunks at 1000 for MSSQL. |
83
+ | `insert` | `(records, outputColumns: K[]) => Promise<Pick<...>[]>` | Insert and return specified output columns. |
84
+ | `insertIfNotExists` | `(record: TFrom["$inferInsert"]) => Promise<void>` | Insert only if WHERE condition matches no rows. |
85
+ | `insertIfNotExists` | `(record, outputColumns: K[]) => Promise<Pick<...>>` | Insert if not exists and return output columns. |
86
+ | `insertInto` | `(targetTable: TableBuilder) => Promise<void>` | INSERT INTO ... SELECT from current query. |
87
+ | `insertInto` | `(targetTable, outputColumns: K[]) => Promise<Pick<...>[]>` | INSERT INTO with output columns. |
88
+
89
+ ### Execution (UPDATE / DELETE)
90
+
91
+ | Method | Signature | Description |
92
+ |---|---|---|
93
+ | `update` | `(recordFwd: (cols) => WriteRecord) => Promise<void>` | Update matching records. Use `expr.val()` for literal values. |
94
+ | `update` | `(recordFwd, outputColumns: K[]) => Promise<Pick<...>[]>` | Update and return output columns. |
95
+ | `delete` | `() => Promise<void>` | Delete matching records. |
96
+ | `delete` | `(outputColumns: K[]) => Promise<Pick<...>[]>` | Delete and return output columns. |
97
+
98
+ ### Execution (UPSERT)
99
+
100
+ | Method | Signature | Description |
101
+ |---|---|---|
102
+ | `upsert` | `(updateFn: (cols) => WriteRecord) => Promise<void>` | Update if exists, insert otherwise (same data). |
103
+ | `upsert` | `(updateFn, insertFn) => Promise<void>` | Update/insert with different data. |
104
+ | `upsert` | `(updateFn, insertFn?, outputColumns?: K[]) => Promise<Pick<...>[] \| void>` | Upsert with optional output columns. |
105
+
106
+ ### QueryDef Generators
107
+
108
+ Each execution method has a corresponding `get*QueryDef` method:
109
+
110
+ - `getSelectQueryDef(): SelectQueryDef`
111
+ - `getInsertQueryDef(records, outputColumns?): InsertQueryDef`
112
+ - `getInsertIfNotExistsQueryDef(record, outputColumns?): InsertIfNotExistsQueryDef`
113
+ - `getInsertIntoQueryDef(targetTable, outputColumns?): InsertIntoQueryDef`
114
+ - `getUpdateQueryDef(recordFwd, outputColumns?): UpdateQueryDef`
115
+ - `getDeleteQueryDef(outputColumns?): DeleteQueryDef`
116
+ - `getUpsertQueryDef(updateRecordFn, insertRecordFn, outputColumns?): UpsertQueryDef`
117
+ - `getResultMeta(outputColumns?): ResultMeta`
118
+
119
+ ## QueryableRecord
120
+
121
+ Maps data record fields to `ExprUnit` wrappers for type-safe expression building. Nested objects and arrays are recursively mapped.
115
122
 
116
123
  ```typescript
117
- function queryable<T extends TableBuilder<any, any> | ViewBuilder<any, any, any>>(
118
- db: DbContextBase,
119
- builder: T,
120
- alias?: string,
121
- ): () => Queryable<T["$inferSelect"], T extends TableBuilder<any, any> ? T : never>;
124
+ type QueryableRecord<TData extends DataRecord> = {
125
+ [K in keyof TData]: TData[K] extends ColumnPrimitive
126
+ ? ExprUnit<TData[K]>
127
+ : TData[K] extends (infer U)[]
128
+ ? U extends DataRecord ? QueryableRecord<U>[] : never
129
+ : TData[K] extends DataRecord ? QueryableRecord<TData[K]> : never;
130
+ };
122
131
  ```
123
132
 
124
- ## `Executable`
133
+ ## QueryableWriteRecord
134
+
135
+ Maps data fields to `ExprInput` for write operations (INSERT/UPDATE).
136
+
137
+ ```typescript
138
+ type QueryableWriteRecord<TData> = {
139
+ [K in keyof TData]: TData[K] extends ColumnPrimitive ? ExprInput<TData[K]> : never;
140
+ };
141
+ ```
142
+
143
+ ## NullableQueryableRecord
144
+
145
+ Same as `QueryableRecord` but all primitive fields include `| undefined` (for LEFT JOIN null propagation).
146
+
147
+ ```typescript
148
+ type NullableQueryableRecord<TData extends DataRecord> = {
149
+ [K in keyof TData]: TData[K] extends ColumnPrimitive
150
+ ? ExprUnit<TData[K] | undefined>
151
+ : /* recursive for nested records */;
152
+ };
153
+ ```
154
+
155
+ ## getMatchedPrimaryKeys
156
+
157
+ Returns the primary key columns of a target table matched to foreign key columns.
158
+
159
+ ```typescript
160
+ function getMatchedPrimaryKeys(
161
+ fkCols: string[],
162
+ targetTable: TableBuilder<any, any>,
163
+ ): string[];
164
+ ```
165
+
166
+ ## Executable
125
167
 
126
168
  Stored procedure execution wrapper class.
127
169
 
128
170
  ```typescript
129
171
  class Executable<TParams extends ColumnBuilderRecord, TReturns extends ColumnBuilderRecord> {
130
- constructor(
131
- private readonly _db: DbContextBase,
132
- private readonly _builder: ProcedureBuilder<TParams, TReturns>,
133
- );
134
-
135
- getExecProcQueryDef(params?: InferColumnExprs<TParams>): {
136
- type: "execProc";
137
- procedure: { database?: string; schema?: string; name: string };
138
- params?: Record<string, Expr>;
139
- };
172
+ constructor(db: DbContextBase, builder: ProcedureBuilder<TParams, TReturns>);
140
173
 
174
+ getExecProcQueryDef(params?: InferColumnExprs<TParams>): ExecProcQueryDef;
141
175
  execute(params: InferColumnExprs<TParams>): Promise<InferColumnExprs<TReturns>[][]>;
142
176
  }
143
177
  ```
144
178
 
145
- | Method | Description |
146
- |--------|-------------|
147
- | `getExecProcQueryDef()` | Generate procedure execution QueryDef |
148
- | `execute()` | Execute the stored procedure |
179
+ **Example:**
149
180
 
150
- ## `executable`
181
+ ```typescript
182
+ const result = await db.getUserById().execute({ userId: 1n });
183
+ ```
151
184
 
152
- Factory function to create an Executable accessor for DbContext.
185
+ ## executable
186
+
187
+ Factory function that creates an `Executable` accessor for a `ProcedureBuilder`.
153
188
 
154
189
  ```typescript
155
- function executable<
156
- TParams extends ColumnBuilderRecord,
157
- TReturns extends ColumnBuilderRecord,
158
- >(
190
+ function executable<TParams, TReturns>(
159
191
  db: DbContextBase,
160
192
  builder: ProcedureBuilder<TParams, TReturns>,
161
193
  ): () => Executable<TParams, TReturns>;
162
194
  ```
163
195
 
164
- ## `parseSearchQuery`
196
+ ## ParsedSearchQuery
197
+
198
+ Result of `parseSearchQuery()`.
199
+
200
+ ```typescript
201
+ interface ParsedSearchQuery {
202
+ or: string[]; // OR conditions (LIKE patterns)
203
+ must: string[]; // AND conditions (+ prefix or quoted)
204
+ not: string[]; // NOT conditions (- prefix)
205
+ }
206
+ ```
207
+
208
+ ## parseSearchQuery
165
209
 
166
- Parse a search query string and convert to SQL LIKE patterns.
210
+ Parses a search query string into SQL LIKE patterns.
167
211
 
168
212
  ```typescript
169
213
  function parseSearchQuery(searchText: string): ParsedSearchQuery;
170
214
  ```
171
215
 
172
- ### Search Syntax
216
+ **Search Syntax:**
173
217
 
174
218
  | Syntax | Meaning | Example |
175
- |--------|---------|---------|
176
- | `term1 term2` | OR (one of them) | `apple banana` |
219
+ |---|---|---|
220
+ | `term1 term2` | OR (match any) | `apple banana` |
177
221
  | `+term` | Required (AND) | `+apple +banana` |
178
222
  | `-term` | Excluded (NOT) | `apple -banana` |
179
- | `"exact phrase"` | Exact match (required) | `"delicious fruit"` |
180
- | `*` | Wildcard | `app*` -> `app%` |
223
+ | `"exact phrase"` | Exact phrase match (required) | `"delicious fruit"` |
224
+ | `*` | Wildcard | `app*` produces `app%` |
181
225
 
182
- ## `ParsedSearchQuery`
226
+ **Escape Sequences:** `\\` (literal `\`), `\*`, `\%`, `\"`, `\+`, `\-`
183
227
 
184
- Search query parsing result.
228
+ **Example:**
185
229
 
186
230
  ```typescript
187
- interface ParsedSearchQuery {
188
- or: string[];
189
- must: string[];
190
- not: string[];
191
- }
192
- ```
231
+ parseSearchQuery('apple "delicious fruit" -banana +strawberry');
232
+ // { or: ["%apple%"], must: ["%delicious fruit%", "%strawberry%"], not: ["%banana%"] }
193
233
 
194
- | Field | Type | Description |
195
- |-------|------|-------------|
196
- | `or` | `string[]` | General search terms (OR condition) - LIKE pattern |
197
- | `must` | `string[]` | Required search terms (AND condition, + prefix or quotes) - LIKE pattern |
198
- | `not` | `string[]` | Excluded search terms (NOT condition, - prefix) - LIKE pattern |
234
+ parseSearchQuery('app* test');
235
+ // { or: ["app%", "%test%"], must: [], not: [] }
236
+ ```