import type { BaseModel } from '../base_model/base_model.js';
/**
 * Extract the instance type from a model class
 */
type ModelInstance<T extends typeof BaseModel> = InstanceType<T>;
/**
 * Advanced query builder for embedded documents with full type safety
 *
 * Supports:
 * - Complex filtering and searching
 * - Pagination for large datasets
 * - Multiple sorting criteria
 * - Performance optimizations
 * - Aggregation operations
 * - All methods from ModelQueryBuilder for consistency
 */
export declare class EmbeddedQueryBuilder<T extends typeof BaseModel> {
    private items;
    private filters;
    private orFilters;
    private sortOptions;
    private limitValue?;
    private skipValue?;
    private selectFields?;
    private searchTerm?;
    private searchFields?;
    constructor(items: Array<ModelInstance<T>>);
    /**
     * Filter embedded documents by field value with type safety
     */
    where<K extends keyof ModelInstance<T>>(field: K, operator: '=' | '!=' | '>' | '>=' | '<' | '<=' | 'like' | 'in' | 'not in' | '==' | '<>', value: ModelInstance<T>[K]): this;
    where<K extends keyof ModelInstance<T>>(field: K, value: ModelInstance<T>[K]): this;
    /**
     * Alias for where method
     */
    andWhere<K extends keyof ModelInstance<T>>(field: K, operator: '=' | '!=' | '>' | '>=' | '<' | '<=' | 'like' | 'in' | 'not in' | '==' | '<>', value: ModelInstance<T>[K]): this;
    andWhere<K extends keyof ModelInstance<T>>(field: K, value: ModelInstance<T>[K]): this;
    /**
     * Add an OR where condition
     */
    orWhere<K extends keyof ModelInstance<T>>(field: K, operator: '=' | '!=' | '>' | '>=' | '<' | '<=' | 'like' | 'in' | 'not in' | '==' | '<>', value: ModelInstance<T>[K]): this;
    orWhere<K extends keyof ModelInstance<T>>(field: K, value: ModelInstance<T>[K]): this;
    /**
     * Add a where not condition
     */
    whereNot<K extends keyof ModelInstance<T>>(field: K, operator: '=' | '!=' | '>' | '>=' | '<' | '<=' | 'like' | 'in' | 'not in' | '==' | '<>', value: ModelInstance<T>[K]): this;
    whereNot<K extends keyof ModelInstance<T>>(field: K, value: ModelInstance<T>[K]): this;
    /**
     * Alias for whereNot method
     */
    andWhereNot<K extends keyof ModelInstance<T>>(field: K, operator: '=' | '!=' | '>' | '>=' | '<' | '<=' | 'like' | 'in' | 'not in' | any, value?: ModelInstance<T>[K]): this;
    andWhereNot<K extends keyof ModelInstance<T>>(field: K, value: ModelInstance<T>[K]): this;
    /**
     * Add an OR where not condition
     */
    orWhereNot<K extends keyof ModelInstance<T>>(field: K, operator: '=' | '!=' | '>' | '>=' | '<' | '<=' | 'like' | 'in' | 'not in' | any, value?: ModelInstance<T>[K]): this;
    orWhereNot<K extends keyof ModelInstance<T>>(field: K, value: ModelInstance<T>[K]): this;
    /**
     * Add a where like condition (case-sensitive)
     */
    whereLike<K extends keyof ModelInstance<T>>(field: K, value: string): this;
    /**
     * Add a where ilike condition (case-insensitive)
     */
    whereILike<K extends keyof ModelInstance<T>>(field: K, value: string): this;
    /**
     * Add a where in condition
     */
    whereIn<K extends keyof ModelInstance<T>>(field: K, values: ModelInstance<T>[K][]): this;
    /**
     * Add an OR where in condition
     */
    orWhereIn<K extends keyof ModelInstance<T>>(field: K, values: ModelInstance<T>[K][]): this;
    /**
     * Add a where not in condition
     */
    whereNotIn<K extends keyof ModelInstance<T>>(field: K, values: ModelInstance<T>[K][]): this;
    /**
     * Add an OR where not in condition
     */
    orWhereNotIn<K extends keyof ModelInstance<T>>(field: K, values: ModelInstance<T>[K][]): this;
    /**
     * Add a where between condition
     */
    whereBetween<K extends keyof ModelInstance<T>>(field: K, range: [ModelInstance<T>[K], ModelInstance<T>[K]]): this;
    /**
     * Add an OR where between condition
     */
    orWhereBetween<K extends keyof ModelInstance<T>>(field: K, range: [ModelInstance<T>[K], ModelInstance<T>[K]]): this;
    /**
     * Add a where not between condition
     */
    whereNotBetween<K extends keyof ModelInstance<T>>(field: K, range: [ModelInstance<T>[K], ModelInstance<T>[K]]): this;
    /**
     * Add an OR where not between condition
     */
    orWhereNotBetween<K extends keyof ModelInstance<T>>(field: K, range: [ModelInstance<T>[K], ModelInstance<T>[K]]): this;
    /**
     * Filter embedded documents where field is not null
     */
    whereNotNull<K extends keyof ModelInstance<T>>(field: K): this;
    /**
     * Add an OR where not null condition
     */
    orWhereNotNull<K extends keyof ModelInstance<T>>(field: K): this;
    /**
     * Filter embedded documents where field is null
     */
    whereNull<K extends keyof ModelInstance<T>>(field: K): this;
    /**
     * Add an OR where null condition
     */
    orWhereNull<K extends keyof ModelInstance<T>>(field: K): this;
    /**
     * Add a where exists condition
     */
    whereExists<K extends keyof ModelInstance<T>>(field: K): this;
    /**
     * Add an OR where exists condition
     */
    orWhereExists<K extends keyof ModelInstance<T>>(field: K): this;
    /**
     * Add a where not exists condition
     */
    whereNotExists<K extends keyof ModelInstance<T>>(field: K): this;
    /**
     * Add an OR where not exists condition
     */
    orWhereNotExists<K extends keyof ModelInstance<T>>(field: K): this;
    /**
     * Sort embedded documents with type safety
     */
    orderBy<K extends keyof ModelInstance<T>>(field: K, direction?: 'asc' | 'desc'): this;
    /**
     * Limit the number of results
     */
    limit(count: number): this;
    /**
     * Skip a number of results
     */
    skip(count: number): this;
    /**
     * Alias for skip - for pagination compatibility
     */
    offset(count: number): this;
    /**
     * Set pagination using page and perPage
     */
    forPage(page: number, perPage: number): this;
    /**
     * Select specific fields to return (for performance with large objects)
     */
    select(...fields: Array<keyof ModelInstance<T>>): this;
    /**
     * Search across multiple fields with a single term
     */
    search(term: string, fields?: Array<keyof ModelInstance<T>>): this;
    /**
     * Add multiple where conditions with AND logic
     */
    whereAll(conditions: Array<{
        field: keyof ModelInstance<T>;
        operator: '=' | '==' | '!=' | '<>' | '>' | '>=' | '<' | '<=' | 'like' | 'in' | 'not in';
        value: any;
    }>): this;
    /**
     * Add multiple where conditions with OR logic
     */
    whereAny(conditions: Array<{
        field: keyof ModelInstance<T>;
        operator: '=' | '==' | '!=' | '<>' | '>' | '>=' | '<' | '<=' | 'like' | 'in' | 'not in';
        value: any;
    }>): this;
    /**
     * Filter by date range
     */
    whereDateBetween<K extends keyof ModelInstance<T>>(field: K, startDate: Date | string, endDate: Date | string): this;
    /**
     * Filter by array contains
     */
    whereArrayContains<K extends keyof ModelInstance<T>>(field: K, value: any): this;
    /**
     * Filter by regex pattern
     */
    whereRegex<K extends keyof ModelInstance<T>>(field: K, pattern: RegExp | string, flags?: string): this;
    /**
     * Execute the query and return filtered results
     */
    get(): Array<ModelInstance<T>>;
    /**
     * Get the first result
     */
    first(): ModelInstance<T> | null;
    /**
     * Get the count of results
     */
    count(): number;
    /**
     * Check if any results exist
     */
    exists(): boolean;
    /**
     * Get paginated results with metadata
     */
    paginate(page: number, perPage: number): {
        data: Array<ModelInstance<T>>;
        pagination: {
            currentPage: number;
            perPage: number;
            total: number;
            totalPages: number;
            hasNextPage: boolean;
            hasPrevPage: boolean;
        };
    };
    /**
     * Get distinct values for a field
     */
    distinct<K extends keyof ModelInstance<T>>(field: K): Array<ModelInstance<T>[K]>;
    /**
     * Group results by a field value
     */
    groupBy<K extends keyof ModelInstance<T>>(field: K): Map<ModelInstance<T>[K], Array<ModelInstance<T>>>;
    /**
     * Get aggregated statistics for numeric fields
     */
    aggregate<K extends keyof ModelInstance<T>>(field: K): {
        count: number;
        sum: number;
        avg: number;
        min: number;
        max: number;
    } | null;
    /**
     * Execute a custom callback on the results
     */
    tap(callback: (results: Array<ModelInstance<T>>) => void): this;
    /**
     * Clone the query builder for reuse
     */
    clone(): EmbeddedQueryBuilder<T>;
}
export {};
//# sourceMappingURL=embedded_query_builder.d.ts.map