-
Notifications
You must be signed in to change notification settings - Fork 290
/
Copy pathjoin-parser.ts
70 lines (63 loc) · 1.98 KB
/
join-parser.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { JoinNode, JoinType } from '../operation-node/join-node.js'
import { AnyColumn, AnyColumnWithTable } from '../util/type-utils.js'
import {
TableExpression,
parseTableExpression,
ExtractAliasFromTableExpression,
TableExpressionDatabase,
} from './table-parser.js'
import { parseReferenceFilter } from './filter-parser.js'
import { JoinBuilder } from '../query-builder/join-builder.js'
import { ParseContext } from './parse-context.js'
export type JoinReferenceExpression<DB, TB extends keyof DB, F> =
| AnyJoinColumn<DB, TB, F>
| AnyJoinColumnWithTable<DB, TB, F>
export type JoinCallbackExpression<DB, TB extends keyof DB, F> = (
join: JoinBuilder<
TableExpressionDatabase<DB, F>,
TB | ExtractAliasFromTableExpression<DB, F>
>
) => JoinBuilder<any, any>
type AnyJoinColumn<DB, TB extends keyof DB, F> = AnyColumn<
TableExpressionDatabase<DB, F>,
TB | ExtractAliasFromTableExpression<DB, F>
>
type AnyJoinColumnWithTable<DB, TB extends keyof DB, F> = AnyColumnWithTable<
TableExpressionDatabase<DB, F>,
TB | ExtractAliasFromTableExpression<DB, F>
>
export function parseJoin(
ctx: ParseContext,
joinType: JoinType,
args: any[]
): JoinNode {
if (args.length === 3) {
return parseSingleOnJoin(ctx, joinType, args[0], args[1], args[2])
} else if (args.length === 2) {
return parseCallbackJoin(ctx, joinType, args[0], args[1])
} else {
throw new Error('not implemented')
}
}
function parseCallbackJoin(
ctx: ParseContext,
joinType: JoinType,
from: TableExpression<any, any>,
callback: JoinCallbackExpression<any, any, any>
): JoinNode {
const joinBuilder = callback(ctx.createJoinBuilder(joinType, from))
return joinBuilder.toOperationNode()
}
function parseSingleOnJoin(
ctx: ParseContext,
joinType: JoinType,
from: TableExpression<any, any>,
lhsColumn: string,
rhsColumn: string
): JoinNode {
return JoinNode.createWithOn(
joinType,
parseTableExpression(ctx, from),
parseReferenceFilter(ctx, lhsColumn, '=', rhsColumn)
)
}