import { JSONValue } from "@convex-dev/common";
import { Cursor, PaginationResult, PaginationOptions } from "../pagination.js";
import { Query, QueryInitializer } from "../query.js";
import { Expression, FilterBuilder } from "../filter_builder.js";
import { GenericTableInfo } from "../data_model.js";
import { IndexRangeBuilderImpl, SerializedRangeExpression } from "./index_range_builder_impl.js";
declare type QueryOperator = {
    filter: JSONValue;
} | {
    limit: number;
};
declare type Source = {
    type: "FullTableScan";
    tableName: string;
    order: "asc" | "desc";
} | {
    type: "IndexRange";
    indexName: string;
    range: ReadonlyArray<SerializedRangeExpression>;
    order: "asc" | "desc";
};
declare type SerializedQuery = {
    source: Source;
    operators: Array<QueryOperator>;
};
export declare class QueryInitializerImpl implements QueryInitializer<GenericTableInfo> {
    private tableName;
    constructor(tableName: string);
    withIndex(indexName: string, indexRange: (q: IndexRangeBuilderImpl) => IndexRangeBuilderImpl): QueryImpl;
    fullTableScan(): QueryImpl;
    order(order: "asc" | "desc"): QueryImpl;
    count(): Promise<number>;
    filter(predicate: (q: FilterBuilder<GenericTableInfo>) => Expression<boolean>): QueryImpl;
    limit(n: number): QueryImpl;
    collect(): Promise<any[]>;
    take(n: number): Promise<Array<any>>;
    paginate(cursor: null | Cursor, options?: PaginationOptions): Promise<PaginationResult>;
    first(): Promise<any>;
    unique(): Promise<any>;
    [Symbol.asyncIterator](): AsyncIterableIterator<any>;
}
declare class QueryImpl implements Query<GenericTableInfo> {
    private state;
    constructor(query: SerializedQuery);
    private takeQuery;
    private startQuery;
    private closeQuery;
    order(order: "asc" | "desc"): QueryImpl;
    filter(predicate: (q: FilterBuilder<GenericTableInfo>) => Expression<boolean>): QueryImpl;
    limit(n: number): QueryImpl;
    [Symbol.asyncIterator](): AsyncIterableIterator<any>;
    next(): Promise<IteratorResult<any>>;
    return(): Promise<{
        done: boolean;
        value: undefined;
    }>;
    paginate(cursor: null | Cursor, options?: PaginationOptions): Promise<PaginationResult>;
    collect(): Promise<Array<any>>;
    take(n: number): Promise<Array<any>>;
    first(): Promise<any | null>;
    unique(): Promise<any | null>;
}
export {};
//# sourceMappingURL=query_impl.d.ts.map