import { MySqlSelectBase, MySqlSelectBuilder } from "../query-builders/select.cjs";
import { MySqlSelectHKTBase, SelectedFields } from "../query-builders/select.types.cjs";
import { MySqlPreparedQueryConfig } from "../session.cjs";
import { MySqlAsyncPreparedQuery, MySqlAsyncSession } from "./session.cjs";
import { entityKind } from "../../entity.cjs";
import { BuildSubquerySelection, JoinNullability, SelectMode, SelectResult } from "../../query-builders/select.types.cjs";
import { ColumnsSelection } from "../../sql/sql.cjs";
import { Assume } from "../../utils.cjs";
import { QueryPromise } from "../../query-promise.cjs";

//#region src/mysql-core/async/select.d.ts
type MySqlAsyncSelectPrepare<T extends AnyMySqlAsyncSelect> = MySqlAsyncPreparedQuery<MySqlPreparedQueryConfig & {
  execute: T['_']['result'];
  iterator: T['_']['result'][number];
}>;
type MySqlAsyncSelectBuilder<TSelection extends SelectedFields | undefined> = MySqlSelectBuilder<TSelection, MySqlAsyncSelectHKT>;
type MySqlAsyncSelect<TTableName extends string | undefined = string | undefined, TSelection extends ColumnsSelection = Record<string, any>, TSelectMode extends SelectMode = SelectMode, TNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>> = MySqlAsyncSelectBase<TTableName, TSelection, TSelectMode, TNullabilityMap, true, never>;
interface MySqlAsyncSelectHKT extends MySqlSelectHKTBase {
  _type: MySqlAsyncSelectBase<this['tableName'], Assume<this['selection'], ColumnsSelection>, this['selectMode'], Assume<this['nullabilityMap'], Record<string, JoinNullability>>, this['dynamic'], this['excludedMethods'], Assume<this['result'], any[]>, Assume<this['selectedFields'], ColumnsSelection>>;
}
interface MySqlAsyncSelectBase<TTableName extends string | undefined, TSelection extends ColumnsSelection, TSelectMode extends SelectMode, TNullabilityMap extends Record<string, JoinNullability> = (TTableName extends string ? Record<TTableName, 'not-null'> : {}), TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>> extends MySqlSelectBase<MySqlAsyncSelectHKT, TTableName, TSelection, TSelectMode, TNullabilityMap, TDynamic, TExcludedMethods, TResult, TSelectedFields>, QueryPromise<TResult> {}
declare class MySqlAsyncSelectBase<TTableName extends string | undefined, TSelection, TSelectMode extends SelectMode, TNullabilityMap extends Record<string, JoinNullability> = (TTableName extends string ? Record<TTableName, 'not-null'> : {}), TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[], TSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>> extends MySqlSelectBase<MySqlAsyncSelectHKT, TTableName, TSelection, TSelectMode, TNullabilityMap, TDynamic, TExcludedMethods, TResult, TSelectedFields> {
  static readonly [entityKind]: string;
  readonly session: MySqlAsyncSession<any, any>;
  prepare(): MySqlAsyncSelectPrepare<this>;
  execute: ReturnType<this["prepare"]>["execute"];
  private createIterator;
  iterator: ReturnType<this["prepare"]>["iterator"];
}
type AnyMySqlAsyncSelect = MySqlAsyncSelectBase<any, any, any, any, any, any, any, any>;
//#endregion
export { AnyMySqlAsyncSelect, MySqlAsyncSelect, MySqlAsyncSelectBase, MySqlAsyncSelectBuilder, MySqlAsyncSelectHKT, MySqlAsyncSelectPrepare };
//# sourceMappingURL=select.d.cts.map