UNPKG

rawsql-ts

Version:

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

127 lines (126 loc) 5.8 kB
import { SelectQuery, SimpleSelectQuery } from "../models/SelectQuery"; import { ParameterConditionMove, ParameterConditionOptimizationError, ParameterConditionOptimizationOptions, ParameterConditionOptimizationWarning, ParameterConditionSkipped } from "./ParameterConditionPlacementOptimizer"; import { StaticPredicateMove, StaticPredicatePlacementError, StaticPredicatePlacementWarning, StaticPredicateSkipped } from "./StaticPredicatePlacementOptimizer"; import { ConditionDeduplicationApplied } from "./ConditionDeduplicationOptimizer"; import { OptionalConditionPruningParameters } from "./PruneOptionalConditionBranches"; export type ConditionOptimizationInput = string | SelectQuery | SimpleSelectQuery; export type ConditionOptimizationPhaseKind = "sssql_optional_condition" | "parameter_condition_placement" | "static_predicate_placement" | "condition_deduplication"; export interface ConditionOptimizationOptions extends ParameterConditionOptimizationOptions { /** * Explicit opt-in values for SSSQL optional branch pruning. * Only listed parameter names are considered, and only null/undefined values * are pruned by the safe-only SSSQL phase. */ optionalConditionParameters?: OptionalConditionPruningParameters; } export interface ConditionOptimizationPhaseSummary { kind: ConditionOptimizationPhaseKind; appliedCount: number; skippedCount: number; warningCount: number; errorCount: number; } export type ConditionOptimizationSkipDisposition = "blocked" | "unchanged" | "ignored"; export interface SssqlOptionalConditionApplied { phaseKind: "sssql_optional_condition"; kind: "prune_optional_branch" | "refresh_optional_branch"; conditionSql: string; parameterName: string; reason: string; previousConditionSql?: string; } export interface SssqlOptionalConditionSkipped { phaseKind: "sssql_optional_condition"; kind: "optional_branch_skipped"; conditionSql: string; parameterName: string; code: string; reason: string; skipDisposition: ConditionOptimizationSkipDisposition; } export type ConditionOptimizationApplied = SssqlOptionalConditionApplied | (ParameterConditionMove & { phaseKind: "parameter_condition_placement"; }) | (StaticPredicateMove & { phaseKind: "static_predicate_placement"; }) | (ConditionDeduplicationApplied & { phaseKind: "condition_deduplication"; }); export type ConditionOptimizationSkipped = SssqlOptionalConditionSkipped | (ParameterConditionSkipped & { phaseKind: "parameter_condition_placement"; skipDisposition: ConditionOptimizationSkipDisposition; }) | (StaticPredicateSkipped & { phaseKind: "static_predicate_placement"; skipDisposition: ConditionOptimizationSkipDisposition; }); export type ConditionOptimizationWarning = (ParameterConditionOptimizationWarning & { phaseKind: ConditionOptimizationPhaseKind; }) | (StaticPredicatePlacementWarning & { phaseKind: ConditionOptimizationPhaseKind; }); export type ConditionOptimizationError = (ParameterConditionOptimizationError & { phaseKind: ConditionOptimizationPhaseKind; }) | (StaticPredicatePlacementError & { phaseKind: ConditionOptimizationPhaseKind; }); export interface ConditionOptimizationSafety { mode: "safe_only"; unsafeRewriteApplied: false; dryRun: boolean; formatterGeneratedSource: boolean; } export interface ConditionOptimizationSourceFilterProbe { kind: "source_filter_probe"; source: string; sourceAlias: string; predicate: string; suggestedSql: string; reason: string; relation?: "source_filter" | "join_equivalence"; targetPredicate?: string; targetScope?: { kind: "scope" | "cte" | "table" | "subquery" | "source"; name: string; }; } export interface ConditionOptimizationSkippedProbe { kind: "source_filter_probe_skipped"; source?: string; sourceAlias?: string; predicate: string; code: string; reason: string; } export interface ConditionOptimizationDiagnostics { /** * Probe diagnostics are collected after SSSQL optional pruning/refresh and * before parameter/static placement phases, so they describe the pre-placement * source-filter debugging snapshot rather than the final rewritten query. */ probes: readonly ConditionOptimizationSourceFilterProbe[]; skippedProbes: readonly ConditionOptimizationSkippedProbe[]; /** * API output shape review: keep result.sql/result.query as the production-safe * rewrite output and expose debugSql/debugQuery only for diagnostic pipelines. * * Debug-only probe SQL is additive: result.sql/result.query remain the safe-only * production rewrite output, while debugSql/debugQuery include investigation * probes that callers can feed into lineage/debug surfaces. */ debugSql?: string; debugQuery?: SelectQuery | null; } export interface ConditionOptimizationResult { ok: boolean; sql: string; query: SelectQuery | null; phases: readonly ConditionOptimizationPhaseSummary[]; applied: readonly ConditionOptimizationApplied[]; skipped: readonly ConditionOptimizationSkipped[]; warnings: readonly ConditionOptimizationWarning[]; errors: readonly ConditionOptimizationError[]; safety: ConditionOptimizationSafety; /** API output shape review: diagnostics is additive; sql/query keep their existing output shape for callers. */ diagnostics?: ConditionOptimizationDiagnostics; } export declare const planConditionOptimization: (input: ConditionOptimizationInput, options?: ConditionOptimizationOptions) => ConditionOptimizationResult; export declare const optimizeConditions: (input: ConditionOptimizationInput, options?: ConditionOptimizationOptions) => ConditionOptimizationResult;