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