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,266 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeSameFieldConditions = mergeSameFieldConditions;
4
+ exports.mergeConditionsForField = mergeConditionsForField;
5
+ /**
6
+ * 按字段分组后,对同一字段的多个条件进行合并(如多个 $eq -> $in,$gt 取 max,$in 取交集等)。
7
+ * 语义为「合并同类项」,减少冗余并可能暴露冲突(如合并后 $in: [])。
8
+ *
9
+ * @param conditions - 解析后的条件列表(通常来自同一 $and 下的 parseSelector 结果)
10
+ * @returns 合并后的条件列表,可能更短或出现不可满足项
11
+ */
12
+ function mergeSameFieldConditions(conditions) {
13
+ if (conditions.length === 0) {
14
+ return [];
15
+ }
16
+ const byField = new Map();
17
+ for (const c of conditions) {
18
+ const list = byField.get(c.field);
19
+ if (list) {
20
+ list.push(c);
21
+ }
22
+ else {
23
+ byField.set(c.field, [c]);
24
+ }
25
+ }
26
+ const merged = [];
27
+ for (const [field, fieldConds] of byField) {
28
+ merged.push(...mergeConditionsForField(field, fieldConds));
29
+ }
30
+ return merged;
31
+ }
32
+ /**
33
+ * 对同一字段的多个条件做合并($eq/$gt/$gte/$lt/$lte/$in/$nin 等可合并,其余保留)。
34
+ *
35
+ * @param fieldName - 字段名
36
+ * @param conditions - 该字段的条件列表
37
+ * @returns 合并后的该字段对应的条件列表
38
+ */
39
+ function mergeConditionsForField(fieldName, conditions) {
40
+ if (conditions.length === 0) {
41
+ return [];
42
+ }
43
+ // 其他暂不识别的操作符原样保留
44
+ const others = [];
45
+ let eq;
46
+ let hasEqConflict = false;
47
+ let min;
48
+ let minInclusive = false;
49
+ let max;
50
+ let maxInclusive = false;
51
+ let inSet;
52
+ let ninSet;
53
+ let exists;
54
+ function toNum(v) {
55
+ if (v instanceof Date) {
56
+ return v.getTime();
57
+ }
58
+ if (typeof v === "number") {
59
+ return v;
60
+ }
61
+ return undefined;
62
+ }
63
+ function intersectIn(nextValues) {
64
+ const next = new Set(nextValues);
65
+ if (!inSet) {
66
+ inSet = next;
67
+ return;
68
+ }
69
+ const res = new Set();
70
+ for (const v of inSet) {
71
+ if (next.has(v)) {
72
+ res.add(v);
73
+ }
74
+ }
75
+ inSet = res;
76
+ }
77
+ for (const cond of conditions) {
78
+ const op = cond.operator;
79
+ const value = cond.value;
80
+ switch (op) {
81
+ case "$eq": {
82
+ if (eq === undefined) {
83
+ eq = value;
84
+ }
85
+ else if (eq !== value) {
86
+ hasEqConflict = true;
87
+ }
88
+ break;
89
+ }
90
+ case "$gt":
91
+ case "$gte": {
92
+ const n = toNum(value);
93
+ if (n === undefined) {
94
+ others.push(cond);
95
+ break;
96
+ }
97
+ if (min === undefined || n > min || (n === min && op === "$gt" && minInclusive)) {
98
+ min = n;
99
+ minInclusive = op === "$gte" ? true : false;
100
+ }
101
+ else if (n === min && op === "$gte") {
102
+ if (!minInclusive) {
103
+ minInclusive = true;
104
+ }
105
+ }
106
+ break;
107
+ }
108
+ case "$lt":
109
+ case "$lte": {
110
+ const n = toNum(value);
111
+ if (n === undefined) {
112
+ others.push(cond);
113
+ break;
114
+ }
115
+ if (max === undefined || n < max || (n === max && op === "$lt" && maxInclusive)) {
116
+ max = n;
117
+ maxInclusive = op === "$lte" ? true : false;
118
+ }
119
+ else if (n === max && op === "$lte") {
120
+ if (!maxInclusive) {
121
+ maxInclusive = true;
122
+ }
123
+ }
124
+ break;
125
+ }
126
+ case "$in": {
127
+ const arr = Array.isArray(value) ? value : [value];
128
+ intersectIn(arr);
129
+ break;
130
+ }
131
+ case "$nin": {
132
+ const arr = Array.isArray(value) ? value : [value];
133
+ if (!ninSet) {
134
+ ninSet = new Set();
135
+ }
136
+ for (const v of arr) {
137
+ ninSet.add(v);
138
+ }
139
+ break;
140
+ }
141
+ case "$exists": {
142
+ const b = Boolean(value);
143
+ if (exists === undefined) {
144
+ exists = b;
145
+ }
146
+ else if (exists !== b) {
147
+ return [
148
+ {
149
+ field: fieldName,
150
+ operator: "$in",
151
+ value: [],
152
+ },
153
+ ];
154
+ }
155
+ break;
156
+ }
157
+ default:
158
+ others.push(cond);
159
+ }
160
+ }
161
+ // eq 与范围 / in / nin 的简单一致性检查
162
+ if (eq !== undefined) {
163
+ const num = toNum(eq);
164
+ if (num !== undefined) {
165
+ if (min !== undefined) {
166
+ if (num < min || (num === min && !minInclusive)) {
167
+ hasEqConflict = true;
168
+ }
169
+ }
170
+ if (max !== undefined) {
171
+ if (num > max || (num === max && !maxInclusive)) {
172
+ hasEqConflict = true;
173
+ }
174
+ }
175
+ }
176
+ if (inSet && !inSet.has(eq)) {
177
+ hasEqConflict = true;
178
+ }
179
+ if (ninSet && ninSet.has(eq)) {
180
+ hasEqConflict = true;
181
+ }
182
+ }
183
+ // range 自身冲突(min > max)
184
+ if (min !== undefined && max !== undefined) {
185
+ if (min > max || (min === max && (!minInclusive || !maxInclusive))) {
186
+ return [
187
+ {
188
+ field: fieldName,
189
+ operator: "$in",
190
+ value: [],
191
+ },
192
+ ];
193
+ }
194
+ }
195
+ // $in 交集为空
196
+ if (inSet && inSet.size === 0) {
197
+ return [
198
+ {
199
+ field: fieldName,
200
+ operator: "$in",
201
+ value: [],
202
+ },
203
+ ];
204
+ }
205
+ if (hasEqConflict) {
206
+ return [
207
+ {
208
+ field: fieldName,
209
+ operator: "$in",
210
+ value: [],
211
+ },
212
+ ];
213
+ }
214
+ const result = [];
215
+ if (eq !== undefined) {
216
+ result.push({ field: fieldName, operator: "$eq", value: eq });
217
+ }
218
+ else {
219
+ if (inSet) {
220
+ const values = [...inSet];
221
+ if (ninSet) {
222
+ const filtered = values.filter((v) => !ninSet.has(v));
223
+ if (filtered.length === 0) {
224
+ return [
225
+ {
226
+ field: fieldName,
227
+ operator: "$in",
228
+ value: [],
229
+ },
230
+ ];
231
+ }
232
+ result.push({ field: fieldName, operator: "$in", value: filtered });
233
+ }
234
+ else {
235
+ result.push({ field: fieldName, operator: "$in", value: values });
236
+ }
237
+ }
238
+ else {
239
+ if (min !== undefined) {
240
+ result.push({
241
+ field: fieldName,
242
+ operator: minInclusive ? "$gte" : "$gt",
243
+ value: min,
244
+ });
245
+ }
246
+ if (max !== undefined) {
247
+ result.push({
248
+ field: fieldName,
249
+ operator: maxInclusive ? "$lte" : "$lt",
250
+ value: max,
251
+ });
252
+ }
253
+ }
254
+ }
255
+ if (exists !== undefined) {
256
+ result.push({
257
+ field: fieldName,
258
+ operator: "$exists",
259
+ value: exists,
260
+ });
261
+ }
262
+ // 追加未识别的其他操作符
263
+ result.push(...others);
264
+ return result;
265
+ }
266
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/operations/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Selector } from "../types";
2
+ import type { FieldCondition, SelectorAST } from "../ast/types";
3
+ /**
4
+ * Mongo Query Object → Selector AST。
5
+ *
6
+ * 规则(摘自设计稿):
7
+ * - `{ a: 5 }` 统一为 FieldNode:`{ field: 'a', conditions: [{ op: '$eq', value: 5 }] }`
8
+ * - 顶层多个字段等价于隐式 `$and`
9
+ *
10
+ * @param selector - MongoDB 选择器对象
11
+ * @returns AST
12
+ */
13
+ export declare function parseSelector(selector: Selector): SelectorAST;
14
+ /**
15
+ * 将某字段的条件值(字面量或 { $eq, $in, $gt, ... })转为统一的 FieldCondition[](toFieldConditions)。
16
+ *
17
+ * @param fieldValue - 字段对应的值或操作符对象
18
+ */
19
+ export declare function toFieldConditions(fieldValue: unknown): FieldCondition[];
20
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/operations/parse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,cAAc,EAAmB,WAAW,EAAE,MAAM,cAAc,CAAC;AAkBjF;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAyC7D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,OAAO,GAAG,cAAc,EAAE,CA0DvE"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSelector = parseSelector;
4
+ exports.toFieldConditions = toFieldConditions;
5
+ const builders_1 = require("../ast/builders");
6
+ function isPlainObject(value) {
7
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8
+ }
9
+ function isEjsonObjectId(value) {
10
+ if (!isPlainObject(value)) {
11
+ return false;
12
+ }
13
+ return Object.keys(value).length === 1 && typeof value["$oid"] === "string";
14
+ }
15
+ function isLogicalOperator(key) {
16
+ return key === "$and" || key === "$or" || key === "$nor";
17
+ }
18
+ /**
19
+ * Mongo Query Object → Selector AST。
20
+ *
21
+ * 规则(摘自设计稿):
22
+ * - `{ a: 5 }` 统一为 FieldNode:`{ field: 'a', conditions: [{ op: '$eq', value: 5 }] }`
23
+ * - 顶层多个字段等价于隐式 `$and`
24
+ *
25
+ * @param selector - MongoDB 选择器对象
26
+ * @returns AST
27
+ */
28
+ function parseSelector(selector) {
29
+ if (selector == null || typeof selector !== "object" || Array.isArray(selector)) {
30
+ return builders_1.ASTNodeBuilder.trueNode();
31
+ }
32
+ const children = [];
33
+ // logical clauses
34
+ for (const key of Object.keys(selector)) {
35
+ if (!isLogicalOperator(key)) {
36
+ continue;
37
+ }
38
+ const value = selector[key];
39
+ if (Array.isArray(value)) {
40
+ children.push({
41
+ type: "logical",
42
+ op: key,
43
+ children: value.map((x) => parseSelector(x)),
44
+ });
45
+ }
46
+ }
47
+ // field clauses (implicit AND)
48
+ for (const [key, value] of Object.entries(selector)) {
49
+ // 顶层 $expr / $where 等:本 AST 不建模,跳过(与 README「非目标」一致)
50
+ if (key.startsWith("$")) {
51
+ continue;
52
+ }
53
+ children.push({
54
+ type: "field",
55
+ field: key,
56
+ conditions: toFieldConditions(value),
57
+ });
58
+ }
59
+ if (children.length === 0) {
60
+ return builders_1.ASTNodeBuilder.trueNode();
61
+ }
62
+ if (children.length === 1) {
63
+ return children[0];
64
+ }
65
+ return { type: "logical", op: "$and", children };
66
+ }
67
+ /**
68
+ * 将某字段的条件值(字面量或 { $eq, $in, $gt, ... })转为统一的 FieldCondition[](toFieldConditions)。
69
+ *
70
+ * @param fieldValue - 字段对应的值或操作符对象
71
+ */
72
+ function toFieldConditions(fieldValue) {
73
+ // Extended JSON 标量(如 { $oid: "..." })是“值”,不是查询操作符对象
74
+ if (isEjsonObjectId(fieldValue)) {
75
+ return [{ op: "$eq", value: fieldValue }];
76
+ }
77
+ if (!isPlainObject(fieldValue) || Object.keys(fieldValue).every((k) => !k.startsWith("$"))) {
78
+ return [{ op: "$eq", value: fieldValue }];
79
+ }
80
+ const conditions = [];
81
+ for (const [op, raw] of Object.entries(fieldValue)) {
82
+ if (!op.startsWith("$")) {
83
+ continue;
84
+ }
85
+ switch (op) {
86
+ case "$eq":
87
+ conditions.push({ op: "$eq", value: raw });
88
+ break;
89
+ case "$ne":
90
+ conditions.push({ op: "$ne", value: raw });
91
+ break;
92
+ case "$gt":
93
+ case "$gte":
94
+ case "$lt":
95
+ case "$lte":
96
+ conditions.push({ op, value: raw });
97
+ break;
98
+ case "$all":
99
+ conditions.push({ op: "$all", value: Array.isArray(raw) ? raw : [raw] });
100
+ break;
101
+ case "$size": {
102
+ const n = typeof raw === "number" ? raw : Number(raw);
103
+ if (!Number.isFinite(n)) {
104
+ conditions.push({ op: "$size", value: raw });
105
+ break;
106
+ }
107
+ conditions.push({ op: "$size", value: n });
108
+ break;
109
+ }
110
+ case "$in":
111
+ case "$nin":
112
+ conditions.push({ op, value: Array.isArray(raw) ? raw : [raw] });
113
+ break;
114
+ case "$exists":
115
+ conditions.push({ op: "$exists", value: Boolean(raw) });
116
+ break;
117
+ case "$regex":
118
+ conditions.push({ op: "$regex", value: raw });
119
+ break;
120
+ default:
121
+ // 未知字段操作符:保真保留 op,禁止伪装成 $eq(会篡改语义)
122
+ conditions.push({ op, value: raw });
123
+ break;
124
+ }
125
+ }
126
+ return conditions.length > 0 ? conditions : [{ op: "$eq", value: fieldValue }];
127
+ }
128
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/operations/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AtomicCondition } from "../common/types.js";
2
+ /**
3
+ * 将合并后的条件列表编译回单层选择器(如将 $in 单元素简化为 $eq 或字面量)。
4
+ *
5
+ * @param conditions - 合并后的条件列表
6
+ * @returns 单层选择器对象,无 $and/$or/$nor
7
+ */
8
+ export declare function compileSelector(conditions: AtomicCondition[]): Record<string, unknown>;
9
+ //# sourceMappingURL=compile-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile-selector.d.ts","sourceRoot":"","sources":["../../src/ops/compile-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGtF"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compileSelector = compileSelector;
4
+ /**
5
+ * 将合并后的条件列表编译回单层选择器(如将 $in 单元素简化为 $eq 或字面量)。
6
+ *
7
+ * @param conditions - 合并后的条件列表
8
+ * @returns 单层选择器对象,无 $and/$or/$nor
9
+ */
10
+ function compileSelector(conditions) {
11
+ void conditions;
12
+ return {};
13
+ }
14
+ //# sourceMappingURL=compile-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compile-selector.js","sourceRoot":"","sources":["../../src/ops/compile-selector.ts"],"names":[],"mappings":";;AAQA,0CAGC;AATD;;;;;GAKG;AACH,SAAgB,eAAe,CAAC,UAA6B;IAC3D,KAAK,UAAU,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { parseSelector, toOperatorValuePairs } from "./parse-selector.js";
2
+ export { compileSelector } from "./compile-selector.js";
3
+ export { mergeFieldConditions, consolidateFieldConditions, areValuesEqual, deduplicateByValue, } from "./merge-ops.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ops/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EACL,oBAAoB,EACpB,0BAA0B,EAC1B,cAAc,EACd,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deduplicateByValue = exports.areValuesEqual = exports.consolidateFieldConditions = exports.mergeFieldConditions = exports.compileSelector = exports.toOperatorValuePairs = exports.parseSelector = void 0;
4
+ var parse_selector_js_1 = require("./parse-selector.js");
5
+ Object.defineProperty(exports, "parseSelector", { enumerable: true, get: function () { return parse_selector_js_1.parseSelector; } });
6
+ Object.defineProperty(exports, "toOperatorValuePairs", { enumerable: true, get: function () { return parse_selector_js_1.toOperatorValuePairs; } });
7
+ var compile_selector_js_1 = require("./compile-selector.js");
8
+ Object.defineProperty(exports, "compileSelector", { enumerable: true, get: function () { return compile_selector_js_1.compileSelector; } });
9
+ var merge_ops_js_1 = require("./merge-ops.js");
10
+ Object.defineProperty(exports, "mergeFieldConditions", { enumerable: true, get: function () { return merge_ops_js_1.mergeFieldConditions; } });
11
+ Object.defineProperty(exports, "consolidateFieldConditions", { enumerable: true, get: function () { return merge_ops_js_1.consolidateFieldConditions; } });
12
+ Object.defineProperty(exports, "areValuesEqual", { enumerable: true, get: function () { return merge_ops_js_1.areValuesEqual; } });
13
+ Object.defineProperty(exports, "deduplicateByValue", { enumerable: true, get: function () { return merge_ops_js_1.deduplicateByValue; } });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ops/index.ts"],"names":[],"mappings":";;;AAAA,yDAA0E;AAAjE,kHAAA,aAAa,OAAA;AAAE,yHAAA,oBAAoB,OAAA;AAC5C,6DAAwD;AAA/C,sHAAA,eAAe,OAAA;AACxB,+CAKwB;AAJtB,oHAAA,oBAAoB,OAAA;AACpB,0HAAA,0BAA0B,OAAA;AAC1B,8GAAA,cAAc,OAAA;AACd,kHAAA,kBAAkB,OAAA"}
@@ -0,0 +1,33 @@
1
+ import type { AtomicCondition } from "../common/types.js";
2
+ /**
3
+ * 按字段分组后,对同一字段的多个条件进行合并(如多个 $eq -> $in,$gt 取 max,$in 取交集等)。
4
+ * 语义为「合并同类项」,减少冗余并可能暴露冲突(如合并后 $in: [])。
5
+ *
6
+ * @param conditions - 解析后的条件列表(通常来自同一 $and 下的 parseSelector 结果)
7
+ * @returns 合并后的条件列表,可能更短或出现不可满足项
8
+ */
9
+ export declare function mergeFieldConditions(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 consolidateFieldConditions(fieldName: string, conditions: AtomicCondition[]): AtomicCondition[];
18
+ /**
19
+ * 深度比较两个值是否相等(含 Date、数组、对象),用于去重与交集等。
20
+ *
21
+ * @param left - 任意值
22
+ * @param right - 任意值
23
+ * @returns 是否相等
24
+ */
25
+ export declare function areValuesEqual(left: unknown, right: unknown): boolean;
26
+ /**
27
+ * 数组去重(使用 areValuesEqual 比较)。
28
+ *
29
+ * @param items - 待去重数组
30
+ * @returns 去重后的新数组
31
+ */
32
+ export declare function deduplicateByValue<T>(items: T[]): T[];
33
+ //# sourceMappingURL=merge-ops.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-ops.d.ts","sourceRoot":"","sources":["../../src/ops/merge-ops.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAGrF;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,eAAe,EAAE,GAC5B,eAAe,EAAE,CAInB;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAIrE;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAGrD"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergeFieldConditions = mergeFieldConditions;
4
+ exports.consolidateFieldConditions = consolidateFieldConditions;
5
+ exports.areValuesEqual = areValuesEqual;
6
+ exports.deduplicateByValue = deduplicateByValue;
7
+ /**
8
+ * 按字段分组后,对同一字段的多个条件进行合并(如多个 $eq -> $in,$gt 取 max,$in 取交集等)。
9
+ * 语义为「合并同类项」,减少冗余并可能暴露冲突(如合并后 $in: [])。
10
+ *
11
+ * @param conditions - 解析后的条件列表(通常来自同一 $and 下的 parseSelector 结果)
12
+ * @returns 合并后的条件列表,可能更短或出现不可满足项
13
+ */
14
+ function mergeFieldConditions(conditions) {
15
+ void conditions;
16
+ return [];
17
+ }
18
+ /**
19
+ * 对同一字段的多个条件做合并($eq/$gt/$gte/$lt/$lte/$in/$nin 等可合并,其余保留)。
20
+ *
21
+ * @param fieldName - 字段名
22
+ * @param conditions - 该字段的条件列表
23
+ * @returns 合并后的该字段对应的条件列表
24
+ */
25
+ function consolidateFieldConditions(fieldName, conditions) {
26
+ void fieldName;
27
+ void conditions;
28
+ return [];
29
+ }
30
+ /**
31
+ * 深度比较两个值是否相等(含 Date、数组、对象),用于去重与交集等。
32
+ *
33
+ * @param left - 任意值
34
+ * @param right - 任意值
35
+ * @returns 是否相等
36
+ */
37
+ function areValuesEqual(left, right) {
38
+ void left;
39
+ void right;
40
+ return false;
41
+ }
42
+ /**
43
+ * 数组去重(使用 areValuesEqual 比较)。
44
+ *
45
+ * @param items - 待去重数组
46
+ * @returns 去重后的新数组
47
+ */
48
+ function deduplicateByValue(items) {
49
+ void items;
50
+ return [];
51
+ }
52
+ //# sourceMappingURL=merge-ops.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-ops.js","sourceRoot":"","sources":["../../src/ops/merge-ops.ts"],"names":[],"mappings":";;AASA,oDAGC;AASD,gEAOC;AASD,wCAIC;AAQD,gDAGC;AAlDD;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAAC,UAA6B;IAChE,KAAK,UAAU,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,0BAA0B,CACxC,SAAiB,EACjB,UAA6B;IAE7B,KAAK,SAAS,CAAC;IACf,KAAK,UAAU,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,IAAa,EAAE,KAAc;IAC1D,KAAK,IAAI,CAAC;IACV,KAAK,KAAK,CAAC;IACX,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAI,KAAU;IAC9C,KAAK,KAAK,CAAC;IACX,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { AtomicCondition, OperatorValuePair } from "../common/types.js";
2
+ /**
3
+ * 将「不含 $and/$or/$nor 等逻辑子句」的扁平选择器解析为「字段 + 操作符 + 值」条件列表。
4
+ * 仅用于单层字段条件,逻辑子句应在调用前拆出并分别解析。
5
+ *
6
+ * @param selector - 单层选择器(不含顶层 $and/$or/$nor)
7
+ * @returns 解析后的条件列表
8
+ */
9
+ export declare function parseSelector(selector: Record<string, unknown>): AtomicCondition[];
10
+ /**
11
+ * 将某字段的条件值(字面量或 { $eq, $in, $gt, ... })转为统一的「操作符-值」对列表,
12
+ * 用于冲突检测、合并时的比较与归并。
13
+ *
14
+ * @param fieldValue - 字段对应的值或操作符对象
15
+ * @returns 标准化后的操作符-值对列表
16
+ */
17
+ export declare function toOperatorValuePairs(fieldValue: unknown): OperatorValuePair[];
18
+ //# sourceMappingURL=parse-selector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-selector.d.ts","sourceRoot":"","sources":["../../src/ops/parse-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE7E;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,eAAe,EAAE,CAIlF;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,OAAO,GAAG,iBAAiB,EAAE,CAI7E"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSelector = parseSelector;
4
+ exports.toOperatorValuePairs = toOperatorValuePairs;
5
+ /**
6
+ * 将「不含 $and/$or/$nor 等逻辑子句」的扁平选择器解析为「字段 + 操作符 + 值」条件列表。
7
+ * 仅用于单层字段条件,逻辑子句应在调用前拆出并分别解析。
8
+ *
9
+ * @param selector - 单层选择器(不含顶层 $and/$or/$nor)
10
+ * @returns 解析后的条件列表
11
+ */
12
+ function parseSelector(selector) {
13
+ // TODO: 实现解析逻辑
14
+ void selector;
15
+ return [];
16
+ }
17
+ /**
18
+ * 将某字段的条件值(字面量或 { $eq, $in, $gt, ... })转为统一的「操作符-值」对列表,
19
+ * 用于冲突检测、合并时的比较与归并。
20
+ *
21
+ * @param fieldValue - 字段对应的值或操作符对象
22
+ * @returns 标准化后的操作符-值对列表
23
+ */
24
+ function toOperatorValuePairs(fieldValue) {
25
+ // TODO: 实现(如字面量 -> [{ operator: '$eq', value }],多操作符 -> 多项)
26
+ void fieldValue;
27
+ return [];
28
+ }
29
+ //# sourceMappingURL=parse-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-selector.js","sourceRoot":"","sources":["../../src/ops/parse-selector.ts"],"names":[],"mappings":";;AASA,sCAIC;AASD,oDAIC;AAxBD;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,QAAiC;IAC7D,eAAe;IACf,KAAK,QAAQ,CAAC;IACd,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,oBAAoB,CAAC,UAAmB;IACtD,4DAA4D;IAC5D,KAAK,UAAU,CAAC;IAChB,OAAO,EAAE,CAAC;AACZ,CAAC"}