mongo-query-normalizer 0.1.0 → 0.2.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 (234) hide show
  1. package/README.md +369 -39
  2. package/README.zh-CN.md +363 -44
  3. package/dist/ast/types.d.ts +4 -0
  4. package/dist/ast/types.d.ts.map +1 -1
  5. package/dist/index.d.ts +4 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/normalize-context.d.ts +5 -1
  8. package/dist/normalize-context.d.ts.map +1 -1
  9. package/dist/normalize-context.js +3 -0
  10. package/dist/normalize-context.js.map +1 -1
  11. package/dist/normalize.d.ts +1 -1
  12. package/dist/normalize.d.ts.map +1 -1
  13. package/dist/normalize.js +105 -52
  14. package/dist/normalize.js.map +1 -1
  15. package/dist/options/constants.d.ts.map +1 -1
  16. package/dist/options/constants.js +7 -16
  17. package/dist/options/constants.js.map +1 -1
  18. package/dist/options/resolve.d.ts.map +1 -1
  19. package/dist/options/resolve.js +32 -1
  20. package/dist/options/resolve.js.map +1 -1
  21. package/dist/options/types.d.ts +1 -1
  22. package/dist/options/types.d.ts.map +1 -1
  23. package/dist/passes/normalize-predicate.d.ts.map +1 -1
  24. package/dist/passes/normalize-predicate.js +93 -14
  25. package/dist/passes/normalize-predicate.js.map +1 -1
  26. package/dist/predicate/analysis/detect-array-sensitive.d.ts +3 -0
  27. package/dist/predicate/analysis/detect-array-sensitive.d.ts.map +1 -0
  28. package/dist/predicate/analysis/detect-array-sensitive.js +33 -0
  29. package/dist/predicate/analysis/detect-array-sensitive.js.map +1 -0
  30. package/dist/predicate/analysis/detect-null-sensitive.d.ts +3 -0
  31. package/dist/predicate/analysis/detect-null-sensitive.d.ts.map +1 -0
  32. package/dist/predicate/analysis/detect-null-sensitive.js +24 -0
  33. package/dist/predicate/analysis/detect-null-sensitive.js.map +1 -0
  34. package/dist/predicate/analysis/detect-opaque-mix.d.ts +3 -0
  35. package/dist/predicate/analysis/detect-opaque-mix.d.ts.map +1 -0
  36. package/dist/predicate/analysis/detect-opaque-mix.js +9 -0
  37. package/dist/predicate/analysis/detect-opaque-mix.js.map +1 -0
  38. package/dist/predicate/analysis/detect-path-conflict-risk.d.ts +3 -0
  39. package/dist/predicate/analysis/detect-path-conflict-risk.d.ts.map +1 -0
  40. package/dist/predicate/analysis/detect-path-conflict-risk.js +14 -0
  41. package/dist/predicate/analysis/detect-path-conflict-risk.js.map +1 -0
  42. package/dist/predicate/analysis/merge-range-bounds.d.ts +27 -0
  43. package/dist/predicate/analysis/merge-range-bounds.d.ts.map +1 -0
  44. package/dist/predicate/analysis/merge-range-bounds.js +150 -0
  45. package/dist/predicate/analysis/merge-range-bounds.js.map +1 -0
  46. package/dist/predicate/capabilities/eq/eq-eq.d.ts +3 -0
  47. package/dist/predicate/capabilities/eq/eq-eq.d.ts.map +1 -0
  48. package/dist/predicate/capabilities/eq/eq-eq.js +53 -0
  49. package/dist/predicate/capabilities/eq/eq-eq.js.map +1 -0
  50. package/dist/predicate/capabilities/eq/eq-in.d.ts +3 -0
  51. package/dist/predicate/capabilities/eq/eq-in.d.ts.map +1 -0
  52. package/dist/predicate/capabilities/eq/eq-in.js +117 -0
  53. package/dist/predicate/capabilities/eq/eq-in.js.map +1 -0
  54. package/dist/predicate/capabilities/eq/eq-ne.d.ts +3 -0
  55. package/dist/predicate/capabilities/eq/eq-ne.d.ts.map +1 -0
  56. package/dist/predicate/capabilities/eq/eq-ne.js +37 -0
  57. package/dist/predicate/capabilities/eq/eq-ne.js.map +1 -0
  58. package/dist/predicate/capabilities/eq/eq-range.d.ts +3 -0
  59. package/dist/predicate/capabilities/eq/eq-range.d.ts.map +1 -0
  60. package/dist/predicate/capabilities/eq/eq-range.js +138 -0
  61. package/dist/predicate/capabilities/eq/eq-range.js.map +1 -0
  62. package/dist/predicate/capabilities/range/range-range.d.ts +3 -0
  63. package/dist/predicate/capabilities/range/range-range.d.ts.map +1 -0
  64. package/dist/predicate/capabilities/range/range-range.js +154 -0
  65. package/dist/predicate/capabilities/range/range-range.js.map +1 -0
  66. package/dist/predicate/capabilities/shared/capability-types.d.ts +11 -0
  67. package/dist/predicate/capabilities/shared/capability-types.d.ts.map +1 -0
  68. package/dist/predicate/capabilities/shared/capability-types.js +3 -0
  69. package/dist/predicate/capabilities/shared/capability-types.js.map +1 -0
  70. package/dist/predicate/capabilities/shared/relation-context.d.ts +13 -0
  71. package/dist/predicate/capabilities/shared/relation-context.d.ts.map +1 -0
  72. package/dist/predicate/capabilities/shared/relation-context.js +3 -0
  73. package/dist/predicate/capabilities/shared/relation-context.js.map +1 -0
  74. package/dist/predicate/capabilities/shared/relation-result.d.ts +12 -0
  75. package/dist/predicate/capabilities/shared/relation-result.d.ts.map +1 -0
  76. package/dist/predicate/capabilities/shared/relation-result.js +14 -0
  77. package/dist/predicate/capabilities/shared/relation-result.js.map +1 -0
  78. package/dist/predicate/index.d.ts +12 -0
  79. package/dist/predicate/index.d.ts.map +1 -0
  80. package/dist/predicate/index.js +22 -0
  81. package/dist/predicate/index.js.map +1 -0
  82. package/dist/predicate/ir/build-field-bundle.d.ts +7 -0
  83. package/dist/predicate/ir/build-field-bundle.d.ts.map +1 -0
  84. package/dist/predicate/ir/build-field-bundle.js +88 -0
  85. package/dist/predicate/ir/build-field-bundle.js.map +1 -0
  86. package/dist/predicate/ir/compile-field-bundle.d.ts +4 -0
  87. package/dist/predicate/ir/compile-field-bundle.d.ts.map +1 -0
  88. package/dist/predicate/ir/compile-field-bundle.js +57 -0
  89. package/dist/predicate/ir/compile-field-bundle.js.map +1 -0
  90. package/dist/predicate/ir/dedupe-atoms.d.ts +6 -0
  91. package/dist/predicate/ir/dedupe-atoms.d.ts.map +1 -0
  92. package/dist/predicate/ir/dedupe-atoms.js +42 -0
  93. package/dist/predicate/ir/dedupe-atoms.js.map +1 -0
  94. package/dist/predicate/ir/field-predicate-bundle.d.ts +16 -0
  95. package/dist/predicate/ir/field-predicate-bundle.d.ts.map +1 -0
  96. package/dist/predicate/ir/field-predicate-bundle.js +3 -0
  97. package/dist/predicate/ir/field-predicate-bundle.js.map +1 -0
  98. package/dist/predicate/ir/predicate-atom.d.ts +33 -0
  99. package/dist/predicate/ir/predicate-atom.d.ts.map +1 -0
  100. package/dist/predicate/ir/predicate-atom.js +3 -0
  101. package/dist/predicate/ir/predicate-atom.js.map +1 -0
  102. package/dist/predicate/local-normalize-result.d.ts +17 -0
  103. package/dist/predicate/local-normalize-result.d.ts.map +1 -0
  104. package/dist/predicate/local-normalize-result.js +3 -0
  105. package/dist/predicate/local-normalize-result.js.map +1 -0
  106. package/dist/predicate/meta/collect-predicate-meta.d.ts +16 -0
  107. package/dist/predicate/meta/collect-predicate-meta.d.ts.map +1 -0
  108. package/dist/predicate/meta/collect-predicate-meta.js +13 -0
  109. package/dist/predicate/meta/collect-predicate-meta.js.map +1 -0
  110. package/dist/predicate/normalize-field-predicate-bundle.d.ts +18 -0
  111. package/dist/predicate/normalize-field-predicate-bundle.d.ts.map +1 -0
  112. package/dist/predicate/normalize-field-predicate-bundle.js +126 -0
  113. package/dist/predicate/normalize-field-predicate-bundle.js.map +1 -0
  114. package/dist/predicate/normalize-predicate.d.ts +5 -0
  115. package/dist/predicate/normalize-predicate.d.ts.map +1 -0
  116. package/dist/predicate/normalize-predicate.js +10 -0
  117. package/dist/predicate/normalize-predicate.js.map +1 -0
  118. package/dist/predicate/planner/capability-selector.d.ts +8 -0
  119. package/dist/predicate/planner/capability-selector.d.ts.map +1 -0
  120. package/dist/predicate/planner/capability-selector.js +23 -0
  121. package/dist/predicate/planner/capability-selector.js.map +1 -0
  122. package/dist/predicate/planner/relation-plan.d.ts +10 -0
  123. package/dist/predicate/planner/relation-plan.d.ts.map +1 -0
  124. package/dist/predicate/planner/relation-plan.js +3 -0
  125. package/dist/predicate/planner/relation-plan.js.map +1 -0
  126. package/dist/predicate/planner/relation-planner.d.ts +5 -0
  127. package/dist/predicate/planner/relation-planner.d.ts.map +1 -0
  128. package/dist/predicate/planner/relation-planner.js +62 -0
  129. package/dist/predicate/planner/relation-planner.js.map +1 -0
  130. package/dist/predicate/registry/predicate-capability-registry.d.ts +3 -0
  131. package/dist/predicate/registry/predicate-capability-registry.d.ts.map +1 -0
  132. package/dist/predicate/registry/predicate-capability-registry.js +19 -0
  133. package/dist/predicate/registry/predicate-capability-registry.js.map +1 -0
  134. package/dist/predicate/safety/predicate-safety-policy.d.ts +9 -0
  135. package/dist/predicate/safety/predicate-safety-policy.d.ts.map +1 -0
  136. package/dist/predicate/safety/predicate-safety-policy.js +11 -0
  137. package/dist/predicate/safety/predicate-safety-policy.js.map +1 -0
  138. package/dist/predicate/utils/bson-compare.d.ts +2 -0
  139. package/dist/predicate/utils/bson-compare.d.ts.map +1 -0
  140. package/dist/predicate/utils/bson-compare.js +7 -0
  141. package/dist/predicate/utils/bson-compare.js.map +1 -0
  142. package/dist/predicate/utils/intersect-in-lists.d.ts +5 -0
  143. package/dist/predicate/utils/intersect-in-lists.d.ts.map +1 -0
  144. package/dist/predicate/utils/intersect-in-lists.js +15 -0
  145. package/dist/predicate/utils/intersect-in-lists.js.map +1 -0
  146. package/dist/predicate/utils/set-ops.d.ts +3 -0
  147. package/dist/predicate/utils/set-ops.d.ts.map +1 -0
  148. package/dist/predicate/utils/set-ops.js +18 -0
  149. package/dist/predicate/utils/set-ops.js.map +1 -0
  150. package/dist/predicate/utils/value-equality.d.ts +2 -0
  151. package/dist/predicate/utils/value-equality.d.ts.map +1 -0
  152. package/dist/predicate/utils/value-equality.js +8 -0
  153. package/dist/predicate/utils/value-equality.js.map +1 -0
  154. package/dist/rules/or-common-predicate/detect-common-predicates-in-or.d.ts +6 -0
  155. package/dist/rules/or-common-predicate/detect-common-predicates-in-or.d.ts.map +1 -0
  156. package/dist/rules/or-common-predicate/detect-common-predicates-in-or.js +83 -0
  157. package/dist/rules/or-common-predicate/detect-common-predicates-in-or.js.map +1 -0
  158. package/dist/rules/shape/collapse-single-child-logical.js +1 -1
  159. package/dist/rules/shape/collapse-single-child-logical.js.map +1 -1
  160. package/dist/rules/shape/dedupe-logical-children.js +1 -1
  161. package/dist/rules/shape/dedupe-logical-children.js.map +1 -1
  162. package/dist/rules/shape/flatten-logical.js +2 -2
  163. package/dist/rules/shape/flatten-logical.js.map +1 -1
  164. package/dist/rules/shape/remove-empty-logical.js +2 -2
  165. package/dist/rules/shape/remove-empty-logical.js.map +1 -1
  166. package/dist/scope/analysis/analyze-branch-coverage.d.ts +5 -0
  167. package/dist/scope/analysis/analyze-branch-coverage.d.ts.map +1 -0
  168. package/dist/scope/analysis/analyze-branch-coverage.js +8 -0
  169. package/dist/scope/analysis/analyze-branch-coverage.js.map +1 -0
  170. package/dist/scope/analysis/analyze-branch-satisfiability.d.ts +9 -0
  171. package/dist/scope/analysis/analyze-branch-satisfiability.d.ts.map +1 -0
  172. package/dist/scope/analysis/analyze-branch-satisfiability.js +33 -0
  173. package/dist/scope/analysis/analyze-branch-satisfiability.js.map +1 -0
  174. package/dist/scope/context/build-inherited-constraints.d.ts +6 -0
  175. package/dist/scope/context/build-inherited-constraints.d.ts.map +1 -0
  176. package/dist/scope/context/build-inherited-constraints.js +119 -0
  177. package/dist/scope/context/build-inherited-constraints.js.map +1 -0
  178. package/dist/scope/context/constraint-set.d.ts +19 -0
  179. package/dist/scope/context/constraint-set.d.ts.map +1 -0
  180. package/dist/scope/context/constraint-set.js +26 -0
  181. package/dist/scope/context/constraint-set.js.map +1 -0
  182. package/dist/scope/context/merge-constraint-sources.d.ts +4 -0
  183. package/dist/scope/context/merge-constraint-sources.d.ts.map +1 -0
  184. package/dist/scope/context/merge-constraint-sources.js +28 -0
  185. package/dist/scope/context/merge-constraint-sources.js.map +1 -0
  186. package/dist/scope/index.d.ts +8 -0
  187. package/dist/scope/index.d.ts.map +1 -0
  188. package/dist/scope/index.js +19 -0
  189. package/dist/scope/index.js.map +1 -0
  190. package/dist/scope/meta/collect-scope-meta.d.ts +5 -0
  191. package/dist/scope/meta/collect-scope-meta.d.ts.map +1 -0
  192. package/dist/scope/meta/collect-scope-meta.js +7 -0
  193. package/dist/scope/meta/collect-scope-meta.js.map +1 -0
  194. package/dist/scope/normalize-scope.d.ts +4 -0
  195. package/dist/scope/normalize-scope.d.ts.map +1 -0
  196. package/dist/scope/normalize-scope.js +149 -0
  197. package/dist/scope/normalize-scope.js.map +1 -0
  198. package/dist/scope/planner/scope-plan.d.ts +6 -0
  199. package/dist/scope/planner/scope-plan.d.ts.map +1 -0
  200. package/dist/scope/planner/scope-plan.js +9 -0
  201. package/dist/scope/planner/scope-plan.js.map +1 -0
  202. package/dist/scope/planner/scope-rewrite-planner.d.ts +4 -0
  203. package/dist/scope/planner/scope-rewrite-planner.d.ts.map +1 -0
  204. package/dist/scope/planner/scope-rewrite-planner.js +8 -0
  205. package/dist/scope/planner/scope-rewrite-planner.js.map +1 -0
  206. package/dist/scope/propagation/create-branch-local-bundle.d.ts +5 -0
  207. package/dist/scope/propagation/create-branch-local-bundle.d.ts.map +1 -0
  208. package/dist/scope/propagation/create-branch-local-bundle.js +16 -0
  209. package/dist/scope/propagation/create-branch-local-bundle.js.map +1 -0
  210. package/dist/scope/propagation/propagate-constraints-to-children.d.ts +6 -0
  211. package/dist/scope/propagation/propagate-constraints-to-children.d.ts.map +1 -0
  212. package/dist/scope/propagation/propagate-constraints-to-children.js +9 -0
  213. package/dist/scope/propagation/propagate-constraints-to-children.js.map +1 -0
  214. package/dist/scope/rewrite/collapse-single-branch.d.ts +5 -0
  215. package/dist/scope/rewrite/collapse-single-branch.d.ts.map +1 -0
  216. package/dist/scope/rewrite/collapse-single-branch.js +28 -0
  217. package/dist/scope/rewrite/collapse-single-branch.js.map +1 -0
  218. package/dist/scope/rewrite/prune-impossible-branches.d.ts +6 -0
  219. package/dist/scope/rewrite/prune-impossible-branches.d.ts.map +1 -0
  220. package/dist/scope/rewrite/prune-impossible-branches.js +32 -0
  221. package/dist/scope/rewrite/prune-impossible-branches.js.map +1 -0
  222. package/dist/scope/rewrite/remove-covered-local-constraints.d.ts +6 -0
  223. package/dist/scope/rewrite/remove-covered-local-constraints.d.ts.map +1 -0
  224. package/dist/scope/rewrite/remove-covered-local-constraints.js +76 -0
  225. package/dist/scope/rewrite/remove-covered-local-constraints.js.map +1 -0
  226. package/dist/scope/safety/scope-safety-policy.d.ts +10 -0
  227. package/dist/scope/safety/scope-safety-policy.d.ts.map +1 -0
  228. package/dist/scope/safety/scope-safety-policy.js +12 -0
  229. package/dist/scope/safety/scope-safety-policy.js.map +1 -0
  230. package/dist/types.d.ts +70 -2
  231. package/dist/types.d.ts.map +1 -1
  232. package/dist/types.js +2 -1
  233. package/dist/types.js.map +1 -1
  234. package/package.json +6 -4
