import { Key, QueryInput, QueryOutput, ScanInput, ScanOutput } from 'aws-sdk/clients/dynamodb';
import { Observable } from 'rxjs';
import { ModelConstructor } from '../../model/model-constructor';
import { DynamoRx } from '../dynamo-rx';
import { ConditionExpressionDefinitionFunction, RequestConditionFunction } from '../expression/type';
import { BaseRequest } from './base.request';
import { QueryRequest } from './query/query.request';
import { QueryResponse } from './query/query.response';
import { ScanRequest } from './scan/scan.request';
import { ScanResponse } from './scan/scan.response';
export declare abstract class Request<T, R extends QueryRequest<T> | ScanRequest<T>, I extends QueryInput | ScanInput, Z extends QueryResponse<T> | ScanResponse<T>> extends BaseRequest<T, I> {
    static DEFAULT_LIMIT: number;
    static INFINITE_LIMIT: number;
    readonly params: I;
    protected constructor(dynamoRx: DynamoRx, modelClazz: ModelConstructor<T>);
    /**
     *
     * @param key A map representing the start id which is included in next call, if null is delivered
     * startKey will be removed from params
     * @returns {Request}
     */
    exclusiveStartKey(key: Key | null): R;
    index(indexName: string): R;
    limit(limit: number): R;
    whereAttribute(attributePath: keyof T): RequestConditionFunction<R>;
    where(...conditionDefFns: ConditionExpressionDefinitionFunction[]): R;
    abstract execNoMap(): Observable<QueryOutput | ScanOutput>;
    abstract execFullResponse(): Observable<Z>;
    abstract exec(): Observable<T[]>;
    abstract execSingle(): Observable<T | null>;
    abstract execCount(): Observable<number>;
    /**
     * fetches all pages. may uses all provisionedOutput, therefore for client side use cases rather use pagedDatasource (exec)
     */
    execFetchAll(): Observable<T[]>;
}
