Skip to content
This repository was archived by the owner on May 18, 2024. It is now read-only.
This repository was archived by the owner on May 18, 2024. It is now read-only.

Support conditional application level join #59

@samchon

Description

@samchon

Support conditional app join through those AppJoinBuilder and JsonSelectBuilder classes.

To support the conditional app join, complement #57 and refactor AppJoinBuilder and JsonSelectBuilder classes like below:

export class AppJoinBuilder<Mine extends object>
{
    // TUPLE TYPE
    public join<Field extends AppJoinBuilder.Key<Mine>>
        (
            target: Field | 
            [
                Field, 
                (stmt: orm.SelectQueryBuilder<Relationship.TargetType<Mine, Field>>) => void
            ],
            closure?: AppJoinBuilder.Closure<Relationship.TargetType<Mine, Field>>
        ): AppJoinBuilder<Relationship.TargetType<Mine, Field>>;

    // METHOD OVERRIDING
    public set<Field extends AppJoinBuilder.Key<Mine>>
        (
            field: Field,
            builder: AppJoinBuilder<Relationship.TargetType<Mine, Field>>,
        ): this;
    public set<Field extends AppJoinBuilder.Key<Mine>>
        (
            field: Field,
            filter: (stmt: orm.SelectQueryBuilder<Relationship.TargetType<Mine, any>>) => void,
            builder: AppJoinBuilder<Relationship.TargetType<Mine, Field>>
        ): this;
}
export namespace AppJoinBuilder
{
    export type Initialized<Mine extends object> = OmitNever<
    {
        [P in keyof Mine]: Mine[P] extends Relationship<infer Target>
            ? (AppJoinBuilder<Target> | undefined | Closure<Target> | "join") 
            | [
                (AppJoinBuilder<Target> | undefined | Closure<Target> | "join"), 
                (condition: orm.SelectQueryBuilder<Target>) => void
            ] : never;
    }>;
}

export namespace JsonSelectBuilder
{
    export type Input<Mine extends object> = Partial<OmitNever<
    {
        [P in keyof Mine]: Mine[P] extends Relationship<infer Target>
            ? Mine[P] extends BelongsCommon<Target, any, infer TargetOptions>
                ? TargetOptions extends { nullable: true }
                    ? Same<Mine, Target> extends true
                        ? "recursive" | Tuplize<Target, "join"> | DEFAULT | undefined
                        : Tuplize<Target, JsonSelectBuilder<Target, any, any>> | Tuplize<Target, "join"> | DEFAULT | undefined
                    : Same<Mine, Target> extends true 
                        ? "recursive" | Tuplize<Target, "join"> | DEFAULT | undefined
                        : Tuplize<Target, JsonSelectBuilder<Target, any, any>> | Tuplize<Target, "join"> | DEFAULT | undefined
            : Same<Mine, Target> extends true
                ? "recursive" | Tuplize<Target, "join"> | undefined
                : Tuplize<Target, JsonSelectBuilder<Target, any, any>> | Tuplize<Target, "join"> | undefined
            : never
    }>>;
    type Tuplize<Target extends object, Value> 
        = Value 
        | [Value, (stmt: orm.SelectQueryBuilder<Target>) => void];
}

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions