@grest-ts/sql 0.0.6 → 0.0.8
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/LICENSE +21 -21
- package/README.md +498 -498
- package/dist/src/select/parts/S0Union.d.ts +2 -2
- package/dist/tsconfig.publish.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/MysqlTable.ts +101 -101
- package/src/MysqlTableStructureParser.ts +283 -283
- package/src/SQL.ts +244 -244
- package/src/SqlExpression.ts +172 -172
- package/src/SqlFunctions.ts +471 -471
- package/src/Symbols.ts +10 -10
- package/src/Types.ts +244 -244
- package/src/delete/DeleteBuilder.ts +64 -64
- package/src/delete/DeleteInterfaces.ts +70 -70
- package/src/escape.ts +51 -51
- package/src/index.ts +5 -5
- package/src/insert/InsertBuilder.ts +75 -75
- package/src/insert/InsertInterfaces.ts +16 -16
- package/src/select/SelectBuilder.ts +371 -371
- package/src/select/parts/GatewayWhere.ts +30 -30
- package/src/select/parts/S0Union.ts +43 -43
- package/src/select/parts/S0Uses.ts +21 -21
- package/src/select/parts/S0With.ts +21 -21
- package/src/select/parts/S1Join.ts +38 -38
- package/src/select/parts/S2Columns.ts +68 -68
- package/src/select/parts/S2Where.ts +51 -51
- package/src/select/parts/S3GroupBy.ts +23 -23
- package/src/select/parts/S4Having.ts +24 -24
- package/src/select/parts/S5OrderBy.ts +21 -21
- package/src/select/parts/S6Limit.ts +9 -9
- package/src/select/parts/S7Exec.ts +41 -41
- package/src/update/UpdateBuilder.ts +95 -95
- package/src/update/UpdateInterfaces.ts +87 -87
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import {ExecMethods} from "./S7Exec";
|
|
2
|
-
import {OrderByStructure} from "../../Types";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
export interface GatewayWhereMethods<Entity, Result> {
|
|
6
|
-
|
|
7
|
-
where(where: Partial<Entity>): GatewaySelectGroupByMethods<Entity, Result> & GatewaySelectOrderByMethods<Entity, Result> & GatewaySelectLimitMethods<Result> & ExecMethods<Result>
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export interface GatewaySelectGroupByMethods<Entity, Result> extends GatewaySelectLimitMethods<Result> {
|
|
12
|
-
|
|
13
|
-
groupBy(...fields: (keyof Entity)[]): GatewaySelectOrderByMethods<Entity, Result> & GatewaySelectLimitMethods<Result> & ExecMethods<Result>
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface GatewaySelectOrderByMethods<Entity, Result> extends GatewaySelectLimitMethods<Result> {
|
|
18
|
-
|
|
19
|
-
orderBy(...fields: OrderByStructure<keyof Entity>): GatewaySelectLimitMethods<Result> & ExecMethods<Result>
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface GatewaySelectLimitMethods<Result> {
|
|
24
|
-
|
|
25
|
-
noLimit(): ExecMethods<Result>
|
|
26
|
-
|
|
27
|
-
limit(limit: number | [number, number]): ExecMethods<Result>
|
|
28
|
-
|
|
29
|
-
limit1(): ExecMethods<Result>
|
|
30
|
-
|
|
1
|
+
import {ExecMethods} from "./S7Exec";
|
|
2
|
+
import {OrderByStructure} from "../../Types";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
export interface GatewayWhereMethods<Entity, Result> {
|
|
6
|
+
|
|
7
|
+
where(where: Partial<Entity>): GatewaySelectGroupByMethods<Entity, Result> & GatewaySelectOrderByMethods<Entity, Result> & GatewaySelectLimitMethods<Result> & ExecMethods<Result>
|
|
8
|
+
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface GatewaySelectGroupByMethods<Entity, Result> extends GatewaySelectLimitMethods<Result> {
|
|
12
|
+
|
|
13
|
+
groupBy(...fields: (keyof Entity)[]): GatewaySelectOrderByMethods<Entity, Result> & GatewaySelectLimitMethods<Result> & ExecMethods<Result>
|
|
14
|
+
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface GatewaySelectOrderByMethods<Entity, Result> extends GatewaySelectLimitMethods<Result> {
|
|
18
|
+
|
|
19
|
+
orderBy(...fields: OrderByStructure<keyof Entity>): GatewaySelectLimitMethods<Result> & ExecMethods<Result>
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface GatewaySelectLimitMethods<Result> {
|
|
24
|
+
|
|
25
|
+
noLimit(): ExecMethods<Result>
|
|
26
|
+
|
|
27
|
+
limit(limit: number | [number, number]): ExecMethods<Result>
|
|
28
|
+
|
|
29
|
+
limit1(): ExecMethods<Result>
|
|
30
|
+
|
|
31
31
|
}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import {ExecMethods} from "./S7Exec";
|
|
2
|
-
import {GroupByMethods} from "./S3GroupBy";
|
|
3
|
-
|
|
4
|
-
export interface UnionMethods<Result> {
|
|
5
|
-
|
|
6
|
-
union<Exec, MergedResult = Merge<Result, Exec>>(
|
|
7
|
-
table: Check<Result, Exec> & Exec
|
|
8
|
-
): UnionMethods<MergedResult> & GroupByMethods<MergedResult, {}>
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
unionAll<Exec, MergedResult = Merge<Result, Exec>>(
|
|
12
|
-
table: Check<Result, Exec> & Exec
|
|
13
|
-
): UnionMethods<MergedResult> & GroupByMethods<MergedResult, {}>
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
type Check<Result1, Exec> = Exec extends ExecMethods<infer Result2>
|
|
17
|
-
? Key1Checker<Result1, Result2> extends never
|
|
18
|
-
? Key2Checker<Result1, Result2> extends never
|
|
19
|
-
? Exec
|
|
20
|
-
: Key2Checker<Result1, Result2>
|
|
21
|
-
: Key1Checker<Result1, Result2>
|
|
22
|
-
: never
|
|
23
|
-
|
|
24
|
-
type Key1Checker<Result1, Result2> = {
|
|
25
|
-
[K in keyof Result1]: K extends keyof Result2
|
|
26
|
-
? never
|
|
27
|
-
: `Missing column '${K extends string ? K : "???"}' on added union table! (...,${K extends string ? K : "???"}) UNION (..., ${K extends string ? K : "???"} <- Missing!)
|
|
28
|
-
`
|
|
29
|
-
// Empty line is intentional to have only this message as an Error and no obejct comparison.
|
|
30
|
-
}[keyof Result1]
|
|
31
|
-
|
|
32
|
-
type Key2Checker<Result1, Result2> = {
|
|
33
|
-
[K in keyof Result2]: K extends keyof Result1
|
|
34
|
-
? never
|
|
35
|
-
: `Column '${K extends string ? K : "???"}' does not exist in previous queries! (...) UNION (...,'${K extends string ? K : "???"}' <--- is a mistake (or add it to previous queries)!)
|
|
36
|
-
`
|
|
37
|
-
// Empty line is intentional to have only this message as an Error and no obejct comparison.
|
|
38
|
-
}[keyof Result2]
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
type Merge<Result, Exec> = Exec extends ExecMethods<infer Result2> ? {
|
|
42
|
-
[K in keyof Result]: K extends keyof Result2 ? Result[K] | Result2[K] : never
|
|
43
|
-
} : never;
|
|
1
|
+
import {ExecMethods} from "./S7Exec";
|
|
2
|
+
import {GroupByMethods} from "./S3GroupBy";
|
|
3
|
+
|
|
4
|
+
export interface UnionMethods<Result> {
|
|
5
|
+
|
|
6
|
+
union<Exec, MergedResult = Merge<Result, Exec>>(
|
|
7
|
+
table: Check<Result, Exec> & Exec
|
|
8
|
+
): UnionMethods<MergedResult> & GroupByMethods<MergedResult, {}>
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
unionAll<Exec, MergedResult = Merge<Result, Exec>>(
|
|
12
|
+
table: Check<Result, Exec> & Exec
|
|
13
|
+
): UnionMethods<MergedResult> & GroupByMethods<MergedResult, {}>
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type Check<Result1, Exec> = Exec extends ExecMethods<infer Result2>
|
|
17
|
+
? Key1Checker<Result1, Result2> extends never
|
|
18
|
+
? Key2Checker<Result1, Result2> extends never
|
|
19
|
+
? Exec
|
|
20
|
+
: Key2Checker<Result1, Result2>
|
|
21
|
+
: Key1Checker<Result1, Result2>
|
|
22
|
+
: never
|
|
23
|
+
|
|
24
|
+
type Key1Checker<Result1, Result2> = {
|
|
25
|
+
[K in keyof Result1]: K extends keyof Result2
|
|
26
|
+
? never
|
|
27
|
+
: `Missing column '${K extends string ? K : "???"}' on added union table! (...,${K extends string ? K : "???"}) UNION (..., ${K extends string ? K : "???"} <- Missing!)
|
|
28
|
+
`
|
|
29
|
+
// Empty line is intentional to have only this message as an Error and no obejct comparison.
|
|
30
|
+
}[keyof Result1]
|
|
31
|
+
|
|
32
|
+
type Key2Checker<Result1, Result2> = {
|
|
33
|
+
[K in keyof Result2]: K extends keyof Result1
|
|
34
|
+
? never
|
|
35
|
+
: `Column '${K extends string ? K : "???"}' does not exist in previous queries! (...) UNION (...,'${K extends string ? K : "???"}' <--- is a mistake (or add it to previous queries)!)
|
|
36
|
+
`
|
|
37
|
+
// Empty line is intentional to have only this message as an Error and no obejct comparison.
|
|
38
|
+
}[keyof Result2]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
type Merge<Result, Exec> = Exec extends ExecMethods<infer Result2> ? {
|
|
42
|
+
[K in keyof Result]: K extends keyof Result2 ? Result[K] | Result2[K] : never
|
|
43
|
+
} : never;
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import {AliasedTable, Key, NotUsingWithPart} from "../../Types";
|
|
2
|
-
import {JoinMethods} from "./S1Join";
|
|
3
|
-
|
|
4
|
-
export interface UsesMethods<Aliases, Tables> {
|
|
5
|
-
|
|
6
|
-
// uses<
|
|
7
|
-
// Alias extends string,
|
|
8
|
-
// TableRef extends `${string} as ${Alias}`
|
|
9
|
-
// >(
|
|
10
|
-
// table: isAliasAlreadyUsed<Aliases, Alias, AliasedTable<Alias, TableRef, any, NotUsingWithPart>>
|
|
11
|
-
// ): UsesMethods<Aliases & Key<Alias>, Tables & Key<TableRef>>
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
selectFrom<
|
|
15
|
-
Alias extends string,
|
|
16
|
-
TableRef extends `${string} as ${Alias}`
|
|
17
|
-
>(
|
|
18
|
-
table: AliasedTable<Alias, TableRef, object, object, string | NotUsingWithPart>
|
|
19
|
-
): JoinMethods<Aliases & Key<Alias>, {}, Tables & Key<TableRef>>
|
|
20
|
-
|
|
21
|
-
}
|
|
1
|
+
import {AliasedTable, Key, NotUsingWithPart} from "../../Types";
|
|
2
|
+
import {JoinMethods} from "./S1Join";
|
|
3
|
+
|
|
4
|
+
export interface UsesMethods<Aliases, Tables> {
|
|
5
|
+
|
|
6
|
+
// uses<
|
|
7
|
+
// Alias extends string,
|
|
8
|
+
// TableRef extends `${string} as ${Alias}`
|
|
9
|
+
// >(
|
|
10
|
+
// table: isAliasAlreadyUsed<Aliases, Alias, AliasedTable<Alias, TableRef, any, NotUsingWithPart>>
|
|
11
|
+
// ): UsesMethods<Aliases & Key<Alias>, Tables & Key<TableRef>>
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
selectFrom<
|
|
15
|
+
Alias extends string,
|
|
16
|
+
TableRef extends `${string} as ${Alias}`
|
|
17
|
+
>(
|
|
18
|
+
table: AliasedTable<Alias, TableRef, object, object, string | NotUsingWithPart>
|
|
19
|
+
): JoinMethods<Aliases & Key<Alias>, {}, Tables & Key<TableRef>>
|
|
20
|
+
|
|
21
|
+
}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import {AliasedTable, Key, NotUsingWithPart} from "../../Types";
|
|
2
|
-
import {JoinMethods} from "./S1Join";
|
|
3
|
-
|
|
4
|
-
export interface WithMethods<AliasesFromWith> {
|
|
5
|
-
|
|
6
|
-
// with<
|
|
7
|
-
// Alias extends string,
|
|
8
|
-
// TableRef extends `${string} as ${Alias}`
|
|
9
|
-
// >(
|
|
10
|
-
// table: isAliasAlreadyUsed<AliasesFromWith, Alias, AliasedTable<Alias, TableRef, object, NotUsingWithPart>>
|
|
11
|
-
// ): WithMethods<AliasesFromWith & Key<Alias>>
|
|
12
|
-
|
|
13
|
-
selectFrom<
|
|
14
|
-
Alias extends string,
|
|
15
|
-
TableRef extends `${string} as ${Alias}`
|
|
16
|
-
>(
|
|
17
|
-
table: AliasedTable<Alias, TableRef, object, object, string | NotUsingWithPart>
|
|
18
|
-
): JoinMethods<Key<Alias>, AliasesFromWith, Key<TableRef>>
|
|
19
|
-
|
|
20
|
-
}
|
|
21
|
-
|
|
1
|
+
import {AliasedTable, Key, NotUsingWithPart} from "../../Types";
|
|
2
|
+
import {JoinMethods} from "./S1Join";
|
|
3
|
+
|
|
4
|
+
export interface WithMethods<AliasesFromWith> {
|
|
5
|
+
|
|
6
|
+
// with<
|
|
7
|
+
// Alias extends string,
|
|
8
|
+
// TableRef extends `${string} as ${Alias}`
|
|
9
|
+
// >(
|
|
10
|
+
// table: isAliasAlreadyUsed<AliasesFromWith, Alias, AliasedTable<Alias, TableRef, object, NotUsingWithPart>>
|
|
11
|
+
// ): WithMethods<AliasesFromWith & Key<Alias>>
|
|
12
|
+
|
|
13
|
+
selectFrom<
|
|
14
|
+
Alias extends string,
|
|
15
|
+
TableRef extends `${string} as ${Alias}`
|
|
16
|
+
>(
|
|
17
|
+
table: AliasedTable<Alias, TableRef, object, object, string | NotUsingWithPart>
|
|
18
|
+
): JoinMethods<Key<Alias>, AliasesFromWith, Key<TableRef>>
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
|
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
import {AliasedTable, isAliasAlreadyUsed, isTableReferenced, Key, NotUsingWithPart, SQL_BOOL} from "../../Types";
|
|
2
|
-
import {Expr, Over} from "../../SqlExpression";
|
|
3
|
-
import {ColumnsMethods} from "./S2Columns";
|
|
4
|
-
|
|
5
|
-
export interface JoinMethods<Aliases, AliasesFromWith, Tables> extends ColumnsMethods<{}, Tables> {
|
|
6
|
-
|
|
7
|
-
join<
|
|
8
|
-
Alias extends string,
|
|
9
|
-
TableRef extends `${string} as ${Alias}`,
|
|
10
|
-
RefAlias extends NotUsingWithPart | string,
|
|
11
|
-
ColTableRef extends string
|
|
12
|
-
>(
|
|
13
|
-
table: isRefAliasInAliasesFromWith<AliasesFromWith, RefAlias, isAliasAlreadyUsed<Aliases & AliasesFromWith, Alias, AliasedTable<Alias, TableRef, object, object, RefAlias>>>,
|
|
14
|
-
condition: isConditionUsingJoinedTable<TableRef, ColTableRef, isTableReferenced<Tables & Key<TableRef>, Key<ColTableRef>, Expr<ColTableRef, unknown, SQL_BOOL>>>
|
|
15
|
-
): JoinMethods<Aliases & Key<Alias>, AliasesFromWith, Tables & Key<TableRef>>
|
|
16
|
-
|
|
17
|
-
leftJoin<
|
|
18
|
-
Alias extends string,
|
|
19
|
-
TableRef extends `${string} as ${Alias}`,
|
|
20
|
-
RefAlias extends NotUsingWithPart | string,
|
|
21
|
-
ColTableRef extends string
|
|
22
|
-
>(
|
|
23
|
-
table: isRefAliasInAliasesFromWith<AliasesFromWith, RefAlias, isAliasAlreadyUsed<Aliases & AliasesFromWith, Alias, AliasedTable<Alias, TableRef, object, object, RefAlias>>>,
|
|
24
|
-
condition: isConditionUsingJoinedTable<TableRef, ColTableRef, isTableReferenced<Tables & Key<TableRef>, Key<ColTableRef>, Expr<ColTableRef, unknown, SQL_BOOL>>>
|
|
25
|
-
): JoinMethods<Aliases & Key<Alias>, AliasesFromWith, Tables & Key<TableRef>>
|
|
26
|
-
|
|
27
|
-
window<
|
|
28
|
-
WindowName extends string,
|
|
29
|
-
UsedTablesRef extends string
|
|
30
|
-
>(
|
|
31
|
-
name: isAliasAlreadyUsed<Aliases & AliasesFromWith, WindowName, WindowName>,
|
|
32
|
-
func: (builder: Over<never>) => Over<UsedTablesRef>
|
|
33
|
-
): JoinMethods<Aliases & Key<WindowName>, AliasesFromWith, Tables & Key<`(window) as ${WindowName}`>>
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
type isConditionUsingJoinedTable<TableRef, ColTableRef, OUT> = TableRef extends ColTableRef ? OUT : "Join condition should use columns from the joined table!"
|
|
38
|
-
|
|
1
|
+
import {AliasedTable, isAliasAlreadyUsed, isTableReferenced, Key, NotUsingWithPart, SQL_BOOL} from "../../Types";
|
|
2
|
+
import {Expr, Over} from "../../SqlExpression";
|
|
3
|
+
import {ColumnsMethods} from "./S2Columns";
|
|
4
|
+
|
|
5
|
+
export interface JoinMethods<Aliases, AliasesFromWith, Tables> extends ColumnsMethods<{}, Tables> {
|
|
6
|
+
|
|
7
|
+
join<
|
|
8
|
+
Alias extends string,
|
|
9
|
+
TableRef extends `${string} as ${Alias}`,
|
|
10
|
+
RefAlias extends NotUsingWithPart | string,
|
|
11
|
+
ColTableRef extends string
|
|
12
|
+
>(
|
|
13
|
+
table: isRefAliasInAliasesFromWith<AliasesFromWith, RefAlias, isAliasAlreadyUsed<Aliases & AliasesFromWith, Alias, AliasedTable<Alias, TableRef, object, object, RefAlias>>>,
|
|
14
|
+
condition: isConditionUsingJoinedTable<TableRef, ColTableRef, isTableReferenced<Tables & Key<TableRef>, Key<ColTableRef>, Expr<ColTableRef, unknown, SQL_BOOL>>>
|
|
15
|
+
): JoinMethods<Aliases & Key<Alias>, AliasesFromWith, Tables & Key<TableRef>>
|
|
16
|
+
|
|
17
|
+
leftJoin<
|
|
18
|
+
Alias extends string,
|
|
19
|
+
TableRef extends `${string} as ${Alias}`,
|
|
20
|
+
RefAlias extends NotUsingWithPart | string,
|
|
21
|
+
ColTableRef extends string
|
|
22
|
+
>(
|
|
23
|
+
table: isRefAliasInAliasesFromWith<AliasesFromWith, RefAlias, isAliasAlreadyUsed<Aliases & AliasesFromWith, Alias, AliasedTable<Alias, TableRef, object, object, RefAlias>>>,
|
|
24
|
+
condition: isConditionUsingJoinedTable<TableRef, ColTableRef, isTableReferenced<Tables & Key<TableRef>, Key<ColTableRef>, Expr<ColTableRef, unknown, SQL_BOOL>>>
|
|
25
|
+
): JoinMethods<Aliases & Key<Alias>, AliasesFromWith, Tables & Key<TableRef>>
|
|
26
|
+
|
|
27
|
+
window<
|
|
28
|
+
WindowName extends string,
|
|
29
|
+
UsedTablesRef extends string
|
|
30
|
+
>(
|
|
31
|
+
name: isAliasAlreadyUsed<Aliases & AliasesFromWith, WindowName, WindowName>,
|
|
32
|
+
func: (builder: Over<never>) => Over<UsedTablesRef>
|
|
33
|
+
): JoinMethods<Aliases & Key<WindowName>, AliasesFromWith, Tables & Key<`(window) as ${WindowName}`>>
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
type isConditionUsingJoinedTable<TableRef, ColTableRef, OUT> = TableRef extends ColTableRef ? OUT : "Join condition should use columns from the joined table!"
|
|
38
|
+
|
|
39
39
|
type isRefAliasInAliasesFromWith<AliasesFromWith, RefAlias, OUT> = RefAlias extends NotUsingWithPart | string & keyof AliasesFromWith ? OUT : `Alias '${RefAlias extends string ? RefAlias : RefAlias extends NotUsingWithPart ? "NOT_REFERENCED" : "???"}' is not defined by any of the with queries!`
|
|
@@ -1,68 +1,68 @@
|
|
|
1
|
-
import {WhereMethods} from "./S2Where";
|
|
2
|
-
import {Expr} from "../../SqlExpression";
|
|
3
|
-
import {AliasedTable, NotUsingWithPart} from "../../Types";
|
|
4
|
-
|
|
5
|
-
export interface ColumnsMethods<Result, Tables> {
|
|
6
|
-
|
|
7
|
-
distinct(): ColumnsMethods<Result, Tables>
|
|
8
|
-
|
|
9
|
-
allColumnsFrom<TableRef, Entity, Result2 = Result & Entity>(table: AliasedTable<string, TableRef, Entity, any, NotUsingWithPart>): ColumnsMethods<Result2, Tables> & WhereMethods<Result2, Tables>
|
|
10
|
-
|
|
11
|
-
one(): WhereMethods<Result & { one: 1 }, Tables>
|
|
12
|
-
|
|
13
|
-
columns<
|
|
14
|
-
TableRef,
|
|
15
|
-
Columns extends Expr<TableRef, string, any>[]
|
|
16
|
-
>(
|
|
17
|
-
//...columns: Columns - this will enable seeing sources of Result object properties.
|
|
18
|
-
...columns: isColumnOkToAdd<Result, Tables, Columns>
|
|
19
|
-
): WhereMethods<Result & ExtractObj<Columns>, Tables>
|
|
20
|
-
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// --------------------------------------------------------------------
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Take array of Col-s and convert to Record<key, value> & ... object.
|
|
27
|
-
*/
|
|
28
|
-
export type ExtractObj<Columns extends Expr<any, string, any>[]> = {
|
|
29
|
-
[K in Columns[number]['nameAs']]: Extract<Columns[number], { nameAs: K }>['type']
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// --------------------------------------------------------------------
|
|
34
|
-
|
|
35
|
-
type _checkIfExistsInOtherFields<Rest extends any[], Expr> =
|
|
36
|
-
Rest extends []
|
|
37
|
-
? Expr
|
|
38
|
-
: Expr extends { nameAs: string } ?
|
|
39
|
-
Expr["nameAs"] extends (Rest extends { nameAs: infer A }[] ? A : never)
|
|
40
|
-
? `'${Expr["nameAs"]}' already exists in columns!`
|
|
41
|
-
: Expr
|
|
42
|
-
: Expr extends { nameAs: unknown } ?
|
|
43
|
-
`Is missing column name. Add .as('name')`
|
|
44
|
-
: Expr
|
|
45
|
-
|
|
46
|
-
type _checkIfExistsInResult<Result, Expr> =
|
|
47
|
-
Expr extends { nameAs: string } ?
|
|
48
|
-
Expr["nameAs"] extends keyof Result
|
|
49
|
-
? `'${Expr["nameAs"]}' already exists in result columns!`
|
|
50
|
-
: Expr
|
|
51
|
-
: Expr
|
|
52
|
-
|
|
53
|
-
type _checkThatTableIsReferenced<Tables, Expr> =
|
|
54
|
-
Expr extends { tableRef: string } ?
|
|
55
|
-
Expr["tableRef"] extends keyof Tables
|
|
56
|
-
? Expr
|
|
57
|
-
: `'${Expr["tableRef"]}' is not used in this query!`
|
|
58
|
-
: Expr
|
|
59
|
-
|
|
60
|
-
type isColumnOkToAdd<Result, Tables, ColumnExpressions> =
|
|
61
|
-
ColumnExpressions extends []
|
|
62
|
-
? ColumnExpressions
|
|
63
|
-
: ColumnExpressions extends [...(infer Rest), infer A]
|
|
64
|
-
? [...isColumnOkToAdd<Result, Tables, Rest>, _checkIfExistsInOtherFields<Rest, _checkIfExistsInResult<Result, _checkThatTableIsReferenced<Tables, A>>>]
|
|
65
|
-
: ColumnExpressions;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
// --------------------------------------------------------------------
|
|
1
|
+
import {WhereMethods} from "./S2Where";
|
|
2
|
+
import {Expr} from "../../SqlExpression";
|
|
3
|
+
import {AliasedTable, NotUsingWithPart} from "../../Types";
|
|
4
|
+
|
|
5
|
+
export interface ColumnsMethods<Result, Tables> {
|
|
6
|
+
|
|
7
|
+
distinct(): ColumnsMethods<Result, Tables>
|
|
8
|
+
|
|
9
|
+
allColumnsFrom<TableRef, Entity, Result2 = Result & Entity>(table: AliasedTable<string, TableRef, Entity, any, NotUsingWithPart>): ColumnsMethods<Result2, Tables> & WhereMethods<Result2, Tables>
|
|
10
|
+
|
|
11
|
+
one(): WhereMethods<Result & { one: 1 }, Tables>
|
|
12
|
+
|
|
13
|
+
columns<
|
|
14
|
+
TableRef,
|
|
15
|
+
Columns extends Expr<TableRef, string, any>[]
|
|
16
|
+
>(
|
|
17
|
+
//...columns: Columns - this will enable seeing sources of Result object properties.
|
|
18
|
+
...columns: isColumnOkToAdd<Result, Tables, Columns>
|
|
19
|
+
): WhereMethods<Result & ExtractObj<Columns>, Tables>
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// --------------------------------------------------------------------
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Take array of Col-s and convert to Record<key, value> & ... object.
|
|
27
|
+
*/
|
|
28
|
+
export type ExtractObj<Columns extends Expr<any, string, any>[]> = {
|
|
29
|
+
[K in Columns[number]['nameAs']]: Extract<Columns[number], { nameAs: K }>['type']
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
// --------------------------------------------------------------------
|
|
34
|
+
|
|
35
|
+
type _checkIfExistsInOtherFields<Rest extends any[], Expr> =
|
|
36
|
+
Rest extends []
|
|
37
|
+
? Expr
|
|
38
|
+
: Expr extends { nameAs: string } ?
|
|
39
|
+
Expr["nameAs"] extends (Rest extends { nameAs: infer A }[] ? A : never)
|
|
40
|
+
? `'${Expr["nameAs"]}' already exists in columns!`
|
|
41
|
+
: Expr
|
|
42
|
+
: Expr extends { nameAs: unknown } ?
|
|
43
|
+
`Is missing column name. Add .as('name')`
|
|
44
|
+
: Expr
|
|
45
|
+
|
|
46
|
+
type _checkIfExistsInResult<Result, Expr> =
|
|
47
|
+
Expr extends { nameAs: string } ?
|
|
48
|
+
Expr["nameAs"] extends keyof Result
|
|
49
|
+
? `'${Expr["nameAs"]}' already exists in result columns!`
|
|
50
|
+
: Expr
|
|
51
|
+
: Expr
|
|
52
|
+
|
|
53
|
+
type _checkThatTableIsReferenced<Tables, Expr> =
|
|
54
|
+
Expr extends { tableRef: string } ?
|
|
55
|
+
Expr["tableRef"] extends keyof Tables
|
|
56
|
+
? Expr
|
|
57
|
+
: `'${Expr["tableRef"]}' is not used in this query!`
|
|
58
|
+
: Expr
|
|
59
|
+
|
|
60
|
+
type isColumnOkToAdd<Result, Tables, ColumnExpressions> =
|
|
61
|
+
ColumnExpressions extends []
|
|
62
|
+
? ColumnExpressions
|
|
63
|
+
: ColumnExpressions extends [...(infer Rest), infer A]
|
|
64
|
+
? [...isColumnOkToAdd<Result, Tables, Rest>, _checkIfExistsInOtherFields<Rest, _checkIfExistsInResult<Result, _checkThatTableIsReferenced<Tables, A>>>]
|
|
65
|
+
: ColumnExpressions;
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
// --------------------------------------------------------------------
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
import {isTableReferenced, Key, SQL_BOOL} from "../../Types";
|
|
2
|
-
import {GroupByMethods} from "./S3GroupBy";
|
|
3
|
-
import {Expr} from "../../SqlExpression";
|
|
4
|
-
import {OrderByMethods} from "./S5OrderBy";
|
|
5
|
-
import {LimitMethods} from "./S6Limit";
|
|
6
|
-
import {ExecMethods} from "./S7Exec";
|
|
7
|
-
|
|
8
|
-
export interface WhereMethods<Result, Tables> {
|
|
9
|
-
|
|
10
|
-
noWhere(): GroupByMethods<Result, Tables> & OrderByMethods<Result, Tables> & LimitMethods<Result> & ExecMethods<Result>
|
|
11
|
-
|
|
12
|
-
where<
|
|
13
|
-
T1 extends string,
|
|
14
|
-
T2 extends string = never,
|
|
15
|
-
T3 extends string = never,
|
|
16
|
-
T4 extends string = never,
|
|
17
|
-
T5 extends string = never,
|
|
18
|
-
T6 extends string = never,
|
|
19
|
-
T7 extends string = never,
|
|
20
|
-
T8 extends string = never,
|
|
21
|
-
T9 extends string = never,
|
|
22
|
-
T10 extends string = never,
|
|
23
|
-
T11 extends string = never,
|
|
24
|
-
T12 extends string = never,
|
|
25
|
-
T13 extends string = never,
|
|
26
|
-
T14 extends string = never,
|
|
27
|
-
T15 extends string = never,
|
|
28
|
-
T = Tables
|
|
29
|
-
>(
|
|
30
|
-
c1: C<T, T1>,
|
|
31
|
-
c2?: C<T, T2>,
|
|
32
|
-
c3?: C<T, T3>,
|
|
33
|
-
c4?: C<T, T4>,
|
|
34
|
-
c5?: C<T, T5>,
|
|
35
|
-
c6?: C<T, T6>,
|
|
36
|
-
c7?: C<T, T7>,
|
|
37
|
-
c8?: C<T, T8>,
|
|
38
|
-
c9?: C<T, T9>,
|
|
39
|
-
c10?: C<T, T10>,
|
|
40
|
-
c11?: C<T, T11>,
|
|
41
|
-
c12?: C<T, T12>,
|
|
42
|
-
c13?: C<T, T13>,
|
|
43
|
-
c14?: C<T, T14>,
|
|
44
|
-
c15?: C<T, T15>,
|
|
45
|
-
): GroupByMethods<Result, Tables> & OrderByMethods<Result, Tables> & LimitMethods<Result> & ExecMethods<Result>
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
type C<Tables, T extends string> = isTableReferenced<Tables, Key<T>, Expr<T, unknown, SQL_BOOL>>
|
|
50
|
-
|
|
51
|
-
|
|
1
|
+
import {isTableReferenced, Key, SQL_BOOL} from "../../Types";
|
|
2
|
+
import {GroupByMethods} from "./S3GroupBy";
|
|
3
|
+
import {Expr} from "../../SqlExpression";
|
|
4
|
+
import {OrderByMethods} from "./S5OrderBy";
|
|
5
|
+
import {LimitMethods} from "./S6Limit";
|
|
6
|
+
import {ExecMethods} from "./S7Exec";
|
|
7
|
+
|
|
8
|
+
export interface WhereMethods<Result, Tables> {
|
|
9
|
+
|
|
10
|
+
noWhere(): GroupByMethods<Result, Tables> & OrderByMethods<Result, Tables> & LimitMethods<Result> & ExecMethods<Result>
|
|
11
|
+
|
|
12
|
+
where<
|
|
13
|
+
T1 extends string,
|
|
14
|
+
T2 extends string = never,
|
|
15
|
+
T3 extends string = never,
|
|
16
|
+
T4 extends string = never,
|
|
17
|
+
T5 extends string = never,
|
|
18
|
+
T6 extends string = never,
|
|
19
|
+
T7 extends string = never,
|
|
20
|
+
T8 extends string = never,
|
|
21
|
+
T9 extends string = never,
|
|
22
|
+
T10 extends string = never,
|
|
23
|
+
T11 extends string = never,
|
|
24
|
+
T12 extends string = never,
|
|
25
|
+
T13 extends string = never,
|
|
26
|
+
T14 extends string = never,
|
|
27
|
+
T15 extends string = never,
|
|
28
|
+
T = Tables
|
|
29
|
+
>(
|
|
30
|
+
c1: C<T, T1>,
|
|
31
|
+
c2?: C<T, T2>,
|
|
32
|
+
c3?: C<T, T3>,
|
|
33
|
+
c4?: C<T, T4>,
|
|
34
|
+
c5?: C<T, T5>,
|
|
35
|
+
c6?: C<T, T6>,
|
|
36
|
+
c7?: C<T, T7>,
|
|
37
|
+
c8?: C<T, T8>,
|
|
38
|
+
c9?: C<T, T9>,
|
|
39
|
+
c10?: C<T, T10>,
|
|
40
|
+
c11?: C<T, T11>,
|
|
41
|
+
c12?: C<T, T12>,
|
|
42
|
+
c13?: C<T, T13>,
|
|
43
|
+
c14?: C<T, T14>,
|
|
44
|
+
c15?: C<T, T15>,
|
|
45
|
+
): GroupByMethods<Result, Tables> & OrderByMethods<Result, Tables> & LimitMethods<Result> & ExecMethods<Result>
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
type C<Tables, T extends string> = isTableReferenced<Tables, Key<T>, Expr<T, unknown, SQL_BOOL>>
|
|
50
|
+
|
|
51
|
+
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import {AliasedTable, isColumnOkToUse, Key, NotUsingWithPart} from "../../Types";
|
|
2
|
-
import {HavingMethods} from "./S4Having";
|
|
3
|
-
import {Expr} from "../../SqlExpression";
|
|
4
|
-
import {OrderByMethods} from "./S5OrderBy";
|
|
5
|
-
import {LimitMethods} from "./S6Limit";
|
|
6
|
-
|
|
7
|
-
export interface GroupByMethods<Result, Tables> extends OrderByMethods<Result, Tables>, LimitMethods<Result> {
|
|
8
|
-
groupBy<
|
|
9
|
-
TableRef,
|
|
10
|
-
Columns extends Expr<TableRef, string | unknown, any>[]
|
|
11
|
-
>(
|
|
12
|
-
...items: isColumnOkToUse<Tables, Columns>
|
|
13
|
-
): HavingMethods<Result, Tables>
|
|
14
|
-
|
|
15
|
-
groupByF<
|
|
16
|
-
TableRef,
|
|
17
|
-
Columns extends Expr<TableRef, string | unknown, any>[]
|
|
18
|
-
>(
|
|
19
|
-
func: (columnsTable: AliasedTable<"(columns)", "(columns)", Result, object, NotUsingWithPart>) => isColumnOkToUse<Tables & Key<"(columns)">, Columns>
|
|
20
|
-
): HavingMethods<Result, Tables>
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
|
|
1
|
+
import {AliasedTable, isColumnOkToUse, Key, NotUsingWithPart} from "../../Types";
|
|
2
|
+
import {HavingMethods} from "./S4Having";
|
|
3
|
+
import {Expr} from "../../SqlExpression";
|
|
4
|
+
import {OrderByMethods} from "./S5OrderBy";
|
|
5
|
+
import {LimitMethods} from "./S6Limit";
|
|
6
|
+
|
|
7
|
+
export interface GroupByMethods<Result, Tables> extends OrderByMethods<Result, Tables>, LimitMethods<Result> {
|
|
8
|
+
groupBy<
|
|
9
|
+
TableRef,
|
|
10
|
+
Columns extends Expr<TableRef, string | unknown, any>[]
|
|
11
|
+
>(
|
|
12
|
+
...items: isColumnOkToUse<Tables, Columns>
|
|
13
|
+
): HavingMethods<Result, Tables>
|
|
14
|
+
|
|
15
|
+
groupByF<
|
|
16
|
+
TableRef,
|
|
17
|
+
Columns extends Expr<TableRef, string | unknown, any>[]
|
|
18
|
+
>(
|
|
19
|
+
func: (columnsTable: AliasedTable<"(columns)", "(columns)", Result, object, NotUsingWithPart>) => isColumnOkToUse<Tables & Key<"(columns)">, Columns>
|
|
20
|
+
): HavingMethods<Result, Tables>
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|