mongo-query-normalizer 0.1.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 (316) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +193 -0
  3. package/README.zh-CN.md +194 -0
  4. package/dist/ast/builders.d.ts +8 -0
  5. package/dist/ast/builders.d.ts.map +1 -0
  6. package/dist/ast/builders.js +27 -0
  7. package/dist/ast/builders.js.map +1 -0
  8. package/dist/ast/contains-opaque.d.ts +3 -0
  9. package/dist/ast/contains-opaque.d.ts.map +1 -0
  10. package/dist/ast/contains-opaque.js +14 -0
  11. package/dist/ast/contains-opaque.js.map +1 -0
  12. package/dist/ast/guards.d.ts +7 -0
  13. package/dist/ast/guards.d.ts.map +1 -0
  14. package/dist/ast/guards.js +23 -0
  15. package/dist/ast/guards.js.map +1 -0
  16. package/dist/ast/hash.d.ts +4 -0
  17. package/dist/ast/hash.d.ts.map +1 -0
  18. package/dist/ast/hash.js +67 -0
  19. package/dist/ast/hash.js.map +1 -0
  20. package/dist/ast/index.d.ts +6 -0
  21. package/dist/ast/index.d.ts.map +1 -0
  22. package/dist/ast/index.js +22 -0
  23. package/dist/ast/index.js.map +1 -0
  24. package/dist/ast/types.d.ts +28 -0
  25. package/dist/ast/types.d.ts.map +1 -0
  26. package/dist/ast/types.js +3 -0
  27. package/dist/ast/types.js.map +1 -0
  28. package/dist/ast/visitor.d.ts +3 -0
  29. package/dist/ast/visitor.d.ts.map +1 -0
  30. package/dist/ast/visitor.js +12 -0
  31. package/dist/ast/visitor.js.map +1 -0
  32. package/dist/common/types.d.ts +46 -0
  33. package/dist/common/types.d.ts.map +1 -0
  34. package/dist/common/types.js +3 -0
  35. package/dist/common/types.js.map +1 -0
  36. package/dist/compile/compile.d.ts +5 -0
  37. package/dist/compile/compile.d.ts.map +1 -0
  38. package/dist/compile/compile.js +69 -0
  39. package/dist/compile/compile.js.map +1 -0
  40. package/dist/compile-selector.d.ts +9 -0
  41. package/dist/compile-selector.d.ts.map +1 -0
  42. package/dist/compile-selector.js +14 -0
  43. package/dist/compile-selector.js.map +1 -0
  44. package/dist/conflict.d.ts +18 -0
  45. package/dist/conflict.d.ts.map +1 -0
  46. package/dist/conflict.js +30 -0
  47. package/dist/conflict.js.map +1 -0
  48. package/dist/core/canonicalize.d.ts +11 -0
  49. package/dist/core/canonicalize.d.ts.map +1 -0
  50. package/dist/core/canonicalize.js +104 -0
  51. package/dist/core/canonicalize.js.map +1 -0
  52. package/dist/core/conditions.d.ts +8 -0
  53. package/dist/core/conditions.d.ts.map +1 -0
  54. package/dist/core/conditions.js +282 -0
  55. package/dist/core/conditions.js.map +1 -0
  56. package/dist/core/conflicts-and-tighten.d.ts +15 -0
  57. package/dist/core/conflicts-and-tighten.d.ts.map +1 -0
  58. package/dist/core/conflicts-and-tighten.js +26 -0
  59. package/dist/core/conflicts-and-tighten.js.map +1 -0
  60. package/dist/core/conflicts.d.ts +14 -0
  61. package/dist/core/conflicts.d.ts.map +1 -0
  62. package/dist/core/conflicts.js +157 -0
  63. package/dist/core/conflicts.js.map +1 -0
  64. package/dist/core/constraint-propagation.d.ts +15 -0
  65. package/dist/core/constraint-propagation.d.ts.map +1 -0
  66. package/dist/core/constraint-propagation.js +93 -0
  67. package/dist/core/constraint-propagation.js.map +1 -0
  68. package/dist/core/field-condition-normalize.d.ts +22 -0
  69. package/dist/core/field-condition-normalize.d.ts.map +1 -0
  70. package/dist/core/field-condition-normalize.js +225 -0
  71. package/dist/core/field-condition-normalize.js.map +1 -0
  72. package/dist/core/index.d.ts +6 -0
  73. package/dist/core/index.d.ts.map +1 -0
  74. package/dist/core/index.js +14 -0
  75. package/dist/core/index.js.map +1 -0
  76. package/dist/core/normalize.d.ts +8 -0
  77. package/dist/core/normalize.d.ts.map +1 -0
  78. package/dist/core/normalize.js +44 -0
  79. package/dist/core/normalize.js.map +1 -0
  80. package/dist/core/operators.d.ts +11 -0
  81. package/dist/core/operators.d.ts.map +1 -0
  82. package/dist/core/operators.js +26 -0
  83. package/dist/core/operators.js.map +1 -0
  84. package/dist/core/predicate-merge.d.ts +9 -0
  85. package/dist/core/predicate-merge.d.ts.map +1 -0
  86. package/dist/core/predicate-merge.js +105 -0
  87. package/dist/core/predicate-merge.js.map +1 -0
  88. package/dist/core/predicateMerge.d.ts +17 -0
  89. package/dist/core/predicateMerge.d.ts.map +1 -0
  90. package/dist/core/predicateMerge.js +57 -0
  91. package/dist/core/predicateMerge.js.map +1 -0
  92. package/dist/core/simplify.d.ts +11 -0
  93. package/dist/core/simplify.d.ts.map +1 -0
  94. package/dist/core/simplify.js +128 -0
  95. package/dist/core/simplify.js.map +1 -0
  96. package/dist/core/stable-structural-key.d.ts +7 -0
  97. package/dist/core/stable-structural-key.d.ts.map +1 -0
  98. package/dist/core/stable-structural-key.js +71 -0
  99. package/dist/core/stable-structural-key.js.map +1 -0
  100. package/dist/core/utils.d.ts +16 -0
  101. package/dist/core/utils.d.ts.map +1 -0
  102. package/dist/core/utils.js +109 -0
  103. package/dist/core/utils.js.map +1 -0
  104. package/dist/flatten/flatten.d.ts +43 -0
  105. package/dist/flatten/flatten.d.ts.map +1 -0
  106. package/dist/flatten/flatten.js +68 -0
  107. package/dist/flatten/flatten.js.map +1 -0
  108. package/dist/flatten/index.d.ts +2 -0
  109. package/dist/flatten/index.d.ts.map +1 -0
  110. package/dist/flatten/index.js +10 -0
  111. package/dist/flatten/index.js.map +1 -0
  112. package/dist/flatten.d.ts +43 -0
  113. package/dist/flatten.d.ts.map +1 -0
  114. package/dist/flatten.js +68 -0
  115. package/dist/flatten.js.map +1 -0
  116. package/dist/index.d.ts +4 -0
  117. package/dist/index.d.ts.map +1 -0
  118. package/dist/index.js +8 -0
  119. package/dist/index.js.map +1 -0
  120. package/dist/merge-ops.d.ts +33 -0
  121. package/dist/merge-ops.d.ts.map +1 -0
  122. package/dist/merge-ops.js +52 -0
  123. package/dist/merge-ops.js.map +1 -0
  124. package/dist/normalize-context.d.ts +16 -0
  125. package/dist/normalize-context.d.ts.map +1 -0
  126. package/dist/normalize-context.js +19 -0
  127. package/dist/normalize-context.js.map +1 -0
  128. package/dist/normalize.d.ts +6 -0
  129. package/dist/normalize.d.ts.map +1 -0
  130. package/dist/normalize.js +122 -0
  131. package/dist/normalize.js.map +1 -0
  132. package/dist/observe/diff.d.ts +7 -0
  133. package/dist/observe/diff.d.ts.map +1 -0
  134. package/dist/observe/diff.js +15 -0
  135. package/dist/observe/diff.js.map +1 -0
  136. package/dist/observe/level-boundary-hints.d.ts +11 -0
  137. package/dist/observe/level-boundary-hints.d.ts.map +1 -0
  138. package/dist/observe/level-boundary-hints.js +42 -0
  139. package/dist/observe/level-boundary-hints.js.map +1 -0
  140. package/dist/observe/level-preview-warning.d.ts +11 -0
  141. package/dist/observe/level-preview-warning.d.ts.map +1 -0
  142. package/dist/observe/level-preview-warning.js +42 -0
  143. package/dist/observe/level-preview-warning.js.map +1 -0
  144. package/dist/observe/metrics.d.ts +4 -0
  145. package/dist/observe/metrics.d.ts.map +1 -0
  146. package/dist/observe/metrics.js +30 -0
  147. package/dist/observe/metrics.js.map +1 -0
  148. package/dist/observe/warnings.d.ts +6 -0
  149. package/dist/observe/warnings.d.ts.map +1 -0
  150. package/dist/observe/warnings.js +24 -0
  151. package/dist/observe/warnings.js.map +1 -0
  152. package/dist/operations/compile.d.ts +7 -0
  153. package/dist/operations/compile.d.ts.map +1 -0
  154. package/dist/operations/compile.js +70 -0
  155. package/dist/operations/compile.js.map +1 -0
  156. package/dist/operations/conflicts-and-tighten.d.ts +29 -0
  157. package/dist/operations/conflicts-and-tighten.d.ts.map +1 -0
  158. package/dist/operations/conflicts-and-tighten.js +40 -0
  159. package/dist/operations/conflicts-and-tighten.js.map +1 -0
  160. package/dist/operations/conflicts.d.ts +28 -0
  161. package/dist/operations/conflicts.d.ts.map +1 -0
  162. package/dist/operations/conflicts.js +216 -0
  163. package/dist/operations/conflicts.js.map +1 -0
  164. package/dist/operations/conflictsAndTighten.d.ts +29 -0
  165. package/dist/operations/conflictsAndTighten.d.ts.map +1 -0
  166. package/dist/operations/conflictsAndTighten.js +40 -0
  167. package/dist/operations/conflictsAndTighten.js.map +1 -0
  168. package/dist/operations/merge.d.ts +18 -0
  169. package/dist/operations/merge.d.ts.map +1 -0
  170. package/dist/operations/merge.js +266 -0
  171. package/dist/operations/merge.js.map +1 -0
  172. package/dist/operations/parse.d.ts +20 -0
  173. package/dist/operations/parse.d.ts.map +1 -0
  174. package/dist/operations/parse.js +128 -0
  175. package/dist/operations/parse.js.map +1 -0
  176. package/dist/ops/compile-selector.d.ts +9 -0
  177. package/dist/ops/compile-selector.d.ts.map +1 -0
  178. package/dist/ops/compile-selector.js +14 -0
  179. package/dist/ops/compile-selector.js.map +1 -0
  180. package/dist/ops/index.d.ts +4 -0
  181. package/dist/ops/index.d.ts.map +1 -0
  182. package/dist/ops/index.js +14 -0
  183. package/dist/ops/index.js.map +1 -0
  184. package/dist/ops/merge-ops.d.ts +33 -0
  185. package/dist/ops/merge-ops.d.ts.map +1 -0
  186. package/dist/ops/merge-ops.js +52 -0
  187. package/dist/ops/merge-ops.js.map +1 -0
  188. package/dist/ops/parse-selector.d.ts +18 -0
  189. package/dist/ops/parse-selector.d.ts.map +1 -0
  190. package/dist/ops/parse-selector.js +29 -0
  191. package/dist/ops/parse-selector.js.map +1 -0
  192. package/dist/optimize.d.ts +18 -0
  193. package/dist/optimize.d.ts.map +1 -0
  194. package/dist/optimize.js +33 -0
  195. package/dist/optimize.js.map +1 -0
  196. package/dist/options/constants.d.ts +6 -0
  197. package/dist/options/constants.d.ts.map +1 -0
  198. package/dist/options/constants.js +72 -0
  199. package/dist/options/constants.js.map +1 -0
  200. package/dist/options/resolve.d.ts +3 -0
  201. package/dist/options/resolve.d.ts.map +1 -0
  202. package/dist/options/resolve.js +35 -0
  203. package/dist/options/resolve.js.map +1 -0
  204. package/dist/options/types.d.ts +2 -0
  205. package/dist/options/types.d.ts.map +1 -0
  206. package/dist/options/types.js +3 -0
  207. package/dist/options/types.js.map +1 -0
  208. package/dist/parse/parse.d.ts +4 -0
  209. package/dist/parse/parse.d.ts.map +1 -0
  210. package/dist/parse/parse.js +114 -0
  211. package/dist/parse/parse.js.map +1 -0
  212. package/dist/parse/plain-object.d.ts +2 -0
  213. package/dist/parse/plain-object.d.ts.map +1 -0
  214. package/dist/parse/plain-object.js +7 -0
  215. package/dist/parse/plain-object.js.map +1 -0
  216. package/dist/parse-selector.d.ts +18 -0
  217. package/dist/parse-selector.d.ts.map +1 -0
  218. package/dist/parse-selector.js +29 -0
  219. package/dist/parse-selector.js.map +1 -0
  220. package/dist/passes/canonicalize.d.ts +4 -0
  221. package/dist/passes/canonicalize.d.ts.map +1 -0
  222. package/dist/passes/canonicalize.js +40 -0
  223. package/dist/passes/canonicalize.js.map +1 -0
  224. package/dist/passes/normalize-predicate.d.ts +4 -0
  225. package/dist/passes/normalize-predicate.d.ts.map +1 -0
  226. package/dist/passes/normalize-predicate.js +57 -0
  227. package/dist/passes/normalize-predicate.js.map +1 -0
  228. package/dist/passes/normalize-shape.d.ts +4 -0
  229. package/dist/passes/normalize-shape.d.ts.map +1 -0
  230. package/dist/passes/normalize-shape.js +37 -0
  231. package/dist/passes/normalize-shape.js.map +1 -0
  232. package/dist/passes/simplify.d.ts +4 -0
  233. package/dist/passes/simplify.d.ts.map +1 -0
  234. package/dist/passes/simplify.js +49 -0
  235. package/dist/passes/simplify.js.map +1 -0
  236. package/dist/prune/conflict.d.ts +18 -0
  237. package/dist/prune/conflict.d.ts.map +1 -0
  238. package/dist/prune/conflict.js +30 -0
  239. package/dist/prune/conflict.js.map +1 -0
  240. package/dist/prune/index.d.ts +3 -0
  241. package/dist/prune/index.d.ts.map +1 -0
  242. package/dist/prune/index.js +9 -0
  243. package/dist/prune/index.js.map +1 -0
  244. package/dist/prune/prune.d.ts +11 -0
  245. package/dist/prune/prune.d.ts.map +1 -0
  246. package/dist/prune/prune.js +19 -0
  247. package/dist/prune/prune.js.map +1 -0
  248. package/dist/prune.d.ts +11 -0
  249. package/dist/prune.d.ts.map +1 -0
  250. package/dist/prune.js +19 -0
  251. package/dist/prune.js.map +1 -0
  252. package/dist/rewrite.d.ts +27 -0
  253. package/dist/rewrite.d.ts.map +1 -0
  254. package/dist/rewrite.js +62 -0
  255. package/dist/rewrite.js.map +1 -0
  256. package/dist/rules/experimental/hoist-common-predicates-from-or.d.ts +5 -0
  257. package/dist/rules/experimental/hoist-common-predicates-from-or.d.ts.map +1 -0
  258. package/dist/rules/experimental/hoist-common-predicates-from-or.js +153 -0
  259. package/dist/rules/experimental/hoist-common-predicates-from-or.js.map +1 -0
  260. package/dist/rules/logical/detect-common-predicates-in-or.d.ts +5 -0
  261. package/dist/rules/logical/detect-common-predicates-in-or.d.ts.map +1 -0
  262. package/dist/rules/logical/detect-common-predicates-in-or.js +82 -0
  263. package/dist/rules/logical/detect-common-predicates-in-or.js.map +1 -0
  264. package/dist/rules/predicate/collapse-contradictions.d.ts +5 -0
  265. package/dist/rules/predicate/collapse-contradictions.d.ts.map +1 -0
  266. package/dist/rules/predicate/collapse-contradictions.js +45 -0
  267. package/dist/rules/predicate/collapse-contradictions.js.map +1 -0
  268. package/dist/rules/predicate/dedupe-same-field-predicates.d.ts +5 -0
  269. package/dist/rules/predicate/dedupe-same-field-predicates.d.ts.map +1 -0
  270. package/dist/rules/predicate/dedupe-same-field-predicates.js +33 -0
  271. package/dist/rules/predicate/dedupe-same-field-predicates.js.map +1 -0
  272. package/dist/rules/predicate/merge-comparable-predicates.d.ts +5 -0
  273. package/dist/rules/predicate/merge-comparable-predicates.d.ts.map +1 -0
  274. package/dist/rules/predicate/merge-comparable-predicates.js +30 -0
  275. package/dist/rules/predicate/merge-comparable-predicates.js.map +1 -0
  276. package/dist/rules/predicate/merge-predicates-internal.d.ts +7 -0
  277. package/dist/rules/predicate/merge-predicates-internal.d.ts.map +1 -0
  278. package/dist/rules/predicate/merge-predicates-internal.js +186 -0
  279. package/dist/rules/predicate/merge-predicates-internal.js.map +1 -0
  280. package/dist/rules/shape/collapse-single-child-logical.d.ts +5 -0
  281. package/dist/rules/shape/collapse-single-child-logical.d.ts.map +1 -0
  282. package/dist/rules/shape/collapse-single-child-logical.js +20 -0
  283. package/dist/rules/shape/collapse-single-child-logical.js.map +1 -0
  284. package/dist/rules/shape/dedupe-logical-children.d.ts +6 -0
  285. package/dist/rules/shape/dedupe-logical-children.d.ts.map +1 -0
  286. package/dist/rules/shape/dedupe-logical-children.js +37 -0
  287. package/dist/rules/shape/dedupe-logical-children.js.map +1 -0
  288. package/dist/rules/shape/flatten-logical.d.ts +6 -0
  289. package/dist/rules/shape/flatten-logical.d.ts.map +1 -0
  290. package/dist/rules/shape/flatten-logical.js +37 -0
  291. package/dist/rules/shape/flatten-logical.js.map +1 -0
  292. package/dist/rules/shape/remove-empty-logical.d.ts +5 -0
  293. package/dist/rules/shape/remove-empty-logical.d.ts.map +1 -0
  294. package/dist/rules/shape/remove-empty-logical.js +21 -0
  295. package/dist/rules/shape/remove-empty-logical.js.map +1 -0
  296. package/dist/types.d.ts +70 -0
  297. package/dist/types.d.ts.map +1 -0
  298. package/dist/types.js +8 -0
  299. package/dist/types.js.map +1 -0
  300. package/dist/utils/compare-values.d.ts +6 -0
  301. package/dist/utils/compare-values.d.ts.map +1 -0
  302. package/dist/utils/compare-values.js +31 -0
  303. package/dist/utils/compare-values.js.map +1 -0
  304. package/dist/utils/deep-equal.d.ts +2 -0
  305. package/dist/utils/deep-equal.d.ts.map +1 -0
  306. package/dist/utils/deep-equal.js +30 -0
  307. package/dist/utils/deep-equal.js.map +1 -0
  308. package/dist/utils/is-opaque.d.ts +4 -0
  309. package/dist/utils/is-opaque.d.ts.map +1 -0
  310. package/dist/utils/is-opaque.js +42 -0
  311. package/dist/utils/is-opaque.js.map +1 -0
  312. package/dist/utils/stable-sort.d.ts +2 -0
  313. package/dist/utils/stable-sort.d.ts.map +1 -0
  314. package/dist/utils/stable-sort.js +16 -0
  315. package/dist/utils/stable-sort.js.map +1 -0
  316. package/package.json +51 -0
