import type { MySqlColumn } from "../columns/index.js"; import type { MySqlTable, MySqlTableWithColumns } from "../table.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, View } from "../../sql/sql.js"; import type { Subquery } from "../../subquery.js"; import type { Table, UpdateTableConfig } from "../../table.js"; import type { Assume, ValidateShape } from "../../utils.js"; import type { MySqlPreparedQueryConfig, PreparedQueryHKTBase, PreparedQueryKind } from "../session.js"; import type { MySqlViewBase } from "../view-base.js"; import type { MySqlViewWithSelection } from "../view.js"; import type { IndexConfig, MySqlSelectBase, MySqlSelectQueryBuilderBase } from "./select.js"; export type MySqlJoinType = Exclude; export interface MySqlSelectJoinConfig { on: SQL | undefined; table: MySqlTable | Subquery | MySqlViewBase | SQL; alias: string | undefined; joinType: MySqlJoinType; lateral?: boolean; useIndex?: string[]; forceIndex?: string[]; ignoreIndex?: string[]; } export type BuildAliasTable = TTable extends Table ? MySqlTableWithColumns; }>> : TTable extends View ? MySqlViewWithSelection> : never; export interface MySqlSelectConfig { withList?: Subquery[]; fields: Record; fieldsFlat?: SelectedFieldsOrdered; where?: SQL; having?: SQL; table: MySqlTable | Subquery | MySqlViewBase | SQL; limit?: number | Placeholder; offset?: number | Placeholder; joins?: MySqlSelectJoinConfig[]; orderBy?: (MySqlColumn | SQL | SQL.Aliased)[]; groupBy?: (MySqlColumn | SQL | SQL.Aliased)[]; lockingClause?: { strength: LockStrength; config: LockConfig; }; distinct?: boolean; setOperators: { rightSelect: TypedQueryBuilder; type: SetOperator; isAll: boolean; orderBy?: (MySqlColumn | SQL | SQL.Aliased)[]; limit?: number | Placeholder; offset?: number | Placeholder; }[]; useIndex?: string[]; forceIndex?: string[]; ignoreIndex?: string[]; } export type MySqlJoin = GetSelectTableName> = T extends any ? MySqlSelectWithout : never, T['_']['selectMode']>, T['_']['selectMode'] extends 'partial' ? T['_']['selectMode'] : 'multiple', T['_']['preparedQueryHKT'], AppendToNullabilityMap, TDynamic, T['_']['excludedMethods']>, TDynamic, T['_']['excludedMethods']> : never; export type MySqlJoinFn = = GetSelectTableName>(table: TJoinedTable, on: ((aliases: T['_']['selection']) => SQL | undefined) | SQL | undefined, onIndex?: (TJoinedTable extends MySqlTable ? IndexConfig : 'Index hint configuration is allowed only for MySqlTable and not for subqueries or views') | undefined) => MySqlJoin; export type MySqlCrossJoinFn = = GetSelectTableName>(table: TJoinedTable, onIndex?: (TJoinedTable extends MySqlTable ? IndexConfig : 'Index hint configuration is allowed only for MySqlTable and not for subqueries or views') | undefined) => MySqlJoin; export type SelectedFieldsFlat = SelectedFieldsFlatBase; export type SelectedFields = SelectedFieldsBase; export type SelectedFieldsOrdered = SelectedFieldsOrderedBase; export type LockStrength = 'update' | 'share'; export type LockConfig = { noWait: true; skipLocked?: undefined; } | { noWait?: undefined; skipLocked: true; } | { noWait?: undefined; skipLocked?: undefined; }; export interface MySqlSelectHKTBase { tableName: string | undefined; selection: unknown; selectMode: SelectMode; preparedQueryHKT: unknown; nullabilityMap: unknown; dynamic: boolean; excludedMethods: string; result: unknown; selectedFields: unknown; _type: unknown; } export type MySqlSelectKind, TDynamic extends boolean, TExcludedMethods extends string, TResult = SelectResult[], TSelectedFields = BuildSubquerySelection> = (T & { tableName: TTableName; selection: TSelection; selectMode: TSelectMode; preparedQueryHKT: TPreparedQueryHKT; nullabilityMap: TNullabilityMap; dynamic: TDynamic; excludedMethods: TExcludedMethods; result: TResult; selectedFields: TSelectedFields; })['_type']; export interface MySqlSelectQueryBuilderHKT extends MySqlSelectHKTBase { _type: MySqlSelectQueryBuilderBase, this['selectMode'], Assume, Assume>, this['dynamic'], this['excludedMethods'], Assume, Assume>; } export interface MySqlSelectHKT extends MySqlSelectHKTBase { _type: MySqlSelectBase, this['selectMode'], Assume, Assume>, this['dynamic'], this['excludedMethods'], Assume, Assume>; } export type MySqlSetOperatorExcludedMethods = 'where' | 'having' | 'groupBy' | 'session' | 'leftJoin' | 'rightJoin' | 'innerJoin' | 'for'; export type MySqlSelectWithout = TDynamic extends true ? T : Omit, TResetExcluded extends true ? K : T['_']['excludedMethods'] | K>; export type MySqlSelectPrepare = PreparedQueryKind; export type MySqlSelectDynamic = MySqlSelectKind; export type CreateMySqlSelectFromBuilderMode = TBuilderMode extends 'db' ? MySqlSelectBase : MySqlSelectQueryBuilderBase; export type MySqlSelectQueryBuilder = Record, TResult extends any[] = unknown[], TSelectedFields extends ColumnsSelection = ColumnsSelection> = MySqlSelectQueryBuilderBase; export type AnyMySqlSelectQueryBuilder = MySqlSelectQueryBuilderBase; export type AnyMySqlSetOperatorInterface = MySqlSetOperatorInterface; export interface MySqlSetOperatorInterface = TTableName extends string ? Record : {}, TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection> { _: { readonly hkt: MySqlSelectHKT; readonly tableName: TTableName; readonly selection: TSelection; readonly selectMode: TSelectMode; readonly preparedQueryHKT: TPreparedQueryHKT; readonly nullabilityMap: TNullabilityMap; readonly dynamic: TDynamic; readonly excludedMethods: TExcludedMethods; readonly result: TResult; readonly selectedFields: TSelectedFields; }; } export type MySqlSetOperatorWithResult = MySqlSetOperatorInterface; export type MySqlSelect, TSelectMode extends SelectMode = SelectMode, TNullabilityMap extends Record = Record> = MySqlSelectBase; export type AnyMySqlSelect = MySqlSelectBase; export type MySqlSetOperator, TSelectMode extends SelectMode = SelectMode, TPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase, TNullabilityMap extends Record = Record> = MySqlSelectBase; export type SetOperatorRightSelect, TResult extends any[]> = TValue extends MySqlSetOperatorInterface ? ValidateShape> : TValue; export type SetOperatorRestSelect[], TResult extends any[]> = TValue extends [infer First, ...infer Rest] ? First extends MySqlSetOperatorInterface ? Rest extends AnyMySqlSetOperatorInterface[] ? [ ValidateShape>, ...SetOperatorRestSelect ] : ValidateShape[]> : never : TValue; export type MySqlCreateSetOperatorFn = , TRest extends MySqlSetOperatorWithResult[], TPreparedQueryHKT extends PreparedQueryHKTBase = PreparedQueryHKTBase, TNullabilityMap extends Record = TTableName extends string ? Record : {}, TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection>(leftSelect: MySqlSetOperatorInterface, rightSelect: SetOperatorRightSelect, ...restSelects: SetOperatorRestSelect) => MySqlSelectWithout, false, MySqlSetOperatorExcludedMethods, true>; export type GetMySqlSetOperators = { union: MySqlCreateSetOperatorFn; intersect: MySqlCreateSetOperatorFn; except: MySqlCreateSetOperatorFn; unionAll: MySqlCreateSetOperatorFn; intersectAll: MySqlCreateSetOperatorFn; exceptAll: MySqlCreateSetOperatorFn; };