rawsql-ts 0.27.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/esm/index.min.js +1 -1
  2. package/dist/esm/index.min.js.map +4 -4
  3. package/dist/esm/transformers/ConditionDeduplicationOptimizer.d.ts +22 -0
  4. package/dist/esm/transformers/ConditionDeduplicationOptimizer.js +198 -0
  5. package/dist/esm/transformers/ConditionDeduplicationOptimizer.js.map +1 -0
  6. package/dist/esm/transformers/ConditionOptimization.d.ts +35 -1
  7. package/dist/esm/transformers/ConditionOptimization.js +359 -24
  8. package/dist/esm/transformers/ConditionOptimization.js.map +1 -1
  9. package/dist/esm/transformers/ParameterConditionPlacementOptimizer.d.ts +13 -0
  10. package/dist/esm/transformers/ParameterConditionPlacementOptimizer.js +246 -27
  11. package/dist/esm/transformers/ParameterConditionPlacementOptimizer.js.map +1 -1
  12. package/dist/esm/transformers/StaticPredicatePlacementOptimizer.d.ts +12 -0
  13. package/dist/esm/transformers/StaticPredicatePlacementOptimizer.js +211 -18
  14. package/dist/esm/transformers/StaticPredicatePlacementOptimizer.js.map +1 -1
  15. package/dist/esm/transformers/TopLevelAndConditionDeduper.d.ts +10 -0
  16. package/dist/esm/transformers/TopLevelAndConditionDeduper.js +66 -0
  17. package/dist/esm/transformers/TopLevelAndConditionDeduper.js.map +1 -0
  18. package/dist/index.min.js +1 -1
  19. package/dist/index.min.js.map +4 -4
  20. package/dist/src/transformers/ConditionDeduplicationOptimizer.d.ts +22 -0
  21. package/dist/src/transformers/ConditionOptimization.d.ts +35 -1
  22. package/dist/src/transformers/ParameterConditionPlacementOptimizer.d.ts +13 -0
  23. package/dist/src/transformers/StaticPredicatePlacementOptimizer.d.ts +12 -0
  24. package/dist/src/transformers/TopLevelAndConditionDeduper.d.ts +10 -0
  25. package/dist/transformers/ConditionDeduplicationOptimizer.js +202 -0
  26. package/dist/transformers/ConditionDeduplicationOptimizer.js.map +1 -0
  27. package/dist/transformers/ConditionOptimization.js +362 -22
  28. package/dist/transformers/ConditionOptimization.js.map +1 -1
  29. package/dist/transformers/ParameterConditionPlacementOptimizer.js +245 -26
  30. package/dist/transformers/ParameterConditionPlacementOptimizer.js.map +1 -1
  31. package/dist/transformers/StaticPredicatePlacementOptimizer.js +210 -17
  32. package/dist/transformers/StaticPredicatePlacementOptimizer.js.map +1 -1
  33. package/dist/transformers/TopLevelAndConditionDeduper.js +72 -0
  34. package/dist/transformers/TopLevelAndConditionDeduper.js.map +1 -0
  35. package/dist/tsconfig.browser.tsbuildinfo +1 -1
  36. package/package.json +1 -1