@@ -0,0 +1,29 @@
1
+ import type { FieldCondition } from "../ast/types";
2
+ import type { TightenResult } from "../core/conditions";
3
+ /**
4
+ * 判断同一字段上的一组条件是否自相冲突(不可满足)。
5
+ * 用于 simplify 阶段对单个 FieldNode 的自洽性检查。
6
+ *
7
+ * @param conditions - 该字段的条件列表
8
+ * @returns 若存在互斥则为 true
9
+ */
10
+ export declare function isConditionsImpossible(conditions: FieldCondition[]): boolean;
11
+ /**
12
+ * 判断父级条件与子级条件是否冲突(在父级约束下子级是否不可能成立)。
13
+ * 用于 simplify 阶段对 context 与当前 FieldNode 的冲突检查。
14
+ *
15
+ * @param parent - 父级该字段的条件列表(来自 context)
16
+ * @param child - 当前节点的条件列表
17
+ * @returns 若存在互斥则为 true
18
+ */
19
+ export declare function isParentChildImpossible(parent: FieldCondition[], child: FieldCondition[]): boolean;
20
+ /**
21
+ * 在父级条件约束下收紧子级条件(取交集),并判断合并后是否不可能满足。
22
+ * 用于 simplify 阶段对 FieldNode 的收紧与不可能性判定。
23
+ *
24
+ * @param parent - 父级该字段的条件列表
25
+ * @param child - 当前节点的条件列表
26
+ * @returns 收紧后的条件、是否不可能、是否有变更
27
+ */
28
+ export declare function tightenWithParent(parent: FieldCondition[], child: FieldCondition[]): TightenResult;
29
+ //# sourceMappingURL=conflicts-and-tighten.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflicts-and-tighten.d.ts","sourceRoot":"","sources":["../../src/operations/conflicts-and-tighten.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACnC,MAAM,EAAE,cAAc,EAAE,EACxB,KAAK,EAAE,cAAc,EAAE,GACxB,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,cAAc,EAAE,EACxB,KAAK,EAAE,cAAc,EAAE,GACxB,aAAa,CAEf"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isConditionsImpossible = isConditionsImpossible;
4
+ exports.isParentChildImpossible = isParentChildImpossible;
5
+ exports.tightenWithParent = tightenWithParent;
6
+ const conditions_1 = require("../core/conditions");
7
+ const conflicts_1 = require("./conflicts");
8
+ /**
9
+ * 判断同一字段上的一组条件是否自相冲突(不可满足)。
10
+ * 用于 simplify 阶段对单个 FieldNode 的自洽性检查。
11
+ *
12
+ * @param conditions - 该字段的条件列表
13
+ * @returns 若存在互斥则为 true
14
+ */
15
+ function isConditionsImpossible(conditions) {
16
+ return (0, conflicts_1.hasConditionConflict)(conditions, conditions);
17
+ }
18
+ /**
19
+ * 判断父级条件与子级条件是否冲突(在父级约束下子级是否不可能成立)。
20
+ * 用于 simplify 阶段对 context 与当前 FieldNode 的冲突检查。
21
+ *
22
+ * @param parent - 父级该字段的条件列表(来自 context)
23
+ * @param child - 当前节点的条件列表
24
+ * @returns 若存在互斥则为 true
25
+ */
26
+ function isParentChildImpossible(parent, child) {
27
+ return (0, conflicts_1.hasConditionConflict)(parent, child);
28
+ }
29
+ /**
30
+ * 在父级条件约束下收紧子级条件(取交集),并判断合并后是否不可能满足。
31
+ * 用于 simplify 阶段对 FieldNode 的收紧与不可能性判定。
32
+ *
33
+ * @param parent - 父级该字段的条件列表
34
+ * @param child - 当前节点的条件列表
35
+ * @returns 收紧后的条件、是否不可能、是否有变更
36
+ */
37
+ function tightenWithParent(parent, child) {
38
+ return (0, conditions_1.tightenChildConditionsByParent)(parent, child);
39
+ }
40
+ //# sourceMappingURL=conflicts-and-tighten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflicts-and-tighten.js","sourceRoot":"","sources":["../../src/operations/conflicts-and-tighten.ts"],"names":[],"mappings":";;AAYA,wDAEC;AAUD,0DAKC;AAUD,8CAKC;AA1CD,mDAAoE;AACpE,2CAAmD;AAEnD;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAAC,UAA4B;IAC/D,OAAO,IAAA,gCAAoB,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,uBAAuB,CACnC,MAAwB,EACxB,KAAuB;IAEvB,OAAO,IAAA,gCAAoB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAC7B,MAAwB,EACxB,KAAuB;IAEvB,OAAO,IAAA,2CAA8B,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { FieldCondition } from "../ast/types";
2
+ /**
3
+ * 判断同一字段上父条件与子条件是否冲突。
4
+ * 父条件来自 context(上层 $and 已累积的该字段条件),子条件为当前 FieldNode 的 conditions。
5
+ *
6
+ * @param parent - 父级该字段的条件列表
7
+ * @param child - 当前节点的条件列表
8
+ * @returns 若存在互斥则为 true
9
+ */
10
+ export declare function hasConditionConflict(parent: FieldCondition[], child: FieldCondition[]): boolean;
11
+ /**
12
+ * 判断内层选择子句与外层选择子句在同一字段上的条件是否冲突。
13
+ * 冲突时修剪阶段应舍弃该子分支或合并为更严条件。
14
+ *
15
+ * @param innerClause - 内层扁平条件(单层,无 $and/$or/$nor)
16
+ * @param outerClause - 外层已有扁平条件
17
+ * @returns 若存在某字段上条件互斥则为 true
18
+ */
19
+ export declare function hasConflictingClauses(innerClause: Record<string, unknown>, outerClause: Record<string, unknown>): boolean;
20
+ /**
21
+ * 判断同一字段上两个条件值是否互斥(如 $eq: 1 与 $eq: 2,或 $in 与 $nin 交集为空)。
22
+ *
23
+ * @param outerValue - 外层该字段的条件值
24
+ * @param innerValue - 内层该字段的条件值
25
+ * @returns 若两条件不可能同时满足则为 true
26
+ */
27
+ export declare function isValueConflict(outerValue: unknown, innerValue: unknown): boolean;
28
+ //# sourceMappingURL=conflicts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/operations/conflicts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAyKnD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAS/F;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACjC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACrC,OAAO,CAqBT;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,OAAO,CAYjF"}
@@ -0,0 +1,216 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasConditionConflict = hasConditionConflict;
4
+ exports.hasConflictingClauses = hasConflictingClauses;
5
+ exports.isValueConflict = isValueConflict;
6
+ const parse_1 = require("./parse");
7
+ const utils_1 = require("../core/utils");
8
+ function isNumberOrDate(v) {
9
+ return typeof v === "number" || v instanceof Date;
10
+ }
11
+ function toNum(v) {
12
+ return v instanceof Date ? v.getTime() : v;
13
+ }
14
+ function twoConditionsConflict(a, b) {
15
+ if (a.op === "$eq" && b.op === "$eq") {
16
+ return !(0, utils_1.areValuesEqual)(a.value, b.value);
17
+ }
18
+ if (a.op === "$eq" || b.op === "$eq") {
19
+ const eq = a.op === "$eq" ? a : b;
20
+ const other = a.op === "$eq" ? b : a;
21
+ const v = eq.value;
22
+ if (other.op === "$gt" || other.op === "$gte" || other.op === "$lt" || other.op === "$lte") {
23
+ if (!isNumberOrDate(v) || !isNumberOrDate(other.value)) {
24
+ return false;
25
+ }
26
+ const cv = other.value;
27
+ const nv = toNum(v);
28
+ const nc = toNum(cv);
29
+ if (other.op === "$gt") {
30
+ return nv <= nc;
31
+ }
32
+ if (other.op === "$gte") {
33
+ return nv < nc;
34
+ }
35
+ if (other.op === "$lt") {
36
+ return nv >= nc;
37
+ }
38
+ if (other.op === "$lte") {
39
+ return nv > nc;
40
+ }
41
+ }
42
+ if (other.op === "$in" || other.op === "$nin") {
43
+ const arr = Array.isArray(other.value) ? other.value : [other.value];
44
+ const found = arr.some((x) => (0, utils_1.areValuesEqual)(v, x));
45
+ if (other.op === "$in") {
46
+ return !found;
47
+ }
48
+ if (other.op === "$nin") {
49
+ return found;
50
+ }
51
+ }
52
+ if (other.op === "$exists") {
53
+ const exists = Boolean(other.value);
54
+ // { field: undefined } 通常用于表达“字段缺失”,与 $exists:true 互斥
55
+ if (v === undefined) {
56
+ return exists === true;
57
+ }
58
+ // { field: null } 在 Mongo 中既可以匹配缺失也可以匹配 null,
59
+ // 与 $exists:true / false 之间都仍可能存在交集,这里不视为互斥。
60
+ if (v === null) {
61
+ return false;
62
+ }
63
+ // 其他 $eq:value(非 null/undefined)隐含要求字段存在
64
+ if (exists === false) {
65
+ return true;
66
+ }
67
+ return false;
68
+ }
69
+ if (other.op === "$ne") {
70
+ return (0, utils_1.areValuesEqual)(v, other.value);
71
+ }
72
+ }
73
+ const cmpOps = ["$gt", "$gte", "$lt", "$lte"];
74
+ if (cmpOps.includes(a.op) && cmpOps.includes(b.op)) {
75
+ if (!isNumberOrDate(a.value) || !isNumberOrDate(b.value)) {
76
+ return false;
77
+ }
78
+ const na = toNum(a.value);
79
+ const nb = toNum(b.value);
80
+ const aop = a.op;
81
+ const bop = b.op;
82
+ if ((aop === "$gt" || aop === "$gte") && (bop === "$lt" || bop === "$lte")) {
83
+ // 双 inclusive 且同值($gte:5 + $lte:5)可满足,不冲突
84
+ return na > nb || (na === nb && (aop === "$gt" || bop === "$lt"));
85
+ }
86
+ if ((aop === "$lt" || aop === "$lte") && (bop === "$gt" || bop === "$gte")) {
87
+ return nb > na || (nb === na && (bop === "$gt" || aop === "$lt"));
88
+ }
89
+ }
90
+ // $exists:false 与任何“要求字段存在或有值”的条件冲突
91
+ // 注意:在 MongoDB 语义中,$ne / $nin 对「字段缺失」同样视为满足条件,
92
+ // 因此它们与 $exists:false 并不冲突;这里仅将确实要求字段存在的操作符视为互斥。
93
+ if (a.op === "$exists" && a.value === false) {
94
+ if ((b.op === "$eq" && b.value !== null) ||
95
+ b.op === "$in" ||
96
+ b.op === "$gt" ||
97
+ b.op === "$gte" ||
98
+ b.op === "$lt" ||
99
+ b.op === "$lte") {
100
+ return true;
101
+ }
102
+ }
103
+ if (b.op === "$exists" && b.value === false) {
104
+ if ((a.op === "$eq" && a.value !== null) ||
105
+ a.op === "$in" ||
106
+ a.op === "$gt" ||
107
+ a.op === "$gte" ||
108
+ a.op === "$lt" ||
109
+ a.op === "$lte") {
110
+ return true;
111
+ }
112
+ }
113
+ if ((a.op === "$in" && b.op === "$nin") || (a.op === "$nin" && b.op === "$in")) {
114
+ const inArr = (a.op === "$in" ? a.value : b.value);
115
+ const ninArr = (a.op === "$nin" ? a.value : b.value);
116
+ // 语义:字段值需落在 inArr ∧ 不落在 ninArr。
117
+ // 仅当 ninArr 覆盖了 inArr 的所有可能值(inArr ⊆ ninArr)时无解。
118
+ const allInBanned = inArr.length > 0 && inArr.every((x) => ninArr.some((y) => (0, utils_1.areValuesEqual)(x, y)));
119
+ return allInBanned;
120
+ }
121
+ if (a.op === "$exists" && b.op === "$exists") {
122
+ return a.value !== b.value;
123
+ }
124
+ // $ne:null 明确要求字段存在且不为 null,
125
+ // 因此与 $exists:false 互斥;非 null 的 $ne 与 $exists 始终可能有交集。
126
+ if (a.op === "$ne" && b.op === "$exists") {
127
+ if (b.value === false && a.value === null) {
128
+ return true;
129
+ }
130
+ return false;
131
+ }
132
+ if (b.op === "$ne" && a.op === "$exists") {
133
+ if (a.value === false && b.value === null) {
134
+ return true;
135
+ }
136
+ return false;
137
+ }
138
+ // $ne 与 $in:
139
+ // 仅当 $in 的所有候选值都等于被排除值时无解。
140
+ if ((a.op === "$ne" && b.op === "$in") ||
141
+ (a.op === "$in" && b.op === "$ne")) {
142
+ const ne = a.op === "$ne" ? a : b;
143
+ const inp = a.op === "$in" ? a : b;
144
+ const inArr = Array.isArray(inp.value) ? inp.value : [inp.value];
145
+ if (inArr.length === 0) {
146
+ return false;
147
+ }
148
+ const allEqualExcluded = inArr.every((x) => (0, utils_1.areValuesEqual)(x, ne.value));
149
+ return allEqualExcluded;
150
+ }
151
+ return false;
152
+ }
153
+ /**
154
+ * 判断同一字段上父条件与子条件是否冲突。
155
+ * 父条件来自 context(上层 $and 已累积的该字段条件),子条件为当前 FieldNode 的 conditions。
156
+ *
157
+ * @param parent - 父级该字段的条件列表
158
+ * @param child - 当前节点的条件列表
159
+ * @returns 若存在互斥则为 true
160
+ */
161
+ function hasConditionConflict(parent, child) {
162
+ for (const pc of parent) {
163
+ for (const cc of child) {
164
+ if (twoConditionsConflict(pc, cc)) {
165
+ return true;
166
+ }
167
+ }
168
+ }
169
+ return false;
170
+ }
171
+ /**
172
+ * 判断内层选择子句与外层选择子句在同一字段上的条件是否冲突。
173
+ * 冲突时修剪阶段应舍弃该子分支或合并为更严条件。
174
+ *
175
+ * @param innerClause - 内层扁平条件(单层,无 $and/$or/$nor)
176
+ * @param outerClause - 外层已有扁平条件
177
+ * @returns 若存在某字段上条件互斥则为 true
178
+ */
179
+ function hasConflictingClauses(innerClause, outerClause) {
180
+ const innerKeys = Object.keys(innerClause);
181
+ for (const key of innerKeys) {
182
+ // 只比较普通字段,跳过 $- 前缀(逻辑/控制类)
183
+ if (key.startsWith("$")) {
184
+ continue;
185
+ }
186
+ if (!(key in outerClause)) {
187
+ continue;
188
+ }
189
+ const outerValue = outerClause[key];
190
+ const innerValue = innerClause[key];
191
+ if (isValueConflict(outerValue, innerValue)) {
192
+ return true;
193
+ }
194
+ }
195
+ return false;
196
+ }
197
+ /**
198
+ * 判断同一字段上两个条件值是否互斥(如 $eq: 1 与 $eq: 2,或 $in 与 $nin 交集为空)。
199
+ *
200
+ * @param outerValue - 外层该字段的条件值
201
+ * @param innerValue - 内层该字段的条件值
202
+ * @returns 若两条件不可能同时满足则为 true
203
+ */
204
+ function isValueConflict(outerValue, innerValue) {
205
+ const outerConds = (0, parse_1.toFieldConditions)(outerValue);
206
+ const innerConds = (0, parse_1.toFieldConditions)(innerValue);
207
+ for (const oc of outerConds) {
208
+ for (const ic of innerConds) {
209
+ if (twoConditionsConflict(oc, ic)) {
210
+ return true;
211
+ }
212
+ }
213
+ }
214
+ return false;
215
+ }
216
+ //# sourceMappingURL=conflicts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/operations/conflicts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { FieldCondition } from "../ast/types";
2
+ import type { TightenResult } from "../core/conditions";
3
+ /**
4
+ * 判断同一字段上的一组条件是否自相冲突(不可满足)。
5
+ * 用于 simplify 阶段对单个 FieldNode 的自洽性检查。
6
+ *
7
+ * @param conditions - 该字段的条件列表
8
+ * @returns 若存在互斥则为 true
9
+ */
10
+ export declare function isConditionsImpossible(conditions: FieldCondition[]): boolean;
11
+ /**
12
+ * 判断父级条件与子级条件是否冲突(在父级约束下子级是否不可能成立)。
13
+ * 用于 simplify 阶段对 context 与当前 FieldNode 的冲突检查。
14
+ *
15
+ * @param parent - 父级该字段的条件列表(来自 context)
16
+ * @param child - 当前节点的条件列表
17
+ * @returns 若存在互斥则为 true
18
+ */
19
+ export declare function isParentChildImpossible(parent: FieldCondition[], child: FieldCondition[]): boolean;
20
+ /**
21
+ * 在父级条件约束下收紧子级条件(取交集),并判断合并后是否不可能满足。
22
+ * 用于 simplify 阶段对 FieldNode 的收紧与不可能性判定。
23
+ *
24
+ * @param parent - 父级该字段的条件列表
25
+ * @param child - 当前节点的条件列表
26
+ * @returns 收紧后的条件、是否不可能、是否有变更
27
+ */
28
+ export declare function tightenWithParent(parent: FieldCondition[], child: FieldCondition[]): TightenResult;
29
+ //# sourceMappingURL=conflictsAndTighten.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflictsAndTighten.d.ts","sourceRoot":"","sources":["../../src/operations/conflictsAndTighten.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAIxD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,OAAO,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACnC,MAAM,EAAE,cAAc,EAAE,EACxB,KAAK,EAAE,cAAc,EAAE,GACxB,OAAO,CAET;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,cAAc,EAAE,EACxB,KAAK,EAAE,cAAc,EAAE,GACxB,aAAa,CAEf"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isConditionsImpossible = isConditionsImpossible;
4
+ exports.isParentChildImpossible = isParentChildImpossible;
5
+ exports.tightenWithParent = tightenWithParent;
6
+ const conditions_1 = require("../core/conditions");
7
+ const conflicts_1 = require("./conflicts");
8
+ /**
9
+ * 判断同一字段上的一组条件是否自相冲突(不可满足)。
10
+ * 用于 simplify 阶段对单个 FieldNode 的自洽性检查。
11
+ *
12
+ * @param conditions - 该字段的条件列表
13
+ * @returns 若存在互斥则为 true
14
+ */
15
+ function isConditionsImpossible(conditions) {
16
+ return (0, conflicts_1.hasConditionConflict)(conditions, conditions);
17
+ }
18
+ /**
19
+ * 判断父级条件与子级条件是否冲突(在父级约束下子级是否不可能成立)。
20
+ * 用于 simplify 阶段对 context 与当前 FieldNode 的冲突检查。
21
+ *
22
+ * @param parent - 父级该字段的条件列表(来自 context)
23
+ * @param child - 当前节点的条件列表
24
+ * @returns 若存在互斥则为 true
25
+ */
26
+ function isParentChildImpossible(parent, child) {
27
+ return (0, conflicts_1.hasConditionConflict)(parent, child);
28
+ }
29
+ /**
30
+ * 在父级条件约束下收紧子级条件(取交集),并判断合并后是否不可能满足。
31
+ * 用于 simplify 阶段对 FieldNode 的收紧与不可能性判定。
32
+ *
33
+ * @param parent - 父级该字段的条件列表
34
+ * @param child - 当前节点的条件列表
35
+ * @returns 收紧后的条件、是否不可能、是否有变更
36
+ */
37
+ function tightenWithParent(parent, child) {
38
+ return (0, conditions_1.tightenChildConditionsByParent)(parent, child);
39
+ }
40
+ //# sourceMappingURL=conflictsAndTighten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflictsAndTighten.js","sourceRoot":"","sources":["../../src/operations/conflictsAndTighten.ts"],"names":[],"mappings":";;AAYA,wDAEC;AAUD,0DAKC;AAUD,8CAKC;AA1CD,mDAAoE;AACpE,2CAAmD;AAEnD;;;;;;GAMG;AACH,SAAgB,sBAAsB,CAAC,UAA4B;IAC/D,OAAO,IAAA,gCAAoB,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,uBAAuB,CACnC,MAAwB,EACxB,KAAuB;IAEvB,OAAO,IAAA,gCAAoB,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAC7B,MAAwB,EACxB,KAAuB;IAEvB,OAAO,IAAA,2CAA8B,EAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { AtomicCondition } from "../types";
2
+ /**
3
+ * 按字段分组后,对同一字段的多个条件进行合并(如多个 $eq -> $in,$gt 取 max,$in 取交集等)。
4
+ * 语义为「合并同类项」,减少冗余并可能暴露冲突(如合并后 $in: [])。
5
+ *
6
+ * @param conditions - 解析后的条件列表(通常来自同一 $and 下的 parseSelector 结果)
7
+ * @returns 合并后的条件列表,可能更短或出现不可满足项
8
+ */
9
+ export declare function mergeSameFieldConditions(conditions: AtomicCondition[]): AtomicCondition[];
10
+ /**
11
+ * 对同一字段的多个条件做合并($eq/$gt/$gte/$lt/$lte/$in/$nin 等可合并,其余保留)。
12
+ *
13
+ * @param fieldName - 字段名
14
+ * @param conditions - 该字段的条件列表
15
+ * @returns 合并后的该字段对应的条件列表
16
+ */
17
+ export declare function mergeConditionsForField(fieldName: string, conditions: AtomicCondition[]): AtomicCondition[];
18
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/operations/merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAsBzF;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,eAAe,EAAE,GAC9B,eAAe,EAAE,CA8OnB"}