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
TypeScript
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;