import type { AnyDB } from "../databases";
import { RawFragment } from "./RawFragment";
import type { database, noTableOrViewRequired, oldValues, outerJoinAlias, outerJoinDatabase, outerJoinTableOrView, resolvedShape, tableOrView, tableOrViewAlias, tableOrViewCustomName, tableOrViewRef, tableOrViewRefType, type, valuesForInsert } from "./symbols";
export interface ITableOrViewRef<DB extends AnyDB> {
    [database]: DB;
    [tableOrViewRefType]: 'tableOrViewRef';
}
export interface OfDB<DB extends AnyDB> {
    [database]: DB;
}
export interface ITableOrView<REF extends ITableOrViewRef<AnyDB>> extends OfDB<REF[typeof database]> {
    [tableOrViewRef]: REF;
}
export interface ITableOrViewOf<DB extends AnyDB, REF extends ITableOrViewRef<DB>> extends ITableOrView<REF> {
}
interface Column {
    [type]: 'column';
}
export interface HasIsValue {
    _isValue(value: any): boolean;
}
export interface HasAddWiths {
    __addWiths(sqlBuilder: HasIsValue, withs: Array<IWithView<any>>): void;
    __registerTableOrView(sqlBuilder: HasIsValue, requiredTablesOrViews: Set<ITableOrView<any>>): void;
    __registerRequiredColumn(sqlBuilder: HasIsValue, requiredColumns: Set<Column>, onlyForTablesOrViews: Set<ITableOrView<any>>): void;
    __getOldValues(sqlBuilder: HasIsValue): ITableOrView<any> | undefined;
    __getValuesForInsert(sqlBuilder: HasIsValue): ITableOrView<any> | undefined;
    __isAllowed(sqlBuilder: HasIsValue): boolean;
}
export declare function __addWiths(value: any, sqlBuilder: HasIsValue, withs: Array<IWithView<any>>): void;
export declare function __registerTableOrView(value: any, sqlBuilder: HasIsValue, requiredTablesOrViews: Set<ITableOrView<any>>): void;
export declare function __registerRequiredColumn(value: any, sqlBuilder: HasIsValue, requiredColumns: Set<Column>, onlyForTablesOrViews: Set<ITableOrView<any>>): void;
export declare function __getOldValues(value: any, sqlBuilder: HasIsValue): ITableOrView<any> | undefined;
export declare function __getValuesForInsert(value: any, sqlBuilder: HasIsValue): ITableOrView<any> | undefined;
export declare function __isAllowed(value: any, sqlBuilder: HasIsValue): boolean;
export interface __ITableOrViewPrivate extends HasAddWiths {
    __name: string;
    __as?: string;
    __type: 'table' | 'view' | 'with' | 'values';
    __forUseInLeftJoin?: boolean;
    __template?: RawFragment<any>;
    __customizationName?: string;
    __oldValues?: boolean;
    __valuesForInsert?: boolean;
    __hasExternalDependencies?: boolean;
}
export declare function __getTableOrViewPrivate(table: ITableOrView<any> | OuterJoinSource<any, any>): __ITableOrViewPrivate;
export interface ITable<REF extends ITableOrViewRef<AnyDB>> extends ITableOrView<REF> {
    [type]: 'table';
}
export interface ITableOf<DB extends AnyDB, REF extends ITableOrViewRef<DB>> extends ITable<REF> {
}
export interface ITableOfDB<DB extends AnyDB> extends ITable<ITableOrViewRef<DB>> {
}
export interface IView<REF extends ITableOrViewRef<AnyDB>> extends ITableOrView<REF> {
    [type]: 'view';
}
export interface IValues<REF extends ITableOrViewRef<AnyDB>> extends ITableOrView<REF> {
    [type]: 'values';
}
export interface IWithView<REF extends ITableOrViewRef<AnyDB>> extends ITableOrView<REF> {
    [type]: 'with';
}
export interface NoTableOrViewRequired<DB extends AnyDB> extends ITableOrViewRef<DB> {
    [noTableOrViewRequired]: 'NoTableOrViewRequired';
}
export interface NoTableOrViewRequiredView<DB extends AnyDB> extends IView<NoTableOrViewRequired<DB>> {
    [noTableOrViewRequired]: 'NoTableOrViewRequiredView';
}
export interface OLD<REF extends ITableOrViewRef<AnyDB>> extends ITableOrViewRef<REF[typeof database]> {
    [tableOrViewRef]: REF;
    [oldValues]: 'OldValues';
}
export interface OldTableOrView<TABLE_OR_VIEW extends ITableOrView<any>> extends ITableOrView<OLD<TABLE_OR_VIEW[typeof tableOrViewRef]>> {
    [tableOrView]: TABLE_OR_VIEW;
    [oldValues]: 'OldValuesTableOrView';
}
export interface VALUES_FOR_INSERT<REF extends ITableOrViewRef<AnyDB>> extends ITableOrViewRef<REF[typeof database]> {
    [tableOrViewRef]: REF;
    [valuesForInsert]: 'ValuesForInsert';
}
export interface ValuesForInsertTableOrView<TABLE_OR_VIEW extends ITableOrView<any>> extends ITableOrView<OLD<TABLE_OR_VIEW[typeof tableOrViewRef]>> {
    [tableOrView]: TABLE_OR_VIEW;
    [valuesForInsert]: 'ValuesForInsertTableOrView';
}
export interface TABLE_OR_VIEW_ALIAS<REF extends ITableOrViewRef<AnyDB>, ALIAS> extends ITableOrViewRef<REF[typeof database]> {
    [tableOrViewAlias]: ALIAS;
    [tableOrViewRef]: REF;
}
export interface CUSTOMIZED_TABLE_OR_VIEW<REF extends ITableOrViewRef<AnyDB>, NAME> extends ITableOrViewRef<REF[typeof database]> {
    [tableOrViewCustomName]: NAME;
    [tableOrViewRef]: REF;
}
export interface TableOrViewAlias<TABLE_OR_VIEW extends ITableOrView<any>, ALIAS> extends ITableOrView<TABLE_OR_VIEW_ALIAS<TABLE_OR_VIEW[typeof tableOrViewRef], ALIAS>> {
    [tableOrView]: TABLE_OR_VIEW;
    [tableOrViewAlias]: ALIAS;
}
export interface OuterJoinSource<TABLE_OR_VIEW extends ITableOrView<any>, ALIAS> {
    [outerJoinDatabase]: TABLE_OR_VIEW[typeof database];
    [outerJoinTableOrView]: TABLE_OR_VIEW;
    [outerJoinAlias]: ALIAS;
}
export interface OUTER_JOIN_SOURCE<REF extends ITableOrViewRef<AnyDB>, ALIAS> extends ITableOrViewRef<REF[typeof database]> {
    [outerJoinDatabase]: REF[typeof database];
    [outerJoinTableOrView]: REF;
    [outerJoinAlias]: ALIAS;
}
export interface ITableOrViewOuterJoin<TABLE_OR_VIEW extends ITableOrView<any>, ALIAS> extends ITableOrView<OUTER_JOIN_SOURCE<TABLE_OR_VIEW[typeof tableOrViewRef], ALIAS>> {
    [tableOrView]: TABLE_OR_VIEW;
    [tableOrViewAlias]: ALIAS;
    [outerJoinAlias]: ALIAS;
}
export interface ResolvedShape<TABLE extends ITableOrView<any>> extends ITableOfDB<TABLE[typeof database]> {
    [resolvedShape]: 'resolvedShape';
}
export {};