package/dist/normalize.js CHANGED
@@ -5,21 +5,20 @@ const hash_1 = require("./ast/hash");
5
5
  const compile_1 = require("./compile/compile");
6
6
  const normalize_context_1 = require("./normalize-context");
7
7
  const metrics_1 = require("./observe/metrics");
8
- const level_boundary_hints_1 = require("./observe/level-boundary-hints");
8
+ const warnings_1 = require("./observe/warnings");
9
9
  const resolve_1 = require("./options/resolve");
10
10
  const canonicalize_1 = require("./passes/canonicalize");
11
11
  const normalize_predicate_1 = require("./passes/normalize-predicate");
12
12
  const normalize_shape_1 = require("./passes/normalize-shape");
13
13
  const simplify_1 = require("./passes/simplify");
14
+ const normalize_scope_1 = require("./scope/normalize-scope");
14
15
  const parse_1 = require("./parse/parse");
15
- const hoist_common_predicates_from_or_1 = require("./rules/experimental/hoist-common-predicates-from-or");
16
- const detect_common_predicates_in_or_1 = require("./rules/logical/detect-common-predicates-in-or");
16
+ const detect_common_predicates_in_or_1 = require("./rules/or-common-predicate/detect-common-predicates-in-or");
17
17
  /**
18
- * 主入口:parse →(shape / predicate 直至稳定)→(可选 logical / experimental)→ canonicalize → compile。
18
+ * 主入口:parse →(shape / predicate / scope 直至稳定)→(scope 下可选 observe-only 的 detectCommonPredicatesInOr)→ canonicalize → compile。
19
19
  */
