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 @@
1
+ {"version":3,"file":"constraint-propagation.js","sourceRoot":"","sources":["../../src/core/constraint-propagation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { FieldCondition, FieldNode, SelectorAST } from "../ast/types";
2
+ type NormalizeResult = {
3
+ conditions: FieldCondition[];
4
+ } | {
5
+ impossible: true;
6
+ };
7
+ /**
8
+ * 单字段条件语义合并:仅 **modeled** 操作符(见 `operators.isModeledFieldOperator`)参与区间与 $in 合并;
9
+ * `$ne`、`$regex`、`$size` 及其他 op 进入 `others` 透传,不与此处推理交互。
10
+ */
11
+ export declare function normalizeFieldConditions(conditions: FieldCondition[]): NormalizeResult;
12
+ /**
13
+ * 对单个 FieldNode 做条件规范化,冲突或空条件时返回 FalseNode/TrueNode。
14
+ */
15
+ export declare function normalizeFieldNode(node: FieldNode): SelectorAST;
16
+ /**
17
+ * AST 层同字段条件语义合并:递归处理所有 FieldNode,冲突替换为 FalseNode。
18
+ * 管线中放在 predicateMerge 之后、simplify 之前。
19
+ */
20
+ export declare function fieldConditionNormalize(ast: SelectorAST): SelectorAST;
21
+ export {};
22
+ //# sourceMappingURL=field-condition-normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-condition-normalize.d.ts","sourceRoot":"","sources":["../../src/core/field-condition-normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAe,WAAW,EAAE,MAAM,cAAc,CAAC;AAIxF,KAAK,eAAe,GACd;IAAE,UAAU,EAAE,cAAc,EAAE,CAAA;CAAE,GAChC;IAAE,UAAU,EAAE,IAAI,CAAA;CAAE,CAAC;AA4B3B;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,eAAe,CAwKtF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,CAS/D;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CAYrE"}
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalizeFieldConditions = normalizeFieldConditions;
4
+ exports.normalizeFieldNode = normalizeFieldNode;
5
+ exports.fieldConditionNormalize = fieldConditionNormalize;
6
+ const builders_1 = require("../ast/builders");
7
+ const utils_1 = require("./utils");
8
+ function toNum(v) {
9
+ if (v instanceof Date) {
10
+ return v.getTime();
11
+ }
12
+ if (typeof v === "number") {
13
+ return v;
14
+ }
15
+ return undefined;
16
+ }
17
+ function intersectByValue(left, right) {
18
+ return left.filter((item) => right.some((r) => (0, utils_1.areValuesEqual)(item, r)));
19
+ }
20
+ function unionByValue(arrays) {
21
+ const result = [];
22
+ for (const arr of arrays) {
23
+ for (const v of arr) {
24
+ if (!result.some((r) => (0, utils_1.areValuesEqual)(r, v))) {
25
+ result.push(v);
26
+ }
27
+ }
28
+ }
29
+ return result;
30
+ }
31
+ /**
32
+ * 单字段条件语义合并:仅 **modeled** 操作符(见 `operators.isModeledFieldOperator`)参与区间与 $in 合并;
33
+ * `$ne`、`$regex`、`$size` 及其他 op 进入 `others` 透传,不与此处推理交互。
34
+ */
35
+ function normalizeFieldConditions(conditions) {
36
+ if (conditions.length === 0) {
37
+ return { conditions: [] };
38
+ }
39
+ const others = [];
40
+ let eq;
41
+ let hasEqConflict = false;
42
+ let min;
43
+ let minVal;
44
+ let minInclusive = false;
45
+ let max;
46
+ let maxVal;
47
+ let maxInclusive = false;
48
+ let inSet;
49
+ let ninSet = [];
50
+ let exists;
51
+ for (const cond of conditions) {
52
+ const op = cond.op;
53
+ const value = cond.value;
54
+ switch (op) {
55
+ case "$eq": {
56
+ if (eq === undefined) {
57
+ eq = value;
58
+ }
59
+ else if (!(0, utils_1.areValuesEqual)(eq, value)) {
60
+ hasEqConflict = true;
61
+ }
62
+ break;
63
+ }
64
+ case "$gt":
65
+ case "$gte": {
66
+ const n = toNum(value);
67
+ if (n === undefined) {
68
+ others.push(cond);
69
+ break;
70
+ }
71
+ const rawMin = value;
72
+ if (min === undefined || n > min || (n === min && op === "$gt" && minInclusive)) {
73
+ min = n;
74
+ minVal = rawMin;
75
+ minInclusive = op === "$gte";
76
+ }
77
+ else if (n === min && op === "$gte") {
78
+ minInclusive = true;
79
+ }
80
+ break;
81
+ }
82
+ case "$lt":
83
+ case "$lte": {
84
+ const n = toNum(value);
85
+ if (n === undefined) {
86
+ others.push(cond);
87
+ break;
88
+ }
89
+ const rawMax = value;
90
+ if (max === undefined || n < max || (n === max && op === "$lt" && maxInclusive)) {
91
+ max = n;
92
+ maxVal = rawMax;
93
+ maxInclusive = op === "$lte";
94
+ }
95
+ else if (n === max && op === "$lte") {
96
+ maxInclusive = true;
97
+ }
98
+ break;
99
+ }
100
+ case "$in": {
101
+ const arr = Array.isArray(value) ? value : [value];
102
+ inSet = inSet === undefined ? [...arr] : intersectByValue(inSet, arr);
103
+ break;
104
+ }
105
+ case "$nin": {
106
+ const arr = Array.isArray(value) ? value : [value];
107
+ ninSet = unionByValue([ninSet, arr]);
108
+ break;
109
+ }
110
+ case "$exists": {
111
+ const b = Boolean(value);
112
+ if (exists === undefined) {
113
+ exists = b;
114
+ }
115
+ else if (exists !== b) {
116
+ return { impossible: true };
117
+ }
118
+ break;
119
+ }
120
+ default:
121
+ others.push(cond);
122
+ }
123
+ }
124
+ if (eq !== undefined) {
125
+ const num = toNum(eq);
126
+ if (num !== undefined) {
127
+ if (min !== undefined && (num < min || (num === min && !minInclusive))) {
128
+ hasEqConflict = true;
129
+ }
130
+ if (max !== undefined && (num > max || (num === max && !maxInclusive))) {
131
+ hasEqConflict = true;
132
+ }
133
+ }
134
+ if (inSet !== undefined && !inSet.some((v) => (0, utils_1.areValuesEqual)(v, eq))) {
135
+ hasEqConflict = true;
136
+ }
137
+ if (ninSet.some((v) => (0, utils_1.areValuesEqual)(v, eq))) {
138
+ hasEqConflict = true;
139
+ }
140
+ }
141
+ if (min !== undefined && max !== undefined) {
142
+ if (min > max || (min === max && (!minInclusive || !maxInclusive))) {
143
+ return { impossible: true };
144
+ }
145
+ }
146
+ if (inSet !== undefined && inSet.length === 0) {
147
+ return { impossible: true };
148
+ }
149
+ if (hasEqConflict) {
150
+ return { impossible: true };
151
+ }
152
+ const result = [];
153
+ if (eq !== undefined) {
154
+ result.push({ op: "$eq", value: eq });
155
+ }
156
+ else {
157
+ if (inSet !== undefined && inSet.length > 0) {
158
+ const filtered = ninSet.length > 0
159
+ ? inSet.filter((v) => !ninSet.some((n) => (0, utils_1.areValuesEqual)(n, v)))
160
+ : inSet;
161
+ if (filtered.length === 0) {
162
+ return { impossible: true };
163
+ }
164
+ result.push({ op: "$in", value: filtered });
165
+ }
166
+ else {
167
+ if (min !== undefined && minVal !== undefined) {
168
+ result.push({
169
+ op: minInclusive ? "$gte" : "$gt",
170
+ value: minVal,
171
+ });
172
+ }
173
+ if (max !== undefined && maxVal !== undefined) {
174
+ result.push({
175
+ op: maxInclusive ? "$lte" : "$lt",
176
+ value: maxVal,
177
+ });
178
+ }
179
+ }
180
+ }
181
+ if (exists !== undefined) {
182
+ result.push({ op: "$exists", value: exists });
183
+ }
184
+ if (ninSet.length > 0) {
185
+ result.push({ op: "$nin", value: ninSet });
186
+ }
187
+ // 已写入 result 的 op(如数值化后的 $lte)不再从 others 重复追加,避免 compile 重复键
188
+ const seenOps = new Set(result.map((c) => c.op));
189
+ for (const c of others) {
190
+ if (!seenOps.has(c.op)) {
191
+ result.push(c);
192
+ seenOps.add(c.op);
193
+ }
194
+ }
195
+ return { conditions: result };
196
+ }
197
+ /**
198
+ * 对单个 FieldNode 做条件规范化,冲突或空条件时返回 FalseNode/TrueNode。
199
+ */
200
+ function normalizeFieldNode(node) {
201
+ const result = normalizeFieldConditions(node.conditions);
202
+ if ("impossible" in result) {
203
+ return builders_1.ASTNodeBuilder.falseNode();
204
+ }
205
+ if (result.conditions.length === 0) {
206
+ return builders_1.ASTNodeBuilder.trueNode();
207
+ }
208
+ return { ...node, conditions: result.conditions };
209
+ }
210
+ /**
211
+ * AST 层同字段条件语义合并:递归处理所有 FieldNode,冲突替换为 FalseNode。
212
+ * 管线中放在 predicateMerge 之后、simplify 之前。
213
+ */
214
+ function fieldConditionNormalize(ast) {
215
+ if (ast.type === "true" || ast.type === "false") {
216
+ return ast;
217
+ }
218
+ if (ast.type === "field") {
219
+ return normalizeFieldNode(ast);
220
+ }
221
+ const node = ast;
222
+ const children = node.children.map(fieldConditionNormalize);
223
+ return { ...node, children };
224
+ }
225
+ //# sourceMappingURL=field-condition-normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-condition-normalize.js","sourceRoot":"","sources":["../../src/core/field-condition-normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { normalize } from "./normalize";
2
+ export { predicateMerge } from "./predicate-merge";
3
+ export { fieldConditionNormalize } from "./field-condition-normalize";
4
+ export { simplify } from "./simplify";
5
+ export { canonicalize } from "./canonicalize";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canonicalize = exports.simplify = exports.fieldConditionNormalize = exports.predicateMerge = exports.normalize = void 0;
4
+ var normalize_1 = require("./normalize");
5
+ Object.defineProperty(exports, "normalize", { enumerable: true, get: function () { return normalize_1.normalize; } });
6
+ var predicate_merge_1 = require("./predicate-merge");
7
+ Object.defineProperty(exports, "predicateMerge", { enumerable: true, get: function () { return predicate_merge_1.predicateMerge; } });
8
+ var field_condition_normalize_1 = require("./field-condition-normalize");
9
+ Object.defineProperty(exports, "fieldConditionNormalize", { enumerable: true, get: function () { return field_condition_normalize_1.fieldConditionNormalize; } });
10
+ var simplify_1 = require("./simplify");
11
+ Object.defineProperty(exports, "simplify", { enumerable: true, get: function () { return simplify_1.simplify; } });
12
+ var canonicalize_1 = require("./canonicalize");
13
+ Object.defineProperty(exports, "canonicalize", { enumerable: true, get: function () { return canonicalize_1.canonicalize; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;AAAA,yCAAwC;AAA/B,sGAAA,SAAS,OAAA;AAClB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,yEAAsE;AAA7D,oIAAA,uBAAuB,OAAA;AAChC,uCAAsC;AAA7B,oGAAA,QAAQ,OAAA;AACjB,+CAA8C;AAArC,4GAAA,YAAY,OAAA"}
@@ -0,0 +1,8 @@
1
+ import type { SelectorAST } from "../ast/types";
2
+ /**
3
+ * normalize(AST → AST):
4
+ * - 只做结构等价变换:打平同 op、移除空逻辑、移除单子节点逻辑
5
+ * - 不做 predicate 合并/排序(交给 predicateMerge/canonicalize 阶段)
6
+ */
7
+ export declare function normalize(ast: SelectorAST): SelectorAST;
8
+ //# sourceMappingURL=normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/core/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,cAAc,CAAC;AAG7D;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CA0CvD"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.normalize = normalize;
4
+ const builders_1 = require("../ast/builders");
5
+ /**
6
+ * normalize(AST → AST):
7
+ * - 只做结构等价变换:打平同 op、移除空逻辑、移除单子节点逻辑
8
+ * - 不做 predicate 合并/排序(交给 predicateMerge/canonicalize 阶段)
9
+ */
10
+ function normalize(ast) {
11
+ if (ast.type !== "logical") {
12
+ return ast;
13
+ }
14
+ const normalizedChildren = ast.children.map((c) => normalize(c));
15
+ // 先同 op 打平
16
+ let flattened = ast.op === "$and" || ast.op === "$or"
17
+ ? normalizedChildren.flatMap((c) => c.type === "logical" && c.op === ast.op ? c.children : [c])
18
+ : normalizedChildren;
19
+ // $nor: 单子项为 $or 时与 Mongo 扁平 $nor:[...] 语义等价;收拢避免 $nor→$or 包装形与扁平形双轨
20
+ if (ast.op === "$nor" && flattened.length === 1) {
21
+ const only = flattened[0];
22
+ if (only.type === "logical" && only.op === "$or") {
23
+ flattened = only.children;
24
+ }
25
+ }
26
+ // 移除 empty logical
27
+ if (flattened.length === 0) {
28
+ switch (ast.op) {
29
+ case "$and":
30
+ return builders_1.ASTNodeBuilder.trueNode();
31
+ case "$or":
32
+ return builders_1.ASTNodeBuilder.falseNode();
33
+ case "$nor":
34
+ return builders_1.ASTNodeBuilder.trueNode();
35
+ }
36
+ }
37
+ // 移除 single logical(仅对 $and/$or;$nor 不能折叠,否则语义改变)
38
+ if (flattened.length === 1 && (ast.op === "$and" || ast.op === "$or")) {
39
+ return flattened[0];
40
+ }
41
+ const node = { ...ast, children: flattened };
42
+ return node;
43
+ }
44
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/core/normalize.ts"],"names":[],"mappings":";;AAQA,8BA0CC;AAjDD,8CAAiD;AAEjD;;;;GAIG;AACH,SAAgB,SAAS,CAAC,GAAgB;IACtC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC;IACf,CAAC;IAED,MAAM,kBAAkB,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjE,WAAW;IACX,IAAI,SAAS,GACT,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,KAAK;QACjC,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAC7B,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC7D;QACH,CAAC,CAAC,kBAAkB,CAAC;IAE7B,qEAAqE;IACrE,IAAI,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;YAC/C,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,mBAAmB;IACnB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,QAAQ,GAAG,CAAC,EAAE,EAAE,CAAC;YACb,KAAK,MAAM;gBACP,OAAO,yBAAc,CAAC,QAAQ,EAAE,CAAC;YACrC,KAAK,KAAK;gBACN,OAAO,yBAAc,CAAC,SAAS,EAAE,CAAC;YACtC,KAAK,MAAM;gBACP,OAAO,yBAAc,CAAC,QAAQ,EAAE,CAAC;QACzC,CAAC;IACL,CAAC;IAED,kDAAkD;IAClD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,MAAM,IAAI,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;QACpE,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,MAAM,IAAI,GAAgB,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC1D,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * 字段级操作符分层(与 README「支持矩阵」一致):
3
+ *
4
+ * **Modeled** — fieldConditionNormalize 会合并 / 冲突检测;conflicts / tighten 会按规则推理。
5
+ * **Preserved** — parse 保留原 op,归并到 normalize 的 others,不参与区间与 $in 交集合并;
6
+ * simplify 的 tighten 会忽略这些 op(见 conditions.ts 中 SUPPORTED_TIGHTEN_OPS)。
7
+ * **Unsupported at top level** — $expr / $where 等:parse 当前不展开,顶层键被跳过(与 Mongo 行为一致需注意)。
8
+ */
9
+ /** 参与单字段语义合并与冲突推理的操作符(fieldConditionNormalize 的 switch 分支)。 */
10
+ export declare function isModeledFieldOperator(op: string): boolean;
11
+ //# sourceMappingURL=operators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.d.ts","sourceRoot":"","sources":["../../src/core/operators.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAaH,+DAA+D;AAC/D,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAE1D"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * 字段级操作符分层(与 README「支持矩阵」一致):
4
+ *
5
+ * **Modeled** — fieldConditionNormalize 会合并 / 冲突检测;conflicts / tighten 会按规则推理。
6
+ * **Preserved** — parse 保留原 op,归并到 normalize 的 others,不参与区间与 $in 交集合并;
7
+ * simplify 的 tighten 会忽略这些 op(见 conditions.ts 中 SUPPORTED_TIGHTEN_OPS)。
8
+ * **Unsupported at top level** — $expr / $where 等:parse 当前不展开,顶层键被跳过(与 Mongo 行为一致需注意)。
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.isModeledFieldOperator = isModeledFieldOperator;
12
+ const MODELED_FIELD_OPERATORS = new Set([
13
+ "$eq",
14
+ "$gt",
15
+ "$gte",
16
+ "$lt",
17
+ "$lte",
18
+ "$in",
19
+ "$nin",
20
+ "$exists",
21
+ ]);
22
+ /** 参与单字段语义合并与冲突推理的操作符(fieldConditionNormalize 的 switch 分支)。 */
23
+ function isModeledFieldOperator(op) {
24
+ return MODELED_FIELD_OPERATORS.has(op);
25
+ }
26
+ //# sourceMappingURL=operators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.js","sourceRoot":"","sources":["../../src/core/operators.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAcH,wDAEC;AAdD,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAS;IAC5C,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,SAAS;CACZ,CAAC,CAAC;AAEH,+DAA+D;AAC/D,SAAgB,sBAAsB,CAAC,EAAU;IAC7C,OAAO,uBAAuB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SelectorAST } from "../ast/types";
2
+ /**
3
+ * predicateMerge(AST → AST):
4
+ * - 只在 `$and` 内合并同字段 FieldNode(conditions 拼接后由 fieldConditionNormalize 处理)
5
+ * - 非 modeled 同 op 异值拆成多个 FieldNode,避免 compile 重复键
6
+ * - 不做逻辑推理/冲突检测(交给 simplify)
7
+ */
8
+ export declare function predicateMerge(ast: SelectorAST): SelectorAST;
9
+ //# sourceMappingURL=predicate-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate-merge.d.ts","sourceRoot":"","sources":["../../src/core/predicate-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0C,WAAW,EAAE,MAAM,cAAc,CAAC;AA0FxF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CAa5D"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.predicateMerge = predicateMerge;
4
+ const operators_1 = require("./operators");
5
+ const utils_1 = require("./utils");
6
+ /**
7
+ * 合并后的 conditions 是否允许进入同一 FieldNode。
8
+ * 对 **modeled** 操作符,允许多个同 op 异值(如两个 $eq)交给 fieldConditionNormalize;
9
+ * 对 **非 modeled** 同 op 异值则不能合并,否则 compile 无法表示为单个 BSON 对象。
10
+ */
11
+ function fieldConditionsMergeable(a, b) {
12
+ const combined = [...a, ...b];
13
+ const byOp = new Map();
14
+ for (const c of combined) {
15
+ const prev = byOp.get(c.op);
16
+ if (prev === undefined) {
17
+ byOp.set(c.op, c.value);
18
+ continue;
19
+ }
20
+ if ((0, utils_1.areValuesEqual)(prev, c.value)) {
21
+ continue;
22
+ }
23
+ if ((0, operators_1.isModeledFieldOperator)(c.op)) {
24
+ continue;
25
+ }
26
+ return false;
27
+ }
28
+ return true;
29
+ }
30
+ /**
31
+ * 将同一字段上按出现顺序收集的 FieldNode 折叠为若干段,每段内可安全拼接 conditions。
32
+ */
33
+ function foldFieldNodes(nodes) {
34
+ if (nodes.length === 0) {
35
+ return [];
36
+ }
37
+ const chunks = [];
38
+ let acc = nodes[0];
39
+ for (let k = 1; k < nodes.length; k++) {
40
+ const next = nodes[k];
41
+ if (fieldConditionsMergeable(acc.conditions, next.conditions)) {
42
+ acc = {
43
+ type: "field",
44
+ field: acc.field,
45
+ conditions: [...acc.conditions, ...next.conditions],
46
+ };
47
+ }
48
+ else {
49
+ chunks.push(acc);
50
+ acc = next;
51
+ }
52
+ }
53
+ chunks.push(acc);
54
+ return chunks;
55
+ }
56
+ /**
57
+ * 在 `$and` 子节点列表上按字段分组、折叠后再按「首次出现字段」顺序展开(中间 logical 等保留原位)。
58
+ */
59
+ function mergeAndChildren(children) {
60
+ const perField = new Map();
61
+ for (const ch of children) {
62
+ if (ch.type === "field") {
63
+ const arr = perField.get(ch.field) ?? [];
64
+ arr.push(ch);
65
+ perField.set(ch.field, arr);
66
+ }
67
+ }
68
+ const foldedByField = new Map();
69
+ for (const [f, nodes] of perField) {
70
+ foldedByField.set(f, foldFieldNodes(nodes));
71
+ }
72
+ const seen = new Set();
73
+ const out = [];
74
+ for (const ch of children) {
75
+ if (ch.type !== "field") {
76
+ out.push(ch);
77
+ continue;
78
+ }
79
+ if (seen.has(ch.field)) {
80
+ continue;
81
+ }
82
+ seen.add(ch.field);
83
+ const folded = foldedByField.get(ch.field) ?? [];
84
+ out.push(...folded);
85
+ }
86
+ return out;
87
+ }
88
+ /**
89
+ * predicateMerge(AST → AST):
90
+ * - 只在 `$and` 内合并同字段 FieldNode(conditions 拼接后由 fieldConditionNormalize 处理)
91
+ * - 非 modeled 同 op 异值拆成多个 FieldNode,避免 compile 重复键
92
+ * - 不做逻辑推理/冲突检测(交给 simplify)
93
+ */
94
+ function predicateMerge(ast) {
95
+ if (ast.type !== "logical") {
96
+ return ast;
97
+ }
98
+ const children = ast.children.map(predicateMerge);
99
+ const node = { ...ast, children };
100
+ if (node.op !== "$and") {
101
+ return node;
102
+ }
103
+ return { ...node, children: mergeAndChildren(children) };
104
+ }
105
+ //# sourceMappingURL=predicate-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate-merge.js","sourceRoot":"","sources":["../../src/core/predicate-merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { FieldNode, SelectorAST } from "../ast/types";
2
+ /**
3
+ * 判断同字段的两个 FieldNode 是否允许合并(仅做 shape/个数判断,不做语义推理)。
4
+ * 为保持与 MongoDB 数组字段语义一致,合并后若会产生多个 `$in` 条件则不允许合并。
5
+ *
6
+ * @param existing - 已存在的同字段 FieldNode
7
+ * @param incoming - 待合并的同字段 FieldNode
8
+ * @returns 是否允许合并
9
+ */
10
+ export declare function canMergeFieldNodes(existing: FieldNode, incoming: FieldNode): boolean;
11
+ /**
12
+ * predicateMerge(AST → AST):
13
+ * - 只在 `$and` 内做同字段 FieldNode 合并(把 conditions 拼接到同一个 FieldNode)
14
+ * - 不做逻辑推理/冲突检测(交给 simplify)
15
+ */
16
+ export declare function predicateMerge(ast: SelectorAST): SelectorAST;
17
+ //# sourceMappingURL=predicateMerge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicateMerge.d.ts","sourceRoot":"","sources":["../../src/core/predicateMerge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAe,WAAW,EAAE,MAAM,cAAc,CAAC;AAExE;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAIpF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CAoC5D"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.canMergeFieldNodes = canMergeFieldNodes;
4
+ exports.predicateMerge = predicateMerge;
5
+ /**
6
+ * 判断同字段的两个 FieldNode 是否允许合并(仅做 shape/个数判断,不做语义推理)。
7
+ * 为保持与 MongoDB 数组字段语义一致,合并后若会产生多个 `$in` 条件则不允许合并。
8
+ *
9
+ * @param existing - 已存在的同字段 FieldNode
10
+ * @param incoming - 待合并的同字段 FieldNode
11
+ * @returns 是否允许合并
12
+ */
13
+ function canMergeFieldNodes(existing, incoming) {
14
+ const existingInCount = existing.conditions.filter((c) => c.op === "$in").length;
15
+ const incomingInCount = incoming.conditions.filter((c) => c.op === "$in").length;
16
+ return existingInCount + incomingInCount <= 1;
17
+ }
18
+ /**
19
+ * predicateMerge(AST → AST):
20
+ * - 只在 `$and` 内做同字段 FieldNode 合并(把 conditions 拼接到同一个 FieldNode)
21
+ * - 不做逻辑推理/冲突检测(交给 simplify)
22
+ */
23
+ function predicateMerge(ast) {
24
+ if (ast.type !== "logical") {
25
+ return ast;
26
+ }
27
+ const children = ast.children.map(predicateMerge);
28
+ const node = { ...ast, children };
29
+ if (node.op !== "$and") {
30
+ return node;
31
+ }
32
+ const byField = new Map();
33
+ const others = [];
34
+ for (const child of node.children) {
35
+ if (child.type === "field") {
36
+ const existing = byField.get(child.field);
37
+ if (existing) {
38
+ if (!canMergeFieldNodes(existing, child)) {
39
+ others.push(child);
40
+ continue;
41
+ }
42
+ byField.set(child.field, {
43
+ ...existing,
44
+ conditions: [...existing.conditions, ...child.conditions],
45
+ });
46
+ }
47
+ else {
48
+ byField.set(child.field, child);
49
+ }
50
+ }
51
+ else {
52
+ others.push(child);
53
+ }
54
+ }
55
+ return { ...node, children: [...byField.values(), ...others] };
56
+ }
57
+ //# sourceMappingURL=predicateMerge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicateMerge.js","sourceRoot":"","sources":["../../src/core/predicateMerge.ts"],"names":[],"mappings":";;AAUA,gDAIC;AAOD,wCAoCC;AAvDD;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAAC,QAAmB,EAAE,QAAmB;IACvE,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;IACjF,OAAO,eAAe,GAAG,eAAe,IAAI,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,GAAgB;IAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAClD,MAAM,IAAI,GAAgB,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC;IAE/C,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC7C,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,QAAQ,EAAE,CAAC;gBACX,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;oBACvC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACnB,SAAS;gBACb,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE;oBACrB,GAAG,QAAQ;oBACX,UAAU,EAAE,CAAC,GAAG,QAAQ,CAAC,UAAU,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC;iBAC5D,CAAC,CAAC;YACP,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC;QACL,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;IAED,OAAO,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC;AACnE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { SelectorAST } from "../ast/types";
2
+ /**
3
+ * simplify(AST → AST)编排:
4
+ *
5
+ * 1. **约束传播**(`constraint-propagation`):`$and` 内 sibling context、父级与子级 FieldNode 的
6
+ * 冲突剪枝与 tighten;tighten 仅作用于 `conditions.ts` 中声明的支持操作符,其余条件原样保留,
7
+ * 不改变 Mongo 语义。
8
+ * 2. **逻辑化简**:true/false 传播、AND 吸收 true、OR 吸收 false、AND flatten、$nor 结构化简。
9
+ */
10
+ export declare function simplify(ast: SelectorAST): SelectorAST;
11
+ //# sourceMappingURL=simplify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simplify.d.ts","sourceRoot":"","sources":["../../src/core/simplify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA0C,WAAW,EAAE,MAAM,cAAc,CAAC;AAUxF;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CAGtD"}