/// <reference types="rx-core" />
/// <reference types="rx-core-binding" />
/// <reference types="rx-lite" />
/// <reference types="rx-lite-aggregates" />
/// <reference types="rx-lite-backpressure" />
/// <reference types="rx-lite-coincidence" />
/// <reference types="rx-lite-experimental" />
/// <reference types="rx-lite-joinpatterns" />
/// <reference types="rx-lite-time" />
import { Callback } from "../core/callback";
import { ResultCallback } from "../core/callback";
import { IteratorCallback } from "../core/callback";
import { InternalSession } from "../session";
import { Constructor } from "../index";
import { Observable } from "rx";
import { CollationOptions } from "../mapping/collationOptions";
export interface QueryBuilder<T> {
    findAll(callback?: ResultCallback<T[]>): FindQuery<T>;
    findAll(criteria: QueryDocument, callback?: ResultCallback<T[]>): FindQuery<T>;
    findOne(callback?: ResultCallback<T>): FindOneQuery<T>;
    findOne(criteria: QueryDocument, callback?: ResultCallback<T>): FindOneQuery<T>;
    findOneById(id: any, callback?: ResultCallback<T>): FindOneQuery<T>;
    findOneAndRemove(callback?: ResultCallback<T>): FindOneAndRemoveQuery<T>;
    findOneAndRemove(criteria: QueryDocument, callback?: ResultCallback<T>): FindOneAndRemoveQuery<T>;
    findOneAndUpdate(updateDocument: QueryDocument, callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    findOneAndUpdate(criteria: QueryDocument, updateDocument: QueryDocument, callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    findOneAndUpsert(updateDocument: QueryDocument, callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    findOneAndUpsert(criteria: QueryDocument, updateDocument: QueryDocument, callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    removeAll(callback?: ResultCallback<number>): void;
    removeAll(criteria: QueryDocument, callback?: ResultCallback<number>): void;
    removeOne(callback?: ResultCallback<number>): void;
    removeOne(criteria: QueryDocument, callback?: ResultCallback<number>): void;
    updateAll(updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    updateAll(criteria: QueryDocument, updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    updateOne(updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    updateOne(criteria: QueryDocument, updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    upsert(updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    upsert(criteria: QueryDocument, updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    distinct(key: string, callback: ResultCallback<any[]>): void;
    distinct(key: string, criteria: QueryDocument, callback: ResultCallback<any[]>): void;
    count(callback?: ResultCallback<number>): CountQuery;
    count(criteria: QueryDocument, callback?: ResultCallback<number>): CountQuery;
}
export interface QueryDocument {
    [name: string]: any;
}
export interface Query<T> {
    execute(callback: ResultCallback<any>): void;
    asPromise(): Promise<T>;
}
export interface CountQuery extends Query<number> {
    limit(value: number, callback?: ResultCallback<number>): CountQuery;
    skip(value: number, callback?: ResultCallback<number>): CountQuery;
}
export interface FindOneAndRemoveQuery<T> extends Query<T> {
    sort(field: string, direction: number, callback?: ResultCallback<T>): FindOneAndRemoveQuery<T>;
    sort(fields: [string, number][], callback?: ResultCallback<T>): FindOneAndRemoveQuery<T>;
    fetch(path: string, callback?: ResultCallback<T>): FindOneAndRemoveQuery<T>;
    fetch(paths: string[], callback?: ResultCallback<T>): FindOneAndRemoveQuery<T>;
    lazy(callback?: ResultCallback<T>): FindOneAndRemoveQuery<T>;
}
export interface FindOneAndUpdateQuery<T> extends Query<T> {
    sort(field: string, direction: number, callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    sort(fields: [string, number][], callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    fetch(path: string, callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    fetch(paths: string[], callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    returnUpdated(callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    lazy(callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
}
export interface FindOneQuery<T> extends Query<T> {
    fetch(path: string, callback?: ResultCallback<T>): FindOneQuery<T>;
    fetch(paths: string[], callback?: ResultCallback<T>): FindOneQuery<T>;
    lazy(callback?: ResultCallback<T>): FindOneQuery<T>;
}
export interface FindQuery<T> extends Query<T[]> {
    sort(field: string, direction: number, callback?: ResultCallback<T[]>): FindQuery<T>;
    sort(fields: [string, number][], callback?: ResultCallback<T[]>): FindQuery<T>;
    fetch(path: string, callback?: ResultCallback<T[]>): FindQuery<T>;
    fetch(paths: string[], callback?: ResultCallback<T[]>): FindQuery<T>;
    limit(value: number, callback?: ResultCallback<T[]>): FindQuery<T>;
    collation(value: CollationOptions, callback?: ResultCallback<T[]>): FindQuery<T>;
    skip(value: number, callback?: ResultCallback<T[]>): FindQuery<T>;
    lazy(callback?: ResultCallback<T[]>): FindQuery<T>;
    batchSize(value: number): FindQuery<T>;
    each(iterator: IteratorCallback<T>, callback: Callback): void;
    eachSeries(iterator: IteratorCallback<T>, callback: Callback): void;
    asObservable(): Observable<T>;
}
export declare class QueryBuilderImpl<T> implements QueryBuilder<T> {
    private _session;
    private _entityCtr;
    constructor(session: InternalSession, entityCtr: Constructor<any>);
    findAll(callback?: ResultCallback<T[]>): FindQuery<T>;
    findAll(criteria: QueryDocument, callback?: ResultCallback<T[]>): FindQuery<T>;
    findOne(callback?: ResultCallback<T>): FindOneQuery<T>;
    findOne(criteria: QueryDocument, callback?: ResultCallback<T>): FindOneQuery<T>;
    findOneById(id: any, callback?: ResultCallback<T>): FindOneQuery<T>;
    findOneAndRemove(callback?: ResultCallback<T>): FindOneAndRemoveQuery<T>;
    findOneAndRemove(criteria: QueryDocument, callback?: ResultCallback<T>): FindOneAndRemoveQuery<T>;
    findOneAndUpdate(updateDocument: QueryDocument, callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    findOneAndUpdate(criteria: QueryDocument, updateDocument: QueryDocument, callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    findOneAndUpsert(updateDocument: QueryDocument, callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    findOneAndUpsert(criteria: QueryDocument, updateDocument: QueryDocument, callback?: ResultCallback<T>): FindOneAndUpdateQuery<T>;
    removeAll(callback?: ResultCallback<number>): void;
    removeAll(criteria: QueryDocument, callback?: ResultCallback<number>): void;
    removeOne(callback?: ResultCallback<number>): void;
    removeOne(criteria: QueryDocument, callback?: ResultCallback<number>): void;
    updateAll(updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    updateAll(criteria: QueryDocument, updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    updateOne(updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    updateOne(criteria: QueryDocument, updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    upsert(updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    upsert(criteria: QueryDocument, updateDocument: QueryDocument, callback?: ResultCallback<number>): void;
    distinct(key: string, callback: ResultCallback<any[]>): void;
    distinct(key: string, criteria: QueryDocument, callback: ResultCallback<any[]>): void;
    count(callback?: ResultCallback<number>): CountQuery;
    count(criteria: QueryDocument, callback?: ResultCallback<number>): CountQuery;
    private _createUpdateQuery(kind, criteriaOrUpdateDocument, updateDocumentOrCallback, callback?);
    private _createRemoveQuery(kind, criteriaOrCallback?, callback?);
    private _createFindQuery(kind, criteriaOrCallback?, callback?);
    private _createQuery(kind);
}
