import type { HasSql, HasTarget } from '../Internal.js'; import type { MakeNullable, SelectionInput, SelectionRow } from '../Selection.js'; import type { Sql } from '../Sql.js'; import type { Table, TableDefinition, TableFields, TableInsert, TableUpdate } from '../Table.js'; import type { Expand } from '../Types.js'; import type { Input } from '../expr/Input.js'; import type { CTE } from './CTE.js'; export interface InnerJoin { innerJoin: Target; on: HasSql; } export interface LeftJoin { leftJoin: Target; on: HasSql; } export interface RightJoin { rightJoin: Target; on: HasSql; } export interface FullJoin { fullJoin: Target; on: HasSql; } export interface CrossJoin { crossJoin: Target; on: HasSql; } export type Join = InnerJoin | LeftJoin | RightJoin | FullJoin | CrossJoin; export type JoinOp = 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin' | 'crossJoin'; export interface QueryBase { with?: Array; withRecursive?: Array; } interface SelectBase { where?: HasSql; distinct?: boolean; distinctOn?: Array; groupBy?: Array; having?: HasSql | ((input: Returning) => HasSql); } export interface ResultModifiers { orderBy?: Array; limit?: Input; offset?: Input; } export type FromGuard = Target | [Target, ...Array>]; interface SelectionBase extends SelectBase { select: Returning; from?: FromGuard; } export interface SelectionQuery extends SelectionBase, QueryBase, ResultModifiers { } interface FromBase extends SelectBase { from: Target; } export interface FromQuery extends FromBase, QueryBase, ResultModifiers { } type FoldJoins, Result> = T extends [ infer Join, ...infer Joins ] ? FoldJoins> ? Result & MakeNullable>> : Join extends RightJoin> ? MakeNullable & Record> : Join extends InnerJoin> ? Result & Record> : Join extends FullJoin> ? MakeNullable & MakeNullable>> : Result> : Result; export type FromRow = Target extends [ Table, ...infer Joins ] ? Joins['length'] extends 0 ? TableFields : Expand>>> : SelectionRow; export type Union = { union: SelectQuery; } | { unionAll: SelectQuery; } | { intersect: SelectQuery; } | { intersectAll: SelectQuery; } | { except: SelectQuery; } | { exceptAll: SelectQuery; }; export type UnionOp = 'union' | 'unionAll' | 'intersect' | 'intersectAll' | 'except' | 'exceptAll'; export type CompoundSelect = [ SelectQuery, ...Array> ]; export interface UnionQuery extends QueryBase, ResultModifiers { select: CompoundSelect; } export interface SelectQuery extends SelectionQuery { } export interface OnConflict { target: HasSql | Array; targetWhere?: HasSql; } export interface OnConflictSet { set: TableUpdate; } export interface OnConflictUpdate extends OnConflict, OnConflictSet { where?: HasSql; } export type Conflict = { conflictDoNothing: true | OnConflict; } | { conflictDoUpdate: OnConflictUpdate; } | { duplicateKeyUpdate: OnConflictSet; }; export interface InsertQuery extends Partial>, QueryBase, ResultModifiers { insert: Table; values?: TableInsert | Array>; returning?: Returning; on?: Array>; } export interface DeleteQuery extends QueryBase, ResultModifiers { delete: Table; where?: HasSql; returning?: Returning; } export interface UpdateQuery extends QueryBase, ResultModifiers { update: Table; set?: TableUpdate; where?: HasSql; returning?: Returning; } export type Query = SelectionQuery | FromQuery | InsertQuery | DeleteQuery | UpdateQuery; export {};