import { ForClause, FromClause, GroupByClause, HavingClause, JoinClause, JoinOnClause, JoinUsingClause, LimitClause, OrderByClause, OrderByItem, ParenSource, SelectClause, SelectItem, SourceExpression, SubQuerySource, TableSource, WhereClause, WindowFrameClause } from "../models/Clause";
import { BinarySelectQuery, SimpleSelectQuery, SelectQuery, ValuesQuery } from "../models/SelectQuery";
import { SqlComponent, SqlComponentVisitor } from "../models/SqlComponent";
import { ArrayExpression, BetweenExpression, BinaryExpression, CaseExpression, CaseKeyValuePair, CastExpression, ColumnReference, FunctionCall, InlineQuery, ParenExpression, ParameterExpression, SwitchCaseArgument, TupleExpression, UnaryExpression, ValueComponent, WindowFrameExpression, IdentifierString, RawString, WindowFrameSpec, TypeValue } from "../models/ValueComponent";
/**
 * A visitor that disables all WITH clauses in a SQL query structure.
 * This processes and removes WITH clauses from:
 * - Simple SELECT queries
 * - Binary queries (UNION, EXCEPT, etc.)
 * - Subqueries
 * - Inline queries
 *
 * It maintains the CTE queries themselves but restructures the query to not use
 * the WITH clause syntactical construct.
 */
export declare class CTEDisabler implements SqlComponentVisitor<SqlComponent> {
    private handlers;
    private visitedNodes;
    private isRootVisit;
    constructor();
    /**
     * Reset the visited nodes tracking
     */
    private reset;
    execute(arg: SqlComponent): SelectQuery;
    /**
     * Main entry point for the visitor pattern.
     * Implements the shallow visit pattern to distinguish between root and recursive visits.
     */
    visit(arg: SqlComponent): SqlComponent;
    /**
     * Internal visit method used for all nodes.
     * This separates the visit flag management from the actual node visitation logic.
     */
    private visitNode;
    visitSimpleSelectQuery(arg: SimpleSelectQuery): SqlComponent;
    visitBinarySelectQuery(query: BinarySelectQuery): SqlComponent;
    visitValuesQuery(query: ValuesQuery): SqlComponent;
    visitSelectClause(clause: SelectClause): SqlComponent;
    visitFromClause(clause: FromClause): SqlComponent;
    visitSubQuerySource(subQuery: SubQuerySource): SqlComponent;
    visitInlineQuery(inlineQuery: InlineQuery): SqlComponent;
    visitJoinClause(joinClause: JoinClause): SqlComponent;
    visitJoinOnClause(joinOn: JoinOnClause): SqlComponent;
    visitJoinUsingClause(joinUsing: JoinUsingClause): SqlComponent;
    visitWhereClause(whereClause: WhereClause): SqlComponent;
    visitGroupByClause(clause: GroupByClause): SqlComponent;
    visitHavingClause(clause: HavingClause): SqlComponent;
    visitOrderByClause(clause: OrderByClause): SqlComponent;
    visitWindowFrameClause(clause: WindowFrameClause): SqlComponent;
    visitLimitClause(clause: LimitClause): SqlComponent;
    visitForClause(clause: ForClause): SqlComponent;
    visitParenExpression(expr: ParenExpression): SqlComponent;
    visitBinaryExpression(expr: BinaryExpression): SqlComponent;
    visitUnaryExpression(expr: UnaryExpression): SqlComponent;
    visitCaseExpression(expr: CaseExpression): SqlComponent;
    visitSwitchCaseArgument(switchCase: SwitchCaseArgument): SqlComponent;
    visitCaseKeyValuePair(pair: CaseKeyValuePair): SqlComponent;
    visitBetweenExpression(expr: BetweenExpression): SqlComponent;
    visitFunctionCall(func: FunctionCall): SqlComponent;
    visitArrayExpression(expr: ArrayExpression): SqlComponent;
    visitTupleExpression(expr: TupleExpression): SqlComponent;
    visitCastExpression(expr: CastExpression): SqlComponent;
    visitTypeValue(typeValue: TypeValue): SqlComponent;
    visitSelectItem(item: SelectItem): SqlComponent;
    visitIdentifierString(ident: IdentifierString): SqlComponent;
    visitRawString(raw: RawString): SqlComponent;
    visitColumnReference(column: ColumnReference): SqlComponent;
    visitSourceExpression(source: SourceExpression): SqlComponent;
    visitTableSource(source: TableSource): SqlComponent;
    visitParenSource(source: ParenSource): SqlComponent;
    visitParameterExpression(param: ParameterExpression): SqlComponent;
    visitWindowFrameExpression(expr: WindowFrameExpression): SqlComponent;
    visitWindowFrameSpec(spec: WindowFrameSpec): SqlComponent;
    visitLiteralValue(value: ValueComponent): SqlComponent;
    visitOrderByItem(item: OrderByItem): SqlComponent;
}
