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.53 kB
TypeScript
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;