rawsql-ts 0.29.0 → 0.30.1

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 (40) hide show
  1. package/dist/esm/index.d.ts +1 -0
  2. package/dist/esm/index.js +1 -0
  3. package/dist/esm/index.js.map +1 -1
  4. package/dist/esm/index.min.js +2 -2
  5. package/dist/esm/index.min.js.map +4 -4
  6. package/dist/esm/transformers/ConditionOptimization.d.ts +16 -0
  7. package/dist/esm/transformers/ConditionOptimization.js +124 -2
  8. package/dist/esm/transformers/ConditionOptimization.js.map +1 -1
  9. package/dist/esm/transformers/ParameterConditionPlacementOptimizer.js +3 -71
  10. package/dist/esm/transformers/ParameterConditionPlacementOptimizer.js.map +1 -1
  11. package/dist/esm/transformers/PredicateExpressionUtils.d.ts +16 -0
  12. package/dist/esm/transformers/PredicateExpressionUtils.js +74 -0
  13. package/dist/esm/transformers/PredicateExpressionUtils.js.map +1 -0
  14. package/dist/esm/transformers/PredicateReachabilityAnalyzer.d.ts +92 -0
  15. package/dist/esm/transformers/PredicateReachabilityAnalyzer.js +516 -0
  16. package/dist/esm/transformers/PredicateReachabilityAnalyzer.js.map +1 -0
  17. package/dist/esm/transformers/StaticPredicatePlacementOptimizer.d.ts +2 -0
  18. package/dist/esm/transformers/StaticPredicatePlacementOptimizer.js +156 -162
  19. package/dist/esm/transformers/StaticPredicatePlacementOptimizer.js.map +1 -1
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.min.js +2 -2
  23. package/dist/index.min.js.map +4 -4
  24. package/dist/src/index.d.ts +1 -0
  25. package/dist/src/transformers/ConditionOptimization.d.ts +16 -0
  26. package/dist/src/transformers/PredicateExpressionUtils.d.ts +16 -0
  27. package/dist/src/transformers/PredicateReachabilityAnalyzer.d.ts +92 -0
  28. package/dist/src/transformers/StaticPredicatePlacementOptimizer.d.ts +2 -0
  29. package/dist/transformers/ConditionOptimization.js +138 -2
  30. package/dist/transformers/ConditionOptimization.js.map +1 -1
  31. package/dist/transformers/ParameterConditionPlacementOptimizer.js +38 -106
  32. package/dist/transformers/ParameterConditionPlacementOptimizer.js.map +1 -1
  33. package/dist/transformers/PredicateExpressionUtils.js +88 -0
  34. package/dist/transformers/PredicateExpressionUtils.js.map +1 -0
  35. package/dist/transformers/PredicateReachabilityAnalyzer.js +537 -0
  36. package/dist/transformers/PredicateReachabilityAnalyzer.js.map +1 -0
  37. package/dist/transformers/StaticPredicatePlacementOptimizer.js +190 -196
  38. package/dist/transformers/StaticPredicatePlacementOptimizer.js.map +1 -1
  39. package/dist/tsconfig.browser.tsbuildinfo +1 -1
  40. package/package.json +1 -1
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.appendUnique = exports.sameColumnReference = exports.columnReferenceText = exports.cloneColumnReference = exports.cloneValueComponent = exports.rebuildWhereWithoutTerms = exports.collectTopLevelAndTerms = exports.isBinaryOperator = exports.unwrapParens = exports.identifiersEqual = exports.normalizeIdentifier = void 0;
4
+ const Clause_1 = require("../models/Clause");
5
+ const ValueComponent_1 = require("../models/ValueComponent");
6
+ const ValueParser_1 = require("../parsers/ValueParser");
7
+ const SqlComponentFormatter_1 = require("./SqlComponentFormatter");
8
+ const normalizeIdentifier = (value) => value.trim().toLowerCase();
9
+ exports.normalizeIdentifier = normalizeIdentifier;
10
+ const isCaseSensitiveIdentifier = (value) => /[A-Z]/.test(value.trim());
11
+ const identifiersEqual = (left, right) => {
12
+ const trimmedLeft = left.trim();
13
+ const trimmedRight = right.trim();
14
+ return isCaseSensitiveIdentifier(trimmedLeft) || isCaseSensitiveIdentifier(trimmedRight)
15
+ ? trimmedLeft === trimmedRight
16
+ : trimmedLeft.toLowerCase() === trimmedRight.toLowerCase();
17
+ };
18
+ exports.identifiersEqual = identifiersEqual;
19
+ const unwrapParens = (expression) => {
20
+ let candidate = expression;
21
+ while (candidate instanceof ValueComponent_1.ParenExpression) {
22
+ candidate = candidate.expression;
23
+ }
24
+ return candidate;
25
+ };
26
+ exports.unwrapParens = unwrapParens;
27
+ const isBinaryOperator = (expression, operator) => {
28
+ const candidate = (0, exports.unwrapParens)(expression);
29
+ return candidate instanceof ValueComponent_1.BinaryExpression
30
+ && candidate.operator.value.trim().toLowerCase() === operator;
31
+ };
32
+ exports.isBinaryOperator = isBinaryOperator;
33
+ const collectTopLevelAndTerms = (expression) => {
34
+ const candidate = (0, exports.unwrapParens)(expression);
35
+ if (!(0, exports.isBinaryOperator)(candidate, "and")) {
36
+ return [expression];
37
+ }
38
+ return [
39
+ ...(0, exports.collectTopLevelAndTerms)(candidate.left),
40
+ ...(0, exports.collectTopLevelAndTerms)(candidate.right)
41
+ ];
42
+ };
43
+ exports.collectTopLevelAndTerms = collectTopLevelAndTerms;
44
+ const rebuildWhereWithoutTerms = (query, termsToRemove) => {
45
+ if (!query.whereClause || termsToRemove.size === 0) {
46
+ return;
47
+ }
48
+ const remaining = (0, exports.collectTopLevelAndTerms)(query.whereClause.condition)
49
+ .filter(term => !termsToRemove.has(term));
50
+ if (remaining.length === 0) {
51
+ query.whereClause = null;
52
+ return;
53
+ }
54
+ let rebuilt = remaining[0];
55
+ for (let index = 1; index < remaining.length; index += 1) {
56
+ rebuilt = new ValueComponent_1.BinaryExpression(rebuilt, "and", remaining[index]);
57
+ }
58
+ query.whereClause = new Clause_1.WhereClause(rebuilt);
59
+ };
60
+ exports.rebuildWhereWithoutTerms = rebuildWhereWithoutTerms;
61
+ // API output shape review: this helper preserves the existing AST -> SQL -> AST clone path used by callers without changing public result.sql/result.query shapes.
62
+ const cloneValueComponent = (expression, options) => {
63
+ return ValueParser_1.ValueParser.parse((0, SqlComponentFormatter_1.formatSqlComponent)(expression, options));
64
+ };
65
+ exports.cloneValueComponent = cloneValueComponent;
66
+ const cloneColumnReference = (reference) => {
67
+ var _a, _b;
68
+ const namespaces = (_b = (_a = reference.namespaces) === null || _a === void 0 ? void 0 : _a.map(namespace => namespace.name)) !== null && _b !== void 0 ? _b : null;
69
+ return new ValueComponent_1.ColumnReference(namespaces, reference.column.name);
70
+ };
71
+ exports.cloneColumnReference = cloneColumnReference;
72
+ const columnReferenceText = (reference) => {
73
+ const namespace = reference.getNamespace();
74
+ return namespace ? `${namespace}.${reference.column.name}` : reference.column.name;
75
+ };
76
+ exports.columnReferenceText = columnReferenceText;
77
+ const sameColumnReference = (left, right) => {
78
+ return (0, exports.identifiersEqual)(left.column.name, right.column.name)
79
+ && (0, exports.identifiersEqual)(left.getNamespace(), right.getNamespace());
80
+ };
81
+ exports.sameColumnReference = sameColumnReference;
82
+ const appendUnique = (items, value) => {
83
+ if (!items.includes(value)) {
84
+ items.push(value);
85
+ }
86
+ };
87
+ exports.appendUnique = appendUnique;
88
+ //# sourceMappingURL=PredicateExpressionUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PredicateExpressionUtils.js","sourceRoot":"","sources":["../../src/transformers/PredicateExpressionUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,537 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzePredicateReachability = exports.PredicateReachabilityAnalyzer = void 0;
4
+ const Clause_1 = require("../models/Clause");
5
+ const SelectQuery_1 = require("../models/SelectQuery");
6
+ const ValueComponent_1 = require("../models/ValueComponent");
7
+ const SelectQueryParser_1 = require("../parsers/SelectQueryParser");
8
+ const SqlComponentFormatter_1 = require("./SqlComponentFormatter");
9
+ const SelectOutputCollector_1 = require("./SelectOutputCollector");
10
+ const PredicateExpressionUtils_1 = require("./PredicateExpressionUtils");
11
+ class PredicateReachabilityAnalyzer {
12
+ analyze(input, options = {}) {
13
+ const warnings = [];
14
+ const errors = [];
15
+ let query = null;
16
+ try {
17
+ if (typeof input === "string") {
18
+ query = SelectQueryParser_1.SelectQueryParser.parse(input);
19
+ }
20
+ else if (options.cloneInput === false) {
21
+ query = input;
22
+ }
23
+ else {
24
+ query = SelectQueryParser_1.SelectQueryParser.parse((0, SqlComponentFormatter_1.formatSqlComponent)(input, options));
25
+ }
26
+ }
27
+ catch (error) {
28
+ errors.push({
29
+ code: "PARSE_FAILED",
30
+ message: "Predicate reachability analysis could not parse the input SQL.",
31
+ detail: error instanceof Error ? error.message : String(error)
32
+ });
33
+ return this.buildResult(null, [], warnings, errors);
34
+ }
35
+ if (!(query instanceof SelectQuery_1.SimpleSelectQuery)) {
36
+ warnings.push({
37
+ code: "UNSUPPORTED_ROOT_QUERY",
38
+ message: "Predicate reachability analysis currently supports only SimpleSelectQuery roots."
39
+ });
40
+ return this.buildResult(query, [], warnings, errors);
41
+ }
42
+ const predicates = this.analyzeScope(query, query, "scope:root", options);
43
+ return this.buildResult(query, predicates, warnings, errors);
44
+ }
45
+ analyzeScope(contextRoot, query, scopeId, options) {
46
+ if (!query.whereClause) {
47
+ return [];
48
+ }
49
+ return (0, PredicateExpressionUtils_1.collectTopLevelAndTerms)(query.whereClause.condition).map(term => {
50
+ const references = this.collectOuterColumnReferences(query, term);
51
+ const reaches = [{
52
+ scopeId,
53
+ relation: "origin",
54
+ mode: "rewrite_safe",
55
+ predicateSql: (0, SqlComponentFormatter_1.formatSqlComponent)(term, options)
56
+ }];
57
+ const blocked = [];
58
+ const direct = this.resolveDirectOutputReach(contextRoot, query, references);
59
+ if (direct) {
60
+ const rebased = this.rebasePredicate(term, direct.targetColumns, options);
61
+ reaches.push({
62
+ scopeId: direct.scopeId,
63
+ relation: "direct_output",
64
+ mode: "rewrite_safe",
65
+ predicateSql: (0, SqlComponentFormatter_1.formatSqlComponent)(rebased, options)
66
+ });
67
+ }
68
+ const joinReachability = this.resolveJoinEquivalenceReach(contextRoot, query, references, term, options);
69
+ reaches.push(...joinReachability.reaches);
70
+ blocked.push(...joinReachability.blocked);
71
+ return {
72
+ predicateSql: (0, SqlComponentFormatter_1.formatSqlComponent)(term, options),
73
+ originScopeId: scopeId,
74
+ columnReferences: references.map(PredicateExpressionUtils_1.columnReferenceText),
75
+ reaches,
76
+ blocked,
77
+ probeTargets: this.buildProbeTargets(reaches)
78
+ };
79
+ });
80
+ }
81
+ buildProbeTargets(reaches) {
82
+ return reaches.map(reach => ({
83
+ scopeId: reach.scopeId,
84
+ relation: reach.relation,
85
+ mode: reach.mode,
86
+ predicateSql: reach.predicateSql,
87
+ ...(reach.targetPredicateSql ? { targetPredicateSql: reach.targetPredicateSql } : {}),
88
+ target: this.describeScopeTarget(reach.scopeId),
89
+ probeKinds: ["count", "sample"],
90
+ ...(reach.mode === "debug_only"
91
+ ? {
92
+ caution: "This target is inferred through a debug-only relationship and is not a safe SQL rewrite target."
93
+ }
94
+ : {})
95
+ }));
96
+ }
97
+ describeScopeTarget(scopeId) {
98
+ const [kind, ...rest] = scopeId.split(":");
99
+ const name = rest.join(":") || scopeId;
100
+ switch (kind) {
101
+ case "cte":
102
+ return { kind: "cte", name };
103
+ case "table":
104
+ return { kind: "table", name };
105
+ case "subquery":
106
+ return { kind: "subquery", name };
107
+ case "source":
108
+ return { kind: "source", name };
109
+ default:
110
+ return { kind: "scope", name };
111
+ }
112
+ }
113
+ resolveDirectOutputReach(contextRoot, query, references) {
114
+ if (references.length === 0 || !query.fromClause) {
115
+ return null;
116
+ }
117
+ const bindings = [];
118
+ for (const reference of references) {
119
+ const binding = this.resolveSourceBinding(query, reference);
120
+ if (!binding) {
121
+ return null;
122
+ }
123
+ if (!bindings.some(item => item.source === binding.source)) {
124
+ bindings.push(binding);
125
+ }
126
+ }
127
+ if (bindings.length !== 1) {
128
+ return null;
129
+ }
130
+ const binding = bindings[0];
131
+ const target = this.resolveSourceQuery(contextRoot, binding);
132
+ if (!target) {
133
+ return null;
134
+ }
135
+ const targetColumns = [];
136
+ for (const reference of references) {
137
+ const output = this.resolveDirectOutputColumn(contextRoot, target.query, reference.column.name);
138
+ if (!output || !(output.value instanceof ValueComponent_1.ColumnReference)) {
139
+ return null;
140
+ }
141
+ targetColumns.push({
142
+ sourceColumn: reference,
143
+ targetColumn: output.value
144
+ });
145
+ }
146
+ return {
147
+ query: target.query,
148
+ scopeId: target.scopeId,
149
+ targetColumns
150
+ };
151
+ }
152
+ resolveJoinEquivalenceReach(contextRoot, query, references, predicate, options) {
153
+ var _a;
154
+ const reaches = [];
155
+ const blocked = [];
156
+ if (!query.fromClause || references.length === 0) {
157
+ return { reaches, blocked };
158
+ }
159
+ const bindings = this.getSourceBindings(query.fromClause);
160
+ for (const join of (_a = query.fromClause.joins) !== null && _a !== void 0 ? _a : []) {
161
+ if (!(join.condition instanceof Clause_1.JoinOnClause)) {
162
+ continue;
163
+ }
164
+ const equalities = this.collectJoinEqualities(join.condition.condition);
165
+ for (const equality of equalities) {
166
+ for (const reference of references) {
167
+ const equivalent = (0, PredicateExpressionUtils_1.sameColumnReference)(reference, equality.left)
168
+ ? equality.right
169
+ : (0, PredicateExpressionUtils_1.sameColumnReference)(reference, equality.right)
170
+ ? equality.left
171
+ : null;
172
+ if (!equivalent) {
173
+ continue;
174
+ }
175
+ const referenceBinding = this.resolveSourceBindingFromList(bindings, reference);
176
+ if (!referenceBinding) {
177
+ continue;
178
+ }
179
+ const targetBinding = this.resolveSourceBindingFromList(bindings, equivalent);
180
+ if (!targetBinding) {
181
+ continue;
182
+ }
183
+ const via = [(0, SqlComponentFormatter_1.formatSqlComponent)(equality.expression, options)];
184
+ const rebased = this.rebasePredicate(predicate, [{
185
+ sourceColumn: reference,
186
+ targetColumn: equivalent
187
+ }], options);
188
+ const scopeId = this.scopeIdForBinding(contextRoot, targetBinding);
189
+ const joinEquivalenceAllowed = this.isInnerJoin(join)
190
+ || this.isLeftJoinPreservedToNullableReach(join, referenceBinding, targetBinding);
191
+ if (!joinEquivalenceAllowed) {
192
+ blocked.push({
193
+ scopeId,
194
+ relation: "join_equivalence",
195
+ code: "OUTER_JOIN_EQUIVALENCE_UNSUPPORTED",
196
+ reason: "JOIN equivalence debug reachability is reported for INNER JOIN predicates and LEFT JOIN preserved-side predicates only.",
197
+ via
198
+ });
199
+ continue;
200
+ }
201
+ const targetPredicate = this.rebasePredicateToSourceQuery(contextRoot, targetBinding, equivalent, rebased, options);
202
+ reaches.push({
203
+ scopeId,
204
+ relation: "join_equivalence",
205
+ mode: "debug_only",
206
+ predicateSql: (0, SqlComponentFormatter_1.formatSqlComponent)(rebased, options),
207
+ ...(targetPredicate ? { targetPredicateSql: (0, SqlComponentFormatter_1.formatSqlComponent)(targetPredicate, options) } : {}),
208
+ via
209
+ });
210
+ }
211
+ }
212
+ }
213
+ return { reaches, blocked };
214
+ }
215
+ collectJoinEqualities(expression) {
216
+ const candidate = (0, PredicateExpressionUtils_1.unwrapParens)(expression);
217
+ if ((0, PredicateExpressionUtils_1.isBinaryOperator)(candidate, "and")) {
218
+ return [
219
+ ...this.collectJoinEqualities(candidate.left),
220
+ ...this.collectJoinEqualities(candidate.right)
221
+ ];
222
+ }
223
+ if (candidate instanceof ValueComponent_1.BinaryExpression
224
+ && candidate.operator.value.trim() === "="
225
+ && (0, PredicateExpressionUtils_1.unwrapParens)(candidate.left) instanceof ValueComponent_1.ColumnReference
226
+ && (0, PredicateExpressionUtils_1.unwrapParens)(candidate.right) instanceof ValueComponent_1.ColumnReference) {
227
+ return [{
228
+ expression: candidate,
229
+ left: (0, PredicateExpressionUtils_1.unwrapParens)(candidate.left),
230
+ right: (0, PredicateExpressionUtils_1.unwrapParens)(candidate.right)
231
+ }];
232
+ }
233
+ return [];
234
+ }
235
+ resolveSourceQuery(contextRoot, binding) {
236
+ const source = binding.source.datasource;
237
+ if (source instanceof Clause_1.SubQuerySource && source.query instanceof SelectQuery_1.SimpleSelectQuery) {
238
+ return {
239
+ query: source.query,
240
+ scopeId: `subquery:${binding.alias}`
241
+ };
242
+ }
243
+ if (!(source instanceof Clause_1.TableSource)) {
244
+ return null;
245
+ }
246
+ const cte = this.findCte(contextRoot, source.table.name);
247
+ if (!cte || !(cte.query instanceof SelectQuery_1.SimpleSelectQuery)) {
248
+ return null;
249
+ }
250
+ return {
251
+ query: cte.query,
252
+ scopeId: `cte:${cte.getSourceAliasName()}`
253
+ };
254
+ }
255
+ resolveDirectOutputColumn(contextRoot, query, columnName) {
256
+ const matches = this.collectSelectOutputs(contextRoot, query)
257
+ .filter(item => (0, PredicateExpressionUtils_1.identifiersEqual)(item.name, columnName));
258
+ return matches.length === 1 ? matches[0] : null;
259
+ }
260
+ collectSelectOutputs(root, query) {
261
+ var _a, _b, _c, _d;
262
+ const commonTables = [
263
+ ...((_b = (_a = query.withClause) === null || _a === void 0 ? void 0 : _a.tables) !== null && _b !== void 0 ? _b : []),
264
+ ...((_d = (_c = root.withClause) === null || _c === void 0 ? void 0 : _c.tables) !== null && _d !== void 0 ? _d : [])
265
+ ];
266
+ const collector = new SelectOutputCollector_1.SelectOutputCollector(null, commonTables.length > 0 ? commonTables : null);
267
+ return collector.collect(query);
268
+ }
269
+ findCte(root, name) {
270
+ var _a, _b;
271
+ const normalized = (0, PredicateExpressionUtils_1.normalizeIdentifier)(name);
272
+ const matches = ((_b = (_a = root.withClause) === null || _a === void 0 ? void 0 : _a.tables) !== null && _b !== void 0 ? _b : [])
273
+ .filter(table => (0, PredicateExpressionUtils_1.normalizeIdentifier)(table.getSourceAliasName()) === normalized);
274
+ return matches.length === 1 ? matches[0] : null;
275
+ }
276
+ resolveSourceBinding(query, column) {
277
+ if (!query.fromClause) {
278
+ return null;
279
+ }
280
+ return this.resolveSourceBindingFromList(this.getSourceBindings(query.fromClause), column);
281
+ }
282
+ resolveSourceBindingFromList(bindings, column) {
283
+ const namespace = column.getNamespace();
284
+ if (namespace) {
285
+ const matches = bindings.filter(binding => (0, PredicateExpressionUtils_1.identifiersEqual)(binding.alias, namespace));
286
+ return matches.length === 1 ? matches[0] : null;
287
+ }
288
+ return bindings.length === 1 ? bindings[0] : null;
289
+ }
290
+ getSourceBindings(fromClause) {
291
+ var _a, _b, _c;
292
+ const bindings = [{
293
+ source: fromClause.source,
294
+ alias: (_a = fromClause.source.getAliasName()) !== null && _a !== void 0 ? _a : "",
295
+ join: null,
296
+ isPrimary: true
297
+ }];
298
+ for (const join of (_b = fromClause.joins) !== null && _b !== void 0 ? _b : []) {
299
+ bindings.push({
300
+ source: join.source,
301
+ alias: (_c = join.source.getAliasName()) !== null && _c !== void 0 ? _c : "",
302
+ join,
303
+ isPrimary: false
304
+ });
305
+ }
306
+ return bindings;
307
+ }
308
+ scopeIdForBinding(contextRoot, binding) {
309
+ const source = binding.source.datasource;
310
+ if (source instanceof Clause_1.SubQuerySource) {
311
+ return `subquery:${binding.alias}`;
312
+ }
313
+ if (source instanceof Clause_1.TableSource) {
314
+ if (contextRoot && this.findCte(contextRoot, source.table.name)) {
315
+ return `cte:${source.table.name}`;
316
+ }
317
+ return `table:${source.getSourceName()}`;
318
+ }
319
+ return `source:${binding.alias || "unknown"}`;
320
+ }
321
+ isInnerJoin(join) {
322
+ const joinType = join.joinType.value.trim().toLowerCase();
323
+ return joinType === "join" || joinType === "inner join";
324
+ }
325
+ isLeftJoinPreservedToNullableReach(join, referenceBinding, targetBinding) {
326
+ const joinType = join.joinType.value.trim().toLowerCase();
327
+ return (joinType === "left join" || joinType === "left outer join")
328
+ && targetBinding.source === join.source
329
+ && referenceBinding.source !== join.source;
330
+ }
331
+ rebasePredicateToSourceQuery(contextRoot, targetBinding, equivalentColumn, predicate, options) {
332
+ const target = this.resolveSourceQuery(contextRoot, targetBinding);
333
+ if (!target) {
334
+ return null;
335
+ }
336
+ const output = this.resolveDirectOutputColumn(contextRoot, target.query, equivalentColumn.column.name);
337
+ if (!output || !(output.value instanceof ValueComponent_1.ColumnReference)) {
338
+ return null;
339
+ }
340
+ return this.rebasePredicate(predicate, [{
341
+ sourceColumn: equivalentColumn,
342
+ targetColumn: output.value
343
+ }], options);
344
+ }
345
+ rebasePredicate(expression, targetColumns, options) {
346
+ const cloned = (0, PredicateExpressionUtils_1.cloneValueComponent)(expression, options);
347
+ const visit = (value) => {
348
+ const candidate = (0, PredicateExpressionUtils_1.unwrapParens)(value);
349
+ if (candidate instanceof ValueComponent_1.ColumnReference) {
350
+ const target = targetColumns.find(item => (0, PredicateExpressionUtils_1.sameColumnReference)(candidate, item.sourceColumn));
351
+ if (target) {
352
+ candidate.qualifiedName = (0, PredicateExpressionUtils_1.cloneColumnReference)(target.targetColumn).qualifiedName;
353
+ }
354
+ return;
355
+ }
356
+ if (candidate instanceof ValueComponent_1.BinaryExpression) {
357
+ visit(candidate.left);
358
+ visit(candidate.right);
359
+ return;
360
+ }
361
+ if (candidate instanceof ValueComponent_1.UnaryExpression) {
362
+ visit(candidate.expression);
363
+ return;
364
+ }
365
+ if (candidate instanceof ValueComponent_1.InlineQuery) {
366
+ return;
367
+ }
368
+ if (candidate instanceof ValueComponent_1.FunctionCall) {
369
+ if (candidate.argument) {
370
+ visit(candidate.argument);
371
+ }
372
+ if (candidate.filterCondition) {
373
+ visit(candidate.filterCondition);
374
+ }
375
+ return;
376
+ }
377
+ if (candidate instanceof ValueComponent_1.CastExpression) {
378
+ visit(candidate.input);
379
+ return;
380
+ }
381
+ if (candidate instanceof ValueComponent_1.CaseExpression) {
382
+ if (candidate.condition) {
383
+ visit(candidate.condition);
384
+ }
385
+ for (const pair of candidate.switchCase.cases) {
386
+ visit(pair.key);
387
+ visit(pair.value);
388
+ }
389
+ if (candidate.switchCase.elseValue) {
390
+ visit(candidate.switchCase.elseValue);
391
+ }
392
+ return;
393
+ }
394
+ if (candidate instanceof ValueComponent_1.BetweenExpression) {
395
+ visit(candidate.expression);
396
+ visit(candidate.lower);
397
+ visit(candidate.upper);
398
+ return;
399
+ }
400
+ if (candidate instanceof ValueComponent_1.JsonPredicateExpression) {
401
+ visit(candidate.expression);
402
+ return;
403
+ }
404
+ if (candidate instanceof ValueComponent_1.ArrayExpression) {
405
+ visit(candidate.expression);
406
+ return;
407
+ }
408
+ if (candidate instanceof ValueComponent_1.ArrayQueryExpression) {
409
+ return;
410
+ }
411
+ if (candidate instanceof ValueComponent_1.ValueList) {
412
+ candidate.values.forEach(visit);
413
+ return;
414
+ }
415
+ if (candidate instanceof ValueComponent_1.TupleExpression) {
416
+ candidate.values.forEach(visit);
417
+ return;
418
+ }
419
+ if (candidate instanceof ValueComponent_1.TypeValue && candidate.argument) {
420
+ visit(candidate.argument);
421
+ }
422
+ };
423
+ visit(cloned);
424
+ return cloned;
425
+ }
426
+ collectOuterColumnReferences(query, expression) {
427
+ var _a, _b;
428
+ const references = [];
429
+ const sourceAliases = new Set(((_b = (_a = query.fromClause) === null || _a === void 0 ? void 0 : _a.getSources()) !== null && _b !== void 0 ? _b : [])
430
+ .map(source => source.getAliasName())
431
+ .filter((alias) => alias !== null)
432
+ .map(PredicateExpressionUtils_1.normalizeIdentifier));
433
+ const collect = (reference) => {
434
+ if (!references.some(existing => (0, PredicateExpressionUtils_1.sameColumnReference)(existing, reference))) {
435
+ references.push(reference);
436
+ }
437
+ };
438
+ const visit = (value) => {
439
+ const candidate = (0, PredicateExpressionUtils_1.unwrapParens)(value);
440
+ if (candidate instanceof ValueComponent_1.ColumnReference) {
441
+ const namespace = (0, PredicateExpressionUtils_1.normalizeIdentifier)(candidate.getNamespace());
442
+ if (!namespace || sourceAliases.has(namespace)) {
443
+ collect(candidate);
444
+ }
445
+ return;
446
+ }
447
+ if (candidate instanceof ValueComponent_1.BinaryExpression) {
448
+ visit(candidate.left);
449
+ visit(candidate.right);
450
+ return;
451
+ }
452
+ if (candidate instanceof ValueComponent_1.UnaryExpression) {
453
+ visit(candidate.expression);
454
+ return;
455
+ }
456
+ if (candidate instanceof ValueComponent_1.InlineQuery) {
457
+ return;
458
+ }
459
+ if (candidate instanceof ValueComponent_1.FunctionCall) {
460
+ if (candidate.argument) {
461
+ visit(candidate.argument);
462
+ }
463
+ if (candidate.filterCondition) {
464
+ visit(candidate.filterCondition);
465
+ }
466
+ return;
467
+ }
468
+ if (candidate instanceof ValueComponent_1.CastExpression) {
469
+ visit(candidate.input);
470
+ return;
471
+ }
472
+ if (candidate instanceof ValueComponent_1.CaseExpression) {
473
+ if (candidate.condition) {
474
+ visit(candidate.condition);
475
+ }
476
+ for (const pair of candidate.switchCase.cases) {
477
+ visit(pair.key);
478
+ visit(pair.value);
479
+ }
480
+ if (candidate.switchCase.elseValue) {
481
+ visit(candidate.switchCase.elseValue);
482
+ }
483
+ return;
484
+ }
485
+ if (candidate instanceof ValueComponent_1.BetweenExpression) {
486
+ visit(candidate.expression);
487
+ visit(candidate.lower);
488
+ visit(candidate.upper);
489
+ return;
490
+ }
491
+ if (candidate instanceof ValueComponent_1.JsonPredicateExpression) {
492
+ visit(candidate.expression);
493
+ return;
494
+ }
495
+ if (candidate instanceof ValueComponent_1.ArrayExpression) {
496
+ visit(candidate.expression);
497
+ return;
498
+ }
499
+ if (candidate instanceof ValueComponent_1.ArrayQueryExpression) {
500
+ return;
501
+ }
502
+ if (candidate instanceof ValueComponent_1.ValueList) {
503
+ candidate.values.forEach(visit);
504
+ return;
505
+ }
506
+ if (candidate instanceof ValueComponent_1.TupleExpression) {
507
+ candidate.values.forEach(visit);
508
+ return;
509
+ }
510
+ if (candidate instanceof ValueComponent_1.TypeValue && candidate.argument) {
511
+ visit(candidate.argument);
512
+ }
513
+ };
514
+ visit(expression);
515
+ return references;
516
+ }
517
+ buildResult(query, predicates, warnings, errors) {
518
+ // API output shape review: this diagnostic API reports structured reachability only and never emits rewritten SQL.
519
+ return {
520
+ ok: errors.length === 0,
521
+ query,
522
+ predicates,
523
+ warnings,
524
+ errors,
525
+ safety: {
526
+ mode: "debug_only",
527
+ sqlRewritten: false
528
+ }
529
+ };
530
+ }
531
+ }
532
+ exports.PredicateReachabilityAnalyzer = PredicateReachabilityAnalyzer;
533
+ const analyzePredicateReachability = (input, options = {}) => {
534
+ return new PredicateReachabilityAnalyzer().analyze(input, options);
535
+ };
536
+ exports.analyzePredicateReachability = analyzePredicateReachability;
537
+ //# sourceMappingURL=PredicateReachabilityAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PredicateReachabilityAnalyzer.js","sourceRoot":"","sources":["../../src/transformers/PredicateReachabilityAnalyzer.ts"],"names":[],"mappings":"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"}