import { Repository, RepositoryOptions, RepositoryInit } from '../repository';
import { DatabaseRecord } from '../record';
import { DatabaseQueryBuilder, DeleteOptions, InsertOneOptions, InsertOptions, SelectQuery, UpdateOptions } from '../dml';
import { Schema } from '../schema';
import { CountParams } from '../functions/signatures/count';
import { SetOptions } from './set-options';
export interface QueryRepositoryOptions extends RepositoryOptions {
    table?: string;
    identifiedBy?: string;
    queryBuilderType: typeof DatabaseQueryBuilder;
}
export interface QueryRepositoryInit extends RepositoryInit {
    schema?: Schema;
}
/**
 * Use the Query Repository to query a database
 */
export declare class QueryRepository<T extends DatabaseRecord = DatabaseRecord> extends Repository {
    protected schema?: Schema;
    protected table?: string;
    protected identifiedBy?: string;
    protected queryBuilderType: typeof DatabaseQueryBuilder;
    constructor(options: QueryRepositoryOptions);
    init(options: QueryRepositoryInit): void;
    getTableName(): null | string;
    getIdentifier(): null | string;
    getQueryBuilder(): DatabaseQueryBuilder;
    /**
     * Finds entities matching given criteria
     *
     * @param selectQuery Select query
     * @returns Found entities
     */
    find(selectQuery: SelectQuery<T>): Promise<T[]>;
    /**
     * Finds one entity matching given criteria
     *
     * @param selectQuery Select query
     * @returns Found entity or `null`
     */
    findOne(selectQuery: SelectQuery<T>): Promise<null | T>;
    findById(id: number | string): Promise<null | T>;
    /**
     * Finds one entity matching given criteria, or throws error
     *
     * @param selectQuery Select query
     * @param error Error to throw
     * @returns Found entity
     */
    findOneOrFail(selectQuery: SelectQuery<T>, error?: Error): Promise<T>;
    count(selectQuery?: SelectQuery<T>, params?: CountParams): Promise<number>;
    /**
     * Insert one or multiple items into the database
     *
     * @param insertOptions Insert options
     * @returns Inserted item(s)
     */
    insert(insertOptions: InsertOptions<T>): Promise<void>;
    /**
     * Insert one item into the database
     *
     * @param insertOptions Insert options
     * @returns Inserted item
     */
    insertOne(insertOptions: InsertOneOptions<T>): Promise<Partial<T>>;
    /**
     * Update items in the database
     *
     * @param updateOptions Update options
     */
    update(updateOptions: UpdateOptions<T>): Promise<void>;
    /**
     * Set a variable
     *
     * @param setOptions
     */
    set(setOptions: SetOptions): Promise<void>;
    /**
     * Delete items from the database
     *
     * @param deleteOptions Delete options
     */
    delete(deleteOptions: DeleteOptions<T>): Promise<void>;
}
