import { SelectQuery, SimpleSelectQuery } from "../models/SelectQuery";
import { SqlComponentFormatOptions } from "./SqlComponentFormatter";
export type StaticPredicatePlacementInput = string | SelectQuery | SimpleSelectQuery;
/**
 * Safe-only placement for parameter-free static predicates.
 *
 * The optimizer only moves top-level AND terms whose outer column references can
 * be mechanically rebased to direct outputs of a single-use simple CTE or
 * derived table. Unsupported or ambiguous predicates stay in place.
 */
export interface StaticPredicatePlacementOptions 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 StaticPredicatePlacementWarning {
    code: string;
    message: string;
    detail?: unknown;
}
export interface StaticPredicatePlacementError {
    code: string;
    message: string;
    detail?: unknown;
}
export interface StaticPredicateMove {
    kind: "move_static_predicate";
    predicateSql: string;
    fromScopeId: string;
    toScopeId: string;
    reason: string;
    columnReferences: readonly string[];
}
export interface StaticPredicateSkipped {
    predicateSql: string;
    scopeId: string;
    reason: string;
    code: string;
}
export interface StaticPredicatePlacementSafety {
    mode: "safe_only";
    unsafeRewriteApplied: false;
    dryRun: boolean;
    formatterGeneratedSource: boolean;
}
export interface StaticPredicatePlacementResult {
    ok: boolean;
    sql: string;
    query: SelectQuery | null;
    applied: readonly StaticPredicateMove[];
    skipped: readonly StaticPredicateSkipped[];
    warnings: readonly StaticPredicatePlacementWarning[];
    errors: readonly StaticPredicatePlacementError[];
    safety: StaticPredicatePlacementSafety;
    staticPredicateMoves: readonly StaticPredicateMove[];
}
export declare class StaticPredicatePlacementOptimizer {
    plan(input: StaticPredicatePlacementInput, options?: StaticPredicatePlacementOptions): StaticPredicatePlacementResult;
    private placePredicatesInScopes;
    optimize(input: StaticPredicatePlacementInput, options?: StaticPredicatePlacementOptions): StaticPredicatePlacementResult;
    private parseInput;
    private analyzeCandidate;
    private isExistsPredicate;
    private findUnsupportedExpression;
    private resolveTarget;
    private findRootQueryBoundary;
    private resolveTargetPlacement;
    private findNullableSideBoundaryForTargetColumns;
    private resolveSourceBinding;
    private resolveUpstreamQuery;
    private resolveUnionTarget;
    private resolveTargetColumns;
    private resolveBaseTableJoinOnTarget;
    private appendJoinOnPredicate;
    private resolveDeepestBranchTarget;
    private verifyColumnResolvableInQuery;
    private isGroupKeyColumn;
    private sameResolvableColumnInQuery;
    private resolveColumnSourceAlias;
    private rebasePredicate;
    private getSourceBindings;
    private isBaseTableBinding;
    private isInnerJoin;
    private findNullableSideBoundary;
    private hasLaterJoinThatNullsPriorSources;
    private hasOuterJoin;
    private hasDistinctOnBoundary;
    private hasOrdinaryDistinct;
    private getOutputColumnMatchCount;
    private collectUnionBranches;
    private resolveUnionOutputIndex;
    private resolveTargetColumnByOutputIndex;
    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 collectSourceAliases;
    private collectRootColumnReferences;
    private hasWindowUsage;
    private collectParameterNames;
    private makeSkipped;
    private buildResult;
}
export declare const planStaticPredicatePlacement: (input: StaticPredicatePlacementInput, options?: StaticPredicatePlacementOptions) => StaticPredicatePlacementResult;
export declare const optimizeStaticPredicatePlacement: (input: StaticPredicatePlacementInput, options?: StaticPredicatePlacementOptions) => StaticPredicatePlacementResult;
