import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Subject } from 'rxjs/Subject';
import { ArrayEmitter } from './array-emitter.js';
import { Database, Model, Query as IQuery, QueryFunction, QueryList, Resource, SocketFactory } from './types';
export declare class Query<T> extends ArrayEmitter<T> implements IQuery<T> {
    $refresh: (force?: boolean) => Promise<Query<T>>;
    $promise: Promise<Query<T>>;
    $subject: BehaviorSubject<Query<T>>;
    $resolvedSubject: Subject<Query<T>>;
    $resolved: boolean;
    $Model: any;
    $serverResults?: Query<T>;
    $skip?: number;
    $hasNext: boolean;
    $hasPrev: boolean;
    extend: (obj: any, noSanitize?: boolean, retServer?: boolean) => Promise<Query<T>>;
    replace: (qry: any, retServer?: boolean) => Promise<Query<T>>;
    get: (...args: any[]) => any;
    next: (num?: number) => Promise<Query<T>>;
    prev: (num?: number) => Promise<Query<T>>;
    chain: (Model: Resource<Model> | QueryFunction, qryFn?: QueryFunction) => IQuery<Model>;
    transform: (tmpResults: any[]) => Promise<any[]> | any[];
    currentLimit: number;
    currentSkip: number;
    loading: boolean;
    hasNext: boolean;
    hasPrev: boolean;
}
export declare class LocalQuery<T> extends Query<T> {
}
export declare class ServerQuery<T> extends Query<T> {
    $newData?: (qryId: string, response: any, force?: boolean) => void;
}
export declare function createQueryFactory(socket: SocketFactory): (url: string, rootKey: string, rootKeyPlural: string, db?: Database) => QueryList;
