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 @@
|
|
|
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"}
|