Skip to content

Commit 7dc73ca

Browse files
committed
fix more recursion problems in join types
1 parent 3216a2a commit 7dc73ca

File tree

4 files changed

+395
-424
lines changed

4 files changed

+395
-424
lines changed

src/query-builder/delete-query-builder.ts

Lines changed: 94 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import {
2929
AnyRawBuilder,
3030
MergePartial,
3131
Nullable,
32-
NullableValues,
3332
SingleResultType,
3433
} from '../util/type-utils.js'
3534
import { preventAwait } from '../util/prevent-await.js'
@@ -656,170 +655,156 @@ export interface DeleteQueryBuilderProps {
656655
readonly executor: QueryExecutor
657656
}
658657

659-
type DeleteQueryBuilderWithInnerJoin<
658+
export type DeleteQueryBuilderWithInnerJoin<
660659
DB,
661660
TB extends keyof DB,
662661
O,
663662
TE extends TableExpression<DB, TB>
664663
> = TE extends `${infer T} as ${infer A}`
665664
? T extends keyof DB
666-
? DeleteQueryBuilder<Omit<DB, A> & Record<A, DB[T]>, Exclude<TB, A> | A, O>
665+
? InnerJoinedBuilder<DB, TB, O, A, DB[T]>
667666
: never
668667
: TE extends keyof DB
669668
? DeleteQueryBuilder<DB, TB | TE, O>
670669
: TE extends AliasedQueryBuilder<any, any, infer QO, infer QA>
671-
? DeleteQueryBuilder<Omit<DB, QA> & Record<QA, QO>, Exclude<TB, QA> | QA, O>
670+
? InnerJoinedBuilder<DB, TB, O, QA, QO>
672671
: TE extends (qb: any) => AliasedQueryBuilder<any, any, infer QO, infer QA>
673-
? DeleteQueryBuilder<Omit<DB, QA> & Record<QA, QO>, Exclude<TB, QA> | QA, O>
672+
? InnerJoinedBuilder<DB, TB, O, QA, QO>
674673
: TE extends AliasedRawBuilder<infer RO, infer RA>
675-
? DeleteQueryBuilder<Omit<DB, RA> & Record<RA, RO>, Exclude<TB, RA> | RA, O>
674+
? InnerJoinedBuilder<DB, TB, O, RA, RO>
676675
: TE extends (qb: any) => AliasedRawBuilder<infer RO, infer RA>
677-
? DeleteQueryBuilder<Omit<DB, RA> & Record<RA, RO>, Exclude<TB, RA> | RA, O>
676+
? InnerJoinedBuilder<DB, TB, O, RA, RO>
678677
: never
679678

679+
type InnerJoinedBuilder<
680+
DB,
681+
TB extends keyof DB,
682+
O,
683+
A extends string,
684+
R
685+
> = A extends keyof DB
686+
? DeleteQueryBuilder<InnerJoinedDB<DB, A, R>, TB | A, O>
687+
: // Much faster non-recursive solution for the simple case.
688+
DeleteQueryBuilder<DB & Record<A, R>, TB | A, O>
689+
690+
type InnerJoinedDB<DB, A extends string, R> = {
691+
[C in keyof DB | A]: C extends A ? R : C extends keyof DB ? DB[C] : never
692+
}
693+
680694
export type DeleteQueryBuilderWithLeftJoin<
681695
DB,
682696
TB extends keyof DB,
683697
O,
684698
TE extends TableExpression<DB, TB>
685699
> = TE extends `${infer T} as ${infer A}`
686700
? T extends keyof DB
687-
? DeleteQueryBuilder<
688-
Omit<DB, A> & Record<A, Nullable<DB[T]>>,
689-
Exclude<TB, A> | A,
690-
O
691-
>
701+
? LeftJoinedBuilder<DB, TB, O, A, DB[T]>
692702
: never
693703
: TE extends keyof DB
694-
? DeleteQueryBuilder<
695-
Omit<DB, TE> & Record<TE, Nullable<DB[TE]>>,
696-
Exclude<TB, TE> | TE,
697-
O
698-
>
704+
? LeftJoinedBuilder<DB, TB, O, TE, DB[TE]>
699705
: TE extends AliasedQueryBuilder<any, any, infer QO, infer QA>
700-
? DeleteQueryBuilder<
701-
Omit<DB, QA> & Record<QA, Nullable<QO>>,
702-
Exclude<TB, QA> | QA,
703-
O
704-
>
706+
? LeftJoinedBuilder<DB, TB, O, QA, QO>
705707
: TE extends (qb: any) => AliasedQueryBuilder<any, any, infer QO, infer QA>
706-
? DeleteQueryBuilder<
707-
Omit<DB, QA> & Record<QA, Nullable<QO>>,
708-
Exclude<TB, QA> | QA,
709-
O
710-
>
708+
? LeftJoinedBuilder<DB, TB, O, QA, QO>
711709
: TE extends AliasedRawBuilder<infer RO, infer RA>
712-
? DeleteQueryBuilder<
713-
Omit<DB, RA> & Record<RA, Nullable<RO>>,
714-
Exclude<TB, RA> | RA,
715-
O
716-
>
710+
? LeftJoinedBuilder<DB, TB, O, RA, RO>
717711
: TE extends (qb: any) => AliasedRawBuilder<infer RO, infer RA>
718-
? DeleteQueryBuilder<
719-
Omit<DB, RA> & Record<RA, Nullable<RO>>,
720-
Exclude<TB, RA> | RA,
721-
O
722-
>
712+
? LeftJoinedBuilder<DB, TB, O, RA, RO>
723713
: never
724714