@@ -0,0 +1,22 @@
1
+ import { SelectQuery } from "../models/SelectQuery";
2
+ import { SqlComponentFormatOptions } from "./SqlComponentFormatter";
3
+ export interface ConditionDeduplicationApplied {
4
+ kind: "dedupe_condition";
5
+ conditionSql: string;
6
+ scopeId: string;
7
+ reason: string;
8
+ }
9
+ export interface ConditionDeduplicationResult {
10
+ /** API output shape review: this phase mutates and returns the model only; ConditionOptimization remains responsible for compatibility sql output. */
11
+ query: SelectQuery | null;
12
+ applied: readonly ConditionDeduplicationApplied[];
13
+ }
14
+ export declare class ConditionDeduplicationOptimizer {
15
+ private visited;
16
+ private applied;
17
+ optimize(query: SelectQuery | null, options: SqlComponentFormatOptions): ConditionDeduplicationResult;
18
+ private visitSelectQuery;
19
+ private visitSourceExpression;
20
+ private visitValueComponent;
21
+ private dedupeCondition;
22
+ }
@@ -0,0 +1,198 @@
1
+ import { FunctionSource, HavingClause, JoinOnClause, OrderByItem, ParenSource, SubQuerySource, WhereClause } from "../models/Clause";
2
+ import { BinarySelectQuery, SimpleSelectQuery } from "../models/SelectQuery";
3
+ import { ArrayExpression, ArrayIndexExpression, ArrayQueryExpression, ArraySliceExpression, BetweenExpression, BinaryExpression, CaseExpression, CastExpression, FunctionCall, InlineQuery, JsonPredicateExpression, ParenExpression, TupleExpression, TypeValue, UnaryExpression, ValueList } from "../models/ValueComponent";
4
+ import { dedupeTopLevelAndConditionsWithMetadata } from "./TopLevelAndConditionDeduper";
5
+ export class ConditionDeduplicationOptimizer {
6
+ constructor() {
7
+ this.visited = new WeakSet();
8
+ this.applied = [];
9
+ }
10
+ optimize(query, options) {
11
+ this.visited = new WeakSet();
12
+ this.applied = [];
13
+ if (!query) {
14
+ return { query: null, applied: [] };
15
+ }
16
+ this.visitSelectQuery(query, "root", options);
17
+ return {
18
+ query,
19
+ applied: [...this.applied]
20
+ };
21
+ }
22
+ visitSelectQuery(query, scopeId, options) {
23
+ var _a, _b, _c, _d, _e, _f, _g, _h;
24
+ if (this.visited.has(query)) {
25
+ return;
26
+ }
27
+ this.visited.add(query);
28
+ if (query instanceof BinarySelectQuery) {
29
+ this.visitSelectQuery(query.left, `${scopeId}.left`, options);
30
+ this.visitSelectQuery(query.right, `${scopeId}.right`, options);
31
+ return;
32
+ }
33
+ if (!(query instanceof SimpleSelectQuery)) {
34
+ return;
35
+ }
36
+ for (const cte of (_b = (_a = query.withClause) === null || _a === void 0 ? void 0 : _a.tables) !== null && _b !== void 0 ? _b : []) {
37
+ const cteQuery = cte.query;
38
+ if (cteQuery instanceof SimpleSelectQuery || cteQuery instanceof BinarySelectQuery) {
39
+ this.visitSelectQuery(cteQuery, `${scopeId}.cte:${cte.getSourceAliasName()}`, options);
40
+ }
41
+ }
42
+ for (const item of query.selectClause.items) {
43
+ this.visitValueComponent(item.value, `${scopeId}.select`, options);
44
+ }
45
+ if (query.fromClause) {
46
+ this.visitSourceExpression(query.fromClause.source, `${scopeId}.from`, options);
47
+ for (const join of (_c = query.fromClause.joins) !== null && _c !== void 0 ? _c : []) {
48
+ const joinScope = `${scopeId}.join:${(_d = join.source.getAliasName()) !== null && _d !== void 0 ? _d : "unknown"}`;
49
+ this.visitSourceExpression(join.source, joinScope, options);
50
+ if (join.condition instanceof JoinOnClause) {
51
+ join.condition.condition = this.dedupeCondition(join.condition.condition, `${joinScope}.on`, "Removed a duplicate top-level AND condition from a JOIN ON clause.", options);
52
+ this.visitValueComponent(join.condition.condition, `${joinScope}.on`, options);
53
+ }
54
+ }
55
+ }
56
+ if (query.whereClause) {
57
+ query.whereClause = new WhereClause(this.dedupeCondition(query.whereClause.condition, `${scopeId}.where`, "Removed a duplicate top-level AND condition from a WHERE clause.", options));
58
+ this.visitValueComponent(query.whereClause.condition, `${scopeId}.where`, options);
59
+ }
60
+ if (query.havingClause) {
61
+ query.havingClause = new HavingClause(this.dedupeCondition(query.havingClause.condition, `${scopeId}.having`, "Removed a duplicate top-level AND condition from a HAVING clause.", options));
62
+ this.visitValueComponent(query.havingClause.condition, `${scopeId}.having`, options);
63
+ }
64
+ for (const item of (_f = (_e = query.groupByClause) === null || _e === void 0 ? void 0 : _e.grouping) !== null && _f !== void 0 ? _f : []) {
65
+ this.visitValueComponent(item, `${scopeId}.group_by`, options);
66
+ }
67
+ for (const item of (_h = (_g = query.orderByClause) === null || _g === void 0 ? void 0 : _g.order) !== null && _h !== void 0 ? _h : []) {
68
+ if (item instanceof OrderByItem) {
69
+ this.visitValueComponent(item.value, `${scopeId}.order_by`, options);
70
+ }
71
+ else {
72
+ this.visitValueComponent(item, `${scopeId}.order_by`, options);
73
+ }
74
+ }
75
+ }
76
+ visitSourceExpression(source, scopeId, options) {
77
+ const datasource = source.datasource;
78
+ if (datasource instanceof SubQuerySource) {
79
+ this.visitSelectQuery(datasource.query, `${scopeId}.subquery`, options);
80
+ return;
81
+ }
82
+ if (datasource instanceof ParenSource) {
83
+ const nested = datasource.source;
84
+ if (nested instanceof SubQuerySource) {
85
+ this.visitSelectQuery(nested.query, `${scopeId}.subquery`, options);
86
+ }
87
+ return;
88
+ }
89
+ if (datasource instanceof FunctionSource && datasource.argument) {
90
+ this.visitValueComponent(datasource.argument, `${scopeId}.function`, options);
91
+ }
92
+ }
93
+ visitValueComponent(value, scopeId, options) {
94
+ if (this.visited.has(value)) {
95
+ return;
96
+ }
97
+ this.visited.add(value);
98
+ if (value instanceof InlineQuery) {
99
+ this.visitSelectQuery(value.selectQuery, `${scopeId}.inline_query`, options);
100
+ return;
101
+ }
102
+ if (value instanceof ArrayQueryExpression) {
103
+ this.visitSelectQuery(value.query, `${scopeId}.array_query`, options);
104
+ return;
105
+ }
106
+ if (value instanceof ParenExpression) {
107
+ this.visitValueComponent(value.expression, scopeId, options);
108
+ return;
109
+ }
110
+ if (value instanceof BinaryExpression) {
111
+ this.visitValueComponent(value.left, scopeId, options);
112
+ this.visitValueComponent(value.right, scopeId, options);
113
+ return;
114
+ }
115
+ if (value instanceof UnaryExpression) {
116
+ this.visitValueComponent(value.expression, scopeId, options);
117
+ return;
118
+ }
119
+ if (value instanceof FunctionCall) {
120
+ if (value.argument) {
121
+ this.visitValueComponent(value.argument, scopeId, options);
122
+ }
123
+ if (value.filterCondition) {
124
+ this.visitValueComponent(value.filterCondition, `${scopeId}.filter`, options);
125
+ }
126
+ return;
127
+ }
128
+ if (value instanceof CastExpression) {
129
+ this.visitValueComponent(value.input, scopeId, options);
130
+ if (value.castType.argument) {
131
+ this.visitValueComponent(value.castType.argument, scopeId, options);
132
+ }
133
+ return;
134
+ }
135
+ if (value instanceof CaseExpression) {
136
+ if (value.condition) {
137
+ this.visitValueComponent(value.condition, scopeId, options);
138
+ }
139
+ for (const item of value.switchCase.cases) {
140
+ this.visitValueComponent(item.key, scopeId, options);
141
+ this.visitValueComponent(item.value, scopeId, options);
142
+ }
143
+ if (value.switchCase.elseValue) {
144
+ this.visitValueComponent(value.switchCase.elseValue, scopeId, options);
145
+ }
146
+ return;
147
+ }
148
+ if (value instanceof BetweenExpression) {
149
+ this.visitValueComponent(value.expression, scopeId, options);
150
+ this.visitValueComponent(value.lower, scopeId, options);
151
+ this.visitValueComponent(value.upper, scopeId, options);
152
+ return;
153
+ }
154
+ if (value instanceof JsonPredicateExpression) {
155
+ this.visitValueComponent(value.expression, scopeId, options);
156
+ return;
157
+ }
158
+ if (value instanceof ArrayExpression) {
159
+ this.visitValueComponent(value.expression, scopeId, options);
160
+ return;
161
+ }
162
+ if (value instanceof ArrayIndexExpression) {
163
+ this.visitValueComponent(value.array, scopeId, options);
164
+ this.visitValueComponent(value.index, scopeId, options);
165
+ return;
166
+ }
167
+ if (value instanceof ArraySliceExpression) {
168
+ this.visitValueComponent(value.array, scopeId, options);
169
+ if (value.startIndex) {
170
+ this.visitValueComponent(value.startIndex, scopeId, options);
171
+ }
172
+ if (value.endIndex) {
173
+ this.visitValueComponent(value.endIndex, scopeId, options);
174
+ }
175
+ return;
176
+ }
177
+ if (value instanceof ValueList || value instanceof TupleExpression) {
178
+ value.values.forEach(item => this.visitValueComponent(item, scopeId, options));
179
+ return;
180
+ }
181
+ if (value instanceof TypeValue && value.argument) {
182
+ this.visitValueComponent(value.argument, scopeId, options);
183
+ }
184
+ }
185
+ dedupeCondition(condition, scopeId, reason, options) {
186
+ const result = dedupeTopLevelAndConditionsWithMetadata(condition, options);
187
+ for (const conditionSql of result.removedConditionSql) {
188
+ this.applied.push({
189
+ kind: "dedupe_condition",
190
+ conditionSql,
191
+ scopeId,
192
+ reason
193
+ });
194
+ }
195
+ return result.expression;
196
+ }
197
+ }
198
+ //# sourceMappingURL=ConditionDeduplicationOptimizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConditionDeduplicationOptimizer.js","sourceRoot":"","sources":["../../../src/transformers/ConditionDeduplicationOptimizer.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import { SelectQuery, SimpleSelectQuery } from "../models/SelectQuery";
2
2
  import { ParameterConditionMove, ParameterConditionOptimizationError, ParameterConditionOptimizationOptions, ParameterConditionOptimizationWarning, ParameterConditionSkipped } from "./ParameterConditionPlacementOptimizer";
