rawsql-ts
Version:
High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.
151 lines (150 loc) • 6.02 kB
TypeScript
import { SelectQuery, SimpleSelectQuery } from "../models/SelectQuery";
import { type ValueComponent } from "../models/ValueComponent";
import { type SupportedOptionalConditionBranch } from "./PruneOptionalConditionBranches";
export type SSSQLFilterValue = unknown;
export type SSSQLFilterInput = Record<string, SSSQLFilterValue>;
export type SssqlScaffoldFilters = SSSQLFilterInput;
export type SssqlScalarOperator = "=" | "<>" | "<" | "<=" | ">" | ">=" | "like" | "ilike";
export type SssqlScalarOperatorInput = SssqlScalarOperator | "!=";
export type SssqlBranchKind = "scalar" | "exists" | "not-exists" | "expression";
export interface SssqlTransformResult {
query: SelectQuery;
}
export type SssqlRewriteEditKind = "insert" | "replace" | "delete";
export interface SssqlRewriteEdit {
start: number;
end: number;
before: string;
after: string;
kind: SssqlRewriteEditKind;
reason?: string;
target?: SssqlRewriteEditTarget;
}
export interface SssqlRewriteEditTarget {
branchKind: SssqlBranchKind;
parameterName: string;
column?: string;
}
export type SssqlRewriteChangedRegionKind = "target-branch" | "where-keyword" | "boolean-operator" | "parentheses" | "formatter-rewrite" | "comment" | "unknown";
export interface SssqlRewriteChangedRegion {
kind: SssqlRewriteChangedRegionKind;
start: number;
end: number;
message?: string;
}
export interface SssqlRewritePlanWarning {
code: string;
message: string;
detail?: unknown;
}
export interface SssqlRewritePlanError {
code: string;
message: string;
detail?: unknown;
}
export interface SssqlRewriteSafety {
tokenCountBefore: number;
tokenCountAfter: number;
tokenSequencePreserved: boolean;
commentsPreserved: boolean;
changedOnlyTargetBranches: boolean;
changedRegions: readonly SssqlRewriteChangedRegion[];
}
export interface SssqlRewritePlan {
ok: boolean;
requiresFullReformat: boolean;
edits: readonly SssqlRewriteEdit[];
sql?: string;
safety: SssqlRewriteSafety;
warnings: readonly SssqlRewritePlanWarning[];
errors: readonly SssqlRewritePlanError[];
}
export interface SssqlBranchInfo {
parameterName: string;
kind: SssqlBranchKind;
operator?: SssqlScalarOperator;
target?: string;
query: SimpleSelectQuery;
expression: ValueComponent;
sql: string;
}
export interface SssqlScalarScaffoldSpec {
kind?: "scalar";
target: string;
parameterName?: string;
operator?: SssqlScalarOperatorInput;
}
export interface SssqlExistsScaffoldSpec {
kind: "exists" | "not-exists";
parameterName: string;
query: string;
anchorColumns: string[];
}
export type SssqlScaffoldSpec = SssqlScalarScaffoldSpec | SssqlExistsScaffoldSpec;
export interface SssqlRemoveSpec {
parameterName: string;
kind?: SssqlBranchKind;
operator?: SssqlScalarOperatorInput;
target?: string;
}
/**
* Builds and refreshes truthful SSSQL optional filter branches.
* Runtime callers should use pruning, not dynamic predicate injection.
*/
export declare class SSSQLFilterBuilder {
private readonly tableColumnResolver?;
private readonly finder;
constructor(tableColumnResolver?: ((tableName: string) => string[]) | undefined);
list(query: SelectQuery | string): SssqlBranchInfo[];
planScaffold(query: SelectQuery | string, filters: SSSQLFilterInput): SssqlRewritePlan;
dryRunScaffold(query: SelectQuery | string, filters: SSSQLFilterInput): SssqlRewritePlan;
planScaffoldBranch(query: SelectQuery | string, spec: SssqlScaffoldSpec): SssqlRewritePlan;
dryRunScaffoldBranch(query: SelectQuery | string, spec: SssqlScaffoldSpec): SssqlRewritePlan;
planRefresh(query: SelectQuery | string, filters: SSSQLFilterInput): SssqlRewritePlan;
dryRunRefresh(query: SelectQuery | string, filters: SSSQLFilterInput): SssqlRewritePlan;
planRemove(query: SelectQuery | string, spec: SssqlRemoveSpec): SssqlRewritePlan;
dryRunRemove(query: SelectQuery | string, spec: SssqlRemoveSpec): SssqlRewritePlan;
planRemoveAll(query: SelectQuery | string): SssqlRewritePlan;
dryRunRemoveAll(query: SelectQuery | string): SssqlRewritePlan;
scaffold(query: SelectQuery | string, filters: SSSQLFilterInput): SelectQuery;
scaffoldBranch(query: SelectQuery | string, spec: SssqlScaffoldSpec): SelectQuery;
refresh(query: SelectQuery | string, filters: SSSQLFilterInput): SelectQuery;
private refreshParsed;
remove(query: SelectQuery | string, spec: SssqlRemoveSpec): SelectQuery;
removeAll(query: SelectQuery | string): SelectQuery;
private parseQuery;
private planScalarInsert;
private planExistsInsert;
private buildMinimalInsertPlan;
private planBranchRemoval;
private buildPlanFromEdits;
private planRewrite;
private findMatchingBranchInfos;
private scaffoldScalarBranch;
private scaffoldExistsBranch;
private resolveTarget;
private resolveTargetInQuery;
private resolveQualifiedTarget;
private resolveUnqualifiedTarget;
private tryResolveTarget;
private findAliasForTable;
private resolveAliasForSource;
private buildCorrelatedRefreshPlan;
private collectSourceAliases;
private resolveCorrelatedAnchorTarget;
private findSourceExpressionByAlias;
private resolveSourceExpressionToUpstreamQuery;
private resolveAnchorTargetInQuery;
private getSourceAlias;
private buildScalarRefreshPlan;
private resolveScalarTargetInQuery;
private isNullableBranchColumn;
private hasLaterJoinThatNullsPriorSources;
private isPriorSourcesNullableJoin;
private isJoinedSourceNullable;
private rebaseMovedBranch;
private rebaseMovedBranchByAlias;
}
export type { SupportedOptionalConditionBranch };
export declare const scaffoldSssqlQuery: (sqlContent: string, filters: SssqlScaffoldFilters) => SssqlTransformResult;
export declare const refreshSssqlQuery: (sqlContent: string, filters: SssqlScaffoldFilters) => SssqlTransformResult;