import { Association, AssociationType } from './Association';
import { Select } from '@fewer/sq';
export declare const enum INTERNAL_TYPES {
    ALL_FIELDS = "@@ALL_FIELDS",
    RESOLVED_TYPE = "@@RESOLVED_TYPE",
    INTERNAL_TYPE = "@@INTERNAL_TYPE",
    SCHEMA_TYPE = "@@SCHEMA_TYPE",
    JOINS = "@@JOINS",
    TO_SQ_SELECT = "@@TO_SQ_SELECT"
}
export declare type CreateSelectionSet<Original, Additional> = Original extends INTERNAL_TYPES.ALL_FIELDS ? Additional : Original | Additional;
export interface Associations {
    [key: string]: Association;
}
declare type UnrollAssociation<T extends Association> = WhereType<T[INTERNAL_TYPES.SCHEMA_TYPE], T[INTERNAL_TYPES.JOINS]>;
declare type WhereForType<T> = {
    [P in keyof T]?: NonNullable<T[P]> | NonNullable<T[P]>[];
};
declare type Merge<T extends object> = {
    [K in keyof T]: T[K];
};
export declare type WhereType<Root, Assoc extends Associations = {}> = Merge<WhereForType<Root> & {
    [P in keyof Assoc]?: UnrollAssociation<Assoc[P]>;
}>;
export declare type Subset<Root, Keys, AssociationKeys extends keyof Root> = [Keys] extends [INTERNAL_TYPES.ALL_FIELDS] ? Root : {
    [P in ((keyof Root) & Keys) | AssociationKeys]: Root[P];
};
export declare type ResolveAssociations<Assoc extends Associations> = {
    [P in keyof Assoc]: [Assoc[P]['type']] extends [AssociationType.HAS_MANY] ? Assoc[P][INTERNAL_TYPES.RESOLVED_TYPE][] : Assoc[P][INTERNAL_TYPES.RESOLVED_TYPE];
};
export interface CommonQuery<Type, Assoc extends Associations> {
    pluck(...columns: (keyof Type)[]): any;
    pluckAs(name: keyof Type, alias: string): any;
    where(wheres: WhereType<Type, Assoc>): any;
    limit(amount: number): any;
    offset(amount: number): any;
    order(): any;
    load(name: string, association: Association): any;
    join(name: string, association: Association): any;
    [INTERNAL_TYPES.TO_SQ_SELECT](): Select;
}
export {};
