import { Dict } from '@orbit/utils';
import { RecordQuery, RecordIdentity, RecordQueryExpression, RecordOperation, RecordQueryExpressionResult } from '@orbit/records';
import { FullResponse } from '@orbit/data';
import { JSONAPIRequestProcessor } from '../jsonapi-request-processor';
import { JSONAPIRequestOptions } from './jsonapi-request-options';
import { JSONAPIResponse } from '../jsonapi-response';
export interface QueryRequest {
    op: string;
    options?: JSONAPIRequestOptions;
}
export interface FindRecordRequest extends QueryRequest {
    op: 'findRecord';
    record: RecordIdentity;
}
export interface FindRecordsRequest extends QueryRequest {
    op: 'findRecords';
    type: string;
}
export interface FindRelatedRecordRequest extends QueryRequest {
    op: 'findRelatedRecord';
    record: RecordIdentity;
    relationship: string;
}
export interface FindRelatedRecordsRequest extends QueryRequest {
    op: 'findRelatedRecords';
    record: RecordIdentity;
    relationship: string;
}
export declare type RecordQueryRequest = FindRecordRequest | FindRecordsRequest | FindRelatedRecordRequest | FindRelatedRecordsRequest;
export declare type QueryRequestProcessorResponse = FullResponse<RecordQueryExpressionResult, JSONAPIResponse, RecordOperation>;
export interface QueryRequestProcessor {
    (requestProcessor: JSONAPIRequestProcessor, request: RecordQueryRequest): Promise<QueryRequestProcessorResponse>;
}
export declare function getQueryRequests(requestProcessor: JSONAPIRequestProcessor, query: RecordQuery): RecordQueryRequest[];
export interface ExpressionToRequestConverter {
    (expression: RecordQueryExpression, requestProcessor: JSONAPIRequestProcessor): RecordQueryRequest;
}
export declare const QueryRequestProcessors: Dict<QueryRequestProcessor>;
