import type { GelColumn } from "../columns/index.js"; import type { GelTable, GelTableWithColumns } from "../table.js"; import type { GelViewBase } from "../view-base.js"; import type { GelViewWithSelection } from "../view.js"; import type { SelectedFields as SelectedFieldsBase, SelectedFieldsFlat as SelectedFieldsFlatBase, SelectedFieldsOrdered as SelectedFieldsOrderedBase } from "../../operations.js"; import type { TypedQueryBuilder } from "../../query-builders/query-builder.js"; import type { AppendToNullabilityMap, AppendToResult, BuildSubquerySelection, GetSelectTableName, JoinNullability, JoinType, MapColumnsToTableAlias, SelectMode, SelectResult, SetOperator } from "../../query-builders/select.types.js"; import type { ColumnsSelection, Placeholder, SQL, SQLWrapper, View } from "../../sql/sql.js"; import type { Subquery } from "../../subquery.js"; import type { Table, UpdateTableConfig } from "../../table.js"; import type { Assume, ValidateShape, ValueOrArray } from "../../utils.js"; import type { GelPreparedQuery, PreparedQueryConfig } from "../session.js"; import type { GelSelectBase, GelSelectQueryBuilderBase } from "./select.js"; export interface GelSelectJoinConfig { on: SQL | undefined; table: GelTable | Subquery | GelViewBase | SQL; alias: string | undefined; joinType: JoinType; lateral?: boolean; } export type BuildAliasTable = TTable extends Table ? GelTableWithColumns; }>> : TTable extends View ? GelViewWithSelection> : never; export interface GelSelectConfig { withList?: Subquery[]; fields: Record; fieldsFlat?: SelectedFieldsOrdered; where?: SQL; having?: SQL; table: GelTable | Subquery | GelViewBase | SQL; limit?: number | Placeholder; offset?: number | Placeholder; joins?: GelSelectJoinConfig[]; orderBy?: (GelColumn | SQL | SQL.Aliased)[]; groupBy?: (GelColumn | SQL | SQL.Aliased)[]; lockingClause?: { strength: LockStrength; config: LockConfig; }; distinct?: boolean | { on: (GelColumn | SQLWrapper)[]; }; setOperators: { rightSelect: TypedQueryBuilder; type: SetOperator; isAll: boolean; orderBy?: (GelColumn | SQL | SQL.Aliased)[]; limit?: number | Placeholder; offset?: number | Placeholder; }[]; } export type GelSelectJoin = GetSelectTableName> = T extends any ? GelSelectWithout : never, T['_']['selectMode']>, T['_']['selectMode'] extends 'partial' ? T['_']['selectMode'] : 'multiple', AppendToNullabilityMap, T['_']['dynamic'], T['_']['excludedMethods']>, TDynamic, T['_']['excludedMethods']> : never; export type GelSelectJoinFn = = GetSelectTableName>(table: TJoinedTable, on: ((aliases: T['_']['selection']) => SQL | undefined) | SQL | undefined) => GelSelectJoin; export type GelSelectCrossJoinFn = = GetSelectTableName>(table: TJoinedTable) => GelSelectJoin; export type SelectedFieldsFlat = SelectedFieldsFlatBase; export type SelectedFields = SelectedFieldsBase; export type SelectedFieldsOrdered = SelectedFieldsOrderedBase; export type LockStrength = 'update' | 'no key update' | 'share' | 'key share'; export type LockConfig = { of?: ValueOrArray; } & ({ noWait: true; skipLocked?: undefined; } | { noWait?: undefined; skipLocked: true; } | { noWait?: undefined; skipLocked?: undefined; }); export interface GelSelectHKTBase { tableName: string | undefined; selection: unknown; selectMode: SelectMode; nullabilityMap: unknown; dynamic: boolean; excludedMethods: string; result: unknown; selectedFields: unknown; _type: unknown; } export type GelSelectKind, TDynamic extends boolean, TExcludedMethods extends string, TResult = SelectResult[], TSelectedFields = BuildSubquerySelection> = (T & { tableName: TTableName; selection: TSelection; selectMode: TSelectMode; nullabilityMap: TNullabilityMap; dynamic: TDynamic; excludedMethods: TExcludedMethods; result: TResult; selectedFields: TSelectedFields; })['_type']; export interface GelSelectQueryBuilderHKT extends GelSelectHKTBase { _type: GelSelectQueryBuilderBase, this['selectMode'], Assume>, this['dynamic'], this['excludedMethods'], Assume, Assume>; } export interface GelSelectHKT extends GelSelectHKTBase { _type: GelSelectBase, this['selectMode'], Assume>, this['dynamic'], this['excludedMethods'], Assume, Assume>; } export type CreateGelSelectFromBuilderMode = TBuilderMode extends 'db' ? GelSelectBase : GelSelectQueryBuilderBase; export type GelSetOperatorExcludedMethods = 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin' | 'where' | 'having' | 'groupBy' | 'for'; export type GelSelectWithout = TDynamic extends true ? T : Omit, TResetExcluded extends true ? K : T['_']['excludedMethods'] | K>; export type GelSelectPrepare = GelPreparedQuery; export type GelSelectDynamic = GelSelectKind; export type GelSelectQueryBuilder = Record, TResult extends any[] = unknown[], TSelectedFields extends ColumnsSelection = ColumnsSelection> = GelSelectQueryBuilderBase; export type AnyGelSelectQueryBuilder = GelSelectQueryBuilderBase; export type AnyGelSetOperatorInterface = GelSetOperatorInterface; export interface GelSetOperatorInterface = TTableName extends string ? Record : {}, TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection> { _: { readonly hkt: GelSelectHKT; readonly tableName: TTableName; readonly selection: TSelection; readonly selectMode: TSelectMode; readonly nullabilityMap: TNullabilityMap; readonly dynamic: TDynamic; readonly excludedMethods: TExcludedMethods; readonly result: TResult; readonly selectedFields: TSelectedFields; }; } export type GelSetOperatorWithResult = GelSetOperatorInterface; export type GelSelect, TSelectMode extends SelectMode = SelectMode, TNullabilityMap extends Record = Record> = GelSelectBase; export type AnyGelSelect = GelSelectBase; export type GelSetOperator, TSelectMode extends SelectMode = SelectMode, TNullabilityMap extends Record = Record> = GelSelectBase; export type SetOperatorRightSelect, TResult extends any[]> = TValue extends GelSetOperatorInterface ? ValidateShape> : TValue; export type SetOperatorRestSelect[], TResult extends any[]> = TValue extends [infer First, ...infer Rest] ? First extends GelSetOperatorInterface ? Rest extends AnyGelSetOperatorInterface[] ? [ ValidateShape>, ...SetOperatorRestSelect ] : ValidateShape[]> : never : TValue; export type GelCreateSetOperatorFn = , TRest extends GelSetOperatorWithResult[], TNullabilityMap extends Record = TTableName extends string ? Record : {}, TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection>(leftSelect: GelSetOperatorInterface, rightSelect: SetOperatorRightSelect, ...restSelects: SetOperatorRestSelect) => GelSelectWithout, false, GelSetOperatorExcludedMethods, true>; export type GetGelSetOperators = { union: GelCreateSetOperatorFn; intersect: GelCreateSetOperatorFn; except: GelCreateSetOperatorFn; unionAll: GelCreateSetOperatorFn; intersectAll: GelCreateSetOperatorFn; exceptAll: GelCreateSetOperatorFn; };