import { AnyRecord, NoContentRecord, RecordMode, RecordSource } from "../records/record.js";
import { RecordKey } from "../records/recordKey.js";
import { QueryDate } from "./queryDate.js";
import { QueryFilter } from "./queryFilter.js";
import { QuerySort } from "./querySort.js";
type IncludeLink = "entity" | "standing" | "existential" | (string & NonNullable<unknown>);
interface StaticQueryBase {
    proxyTo?: string;
}
export interface LiveSingleQuery {
    includeLinks?: ReadonlyArray<IncludeLink>;
    includeDeleted?: boolean;
}
export interface SingleQuery extends LiveSingleQuery, StaticQueryBase {
}
export interface LiveQuery<T extends AnyRecord> extends LiveSingleQuery {
    sort?: QuerySort;
    min?: QueryDate;
    max?: QueryDate;
    pageStart?: QueryDate;
    pageSize?: number;
    distinct?: string;
    sources?: ReadonlyArray<`${RecordSource}`>;
    filter?: QueryFilter<T>;
    mode?: `${RecordMode}`;
}
export interface Query<T extends AnyRecord> extends LiveQuery<T>, StaticQueryBase {
}
declare function queryNew<T extends AnyRecord>(query: Query<T>): Query<T>;
declare function queryOfKey<T extends AnyRecord>(key: RecordKey<T>, baseQuery?: SingleQuery): Query<T>;
declare function querySingleToQueryString(query: SingleQuery | undefined): string;
declare function queryToQueryString<T extends AnyRecord>(query: Query<T>): string;
declare function queryToSync<T extends AnyRecord>(query: Query<T>, boundary: QueryDate): Query<T>;
declare function queryFindBoundary<T extends AnyRecord>(query: Query<T>, record: T): QueryDate;
interface QueryFilterOptions {
    ignorePageSize?: boolean;
    boundary?: QueryDate;
}
declare function queryFilter<R extends AnyRecord, T extends R>(query: Query<T>, records: ReadonlyArray<R | NoContentRecord>, { ignorePageSize, boundary }?: QueryFilterOptions): readonly T[];
declare function queryIsMatch(query1: Query<AnyRecord>, query2: Query<AnyRecord>): boolean;
declare function queryIsSuperset(query1: Query<AnyRecord>, query2: Query<AnyRecord>): boolean;
declare function queryIsSyncSuperset(query1: Query<AnyRecord>, query2: Query<AnyRecord>): boolean;
export declare const Query: {
    new: typeof queryNew;
    ofKey: typeof queryOfKey;
    singleToQueryString: typeof querySingleToQueryString;
    toQueryString: typeof queryToQueryString;
    toSync: typeof queryToSync;
    findBoundary: typeof queryFindBoundary;
    filter: typeof queryFilter;
    isMatch: typeof queryIsMatch;
    isSuperset: typeof queryIsSuperset;
    isSyncSuperset: typeof queryIsSyncSuperset;
    defaultIncludeLinks: readonly IncludeLink[];
    defaultSources: readonly RecordSource[];
};
export {};
