import { SelectQuery, SimpleSelectQuery } from "../models/SelectQuery";
import { SqlComponentFormatOptions } from "./SqlComponentFormatter";
export type ParameterConditionOptimizationInput = string | SelectQuery | SimpleSelectQuery;
/**
 * First-phase safe-only placement for ordinary parameter predicates.
 *
 * The optimizer intentionally handles only root top-level AND predicates and one
 * CTE/derived-table hop where the destination output is a direct column reference.
 * Unsupported boundaries such as OR, DISTINCT ON, WINDOW, OUTER JOIN,
 * expression outputs, and function predicates are reported as skipped.
 */
export interface ParameterConditionOptimizationOptions extends SqlComponentFormatOptions {
    dryRun?: boolean;
    /**
     * Whether AST/model inputs should be cloned before optimization.
     * Defaults to true for public-call safety. Internal pipelines can pass false
     * when they own the model and want to avoid AST -> SQL -> AST round trips.
     */
    cloneInput?: boolean;
}
export interface ParameterConditionOptimizationWarning {
    code: string;
    message: string;
    detail?: unknown;
}
export interface ParameterConditionOptimizationError {
    code: string;
    message: string;
    detail?: unknown;
}
export interface ParameterConditionMove {
    kind: "move_condition";
    conditionSql: string;
    fromScopeId: string;
    toScopeId: string;
    reason: string;
    parameterNames: readonly string[];
    columnReferences: readonly string[];
}
export interface ParameterConditionSkipped {
    conditionSql: string;
    scopeId: string;
    reason: string;
    code: string;
}
export interface ParameterConditionOptimizationSafety {
    mode: "safe_only";
    unsafeRewriteApplied: false;
    dryRun: boolean;
    formatterGeneratedSource: boolean;
}
export interface ParameterConditionOptimizationResult {
    ok: boolean;
    sql: string;
    query: SelectQuery | null;
    applied: readonly ParameterConditionMove[];
    skipped: readonly ParameterConditionSkipped[];
    warnings: readonly ParameterConditionOptimizationWarning[];
    errors: readonly ParameterConditionOptimizationError[];
    safety: ParameterConditionOptimizationSafety;
    conditionMoves: readonly ParameterConditionMove[];
}
export declare class ParameterConditionPlacementOptimizer {
    plan(input: ParameterConditionOptimizationInput, options?: ParameterConditionOptimizationOptions): ParameterConditionOptimizationResult;
    optimize(input: ParameterConditionOptimizationInput, options?: ParameterConditionOptimizationOptions): ParameterConditionOptimizationResult;
    private parseInput;
    private analyzeCandidate;
    private findUnsupportedExpression;
    private findUnsupportedParameterPredicateShape;
    private isSupportedInPredicate;
    private resolveTarget;
    private findRootQueryBoundary;
    private resolveTargetPlacement;
    private resolveSourceBinding;
    private resolveUpstreamQuery;
    private resolveUnionTarget;
    private resolveTargetColumns;
    private resolveBaseTableJoinOnTarget;
    private appendJoinOnCondition;
    private resolveTargetColumnByOutputIndex;
    private resolveDeepestBranchTarget;
    private verifyColumnResolvableInQuery;
    private isGroupKeyColumn;
    private sameResolvableColumnInQuery;
    private resolveColumnSourceAlias;
    private rebaseCondition;
    private getSourceBindings;
    private isBaseTableBinding;
    private isInnerJoin;
    private findNullableSideBoundary;
    private hasLaterJoinThatNullsPriorSources;
    private hasOuterJoin;
    private hasDistinctOnBoundary;
    private hasOrdinaryDistinct;
    private getOutputColumnMatchCount;
    private collectUnionBranches;
    private resolveUnionOutputIndex;
    private collectSelectOutputs;
    private collectDirectOutputMatches;
    private hasExplicitOutputMatch;
    private inferWildcardOutputMatches;
    private inferWildcardTargetColumn;
    private resolveWildcardColumnFromBinding;
    private collectSourceOutputMatches;
    private createColumnForBinding;
    private createInferredOutputColumn;
    private resolveSourceQueryForColumns;
    private findCte;
    private countTableSourceReferences;
    private hasWindowUsage;
    private collectColumnReferences;
    private collectParameterNames;
    private makeSkipped;
    private buildResult;
}
export declare const planParameterConditionOptimization: (input: ParameterConditionOptimizationInput, options?: ParameterConditionOptimizationOptions) => ParameterConditionOptimizationResult;
export declare const optimizeParameterConditionPlacement: (input: ParameterConditionOptimizationInput, options?: ParameterConditionOptimizationOptions) => ParameterConditionOptimizationResult;