715+
type LeftJoinedBuilder<
716+
DB,
717+
TB extends keyof DB,
718+
O,
719+
A extends keyof any,
720+
R
721+
> = A extends keyof DB
722+
? DeleteQueryBuilder<LeftJoinedDB<DB, A, R>, TB | A, O>
723+
: // Much faster non-recursive solution for the simple case.
724+
DeleteQueryBuilder<DB & Record<A, Nullable<R>>, TB | A, O>
725+
726+
type LeftJoinedDB<DB, A extends keyof any, R> = {
727+
[C in keyof DB | A]: C extends A
728+
? Nullable<R>
729+
: C extends keyof DB
730+
? DB[C]
731+
: never
732+
}
733+
725734
export type DeleteQueryBuilderWithRightJoin<
726735
DB,
727736
TB extends keyof DB,
728737
O,
729738
TE extends TableExpression<DB, TB>
730739
> = TE extends `${infer T} as ${infer A}`
731740
? T extends keyof DB
732-
? DeleteQueryBuilder<
733-
Omit<DB, TB | A> & NullableValues<Pick<DB, TB>> & Record<A, DB[T]>,
734-
TB | A,
735-
O
736-
>
741+
? RightJoinedBuilder<DB, TB, O, A, DB[T]>
737742
: never
738743
: TE extends keyof DB
739-
? DeleteQueryBuilder<
740-
Omit<DB, TB | TE> & NullableValues<Pick<DB, TB>> & Pick<DB, TE>,
741-
TB | TE,
742-
O
743-
>
744+
? RightJoinedBuilder<DB, TB, O, TE, DB[TE]>
744745
: TE extends AliasedQueryBuilder<any, any, infer QO, infer QA>
745-
? DeleteQueryBuilder<
746-
Omit<DB, TB | QA> & NullableValues<Pick<DB, TB>> & Record<QA, QO>,
747-
TB | QA,
748-
O
749-
>
746+
? RightJoinedBuilder<DB, TB, O, QA, QO>
750747
: TE extends (qb: any) => AliasedQueryBuilder<any, any, infer QO, infer QA>
751-
? DeleteQueryBuilder<
752-
Omit<DB, TB | QA> & NullableValues<Pick<DB, TB>> & Record<QA, QO>,
753-
TB | QA,
754-
O
755-
>
748+
? RightJoinedBuilder<DB, TB, O, QA, QO>
756749
: TE extends AliasedRawBuilder<infer RO, infer RA>
757-
? DeleteQueryBuilder<
758-
Omit<DB, TB | RA> & NullableValues<Pick<DB, TB>> & Record<RA, RO>,
759-
TB | RA,
760-
O
761-
>
750+
? RightJoinedBuilder<DB, TB, O, RA, RO>
762751
: TE extends (qb: any) => AliasedRawBuilder<infer RO, infer RA>
763-
? DeleteQueryBuilder<
764-
Omit<DB, TB | RA> & NullableValues<Pick<DB, TB>> & Record<RA, RO>,
765-
TB | RA,
766-
O
767-
>
752+
? RightJoinedBuilder<DB, TB, O, RA, RO>
768753
: never
769754

