/**
 * @athenna/database
 *
 * (c) João Lenon <lenon@athenna.io>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
import { type PaginatedResponse, type PaginationOptions } from '@athenna/common';
import { Driver } from '#src/database/drivers/Driver';
import { ModelSchema } from '#src/models/schemas/ModelSchema';
import { Transaction } from '#src/database/transactions/Transaction';
import type { Connection, Collection, ClientSession } from 'mongoose';
import type { ConnectionOptions, Direction, Operations } from '#src/types';
export declare class MongoDriver extends Driver<Connection, Collection> {
    primaryKey: string;
    session: ClientSession;
    /**
     * The where clause used in update queries.
     */
    private _where;
    /**
     * The or where clause used in update queries.
     */
    private _orWhere;
    /**
     * The aggregate pipeline to make mongo queries.
     */
    private pipeline;
    /**
     * Set the mongo session that should be used by the driver.
     */
    setSession(session: ClientSession): this;
    /**
     * Connect to database.
     */
    connect(options?: ConnectionOptions): void;
    /**
     * Close the connection with database in this instance.
     */
    close(): Promise<void>;
    /**
     * Creates a new instance of query builder.
     */
    query(): Collection;
    /**
     * Sync a model schema with database.
     */
    sync(schema: ModelSchema): Promise<void>;
    /**
     * Create a new transaction.
     */
    startTransaction(): Promise<Transaction<Connection, Collection>>;
    /**
     * Commit the transaction.
     */
    commitTransaction(): Promise<void>;
    /**
     * Rollback the transaction.
     */
    rollbackTransaction(): Promise<void>;
    /**
     * Run database migrations.
     */
    runMigrations(): Promise<void>;
    /**
     * Revert database migrations.
     */
    revertMigrations(): Promise<void>;
    /**
     * List all databases available.
     */
    getDatabases(): Promise<string[]>;
    /**
     * Get the current database name.
     */
    getCurrentDatabase(): Promise<string | undefined>;
    /**
     * Verify if database exists.
     */
    hasDatabase(database: string): Promise<boolean>;
    /**
     * Create a new database.
     */
    createDatabase(): Promise<void>;
    /**
     * Drop some database.
     */
    dropDatabase(database: string): Promise<void>;
    /**
     * List all tables available.
     */
    getTables(): Promise<string[]>;
    /**
     * Verify if table exists.
     */
    hasTable(table: string): Promise<boolean>;
    /**
     * Create a new table in database.
     */
    createTable(): Promise<void>;
    /**
     * Drop a table in database.
     */
    dropTable(table: string): Promise<void>;
    /**
     * Remove all data inside some database table
     * and restart the identity of the table.
     */
    truncate(table: string): Promise<void>;
    /**
     * Make a raw query in database.
     */
    raw<T = any>(): T;
    /**
     * Calculate the average of a given column.
     */
    avg(column: string): Promise<string>;
    /**
     * Calculate the average of a given column using distinct.
     */
    avgDistinct(column: string): Promise<string>;
    /**
     * Get the max number of a given column.
     */
    max(column: string): Promise<string>;
    /**
     * Get the min number of a given column.
     */
    min(column: string): Promise<string>;
    /**
     * Sum all numbers of a given column.
     */
    sum(column: string): Promise<string>;
    /**
     * Sum all numbers of a given column in distinct mode.
     */
    sumDistinct(column: string): Promise<string>;
    /**
     * Increment a value of a given column.
     */
    increment(column: string): Promise<void>;
    /**
     * Decrement a value of a given column.
     */
    decrement(column: string): Promise<void>;
    /**
     * Calculate the average of a given column using distinct.
     */
    count(column?: string): Promise<string>;
    /**
     * Calculate the average of a given column using distinct.
     */
    countDistinct(column: string): Promise<string>;
    /**
     * Find a value in database.
     */
    find<T = any>(): Promise<T>;
    /**
     * Find many values in database.
     */
    findMany<T = any>(): Promise<T[]>;
    /**
     * Find many values in database and return as paginated response.
     */
    paginate<T = any>(page?: PaginationOptions | number, limit?: number, resourceUrl?: string): Promise<PaginatedResponse<T>>;
    /**
     * Create a value in database.
     */
    create<T = any>(data?: Partial<T>): Promise<T>;
    /**
     * Create many values in database.
     */
    createMany<T = any>(data?: Partial<T>[]): Promise<T[]>;
    /**
     * Create data or update if already exists.
     */
    createOrUpdate<T = any>(data?: Partial<T>): Promise<T | T[]>;
    /**
     * Update a value in database.
     */
    update<T = any>(data: Partial<T>): Promise<T | T[]>;
    /**
     * Delete one value in database.
     */
    delete(): Promise<void>;
    /**
     * Set the table that this query will be executed.
     */
    table(table: string): this;
    /**
     * Log in console the actual query built.
     */
    dump(): this;
    /**
     * Set the columns that should be selected on query.
     */
    select(...columns: string[]): this;
    /**
     * Set the columns that should be selected on query raw.
     */
    selectRaw(): this;
    /**
     * Set the table that should be used on query.
     * Different from `table()` method, this method
     * doesn't change the driver table.
     */
    from(): this;
    /**
     * Set the table that should be used on query raw.
     * Different from `table()` method, this method
     * doesn't change the driver table.
     */
    fromRaw(): this;
    /**
     * Set a join statement in your query.
     */
    join(table: any, column1?: any, operation?: any | Operations, column2?: any): this;
    /**
     * Set a left join statement in your query.
     */
    leftJoin(table: any, column1?: any, operation?: any | Operations, column2?: any): this;
    /**
     * Set a right join statement in your query.
     */
    rightJoin(table: any, column1?: any, operation?: any | Operations, column2?: any): this;
    /**
     * Set a cross join statement in your query.
     */
    crossJoin(table: any, column1?: any, operation?: any | Operations, column2?: any): this;
    /**
     * Set a full outer join statement in your query.
     */
    fullOuterJoin(table: any, column1?: any, operation?: any | Operations, column2?: any): this;
    /**
     * Set a left outer join statement in your query.
     */
    leftOuterJoin(table: any, column1?: any, operation?: any | Operations, column2?: any): this;
    /**
     * Set a right outer join statement in your query.
     */
    rightOuterJoin(table: any, column1?: any, operation?: any | Operations, column2?: any): this;
    /**
     * Set a join raw statement in your query.
     */
    joinRaw(): this;
    /**
     * Set a group by statement in your query.
     */
    groupBy(...columns: string[]): this;
    /**
     * Set a group by raw statement in your query.
     */
    groupByRaw(): this;
    having(column: string): this;
    having(column: string, value: any): this;
    having(column: string, operation: Operations, value: any): this;
    /**
     * Set a having raw statement in your query.
     */
    havingRaw(): this;
    /**
     * Set a having exists statement in your query.
     */
    havingExists(): this;
    /**
     * Set a having not exists statement in your query.
     */
    havingNotExists(): this;
    /**
     * Set a having in statement in your query.
     */
    havingIn(column: string, values: any[]): this;
    /**
     * Set a having not in statement in your query.
     */
    havingNotIn(column: string, values: any[]): this;
    /**
     * Set a having between statement in your query.
     */
    havingBetween(column: string, values: [any, any]): this;
    /**
     * Set a having not between statement in your query.
     */
    havingNotBetween(column: string, values: [any, any]): this;
    /**
     * Set a having null statement in your query.
     */
    havingNull(column: string): this;
    /**
     * Set a having not null statement in your query.
     */
    havingNotNull(column: string): this;
    orHaving(column: string): this;
    orHaving(column: string, value: any): this;
    orHaving(column: string, operation: Operations, value: any): this;
    /**
     * Set an or having raw statement in your query.
     */
    orHavingRaw(): this;
    /**
     * Set an or having exists statement in your query.
     */
    orHavingExists(): this;
    /**
     * Set an or having not exists statement in your query.
     */
    orHavingNotExists(): this;
    /**
     * Set an or having in statement in your query.
     */
    orHavingIn(column: string, values: any[]): this;
    /**
     * Set an or having not in statement in your query.
     */
    orHavingNotIn(column: string, values: any[]): this;
    /**
     * Set an or having between statement in your query.
     */
    orHavingBetween(column: string, values: [any, any]): this;
    /**
     * Set an or having not between statement in your query.
     */
    orHavingNotBetween(column: string, values: [any, any]): this;
    /**
     * Set an or having null statement in your query.
     */
    orHavingNull(column: string): this;
    /**
     * Set an or having not null statement in your query.
     */
    orHavingNotNull(column: string): this;
    where(statement: Record<string, any>): this;
    where(key: string, value: any): this;
    where(key: string, operation: Operations, value: any): this;
    whereNot(statement: Record<string, any>): this;
    whereNot(key: string, value: any): this;
    /**
     * Set a where raw statement in your query.
     */
    whereRaw(): this;
    /**
     * Set a where exists statement in your query.
     */
    whereExists(): this;
    /**
     * Set a where not exists statement in your query.
     */
    whereNotExists(): this;
    /**
     * Set a where like statement in your query.
     */
    whereLike(column: string, value: any): this;
    /**
     * Set a where ILike statement in your query.
     */
    whereILike(column: string, value: any): this;
    /**
     * Set a where in statement in your query.
     */
    whereIn(column: string, values: any[]): this;
    /**
     * Set a where not in statement in your query.
     */
    whereNotIn(column: string, values: any[]): this;
    /**
     * Set a where between statement in your query.
     */
    whereBetween(column: string, values: [any, any]): this;
    /**
     * Set a where not between statement in your query.
     */
    whereNotBetween(column: string, values: [any, any]): this;
    /**
     * Set a where null statement in your query.
     */
    whereNull(column: string): this;
    /**
     * Set a where not null statement in your query.
     */
    whereNotNull(column: string): this;
    orWhere(statement: Record<string, any>): this;
    orWhere(key: string, value: any): this;
    orWhere(key: string, operation: Operations, value: any): this;
    orWhereNot(statement: Record<string, any>): this;
    orWhereNot(key: string, value: any): this;
    /**
     * Set a or where raw statement in your query.
     */
    orWhereRaw(): this;
    /**
     * Set an or where exists statement in your query.
     */
    orWhereExists(): this;
    /**
     * Set an or where not exists statement in your query.
     */
    orWhereNotExists(): this;
    /**
     * Set an or where like statement in your query.
     */
    orWhereLike(column: string, value: any): this;
    /**
     * Set an or where ILike statement in your query.
     */
    orWhereILike(column: string, value: any): this;
    /**
     * Set an or where in statement in your query.
     */
    orWhereIn(column: string, values: any[]): this;
    /**
     * Set an or where not in statement in your query.
     */
    orWhereNotIn(column: string, values: any[]): this;
    /**
     * Set an or where between statement in your query.
     */
    orWhereBetween(column: string, values: [any, any]): this;
    /**
     * Set an or where not between statement in your query.
     */
    orWhereNotBetween(column: string, values: [any, any]): this;
    /**
     * Set an or where null statement in your query.
     */
    orWhereNull(column: string): this;
    /**
     * Set an or where not null statement in your query.
     */
    orWhereNotNull(column: string): this;
    /**
     * Set an order by statement in your query.
     */
    orderBy(column: string, direction?: Direction): this;
    /**
     * Set an order by raw statement in your query.
     */
    orderByRaw(): this;
    /**
     * Order the results easily by the latest date. By default, the result will
     * be ordered by the table's "createdAt" column.
     */
    latest(column?: string): this;
    /**
     * Order the results easily by the oldest date. By default, the result will
     * be ordered by the table's "createdAt" column.
     */
    oldest(column?: string): this;
    /**
     * Set the skip number in your query.
     */
    offset(number: number): this;
    /**
     * Set the limit number in your query.
     */
    limit(number: number): this;
    /**
     * Set the mongo operation in value.
     */
    private setOperator;
    /**
     * Creates the where clause with where and orWhere.
     */
    private createWhere;
    /**
     * Creates the aggregation pipeline.
     */
    private createPipeline;
}
