UNPKG

rawsql-ts

Version:

High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.

118 lines (117 loc) 4.72 kB
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;