20
20
  function normalizeQuery(query, options) {
21
21
  const normalizeContext = (0, normalize_context_1.createNormalizeContext)((0, resolve_1.resolveNormalizeOptions)(options));
22
- (0, level_boundary_hints_1.applyPreviewLevelBoundaryHints)(normalizeContext);
23
22
  const beforeNode = (0, parse_1.parseQuery)(query, normalizeContext);
24
23
  recordBeforeObservation(normalizeContext, beforeNode);
25
24
  let workingNode = beforeNode;
@@ -42,53 +41,97 @@ function recordAfterObservation(normalizeContext, node) {
42
41
  normalizeContext.afterHash = (0, hash_1.hashNode)(node);
43
42
  }
44
43
  const MAX_NORMALIZE_STABLE_ROUNDS = 8;
45
- function runNormalizePipeline(root, normalizeContext) {
46
- let node = root;
47
- const shouldRunPredicate = normalizeContext.options.level === "predicate" ||
48
- normalizeContext.options.level === "logical" ||
49
- normalizeContext.options.level === "experimental";
50
- for (let o = 0; o < MAX_NORMALIZE_STABLE_ROUNDS; o++) {
51
- const outerStart = (0, hash_1.hashNode)(node);
44
+ function runStabilizationPhases(node, normalizeContext, root, shouldRunPredicate, shouldRunScope, emitInnerNonConvergeWarnings) {
45
+ let n = node;
46
+ {
47
+ let shapeConverged = false;
52
48
  for (let r = 0; r < MAX_NORMALIZE_STABLE_ROUNDS; r++) {
53
- const beforeRound = (0, hash_1.hashNode)(node);
54
- node = (0, normalize_shape_1.normalizeShape)(node, normalizeContext);
49
+ const beforeRound = (0, hash_1.hashNode)(n);
50
+ n = (0, normalize_shape_1.normalizeShape)(n, normalizeContext);
55
51
  if (normalizeContext.bailedOut) {
56
52
  return root;
57
53
  }
58
- if ((0, hash_1.hashNode)(node) === beforeRound) {
54
+ if ((0, hash_1.hashNode)(n) === beforeRound) {
55
+ shapeConverged = true;
59
56
  break;
60
57
  }
61
58
  }
62
- if (shouldRunPredicate) {
63
- for (let r = 0; r < MAX_NORMALIZE_STABLE_ROUNDS; r++) {
64
- const beforeRound = (0, hash_1.hashNode)(node);
65
- node = (0, normalize_predicate_1.normalizePredicate)(node, normalizeContext);
66
- if (normalizeContext.bailedOut) {
67
- return root;
68
- }
69
- node = (0, simplify_1.simplify)(node, normalizeContext);
70
- if (normalizeContext.bailedOut) {
71
- return root;
72
- }
73
- if ((0, hash_1.hashNode)(node) === beforeRound) {
74
- break;
75
- }
59
+ if (!shapeConverged && emitInnerNonConvergeWarnings) {
60
+ (0, warnings_1.addWarning)(normalizeContext, `[mongo-query-normalizer] shape normalization did not reach a fixed point within ${MAX_NORMALIZE_STABLE_ROUNDS} internal rounds`);
61
+ }
62
+ }
63
+ if (shouldRunPredicate) {
64
+ let predicateConverged = false;
65
+ for (let r = 0; r < MAX_NORMALIZE_STABLE_ROUNDS; r++) {
66
+ const beforeRound = (0, hash_1.hashNode)(n);
67
+ n = (0, normalize_predicate_1.normalizePredicate)(n, normalizeContext);
68
+ if (normalizeContext.bailedOut) {
69
+ return root;
70
+ }
71
+ n = (0, simplify_1.simplify)(n, normalizeContext);
72
+ if (normalizeContext.bailedOut) {
73
+ return root;
74
+ }
75
+ if ((0, hash_1.hashNode)(n) === beforeRound) {
76
+ predicateConverged = true;
77
+ break;
76
78
  }
77
79
  }
80
+ if (!predicateConverged && emitInnerNonConvergeWarnings) {
81
+ (0, warnings_1.addWarning)(normalizeContext, `[mongo-query-normalizer] predicate normalization (with simplify) did not reach a fixed point within ${MAX_NORMALIZE_STABLE_ROUNDS} internal rounds`);
82
+ }
83
+ }
84
+ if (shouldRunScope) {
85
+ let scopeConverged = false;
86
+ for (let r = 0; r < MAX_NORMALIZE_STABLE_ROUNDS; r++) {
87
+ const beforeRound = (0, hash_1.hashNode)(n);
88
+ n = (0, normalize_scope_1.normalizeScope)(n, normalizeContext);
89
+ if (normalizeContext.bailedOut) {
90
+ return root;
91
+ }
92
+ n = (0, simplify_1.simplify)(n, normalizeContext);
93
+ if (normalizeContext.bailedOut) {
94
+ return root;
95
+ }
96
+ if ((0, hash_1.hashNode)(n) === beforeRound) {
97
+ scopeConverged = true;
98
+ break;
99
+ }
100
+ }
101
+ if (!scopeConverged && emitInnerNonConvergeWarnings) {
102
+ (0, warnings_1.addWarning)(normalizeContext, `[mongo-query-normalizer] scope normalization (with simplify) did not reach a fixed point within ${MAX_NORMALIZE_STABLE_ROUNDS} internal rounds`);
103
+ }
104
+ }
105
+ return (0, canonicalize_1.canonicalize)(n, normalizeContext);
106
+ }
107
+ function runNormalizePipeline(root, normalizeContext) {
108
+ let node = root;
109
+ const shouldRunPredicate = normalizeContext.options.level === "predicate" || normalizeContext.options.level === "scope";
110
+ const shouldRunScope = normalizeContext.options.level === "scope";
111
+ let outerReachedFixedPoint = false;
112
+ for (let o = 0; o < MAX_NORMALIZE_STABLE_ROUNDS; o++) {
113
+ const outerStart = (0, hash_1.hashNode)(node);
114
+ node = runStabilizationPhases(node, normalizeContext, root, shouldRunPredicate, shouldRunScope, true);
115
+ if (normalizeContext.bailedOut) {
116
+ return root;
117
+ }
78
118
  if ((0, hash_1.hashNode)(node) === outerStart) {
119
+ outerReachedFixedPoint = true;
79
120
  break;
80
121
  }
81
122
  }
82
- const shouldRunLogicalDetect = normalizeContext.options.level === "logical" || normalizeContext.options.level === "experimental";
83
- if (shouldRunLogicalDetect && normalizeContext.options.rules.detectCommonPredicatesInOr) {
84
- node = (0, detect_common_predicates_in_or_1.detectCommonPredicatesInOr)(node, normalizeContext);
123
+ if (!outerReachedFixedPoint && !normalizeContext.bailedOut) {
124
+ (0, warnings_1.addWarning)(normalizeContext, `[mongo-query-normalizer] normalize pipeline did not reach an outer fixed point within ${MAX_NORMALIZE_STABLE_ROUNDS} outer rounds`);
125
+ }
126
+ if (!normalizeContext.bailedOut) {
127
+ node = (0, parse_1.parseQuery)((0, compile_1.compileQuery)(node, normalizeContext), normalizeContext);
128
+ node = runStabilizationPhases(node, normalizeContext, root, shouldRunPredicate, shouldRunScope, false);
85
129
  if (normalizeContext.bailedOut) {
86
130
  return root;
87
131
  }
88
132
  }
89
- const shouldRunExperimental = normalizeContext.options.level === "experimental" && normalizeContext.options.rules.hoistCommonPredicatesFromOr;
90
- if (shouldRunExperimental) {
91
- node = (0, hoist_common_predicates_from_or_1.hoistCommonPredicatesFromOr)(node, normalizeContext);
133
+ if (normalizeContext.options.level === "scope" && normalizeContext.options.rules.detectCommonPredicatesInOr) {
134
+ node = (0, detect_common_predicates_in_or_1.detectCommonPredicatesInOr)(node, normalizeContext);
92
135
  if (normalizeContext.bailedOut) {
93
136
  return root;
94
137
  }
@@ -98,25 +141,35 @@ function runNormalizePipeline(root, normalizeContext) {
98
141
  }
99
142
  function buildNormalizeResult(_originalQuery, finalQuery, _beforeNode, _afterNode, normalizeContext) {
100
143
  const changed = normalizeContext.beforeHash !== normalizeContext.afterHash;
144
+ const meta = {
145
+ changed,
146
+ level: normalizeContext.options.level,
147
+ appliedRules: normalizeContext.appliedRules,
148
+ skippedRules: normalizeContext.skippedRules,
149
+ warnings: normalizeContext.warnings,
150
+ bailedOut: normalizeContext.bailedOut,
151
+ bailoutReason: normalizeContext.bailoutReason,
152
+ beforeHash: normalizeContext.beforeHash,
153
+ afterHash: normalizeContext.afterHash,
154
+ stats: normalizeContext.options.observe.collectMetrics && normalizeContext.beforeStats && normalizeContext.afterStats
155
+ ? {
156
+ before: normalizeContext.beforeStats,
157
+ after: normalizeContext.afterStats,
158
+ }
159
+ : undefined,
160
+ };
161
+ if (normalizeContext.options.observe.collectPredicateTraces) {
162
+ meta.predicateTraces = [...(normalizeContext.predicateTraces ?? [])];
163
+ }
164
+ if (normalizeContext.options.observe.collectScopeTraces) {
165
+ meta.scopeTrace = {
166
+ constraintRejections: [...(normalizeContext.scopeConstraintRejections ?? [])],
167
+ events: [...(normalizeContext.scopeTraceEvents ?? [])],
168
+ };
169
+ }
101
170
  return {
102
171
  query: finalQuery,
103
- meta: {
104
- changed,
105
- level: normalizeContext.options.level,
106
- appliedRules: normalizeContext.appliedRules,
107
- skippedRules: normalizeContext.skippedRules,
108
- warnings: normalizeContext.warnings,
109
- bailedOut: normalizeContext.bailedOut,
110
- bailoutReason: normalizeContext.bailoutReason,
111
- beforeHash: normalizeContext.beforeHash,
112
- afterHash: normalizeContext.afterHash,
113
- stats: normalizeContext.options.observe.collectMetrics && normalizeContext.beforeStats && normalizeContext.afterStats
114
- ? {
115
- before: normalizeContext.beforeStats,
116
- after: normalizeContext.afterStats,
117
- }
118
- : undefined,
119
- },
172
+ meta,
120
173
  };
121
174
  }
122
175
  //# sourceMappingURL=normalize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/options/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAElG,eAAO,MAAM,aAAa,EAAE,cAAwB,CAAC;AAErD,eAAO,MAAM,cAAc,EAAE,eAG5B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,gBAG7B,CAAC;AA4EF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,CAKzE,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/options/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAElG,eAAO,MAAM,aAAa,EAAE,cAAwB,CAAC;AAErD,eAAO,MAAM,cAAc,EAAE,eAG5B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,gBAK7B,CAAC;AA+DF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,CAIzE,CAAC"}
@@ -9,6 +9,8 @@ exports.DEFAULT_SAFETY = {
9
9
  exports.DEFAULT_OBSERVE = {
10
10
  collectWarnings: true,
11
11
  collectMetrics: false,
12
+ collectPredicateTraces: false,
13
+ collectScopeTraces: false,
12
14
  };
13
15
  const SORT_RULES = {
14
16
  sortLogicalChildren: true,
@@ -25,12 +27,10 @@ const PREDICATE_RULES = {
25
27
  mergeComparablePredicates: true,
26
28
  collapseContradictions: true,
27
29
  };
28
- const LOGICAL_EXTRA = {
30
+ /** Default extra rules when `level` is `scope` (includes `$or` common-predicate detection). */
31
+ const SCOPE_LEVEL_EXTRA = {
29
32
  detectCommonPredicatesInOr: true,
30
33
  };
31
- const EXPERIMENTAL_EXTRA = {
32
- hoistCommonPredicatesFromOr: true,
33
- };
34
34
  function rulesForLevel(level) {
35
35
  const base = {
36
36
  ...BASE_SHAPE_RULES,
@@ -39,7 +39,6 @@ function rulesForLevel(level) {
39
39
  collapseContradictions: false,
40
40
  ...SORT_RULES,
41
41
  detectCommonPredicatesInOr: false,
42
- hoistCommonPredicatesFromOr: false,
43
42
  };
44
43
  if (level === "shape") {
45
44
  return base;
@@ -51,22 +50,14 @@ function rulesForLevel(level) {
51
50
  if (level === "predicate") {
52
51
  return withPredicate;
53
52
  }
54
- const withLogical = {
55
- ...withPredicate,
56
- ...LOGICAL_EXTRA,
57
- };
58
- if (level === "logical") {
59
- return withLogical;
60
- }
61
53
  return {
62
- ...withLogical,
63
- ...EXPERIMENTAL_EXTRA,
54
+ ...withPredicate,
55
+ ...SCOPE_LEVEL_EXTRA,
64
56
  };
65
57
  }
66
58
  exports.DEFAULT_RULES_BY_LEVEL = {
67
59
  shape: rulesForLevel("shape"),
68
60
  predicate: rulesForLevel("predicate"),
69
- logical: rulesForLevel("logical"),
70
- experimental: rulesForLevel("experimental"),
61
+ scope: rulesForLevel("scope"),
71
62
  };
72
63
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/options/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAmB,OAAO,CAAC;AAExC,QAAA,cAAc,GAAoB;IAC3C,iBAAiB,EAAE,EAAE;IACrB,kBAAkB,EAAE,GAAG;CAC1B,CAAC;AAEW,QAAA,eAAe,GAAqB;IAC7C,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,KAAK;CACxB,CAAC;AAEF,MAAM,UAAU,GAAwE;IACpF,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;CAC5B,CAAC;AAEF,MAAM,gBAAgB,GAMlB;IACA,cAAc,EAAE,IAAI;IACpB,kBAAkB,EAAE,IAAI;IACxB,0BAA0B,EAAE,IAAI;IAChC,qBAAqB,EAAE,IAAI;CAC9B,CAAC;AAEF,MAAM,eAAe,GAGjB;IACA,yBAAyB,EAAE,IAAI;IAC/B,yBAAyB,EAAE,IAAI;IAC/B,sBAAsB,EAAE,IAAI;CAC/B,CAAC;AAEF,MAAM,aAAa,GAAuD;IACtE,0BAA0B,EAAE,IAAI;CACnC,CAAC;AAEF,MAAM,kBAAkB,GAAwD;IAC5E,2BAA2B,EAAE,IAAI;CACpC,CAAC;AAEF,SAAS,aAAa,CAAC,KAAqB;IACxC,MAAM,IAAI,GAAmB;QACzB,GAAG,gBAAgB;QACnB,yBAAyB,EAAE,KAAK;QAChC,yBAAyB,EAAE,KAAK;QAChC,sBAAsB,EAAE,KAAK;QAC7B,GAAG,UAAU;QACb,0BAA0B,EAAE,KAAK;QACjC,2BAA2B,EAAE,KAAK;KACrC,CAAC;IAEF,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,aAAa,GAAmB;QAClC,GAAG,IAAI;QACP,GAAG,eAAe;KACrB,CAAC;IAEF,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QACxB,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAmB;QAChC,GAAG,aAAa;QAChB,GAAG,aAAa;KACnB,CAAC;IAEF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,OAAO;QACH,GAAG,WAAW;QACd,GAAG,kBAAkB;KACxB,CAAC;AACN,CAAC;AAEY,QAAA,sBAAsB,GAA2C;IAC1E,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC;IAC7B,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC;IACrC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC;IACjC,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC;CAC9C,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/options/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAmB,OAAO,CAAC;AAExC,QAAA,cAAc,GAAoB;IAC3C,iBAAiB,EAAE,EAAE;IACrB,kBAAkB,EAAE,GAAG;CAC1B,CAAC;AAEW,QAAA,eAAe,GAAqB;IAC7C,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,KAAK;IACrB,sBAAsB,EAAE,KAAK;IAC7B,kBAAkB,EAAE,KAAK;CAC5B,CAAC;AAEF,MAAM,UAAU,GAAwE;IACpF,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;CAC5B,CAAC;AAEF,MAAM,gBAAgB,GAMlB;IACA,cAAc,EAAE,IAAI;IACpB,kBAAkB,EAAE,IAAI;IACxB,0BAA0B,EAAE,IAAI;IAChC,qBAAqB,EAAE,IAAI;CAC9B,CAAC;AAEF,MAAM,eAAe,GAGjB;IACA,yBAAyB,EAAE,IAAI;IAC/B,yBAAyB,EAAE,IAAI;IAC/B,sBAAsB,EAAE,IAAI;CAC/B,CAAC;AAEF,+FAA+F;AAC/F,MAAM,iBAAiB,GAAuD;IAC1E,0BAA0B,EAAE,IAAI;CACnC,CAAC;AAEF,SAAS,aAAa,CAAC,KAAqB;IACxC,MAAM,IAAI,GAAmB;QACzB,GAAG,gBAAgB;QACnB,yBAAyB,EAAE,KAAK;QAChC,yBAAyB,EAAE,KAAK;QAChC,sBAAsB,EAAE,KAAK;QAC7B,GAAG,UAAU;QACb,0BAA0B,EAAE,KAAK;KACpC,CAAC;IAEF,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,aAAa,GAAmB;QAClC,GAAG,IAAI;QACP,GAAG,eAAe;KACrB,CAAC;IAEF,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QACxB,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,OAAO;QACH,GAAG,aAAa;QAChB,GAAG,iBAAiB;KACvB,CAAC;AACN,CAAC;AAEY,QAAA,sBAAsB,GAA2C;IAC1E,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC;IAC7B,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC;IACrC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC;CAChC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/options/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAQ3F,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,wBAAwB,CAS5F"}
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/options/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAiC3F,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,wBAAwB,CAe5F"}
@@ -1,7 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.resolveNormalizeOptions = resolveNormalizeOptions;
4
+ const predicate_safety_policy_1 = require("../predicate/safety/predicate-safety-policy");
5
+ const scope_safety_policy_1 = require("../scope/safety/scope-safety-policy");
4
6
  const constants_1 = require("./constants");
7
+ function mergePredicateSafetyPolicy(partial) {
8
+ return {
9
+ ...predicate_safety_policy_1.DEFAULT_PREDICATE_SAFETY_POLICY,
10
+ ...(partial ?? {}),
11
+ };
12
+ }
13
+ function mergeScopeSafetyPolicy(partial) {
14
+ const merged = { ...scope_safety_policy_1.DEFAULT_SCOPE_SAFETY_POLICY };
15
+ if (!partial) {
16
+ return merged;
17
+ }
18
+ for (const key of Object.keys(scope_safety_policy_1.DEFAULT_SCOPE_SAFETY_POLICY)) {
19
+ if (Object.prototype.hasOwnProperty.call(partial, key)) {
20
+ merged[key] = partial[key];
21
+ }
22
+ }
23
+ return merged;
24
+ }
5
25
  function resolveNormalizeOptions(options) {
6
26
  const level = resolveLevel(options?.level);
7
27
  return {
@@ -9,10 +29,21 @@ function resolveNormalizeOptions(options) {
9
29
  rules: mergeRules(level, options?.rules),
10
30
  safety: mergeSafety(options?.safety),
11
31
  observe: mergeObserve(options?.observe),
32
+ predicate: {
33
+ safetyPolicy: mergePredicateSafetyPolicy(options?.predicate?.safetyPolicy),
34
+ },
35
+ scope: {
36
+ safetyPolicy: mergeScopeSafetyPolicy(options?.scope?.safetyPolicy),
37
+ },
12
38
  };
13
39
  }
14
40
  function resolveLevel(level) {
15
- return level ?? constants_1.DEFAULT_LEVEL;
41
+ const resolved = level ?? constants_1.DEFAULT_LEVEL;
42
+ if (Object.prototype.hasOwnProperty.call(constants_1.DEFAULT_RULES_BY_LEVEL, resolved)) {
43
+ return resolved;
44
+ }
45
+ const allowed = Object.keys(constants_1.DEFAULT_RULES_BY_LEVEL).join(", ");
46
+ throw new Error(`[mongo-query-normalizer] invalid normalize level: ${JSON.stringify(level)}. Expected one of: ${allowed}.`);
16
47
  }
17
48
  function mergeRules(level, rules) {
18
49
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/options/resolve.ts"],"names":[],"mappings":";;AAQA,0DASC;AAhBD,2CAKqB;AAErB,SAAgB,uBAAuB,CAAC,OAA0B;IAC9D,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE3C,OAAO;QACH,KAAK;QACL,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;QACxC,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;QACpC,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;KAC1C,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,KAAsB;IACxC,OAAO,KAAK,IAAI,yBAAa,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,KAAqB,EAAE,KAAkD;IACzF,OAAO;QACH,GAAG,kCAAsB,CAAC,KAAK,CAAC;QAChC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;KACnB,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAC,MAAoD;IACrE,OAAO;QACH,GAAG,0BAAc;QACjB,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;KACpB,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,OAAsD;IACxE,OAAO;QACH,GAAG,2BAAe;QAClB,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;KACrB,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/options/resolve.ts"],"names":[],"mappings":";;AAiCA,0DAeC;AA/CD,yFAGqD;AACrD,6EAA0G;AAC1G,2CAKqB;AAErB,SAAS,0BAA0B,CAAC,OAAwC;IACxE,OAAO;QACH,GAAG,yDAA+B;QAClC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;KACrB,CAAC;AACN,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAoC;IAChE,MAAM,MAAM,GAAsB,EAAE,GAAG,iDAA2B,EAAE,CAAC;IACrE,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,iDAA2B,CAAgC,EAAE,CAAC;QACxF,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAE,CAAC;QAChC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAgB,uBAAuB,CAAC,OAA0B;IAC9D,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE3C,OAAO;QACH,KAAK;QACL,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;QACxC,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;QACpC,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;QACvC,SAAS,EAAE;YACP,YAAY,EAAE,0BAA0B,CAAC,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC;SAC7E;QACD,KAAK,EAAE;YACH,YAAY,EAAE,sBAAsB,CAAC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC;SACrE;KACJ,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,KAAiC;IACnD,MAAM,QAAQ,GAAG,KAAK,IAAI,yBAAa,CAAC;IACxC,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,kCAAsB,EAAE,QAAQ,CAAC,EAAE,CAAC;QACzE,OAAO,QAAQ,CAAC;IACpB,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,kCAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,IAAI,KAAK,CACX,qDAAqD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,sBAAsB,OAAO,GAAG,CAC7G,CAAC;AACN,CAAC;AAED,SAAS,UAAU,CAAC,KAAqB,EAAE,KAAkD;IACzF,OAAO;QACH,GAAG,kCAAsB,CAAC,KAAK,CAAC;QAChC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;KACnB,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAC,MAAoD;IACrE,OAAO;QACH,GAAG,0BAAc;QACjB,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;KACpB,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,OAAsD;IACxE,OAAO;QACH,GAAG,2BAAe;QAClB,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;KACrB,CAAC;AACN,CAAC"}
@@ -1,2 +1,2 @@
1
- export type { NormalizeLevel, NormalizeObserve, NormalizeOptions, NormalizeResult, NormalizeRules, NormalizeSafety, NormalizeStats, ResolvedNormalizeOptions, } from "../types";
1
+ export type { NormalizeLevel, NormalizeObserve, NormalizeOptions, NormalizePredicateOptions, NormalizeResult, NormalizeRules, NormalizeSafety, NormalizeStats, NormalizeScopeLayerOptions, PredicateFieldTrace, ResolvedNormalizeOptions, ScopeNormalizationTrace, ScopeTraceEvent, } from "../types";
2
2
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,eAAe,EACf,cAAc,EACd,wBAAwB,GAC3B,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,EACzB,eAAe,EACf,cAAc,EACd,eAAe,EACf,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,GAClB,MAAM,UAAU,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-predicate.d.ts","sourceRoot":"","sources":["../../src/passes/normalize-predicate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA6B,SAAS,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAK7D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAEjG"}
1
+ {"version":3,"file":"normalize-predicate.d.ts","sourceRoot":"","sources":["../../src/passes/normalize-predicate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA6B,SAAS,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAS7D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAEjG"}
@@ -2,10 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.normalizePredicate = normalizePredicate;
4
4
  const builders_1 = require("../ast/builders");
5
+ const hash_1 = require("../ast/hash");
5
6
  const guards_1 = require("../ast/guards");
6
- const collapse_contradictions_1 = require("../rules/predicate/collapse-contradictions");
7
- const dedupe_same_field_predicates_1 = require("../rules/predicate/dedupe-same-field-predicates");
8
- const merge_comparable_predicates_1 = require("../rules/predicate/merge-comparable-predicates");
7
+ const warnings_1 = require("../observe/warnings");
8
+ const build_field_bundle_1 = require("../predicate/ir/build-field-bundle");
9
+ const normalize_field_predicate_bundle_1 = require("../predicate/normalize-field-predicate-bundle");
9
10
  function normalizePredicate(node, normalizeContext) {
10
11
  return normalizePredicateRecursive(node, normalizeContext);
11
12
  }
@@ -20,9 +21,6 @@ function normalizePredicateRecursive(node, normalizeContext) {
20
21
  }
21
22
  return node;
22
23
  }
23
- /**
24
- * 同一 `$and` 层上合并同名字段子句,再跑谓词规则(可检出 `{ $and: [{ a: 1 }, { a: 2 }] }` 等矛盾)。
25
- */
26
24
  function mergeAndSiblingFieldNodesUnderAnd(children, normalizeContext) {
27
25
  const byField = new Map();
28
26
  const rest = [];
@@ -41,17 +39,98 @@ function mergeAndSiblingFieldNodesUnderAnd(children, normalizeContext) {
41
39
  }
42
40
  return [...rest, ...merged];
43
41
  }
42
+ const RULE_DEDUPE = "predicate.dedupeSameFieldPredicates";
43
+ const RULE_MERGE = "predicate.mergeComparablePredicates";
44
+ const RULE_COLLAPSE = "predicate.collapseContradictions";
45
+ const MERGE_CAPABILITY_IDS = ["eq.eq", "eq.in", "eq.range", "range.range"];
46
+ function fieldPredicatesUnchanged(a, b) {
47
+ if (a.length !== b.length) {
48
+ return false;
49
+ }
50
+ return a.every((p, i) => (0, hash_1.hashPredicate)(p) === (0, hash_1.hashPredicate)(b[i]));
51
+ }
44
52
  function applyPredicateRulesToField(node, normalizeContext) {
45
- let current = node;
46
- if (normalizeContext.options.rules.dedupeSameFieldPredicates) {
47
- current = (0, dedupe_same_field_predicates_1.dedupeSameFieldPredicates)(current, normalizeContext);
53
+ const rules = normalizeContext.options.rules;
54
+ const runAny = rules.dedupeSameFieldPredicates || rules.mergeComparablePredicates || rules.collapseContradictions;
55
+ if (!runAny) {
56
+ (0, warnings_1.markRuleSkipped)(normalizeContext, RULE_DEDUPE, "predicate rules disabled");
57
+ (0, warnings_1.markRuleSkipped)(normalizeContext, RULE_MERGE, "predicate rules disabled");
58
+ (0, warnings_1.markRuleSkipped)(normalizeContext, RULE_COLLAPSE, "predicate rules disabled");
59
+ return node;
60
+ }
61
+ const bundle = (0, build_field_bundle_1.buildFieldPredicateBundleFromFieldNode)(node);
62
+ const local = (0, normalize_field_predicate_bundle_1.normalizeFieldPredicateBundle)(bundle, {
63
+ safety: normalizeContext.options.predicate.safetyPolicy,
64
+ engine: {
65
+ dedupeAtoms: rules.dedupeSameFieldPredicates,
66
+ mergeComparable: rules.mergeComparablePredicates,
67
+ collapseContradictions: rules.collapseContradictions,
68
+ },
69
+ });
70
+ const out = (0, normalize_field_predicate_bundle_1.compileLocalNormalizeResultToAst)(local);
71
+ if (normalizeContext.options.observe.collectPredicateTraces) {
72
+ const trace = {
73
+ field: node.field,
74
+ atomKinds: local.atomKinds,
75
+ appliedCapabilityIds: [...local.appliedCapabilities],
76
+ skippedCapabilities: local.skippedCapabilities.map((s) => ({
77
+ id: s.id,
78
+ reason: s.reason,
79
+ })),
80
+ contradiction: local.contradiction,
81
+ contradictionCapabilityId: local.contradiction ? local.contradictionCapabilityId : undefined,
82
+ hadCoverage: local.coveredAtoms.length > 0,
83
+ coverageAtomCount: local.coveredAtoms.length,
84
+ hadTighten: local.changed && !local.contradiction,
85
+ impossibleEmitted: local.contradiction,
86
+ };
87
+ if (!normalizeContext.predicateTraces) {
88
+ normalizeContext.predicateTraces = [];
89
+ }
90
+ normalizeContext.predicateTraces.push(trace);
91
+ }
92
+ if (rules.dedupeSameFieldPredicates) {
93
+ if (local.atomDedupeChanged) {
94
+ (0, warnings_1.markRuleApplied)(normalizeContext, RULE_DEDUPE);
95
+ }
96
+ else {
97
+ (0, warnings_1.markRuleSkipped)(normalizeContext, RULE_DEDUPE, "no duplicate predicates");
98
+ }
99
+ }
100
+ else {
101
+ (0, warnings_1.markRuleSkipped)(normalizeContext, RULE_DEDUPE, "rule disabled");
102
+ }
103
+ if (rules.mergeComparablePredicates) {
104
+ const mergeTouched = local.appliedCapabilities.some((id) => MERGE_CAPABILITY_IDS.includes(id));
105
+ if (mergeTouched) {
106
+ (0, warnings_1.markRuleApplied)(normalizeContext, RULE_MERGE);
107
+ }
108
+ else {
109
+ (0, warnings_1.markRuleSkipped)(normalizeContext, RULE_MERGE, "no comparable predicate merge applied");
110
+ }
111
+ }
112
+ else {
113
+ (0, warnings_1.markRuleSkipped)(normalizeContext, RULE_MERGE, "rule disabled");
114
+ }
115
+ if (rules.collapseContradictions) {
116
+ const collapseContradictionCaps = ["eq.ne", "eq.in"];
117
+ const collapseHit = local.appliedCapabilities.includes("eq.ne") ||
118
+ (local.contradiction &&
119
+ local.contradictionCapabilityId !== undefined &&
120
+ collapseContradictionCaps.includes(local.contradictionCapabilityId));
121
+ if (collapseHit) {
122
+ (0, warnings_1.markRuleApplied)(normalizeContext, RULE_COLLAPSE);
123
+ }
124
+ else {
125
+ (0, warnings_1.markRuleSkipped)(normalizeContext, RULE_COLLAPSE, "no explicit contradiction");
126
+ }
48
127
  }
49
- if ((0, guards_1.isFieldNode)(current) && normalizeContext.options.rules.mergeComparablePredicates) {
50
- current = (0, merge_comparable_predicates_1.mergeComparablePredicates)(current, normalizeContext);
128
+ else {
129
+ (0, warnings_1.markRuleSkipped)(normalizeContext, RULE_COLLAPSE, "rule disabled");
51
130
  }
52
- if ((0, guards_1.isFieldNode)(current) && normalizeContext.options.rules.collapseContradictions) {
53
- current = (0, collapse_contradictions_1.collapseContradictions)(current, normalizeContext);
131
+ if ((0, guards_1.isFieldNode)(out) && out.field === node.field && fieldPredicatesUnchanged(out.predicates, node.predicates)) {
132
+ return node;
54
133
  }
55
- return current;
134
+ return out;
56
135
  }
57
136
  //# sourceMappingURL=normalize-predicate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalize-predicate.js","sourceRoot":"","sources":["../../src/passes/normalize-predicate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"normalize-predicate.js","sourceRoot":"","sources":["../../src/passes/normalize-predicate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FieldPredicateBundle } from "../ir/field-predicate-bundle";
2
+ export declare function detectArraySensitiveSemantics(bundle: FieldPredicateBundle): boolean;
3
+ //# sourceMappingURL=detect-array-sensitive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-array-sensitive.d.ts","sourceRoot":"","sources":["../../../src/predicate/analysis/detect-array-sensitive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AA0BzE,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAOnF"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectArraySensitiveSemantics = detectArraySensitiveSemantics;
4
+ function valueLooksArraySensitive(value) {
5
+ if (value === null || value === undefined) {
6
+ return false;
7
+ }
8
+ if (Array.isArray(value)) {
9
+ return true;
10
+ }
11
+ if (typeof value === "object") {
12
+ return true;
13
+ }
14
+ return false;
15
+ }
16
+ function atomIsArraySensitive(atom) {
17
+ if (atom.kind === "nin") {
18
+ return true;
19
+ }
20
+ if (atom.kind === "in") {
21
+ return atom.values.some(valueLooksArraySensitive);
22
+ }
23
+ return false;
24
+ }
25
+ function detectArraySensitiveSemantics(bundle) {
26
+ for (const atom of bundle.predicates) {
27
+ if (atomIsArraySensitive(atom)) {
28
+ return true;
29
+ }
30
+ }
31
+ return false;
32
+ }
33
+ //# sourceMappingURL=detect-array-sensitive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-array-sensitive.js","sourceRoot":"","sources":["../../../src/predicate/analysis/detect-array-sensitive.ts"],"names":[],"mappings":";;AA0BA,sEAOC;AA9BD,SAAS,wBAAwB,CAAC,KAAc;IAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAmB;IAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QACtB,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAgB,6BAA6B,CAAC,MAA4B;IACtE,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACnC,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { FieldPredicateBundle } from "../ir/field-predicate-bundle";
2
+ export declare function detectNullSensitiveSemantics(bundle: FieldPredicateBundle): boolean;
3
+ //# sourceMappingURL=detect-null-sensitive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-null-sensitive.d.ts","sourceRoot":"","sources":["../../../src/predicate/analysis/detect-null-sensitive.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAiBzE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAOlF"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectNullSensitiveSemantics = detectNullSensitiveSemantics;
4
+ function containsNull(value) {
5
+ return value === null;
6
+ }
7
+ function atomHasNullSemantics(atom) {
8
+ if (atom.kind === "eq" || atom.kind === "ne") {
9
+ return containsNull(atom.value);
10
+ }
11
+ if (atom.kind === "in" || atom.kind === "nin") {
12
+ return atom.values.some(containsNull);
13
+ }
14
+ return false;
15
+ }
16
+ function detectNullSensitiveSemantics(bundle) {
17
+ for (const atom of bundle.predicates) {
18
+ if (atomHasNullSemantics(atom)) {
19
+ return true;
20
+ }
21
+ }
22
+ return false;
23
+ }
24
+ //# sourceMappingURL=detect-null-sensitive.js.map