3
3
  import { StaticPredicateMove, StaticPredicatePlacementError, StaticPredicatePlacementWarning, StaticPredicateSkipped } from "./StaticPredicatePlacementOptimizer";
4
+ import { ConditionDeduplicationApplied } from "./ConditionDeduplicationOptimizer";
4
5
  import { OptionalConditionPruningParameters } from "./PruneOptionalConditionBranches";
5
6
  export type ConditionOptimizationInput = string | SelectQuery | SimpleSelectQuery;
6
- export type ConditionOptimizationPhaseKind = "sssql_optional_condition" | "parameter_condition_placement" | "static_predicate_placement";
7
+ export type ConditionOptimizationPhaseKind = "sssql_optional_condition" | "parameter_condition_placement" | "static_predicate_placement" | "condition_deduplication";
7
8
  export interface ConditionOptimizationOptions extends ParameterConditionOptimizationOptions {
8
9
  /**
9
10
  * Explicit opt-in values for SSSQL optional branch pruning.
@@ -19,6 +20,7 @@ export interface ConditionOptimizationPhaseSummary {
19
20
  warningCount: number;
20
21
  errorCount: number;
21
22
  }
23
+ export type ConditionOptimizationSkipDisposition = "blocked" | "unchanged" | "ignored";
22
24
  export interface SssqlOptionalConditionApplied {
23
25
  phaseKind: "sssql_optional_condition";
24
26
  kind: "prune_optional_branch" | "refresh_optional_branch";
@@ -34,16 +36,21 @@ export interface SssqlOptionalConditionSkipped {
34
36
  parameterName: string;
35
37
  code: string;
36
38
  reason: string;
39
+ skipDisposition: ConditionOptimizationSkipDisposition;
37
40
  }
38
41
  export type ConditionOptimizationApplied = SssqlOptionalConditionApplied | (ParameterConditionMove & {
39
42
  phaseKind: "parameter_condition_placement";
40
43
  }) | (StaticPredicateMove & {
41
44
  phaseKind: "static_predicate_placement";
45
+ }) | (ConditionDeduplicationApplied & {
46
+ phaseKind: "condition_deduplication";
42
47
  });
43
48
  export type ConditionOptimizationSkipped = SssqlOptionalConditionSkipped | (ParameterConditionSkipped & {
44
49
  phaseKind: "parameter_condition_placement";
50
+ skipDisposition: ConditionOptimizationSkipDisposition;
45
51
  }) | (StaticPredicateSkipped & {
46
52
  phaseKind: "static_predicate_placement";
53
+ skipDisposition: ConditionOptimizationSkipDisposition;
47
54
  });
48
55
  export type ConditionOptimizationWarning = (ParameterConditionOptimizationWarning & {
49
56
  phaseKind: ConditionOptimizationPhaseKind;
@@ -61,6 +68,31 @@ export interface ConditionOptimizationSafety {
61
68
  dryRun: boolean;
62
69
  formatterGeneratedSource: boolean;
63
70
  }
71
+ export interface ConditionOptimizationSourceFilterProbe {
72
+ kind: "source_filter_probe";
73
+ source: string;
74
+ sourceAlias: string;
75
+ predicate: string;
76
+ suggestedSql: string;
77
+ reason: string;
78
+ }
79
+ export interface ConditionOptimizationSkippedProbe {
80
+ kind: "source_filter_probe_skipped";
81
+ source?: string;
82
+ sourceAlias?: string;
83
+ predicate: string;
84
+ code: string;
85
+ reason: string;
86
+ }
87
+ export interface ConditionOptimizationDiagnostics {
88
+ /**
89
+ * Probe diagnostics are collected after SSSQL optional pruning/refresh and
90
+ * before parameter/static placement phases, so they describe the pre-placement
91
+ * source-filter debugging snapshot rather than the final rewritten query.
92
+ */
93
+ probes: readonly ConditionOptimizationSourceFilterProbe[];
94
+ skippedProbes: readonly ConditionOptimizationSkippedProbe[];
95
+ }
64
96
  export interface ConditionOptimizationResult {
65
97
  ok: boolean;
66
98
  sql: string;
@@ -71,6 +103,8 @@ export interface ConditionOptimizationResult {
71
103
  warnings: readonly ConditionOptimizationWarning[];
72
104
  errors: readonly ConditionOptimizationError[];
73
105
  safety: ConditionOptimizationSafety;
106
+ /** API output shape review: diagnostics is additive; sql/query keep their existing output shape for callers. */
107
+ diagnostics?: ConditionOptimizationDiagnostics;
74
108
  }
75
109
  export declare const planConditionOptimization: (input: ConditionOptimizationInput, options?: ConditionOptimizationOptions) => ConditionOptimizationResult;
76
110
  export declare const optimizeConditions: (input: ConditionOptimizationInput, options?: ConditionOptimizationOptions) => ConditionOptimizationResult;