import { OrderDirection } from "@decaf-ts/core";
import { Constructor } from "@decaf-ts/decoration";
import { MangoQuery, MangoSelector, SortOrder } from "../types.d.cts";
export type MangoIndexCandidate = {
    name: string;
    ddoc: string;
    fields: string[];
    direction?: OrderDirection;
    source: "table" | "defaultQuery" | "index";
};
export type MangoIndexResolution = {
    candidate: MangoIndexCandidate;
    use_index: string | [string, string];
};
export type MangoPlannerLog = {
    debug?: (message: string) => void;
    warn?: (message: string) => void;
};
export type RequiredMangoIndexShape = {
    tableName: string;
    modelName: string;
    equalityFields: string[];
    rangeFields: string[];
    sortFields: string[];
    sortDirection?: OrderDirection;
    requiredFields: string[];
};
export type ReversedIndexDeclaration = {
    attribute: string;
    compositions: string[];
    directions: OrderDirection[];
    name: string;
    ddoc: string;
    fields: Array<string | Record<string, OrderDirection>>;
    decorator: string;
};
export declare function normalizeSortField(entry: SortOrder): {
    field: string;
    direction?: OrderDirection;
} | undefined;
export declare function getSortFields(query: MangoQuery): string[];
export declare function getSortDirection(query: MangoQuery): OrderDirection | undefined;
export declare function getEqualitySelectorFields(selector?: MangoSelector): Set<string>;
export declare function getRangeSelectorFields(selector?: MangoSelector): Set<string>;
export declare function buildGeneratedIndexCandidates(clazz: Constructor): MangoIndexCandidate[];
export declare function findGeneratedIndexCandidateByName(clazz: Constructor, expectedName: string): MangoIndexCandidate | undefined;
export declare function resolveGeneratedIndexForQuery(clazz: Constructor, query: MangoQuery, options?: {
    preserveDefaultQuery?: boolean;
    requireSortCoverage?: boolean;
}): MangoIndexResolution | undefined;
export declare function getRequiredMangoIndexShape(clazz: Constructor, query: MangoQuery): RequiredMangoIndexShape;
export declare function reverseRequiredShapeToIndexDeclaration(clazz: Constructor, query: MangoQuery): ReversedIndexDeclaration;
export declare function attachGeneratedUseIndex(clazz: Constructor | undefined, query: MangoQuery, log?: MangoPlannerLog, options?: {
    preserveDefaultQuery?: boolean;
    requireSortCoverage?: boolean;
    requireIndex?: boolean;
    forceNamedIndexes?: boolean;
}): void;
export declare function requireGeneratedUseIndex(clazz: Constructor, query: MangoQuery, log?: MangoPlannerLog, options?: {
    requireSortCoverage?: boolean;
}): void;
export declare function warnScanProneMangoOperators(selector: unknown, log?: MangoPlannerLog, path?: string): void;
export declare function ensureDeterministicSort(query: MangoQuery, tieBreaker: string, direction?: OrderDirection): void;
export declare function enableMangoExecutionStats(query: MangoQuery): void;