755+
type RightJoinedBuilder<
756+
DB,
757+
TB extends keyof DB,
758+
O,
759+
A extends keyof any,
760+
R
761+
> = DeleteQueryBuilder<RightJoinedDB<DB, TB, A, R>, TB | A, O>
762+
763+
type RightJoinedDB<DB, TB extends keyof DB, A extends keyof any, R> = {
764+
[C in keyof DB | A]: C extends A
765+
? R
766+
: C extends TB
767+
? Nullable<DB[C]>
768+
: C extends keyof DB
769+
? DB[C]
770+
: never
771+
}
772+
770773
export type DeleteQueryBuilderWithFullJoin<
771774
DB,
772775
TB extends keyof DB,
773776
O,
774777
TE extends TableExpression<DB, TB>
775778
> = TE extends `${infer T} as ${infer A}`
776779
? T extends keyof DB
777-
? DeleteQueryBuilder<
778-
Omit<DB, TB | A> &
779-
NullableValues<Pick<DB, TB>> &
780-
Record<A, Nullable<DB[T]>>,
781-
TB | A,
782-
O
783-
>
780+
? OuterJoinedBuilder<DB, TB, O, A, DB[T]>
784781
: never
785782
: TE extends keyof DB
786-
? DeleteQueryBuilder<
787-
Omit<DB, TB | TE> &
788-
NullableValues<Pick<DB, TB>> &
789-
NullableValues<Pick<DB, TE>>,
790-
TB | TE,
791-
O
792-
>
783+
? OuterJoinedBuilder<DB, TB, O, TE, DB[TE]>
793784
: TE extends AliasedQueryBuilder<any, any, infer QO, infer QA>
794-
? DeleteQueryBuilder<
795-
Omit<DB, TB | QA> &
796-
NullableValues<Pick<DB, TB>> &
797-
Record<QA, Nullable<QO>>,
798-
TB | QA,
799-
O
800-
>
785+
? OuterJoinedBuilder<DB, TB, O, QA, QO>
801786
: TE extends (qb: any) => AliasedQueryBuilder<any, any, infer QO, infer QA>
802-
? DeleteQueryBuilder<
803-
Omit<DB, TB | QA> &
804-
NullableValues<Pick<DB, TB>> &
805-
Record<QA, Nullable<QO>>,
806-
TB | QA,
807-
O
808-
>
787+
? OuterJoinedBuilder<DB, TB, O, QA, QO>
809788
: TE extends AliasedRawBuilder<infer RO, infer RA>
810-
? DeleteQueryBuilder<
811-
Omit<DB, TB | RA> &
812-
NullableValues<Pick<DB, TB>> &
813-
Record<RA, Nullable<RO>>,
814-
TB | RA,
815-
O
816-
>
789+
? OuterJoinedBuilder<DB, TB, O, RA, RO>
817790
: TE extends (qb: any) => AliasedRawBuilder<infer RO, infer RA>
818-
? DeleteQueryBuilder<
819-
Omit<DB, TB | RA> &
820-
NullableValues<Pick<DB, TB>> &
821-
Record<RA, Nullable<RO>>,
822-
TB | RA,
823-
O
824-
>
791+
? OuterJoinedBuilder<DB, TB, O, RA, RO>
825792
: never
793+
794+
type OuterJoinedBuilder<
795+
DB,
796+
TB extends keyof DB,
797+
O,
798+
A extends keyof any,
799+
R
800+
> = DeleteQueryBuilder<OuterJoinedBuilderDB<DB, TB, A, R>, TB | A, O>
801+
802+
type OuterJoinedBuilderDB<DB, TB extends keyof DB, A extends keyof any, R> = {
803+
[C in keyof DB | A]: C extends A
804+
? Nullable<R>
805+
: C extends TB
806+
? Nullable<DB[C]>
807+
: C extends keyof DB
808+
? DB[C]
809+
: never
810+
}

0 commit comments

Comments
 (0)