@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.
- package/README.md +90 -147
- package/dist/create-db-context.d.ts +10 -10
- package/dist/create-db-context.js +312 -276
- package/dist/create-db-context.js.map +1 -6
- package/dist/ddl/column-ddl.d.ts +4 -4
- package/dist/ddl/column-ddl.js +41 -35
- package/dist/ddl/column-ddl.js.map +1 -6
- package/dist/ddl/initialize.d.ts +17 -17
- package/dist/ddl/initialize.js +200 -142
- package/dist/ddl/initialize.js.map +1 -6
- package/dist/ddl/relation-ddl.d.ts +6 -6
- package/dist/ddl/relation-ddl.js +55 -48
- package/dist/ddl/relation-ddl.js.map +1 -6
- package/dist/ddl/schema-ddl.d.ts +4 -4
- package/dist/ddl/schema-ddl.js +21 -15
- package/dist/ddl/schema-ddl.js.map +1 -6
- package/dist/ddl/table-ddl.d.ts +20 -20
- package/dist/ddl/table-ddl.js +139 -93
- package/dist/ddl/table-ddl.js.map +1 -6
- package/dist/define-db-context.js +10 -13
- package/dist/define-db-context.js.map +1 -6
- package/dist/errors/db-transaction-error.d.ts +15 -15
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/errors/db-transaction-error.js +53 -19
- package/dist/errors/db-transaction-error.js.map +1 -6
- package/dist/exec/executable.d.ts +23 -23
- package/dist/exec/executable.js +94 -40
- package/dist/exec/executable.js.map +1 -6
- package/dist/exec/queryable.d.ts +97 -97
- package/dist/exec/queryable.js +1310 -1204
- package/dist/exec/queryable.js.map +1 -6
- package/dist/exec/search-parser.d.ts +31 -31
- package/dist/exec/search-parser.d.ts.map +1 -1
- package/dist/exec/search-parser.js +158 -59
- package/dist/exec/search-parser.js.map +1 -6
- package/dist/expr/expr-unit.d.ts +4 -4
- package/dist/expr/expr-unit.js +24 -18
- package/dist/expr/expr-unit.js.map +1 -6
- package/dist/expr/expr.d.ts +108 -108
- package/dist/expr/expr.js +1872 -1844
- package/dist/expr/expr.js.map +1 -6
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -6
- package/dist/models/system-migration.js +7 -7
- package/dist/models/system-migration.js.map +1 -6
- package/dist/query-builder/base/expr-renderer-base.d.ts +10 -10
- package/dist/query-builder/base/expr-renderer-base.js +27 -21
- package/dist/query-builder/base/expr-renderer-base.js.map +1 -6
- package/dist/query-builder/base/query-builder-base.d.ts +21 -21
- package/dist/query-builder/base/query-builder-base.d.ts.map +1 -1
- package/dist/query-builder/base/query-builder-base.js +90 -80
- package/dist/query-builder/base/query-builder-base.js.map +1 -6
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mssql/mssql-expr-renderer.js +447 -420
- package/dist/query-builder/mssql/mssql-expr-renderer.js.map +1 -6
- 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 +483 -443
- package/dist/query-builder/mssql/mssql-query-builder.js.map +1 -6
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-expr-renderer.js +451 -419
- package/dist/query-builder/mysql/mysql-expr-renderer.js.map +1 -6
- package/dist/query-builder/mysql/mysql-query-builder.d.ts +10 -10
- package/dist/query-builder/mysql/mysql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/mysql/mysql-query-builder.js +570 -479
- package/dist/query-builder/mysql/mysql-query-builder.js.map +1 -6
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts +5 -5
- package/dist/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js +449 -422
- package/dist/query-builder/postgresql/postgresql-expr-renderer.js.map +1 -6
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts +8 -8
- package/dist/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -1
- package/dist/query-builder/postgresql/postgresql-query-builder.js +511 -460
- package/dist/query-builder/postgresql/postgresql-query-builder.js.map +1 -6
- package/dist/query-builder/query-builder.d.ts +1 -1
- package/dist/query-builder/query-builder.js +13 -13
- package/dist/query-builder/query-builder.js.map +1 -6
- package/dist/schema/factory/column-builder.d.ts +84 -84
- package/dist/schema/factory/column-builder.js +248 -185
- package/dist/schema/factory/column-builder.js.map +1 -6
- package/dist/schema/factory/index-builder.d.ts +38 -38
- package/dist/schema/factory/index-builder.js +144 -85
- package/dist/schema/factory/index-builder.js.map +1 -6
- 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 +274 -136
- package/dist/schema/factory/relation-builder.js.map +1 -6
- package/dist/schema/procedure-builder.d.ts +51 -51
- package/dist/schema/procedure-builder.d.ts.map +1 -1
- package/dist/schema/procedure-builder.js +205 -131
- package/dist/schema/procedure-builder.js.map +1 -6
- package/dist/schema/table-builder.d.ts +55 -55
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +274 -205
- package/dist/schema/table-builder.js.map +1 -6
- package/dist/schema/view-builder.d.ts +44 -44
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +189 -116
- package/dist/schema/view-builder.js.map +1 -6
- package/dist/types/column.d.ts +21 -21
- package/dist/types/column.js +60 -30
- package/dist/types/column.js.map +1 -6
- package/dist/types/db-context-def.d.ts +9 -9
- package/dist/types/db-context-def.js +2 -1
- package/dist/types/db-context-def.js.map +1 -6
- package/dist/types/db.d.ts +47 -47
- package/dist/types/db.js +15 -5
- package/dist/types/db.js.map +1 -6
- package/dist/types/expr.d.ts +81 -81
- package/dist/types/expr.d.ts.map +1 -1
- package/dist/types/expr.js +3 -1
- package/dist/types/expr.js.map +1 -6
- package/dist/types/query-def.d.ts +46 -46
- package/dist/types/query-def.d.ts.map +1 -1
- package/dist/types/query-def.js +31 -24
- package/dist/types/query-def.js.map +1 -6
- package/dist/utils/result-parser.d.ts +11 -11
- package/dist/utils/result-parser.js +362 -221
- package/dist/utils/result-parser.js.map +1 -6
- package/docs/core.md +117 -145
- package/docs/expression.md +186 -203
- package/docs/query-builder.md +75 -42
- package/docs/queryable.md +189 -151
- package/docs/schema-builders.md +172 -283
- package/docs/types.md +229 -173
- package/package.json +7 -5
- package/src/create-db-context.ts +31 -31
- package/src/ddl/column-ddl.ts +4 -4
- package/src/ddl/initialize.ts +38 -38
- package/src/ddl/relation-ddl.ts +6 -6
- package/src/ddl/schema-ddl.ts +4 -4
- package/src/ddl/table-ddl.ts +24 -24
- package/src/errors/db-transaction-error.ts +13 -13
- package/src/exec/executable.ts +25 -25
- package/src/exec/queryable.ts +152 -152
- package/src/exec/search-parser.ts +50 -50
- package/src/expr/expr-unit.ts +4 -4
- package/src/expr/expr.ts +118 -118
- package/src/index.ts +8 -8
- package/src/models/system-migration.ts +1 -1
- package/src/query-builder/base/expr-renderer-base.ts +21 -21
- package/src/query-builder/base/query-builder-base.ts +33 -33
- package/src/query-builder/mssql/mssql-expr-renderer.ts +28 -28
- package/src/query-builder/mssql/mssql-query-builder.ts +37 -37
- package/src/query-builder/mysql/mysql-expr-renderer.ts +29 -29
- package/src/query-builder/mysql/mysql-query-builder.ts +70 -70
- package/src/query-builder/postgresql/postgresql-expr-renderer.ts +22 -22
- package/src/query-builder/postgresql/postgresql-query-builder.ts +54 -54
- package/src/query-builder/query-builder.ts +1 -1
- package/src/schema/factory/column-builder.ts +86 -86
- package/src/schema/factory/index-builder.ts +38 -38
- package/src/schema/factory/relation-builder.ts +102 -102
- package/src/schema/procedure-builder.ts +52 -52
- package/src/schema/table-builder.ts +56 -56
- package/src/schema/view-builder.ts +47 -47
- package/src/types/column.ts +24 -24
- package/src/types/db-context-def.ts +15 -15
- package/src/types/db.ts +50 -50
- package/src/types/expr.ts +103 -103
- package/src/types/query-def.ts +50 -50
- package/src/utils/result-parser.ts +88 -88
- package/docs/utilities.md +0 -27
- package/tests/db-context/create-db-context.spec.ts +0 -193
- package/tests/db-context/define-db-context.spec.ts +0 -17
- package/tests/ddl/basic.expected.ts +0 -341
- package/tests/ddl/basic.spec.ts +0 -557
- package/tests/ddl/column-builder.expected.ts +0 -310
- package/tests/ddl/column-builder.spec.ts +0 -525
- package/tests/ddl/index-builder.expected.ts +0 -38
- package/tests/ddl/index-builder.spec.ts +0 -148
- package/tests/ddl/procedure-builder.expected.ts +0 -52
- package/tests/ddl/procedure-builder.spec.ts +0 -128
- package/tests/ddl/relation-builder.expected.ts +0 -36
- package/tests/ddl/relation-builder.spec.ts +0 -171
- package/tests/ddl/table-builder.expected.ts +0 -113
- package/tests/ddl/table-builder.spec.ts +0 -399
- package/tests/ddl/view-builder.expected.ts +0 -38
- package/tests/ddl/view-builder.spec.ts +0 -116
- package/tests/dml/delete.expected.ts +0 -96
- package/tests/dml/delete.spec.ts +0 -127
- package/tests/dml/insert.expected.ts +0 -192
- package/tests/dml/insert.spec.ts +0 -210
- package/tests/dml/update.expected.ts +0 -176
- package/tests/dml/update.spec.ts +0 -222
- package/tests/dml/upsert.expected.ts +0 -215
- package/tests/dml/upsert.spec.ts +0 -190
- package/tests/errors/queryable-errors.spec.ts +0 -126
- package/tests/escape.spec.ts +0 -59
- package/tests/examples/pivot.expected.ts +0 -211
- package/tests/examples/pivot.spec.ts +0 -200
- package/tests/examples/sampling.expected.ts +0 -69
- package/tests/examples/sampling.spec.ts +0 -42
- package/tests/examples/unpivot.expected.ts +0 -120
- package/tests/examples/unpivot.spec.ts +0 -161
- package/tests/exec/search-parser.spec.ts +0 -267
- package/tests/executable/basic.expected.ts +0 -18
- package/tests/executable/basic.spec.ts +0 -54
- package/tests/expr/comparison.expected.ts +0 -282
- package/tests/expr/comparison.spec.ts +0 -334
- package/tests/expr/conditional.expected.ts +0 -134
- package/tests/expr/conditional.spec.ts +0 -249
- package/tests/expr/date.expected.ts +0 -332
- package/tests/expr/date.spec.ts +0 -459
- package/tests/expr/math.expected.ts +0 -62
- package/tests/expr/math.spec.ts +0 -59
- package/tests/expr/string.expected.ts +0 -218
- package/tests/expr/string.spec.ts +0 -300
- package/tests/expr/utility.expected.ts +0 -147
- package/tests/expr/utility.spec.ts +0 -155
- package/tests/select/basic.expected.ts +0 -322
- package/tests/select/basic.spec.ts +0 -433
- package/tests/select/filter.expected.ts +0 -357
- package/tests/select/filter.spec.ts +0 -954
- package/tests/select/group.expected.ts +0 -169
- package/tests/select/group.spec.ts +0 -159
- package/tests/select/join.expected.ts +0 -582
- package/tests/select/join.spec.ts +0 -692
- package/tests/select/order.expected.ts +0 -150
- package/tests/select/order.spec.ts +0 -140
- package/tests/select/recursive-cte.expected.ts +0 -244
- package/tests/select/recursive-cte.spec.ts +0 -514
- package/tests/select/result-meta.spec.ts +0 -270
- package/tests/select/subquery.expected.ts +0 -363
- package/tests/select/subquery.spec.ts +0 -441
- package/tests/select/view.expected.ts +0 -155
- package/tests/select/view.spec.ts +0 -235
- package/tests/select/window.expected.ts +0 -345
- package/tests/select/window.spec.ts +0 -433
- package/tests/setup/MockExecutor.ts +0 -18
- package/tests/setup/TestDbContext.ts +0 -59
- package/tests/setup/models/Company.ts +0 -13
- package/tests/setup/models/Employee.ts +0 -10
- package/tests/setup/models/MonthlySales.ts +0 -11
- package/tests/setup/models/Post.ts +0 -16
- package/tests/setup/models/Sales.ts +0 -10
- package/tests/setup/models/User.ts +0 -19
- package/tests/setup/procedure/GetAllUsers.ts +0 -9
- package/tests/setup/procedure/GetUserById.ts +0 -12
- package/tests/setup/test-utils.ts +0 -72
- package/tests/setup/views/ActiveUsers.ts +0 -8
- package/tests/setup/views/UserSummary.ts +0 -11
- package/tests/types/nullable-queryable-record.spec.ts +0 -97
- package/tests/utils/result-parser-perf.spec.ts +0 -143
- 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
|
-
|
|
3
|
+
Type-safe query builder and stored procedure executor.
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
|
86
|
-
|
|
87
|
-
| `
|
|
88
|
-
| `
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
|
93
|
-
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
|
101
|
-
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
|
108
|
-
|
|
109
|
-
| `
|
|
110
|
-
| `
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
146
|
-
|--------|-------------|
|
|
147
|
-
| `getExecProcQueryDef()` | Generate procedure execution QueryDef |
|
|
148
|
-
| `execute()` | Execute the stored procedure |
|
|
179
|
+
**Example:**
|
|
149
180
|
|
|
150
|
-
|
|
181
|
+
```typescript
|
|
182
|
+
const result = await db.getUserById().execute({ userId: 1n });
|
|
183
|
+
```
|
|
151
184
|
|
|
152
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
216
|
+
**Search Syntax:**
|
|
173
217
|
|
|
174
218
|
| Syntax | Meaning | Example |
|
|
175
|
-
|
|
176
|
-
| `term1 term2` | OR (
|
|
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*`
|
|
223
|
+
| `"exact phrase"` | Exact phrase match (required) | `"delicious fruit"` |
|
|
224
|
+
| `*` | Wildcard | `app*` produces `app%` |
|
|
181
225
|
|
|
182
|
-
|
|
226
|
+
**Escape Sequences:** `\\` (literal `\`), `\*`, `\%`, `\"`, `\+`, `\-`
|
|
183
227
|
|
|
184
|
-
|
|
228
|
+
**Example:**
|
|
185
229
|
|
|
186
230
|
```typescript
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
+
```
|