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.
- package/LICENSE +15 -0
- package/README.md +193 -0
- package/README.zh-CN.md +194 -0
- package/dist/ast/builders.d.ts +8 -0
- package/dist/ast/builders.d.ts.map +1 -0
- package/dist/ast/builders.js +27 -0
- package/dist/ast/builders.js.map +1 -0
- package/dist/ast/contains-opaque.d.ts +3 -0
- package/dist/ast/contains-opaque.d.ts.map +1 -0
- package/dist/ast/contains-opaque.js +14 -0
- package/dist/ast/contains-opaque.js.map +1 -0
- package/dist/ast/guards.d.ts +7 -0
- package/dist/ast/guards.d.ts.map +1 -0
- package/dist/ast/guards.js +23 -0
- package/dist/ast/guards.js.map +1 -0
- package/dist/ast/hash.d.ts +4 -0
- package/dist/ast/hash.d.ts.map +1 -0
- package/dist/ast/hash.js +67 -0
- package/dist/ast/hash.js.map +1 -0
- package/dist/ast/index.d.ts +6 -0
- package/dist/ast/index.d.ts.map +1 -0
- package/dist/ast/index.js +22 -0
- package/dist/ast/index.js.map +1 -0
- package/dist/ast/types.d.ts +28 -0
- package/dist/ast/types.d.ts.map +1 -0
- package/dist/ast/types.js +3 -0
- package/dist/ast/types.js.map +1 -0
- package/dist/ast/visitor.d.ts +3 -0
- package/dist/ast/visitor.d.ts.map +1 -0
- package/dist/ast/visitor.js +12 -0
- package/dist/ast/visitor.js.map +1 -0
- package/dist/common/types.d.ts +46 -0
- package/dist/common/types.d.ts.map +1 -0
- package/dist/common/types.js +3 -0
- package/dist/common/types.js.map +1 -0
- package/dist/compile/compile.d.ts +5 -0
- package/dist/compile/compile.d.ts.map +1 -0
- package/dist/compile/compile.js +69 -0
- package/dist/compile/compile.js.map +1 -0
- package/dist/compile-selector.d.ts +9 -0
- package/dist/compile-selector.d.ts.map +1 -0
- package/dist/compile-selector.js +14 -0
- package/dist/compile-selector.js.map +1 -0
- package/dist/conflict.d.ts +18 -0
- package/dist/conflict.d.ts.map +1 -0
- package/dist/conflict.js +30 -0
- package/dist/conflict.js.map +1 -0
- package/dist/core/canonicalize.d.ts +11 -0
- package/dist/core/canonicalize.d.ts.map +1 -0
- package/dist/core/canonicalize.js +104 -0
- package/dist/core/canonicalize.js.map +1 -0
- package/dist/core/conditions.d.ts +8 -0
- package/dist/core/conditions.d.ts.map +1 -0
- package/dist/core/conditions.js +282 -0
- package/dist/core/conditions.js.map +1 -0
- package/dist/core/conflicts-and-tighten.d.ts +15 -0
- package/dist/core/conflicts-and-tighten.d.ts.map +1 -0
- package/dist/core/conflicts-and-tighten.js +26 -0
- package/dist/core/conflicts-and-tighten.js.map +1 -0
- package/dist/core/conflicts.d.ts +14 -0
- package/dist/core/conflicts.d.ts.map +1 -0
- package/dist/core/conflicts.js +157 -0
- package/dist/core/conflicts.js.map +1 -0
- package/dist/core/constraint-propagation.d.ts +15 -0
- package/dist/core/constraint-propagation.d.ts.map +1 -0
- package/dist/core/constraint-propagation.js +93 -0
- package/dist/core/constraint-propagation.js.map +1 -0
- package/dist/core/field-condition-normalize.d.ts +22 -0
- package/dist/core/field-condition-normalize.d.ts.map +1 -0
- package/dist/core/field-condition-normalize.js +225 -0
- package/dist/core/field-condition-normalize.js.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/normalize.d.ts +8 -0
- package/dist/core/normalize.d.ts.map +1 -0
- package/dist/core/normalize.js +44 -0
- package/dist/core/normalize.js.map +1 -0
- package/dist/core/operators.d.ts +11 -0
- package/dist/core/operators.d.ts.map +1 -0
- package/dist/core/operators.js +26 -0
- package/dist/core/operators.js.map +1 -0
- package/dist/core/predicate-merge.d.ts +9 -0
- package/dist/core/predicate-merge.d.ts.map +1 -0
- package/dist/core/predicate-merge.js +105 -0
- package/dist/core/predicate-merge.js.map +1 -0
- package/dist/core/predicateMerge.d.ts +17 -0
- package/dist/core/predicateMerge.d.ts.map +1 -0
- package/dist/core/predicateMerge.js +57 -0
- package/dist/core/predicateMerge.js.map +1 -0
- package/dist/core/simplify.d.ts +11 -0
- package/dist/core/simplify.d.ts.map +1 -0
- package/dist/core/simplify.js +128 -0
- package/dist/core/simplify.js.map +1 -0
- package/dist/core/stable-structural-key.d.ts +7 -0
- package/dist/core/stable-structural-key.d.ts.map +1 -0
- package/dist/core/stable-structural-key.js +71 -0
- package/dist/core/stable-structural-key.js.map +1 -0
- package/dist/core/utils.d.ts +16 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/core/utils.js +109 -0
- package/dist/core/utils.js.map +1 -0
- package/dist/flatten/flatten.d.ts +43 -0
- package/dist/flatten/flatten.d.ts.map +1 -0
- package/dist/flatten/flatten.js +68 -0
- package/dist/flatten/flatten.js.map +1 -0
- package/dist/flatten/index.d.ts +2 -0
- package/dist/flatten/index.d.ts.map +1 -0
- package/dist/flatten/index.js +10 -0
- package/dist/flatten/index.js.map +1 -0
- package/dist/flatten.d.ts +43 -0
- package/dist/flatten.d.ts.map +1 -0
- package/dist/flatten.js +68 -0
- package/dist/flatten.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/merge-ops.d.ts +33 -0
- package/dist/merge-ops.d.ts.map +1 -0
- package/dist/merge-ops.js +52 -0
- package/dist/merge-ops.js.map +1 -0
- package/dist/normalize-context.d.ts +16 -0
- package/dist/normalize-context.d.ts.map +1 -0
- package/dist/normalize-context.js +19 -0
- package/dist/normalize-context.js.map +1 -0
- package/dist/normalize.d.ts +6 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +122 -0
- package/dist/normalize.js.map +1 -0
- package/dist/observe/diff.d.ts +7 -0
- package/dist/observe/diff.d.ts.map +1 -0
- package/dist/observe/diff.js +15 -0
- package/dist/observe/diff.js.map +1 -0
- package/dist/observe/level-boundary-hints.d.ts +11 -0
- package/dist/observe/level-boundary-hints.d.ts.map +1 -0
- package/dist/observe/level-boundary-hints.js +42 -0
- package/dist/observe/level-boundary-hints.js.map +1 -0
- package/dist/observe/level-preview-warning.d.ts +11 -0
- package/dist/observe/level-preview-warning.d.ts.map +1 -0
- package/dist/observe/level-preview-warning.js +42 -0
- package/dist/observe/level-preview-warning.js.map +1 -0
- package/dist/observe/metrics.d.ts +4 -0
- package/dist/observe/metrics.d.ts.map +1 -0
- package/dist/observe/metrics.js +30 -0
- package/dist/observe/metrics.js.map +1 -0
- package/dist/observe/warnings.d.ts +6 -0
- package/dist/observe/warnings.d.ts.map +1 -0
- package/dist/observe/warnings.js +24 -0
- package/dist/observe/warnings.js.map +1 -0
- package/dist/operations/compile.d.ts +7 -0
- package/dist/operations/compile.d.ts.map +1 -0
- package/dist/operations/compile.js +70 -0
- package/dist/operations/compile.js.map +1 -0
- package/dist/operations/conflicts-and-tighten.d.ts +29 -0
- package/dist/operations/conflicts-and-tighten.d.ts.map +1 -0
- package/dist/operations/conflicts-and-tighten.js +40 -0
- package/dist/operations/conflicts-and-tighten.js.map +1 -0
- package/dist/operations/conflicts.d.ts +28 -0
- package/dist/operations/conflicts.d.ts.map +1 -0
- package/dist/operations/conflicts.js +216 -0
- package/dist/operations/conflicts.js.map +1 -0
- package/dist/operations/conflictsAndTighten.d.ts +29 -0
- package/dist/operations/conflictsAndTighten.d.ts.map +1 -0
- package/dist/operations/conflictsAndTighten.js +40 -0
- package/dist/operations/conflictsAndTighten.js.map +1 -0
- package/dist/operations/merge.d.ts +18 -0
- package/dist/operations/merge.d.ts.map +1 -0
- package/dist/operations/merge.js +266 -0
- package/dist/operations/merge.js.map +1 -0
- package/dist/operations/parse.d.ts +20 -0
- package/dist/operations/parse.d.ts.map +1 -0
- package/dist/operations/parse.js +128 -0
- package/dist/operations/parse.js.map +1 -0
- package/dist/ops/compile-selector.d.ts +9 -0
- package/dist/ops/compile-selector.d.ts.map +1 -0
- package/dist/ops/compile-selector.js +14 -0
- package/dist/ops/compile-selector.js.map +1 -0
- package/dist/ops/index.d.ts +4 -0
- package/dist/ops/index.d.ts.map +1 -0
- package/dist/ops/index.js +14 -0
- package/dist/ops/index.js.map +1 -0
- package/dist/ops/merge-ops.d.ts +33 -0
- package/dist/ops/merge-ops.d.ts.map +1 -0
- package/dist/ops/merge-ops.js +52 -0
- package/dist/ops/merge-ops.js.map +1 -0
- package/dist/ops/parse-selector.d.ts +18 -0
- package/dist/ops/parse-selector.d.ts.map +1 -0
- package/dist/ops/parse-selector.js +29 -0
- package/dist/ops/parse-selector.js.map +1 -0
- package/dist/optimize.d.ts +18 -0
- package/dist/optimize.d.ts.map +1 -0
- package/dist/optimize.js +33 -0
- package/dist/optimize.js.map +1 -0
- package/dist/options/constants.d.ts +6 -0
- package/dist/options/constants.d.ts.map +1 -0
- package/dist/options/constants.js +72 -0
- package/dist/options/constants.js.map +1 -0
- package/dist/options/resolve.d.ts +3 -0
- package/dist/options/resolve.d.ts.map +1 -0
- package/dist/options/resolve.js +35 -0
- package/dist/options/resolve.js.map +1 -0
- package/dist/options/types.d.ts +2 -0
- package/dist/options/types.d.ts.map +1 -0
- package/dist/options/types.js +3 -0
- package/dist/options/types.js.map +1 -0
- package/dist/parse/parse.d.ts +4 -0
- package/dist/parse/parse.d.ts.map +1 -0
- package/dist/parse/parse.js +114 -0
- package/dist/parse/parse.js.map +1 -0
- package/dist/parse/plain-object.d.ts +2 -0
- package/dist/parse/plain-object.d.ts.map +1 -0
- package/dist/parse/plain-object.js +7 -0
- package/dist/parse/plain-object.js.map +1 -0
- package/dist/parse-selector.d.ts +18 -0
- package/dist/parse-selector.d.ts.map +1 -0
- package/dist/parse-selector.js +29 -0
- package/dist/parse-selector.js.map +1 -0
- package/dist/passes/canonicalize.d.ts +4 -0
- package/dist/passes/canonicalize.d.ts.map +1 -0
- package/dist/passes/canonicalize.js +40 -0
- package/dist/passes/canonicalize.js.map +1 -0
- package/dist/passes/normalize-predicate.d.ts +4 -0
- package/dist/passes/normalize-predicate.d.ts.map +1 -0
- package/dist/passes/normalize-predicate.js +57 -0
- package/dist/passes/normalize-predicate.js.map +1 -0
- package/dist/passes/normalize-shape.d.ts +4 -0
- package/dist/passes/normalize-shape.d.ts.map +1 -0
- package/dist/passes/normalize-shape.js +37 -0
- package/dist/passes/normalize-shape.js.map +1 -0
- package/dist/passes/simplify.d.ts +4 -0
- package/dist/passes/simplify.d.ts.map +1 -0
- package/dist/passes/simplify.js +49 -0
- package/dist/passes/simplify.js.map +1 -0
- package/dist/prune/conflict.d.ts +18 -0
- package/dist/prune/conflict.d.ts.map +1 -0
- package/dist/prune/conflict.js +30 -0
- package/dist/prune/conflict.js.map +1 -0
- package/dist/prune/index.d.ts +3 -0
- package/dist/prune/index.d.ts.map +1 -0
- package/dist/prune/index.js +9 -0
- package/dist/prune/index.js.map +1 -0
- package/dist/prune/prune.d.ts +11 -0
- package/dist/prune/prune.d.ts.map +1 -0
- package/dist/prune/prune.js +19 -0
- package/dist/prune/prune.js.map +1 -0
- package/dist/prune.d.ts +11 -0
- package/dist/prune.d.ts.map +1 -0
- package/dist/prune.js +19 -0
- package/dist/prune.js.map +1 -0
- package/dist/rewrite.d.ts +27 -0
- package/dist/rewrite.d.ts.map +1 -0
- package/dist/rewrite.js +62 -0
- package/dist/rewrite.js.map +1 -0
- package/dist/rules/experimental/hoist-common-predicates-from-or.d.ts +5 -0
- package/dist/rules/experimental/hoist-common-predicates-from-or.d.ts.map +1 -0
- package/dist/rules/experimental/hoist-common-predicates-from-or.js +153 -0
- package/dist/rules/experimental/hoist-common-predicates-from-or.js.map +1 -0
- package/dist/rules/logical/detect-common-predicates-in-or.d.ts +5 -0
- package/dist/rules/logical/detect-common-predicates-in-or.d.ts.map +1 -0
- package/dist/rules/logical/detect-common-predicates-in-or.js +82 -0
- package/dist/rules/logical/detect-common-predicates-in-or.js.map +1 -0
- package/dist/rules/predicate/collapse-contradictions.d.ts +5 -0
- package/dist/rules/predicate/collapse-contradictions.d.ts.map +1 -0
- package/dist/rules/predicate/collapse-contradictions.js +45 -0
- package/dist/rules/predicate/collapse-contradictions.js.map +1 -0
- package/dist/rules/predicate/dedupe-same-field-predicates.d.ts +5 -0
- package/dist/rules/predicate/dedupe-same-field-predicates.d.ts.map +1 -0
- package/dist/rules/predicate/dedupe-same-field-predicates.js +33 -0
- package/dist/rules/predicate/dedupe-same-field-predicates.js.map +1 -0
- package/dist/rules/predicate/merge-comparable-predicates.d.ts +5 -0
- package/dist/rules/predicate/merge-comparable-predicates.d.ts.map +1 -0
- package/dist/rules/predicate/merge-comparable-predicates.js +30 -0
- package/dist/rules/predicate/merge-comparable-predicates.js.map +1 -0
- package/dist/rules/predicate/merge-predicates-internal.d.ts +7 -0
- package/dist/rules/predicate/merge-predicates-internal.d.ts.map +1 -0
- package/dist/rules/predicate/merge-predicates-internal.js +186 -0
- package/dist/rules/predicate/merge-predicates-internal.js.map +1 -0
- package/dist/rules/shape/collapse-single-child-logical.d.ts +5 -0
- package/dist/rules/shape/collapse-single-child-logical.d.ts.map +1 -0
- package/dist/rules/shape/collapse-single-child-logical.js +20 -0
- package/dist/rules/shape/collapse-single-child-logical.js.map +1 -0
- package/dist/rules/shape/dedupe-logical-children.d.ts +6 -0
- package/dist/rules/shape/dedupe-logical-children.d.ts.map +1 -0
- package/dist/rules/shape/dedupe-logical-children.js +37 -0
- package/dist/rules/shape/dedupe-logical-children.js.map +1 -0
- package/dist/rules/shape/flatten-logical.d.ts +6 -0
- package/dist/rules/shape/flatten-logical.d.ts.map +1 -0
- package/dist/rules/shape/flatten-logical.js +37 -0
- package/dist/rules/shape/flatten-logical.js.map +1 -0
- package/dist/rules/shape/remove-empty-logical.d.ts +5 -0
- package/dist/rules/shape/remove-empty-logical.d.ts.map +1 -0
- package/dist/rules/shape/remove-empty-logical.js +21 -0
- package/dist/rules/shape/remove-empty-logical.js.map +1 -0
- package/dist/types.d.ts +70 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/compare-values.d.ts +6 -0
- package/dist/utils/compare-values.d.ts.map +1 -0
- package/dist/utils/compare-values.js +31 -0
- package/dist/utils/compare-values.js.map +1 -0
- package/dist/utils/deep-equal.d.ts +2 -0
- package/dist/utils/deep-equal.d.ts.map +1 -0
- package/dist/utils/deep-equal.js +30 -0
- package/dist/utils/deep-equal.js.map +1 -0
- package/dist/utils/is-opaque.d.ts +4 -0
- package/dist/utils/is-opaque.d.ts.map +1 -0
- package/dist/utils/is-opaque.js +42 -0
- package/dist/utils/is-opaque.js.map +1 -0
- package/dist/utils/stable-sort.d.ts +2 -0
- package/dist/utils/stable-sort.d.ts.map +1 -0
- package/dist/utils/stable-sort.js +16 -0
- package/dist/utils/stable-sort.js.map +1 -0
- 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"}
|