import { IAsyncEnumerable, IList, IEnumerable } from '../../collections';
import { IQueryable } from '../../collections/efcore';
import { PrismaQueryProvider, IPrismaQueryExpression } from '../../collections/prisma/prisma-queryable';
import { PrismaSelectResult, PrismaIncludeResult } from './prisma-types';
export declare class PrismaQueryBuilder<TModel = unknown, TSelect = TModel, TWhereInput = any, TOrderByInput = any, TInclude = any, TSelectInput = any, TExpectedResult = Record<string, any>> {
    private prismaModel;
    private whereClause;
    private selectClause?;
    private includeClause?;
    private orderByClause?;
    private takeClause?;
    private skipClause?;
    private modelName?;
    constructor(prismaModel: any, modelName?: string);
    static create<TModel = unknown, TSelect = TModel, TWhereInput = any, TOrderByInput = any, TInclude = any, TSelectInput = any, TExpectedResult = Record<string, any>>(prismaModel: any, expectedResult?: TExpectedResult): PrismaQueryBuilder<TModel, TSelect, TWhereInput, TOrderByInput, TInclude, TSelectInput, TExpectedResult>;
    static createFrom<TModel = unknown, TSelect = TModel, TWhereInput = any, TOrderByInput = any, TInclude = any, TSelectInput = any, TExpectedResult = Record<string, any>>(builder: PrismaQueryBuilder<any>, prismaModel: any, expectedResult?: TExpectedResult): PrismaQueryBuilder<TModel, TSelect, TWhereInput, TOrderByInput, TInclude, TSelectInput, TExpectedResult>;
    ContextFactory(): PrismaQueryBuilder<TModel, TSelect, TWhereInput, TOrderByInput, TInclude, TSelectInput, TExpectedResult>;
    NewContext(): PrismaQueryBuilder<TModel, TSelect, TWhereInput, TOrderByInput, TInclude, TSelectInput, TExpectedResult>;
    private resetQueryState;
    Where(where: TWhereInput): this;
    Select<TExpectedType = any>(select: TSelectInput): PrismaQueryBuilder<TModel, TExpectedType, TWhereInput, TOrderByInput, TInclude, TSelectInput, TExpectedType>;
    Select<TSelectFields extends TSelectInput>(select: TSelectFields): PrismaQueryBuilder<TModel, PrismaSelectResult<TModel, TSelectFields, any>, TWhereInput, TOrderByInput, TInclude, TSelectInput, any>;
    Select<TSelectFields extends TSelectInput, TNewExpectedResult = TExpectedResult>(select: TSelectFields, expectedResult: TNewExpectedResult): PrismaQueryBuilder<TModel, PrismaSelectResult<TModel, TSelectFields, TNewExpectedResult>, TWhereInput, TOrderByInput, TInclude, TSelectInput, TNewExpectedResult>;
    SelectAll(): PrismaQueryBuilder<TModel, TModel, TWhereInput, TOrderByInput, TInclude, TSelectInput, TModel>;
    SelectAs<TSelectFields extends TSelectInput>(select: TSelectFields): TypedSelector<TModel, TSelectFields, TWhereInput, TOrderByInput, TInclude, TSelectInput>;
    Include<TIncludeFields extends TInclude, TNewExpectedResult = TExpectedResult>(include: TIncludeFields, expectedResult?: TNewExpectedResult): PrismaQueryBuilder<TModel, PrismaIncludeResult<TSelect, TIncludeFields, TNewExpectedResult>, TWhereInput, TOrderByInput, TInclude, TSelectInput, TNewExpectedResult>;
    private mergeIncludes;
    OrderBy(orderBy: TOrderByInput): this;
    Take(n: number): this;
    Skip(n: number): this;
    ToArray(): Promise<TSelect[]>;
    First(): Promise<TSelect | null>;
    Project<TResult>(selector: (item: TSelect) => TResult): Promise<IEnumerable<TResult>>;
    GroupBy<TKey, TElement = TSelect>(keySelector: (item: TSelect) => TKey, elementSelector?: (item: TSelect) => TElement, resultSelector?: (key: TKey, group: IEnumerable<TElement>) => any): Promise<any>;
    private ExecuteQueryAndMap;
    ToList(): Promise<IList<TSelect>>;
    ToEnumerable(): Promise<IEnumerable<TSelect>>;
    Execute(): Promise<IAsyncEnumerable<TSelect>>;
    ToAsyncEnumerable(): Promise<IAsyncEnumerable<TSelect>>;
    ToEnumerableAsync(): Promise<IEnumerable<TSelect>>;
    AsEnumerable(): Promise<IEnumerable<TSelect>>;
    ToArrayAsync(): Promise<TSelect[]>;
    FirstOrDefault(): Promise<TSelect | undefined>;
    Single(): Promise<TSelect | null>;
    Count(): Promise<number>;
    Exists(): Promise<boolean>;
    Any(): Promise<boolean>;
    Min(field: string): Promise<any>;
    Max(field: string): Promise<any>;
    Sum(field: string): Promise<number>;
    Avg(field: string): Promise<number>;
    Paginate(pageNumber: number, pageSize: number): Promise<{
        data: TSelect[];
        total: number;
        page: number;
        pageSize: number;
    }>;
    AsQueryable(): IQueryable<TModel, TSelect, TWhereInput, TOrderByInput, TInclude, TSelectInput, any, any, any>;
    AsNoTrackingQueryable(): IQueryable<TModel, TSelect, TWhereInput, TOrderByInput, TInclude, TSelectInput, any, any, any>;
    buildExpression(): IPrismaQueryExpression;
    static From<T>(source: IQueryable<T>): PrismaQueryBuilder<T>;
    AsAsyncEnumerable(): Promise<IAsyncEnumerable<TSelect>>;
    CopyTo<TNewModel, TNewSelect = TNewModel>(newPrismaModel: any): PrismaQueryBuilder<TNewModel, TNewSelect>;
    get Provider(): PrismaQueryProvider;
    get Expression(): IPrismaQueryExpression;
}
declare class TypedSelector<TModel, TSelectFields, TWhereInput, TOrderByInput, TInclude, TSelectInput> {
    private builder;
    private select;
    constructor(builder: PrismaQueryBuilder<TModel, any, TWhereInput, TOrderByInput, TInclude, TSelectInput, any>, select: TSelectFields);
    As<TExpectedResult>(): PrismaQueryBuilder<TModel, PrismaSelectResult<TModel, TSelectFields, TExpectedResult>, TWhereInput, TOrderByInput, TInclude, TSelectInput, TExpectedResult>;
    Inferred(): PrismaQueryBuilder<TModel, PrismaSelectResult<TModel, TSelectFields, any>, TWhereInput, TOrderByInput, TInclude, TSelectInput, any>;
}
export {};
