mongo-query-normalizer 0.1.0 → 0.2.1
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/README.md +369 -39
- package/README.zh-CN.md +363 -44
- package/dist/ast/types.d.ts +4 -0
- package/dist/ast/types.d.ts.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/normalize-context.d.ts +5 -1
- package/dist/normalize-context.d.ts.map +1 -1
- package/dist/normalize-context.js +3 -0
- package/dist/normalize-context.js.map +1 -1
- package/dist/normalize.d.ts +1 -1
- package/dist/normalize.d.ts.map +1 -1
- package/dist/normalize.js +105 -52
- package/dist/normalize.js.map +1 -1
- package/dist/options/constants.d.ts.map +1 -1
- package/dist/options/constants.js +7 -16
- package/dist/options/constants.js.map +1 -1
- package/dist/options/resolve.d.ts.map +1 -1
- package/dist/options/resolve.js +32 -1
- package/dist/options/resolve.js.map +1 -1
- package/dist/options/types.d.ts +1 -1
- package/dist/options/types.d.ts.map +1 -1
- package/dist/passes/normalize-predicate.d.ts.map +1 -1
- package/dist/passes/normalize-predicate.js +93 -14
- package/dist/passes/normalize-predicate.js.map +1 -1
- package/dist/predicate/analysis/detect-array-sensitive.d.ts +3 -0
- package/dist/predicate/analysis/detect-array-sensitive.d.ts.map +1 -0
- package/dist/predicate/analysis/detect-array-sensitive.js +33 -0
- package/dist/predicate/analysis/detect-array-sensitive.js.map +1 -0
- package/dist/predicate/analysis/detect-null-sensitive.d.ts +3 -0
- package/dist/predicate/analysis/detect-null-sensitive.d.ts.map +1 -0
- package/dist/predicate/analysis/detect-null-sensitive.js +24 -0
- package/dist/predicate/analysis/detect-null-sensitive.js.map +1 -0
- package/dist/predicate/analysis/detect-opaque-mix.d.ts +3 -0
- package/dist/predicate/analysis/detect-opaque-mix.d.ts.map +1 -0
- package/dist/predicate/analysis/detect-opaque-mix.js +9 -0
- package/dist/predicate/analysis/detect-opaque-mix.js.map +1 -0
- package/dist/predicate/analysis/detect-path-conflict-risk.d.ts +3 -0
- package/dist/predicate/analysis/detect-path-conflict-risk.d.ts.map +1 -0
- package/dist/predicate/analysis/detect-path-conflict-risk.js +14 -0
- package/dist/predicate/analysis/detect-path-conflict-risk.js.map +1 -0
- package/dist/predicate/analysis/merge-range-bounds.d.ts +27 -0
- package/dist/predicate/analysis/merge-range-bounds.d.ts.map +1 -0
- package/dist/predicate/analysis/merge-range-bounds.js +150 -0
- package/dist/predicate/analysis/merge-range-bounds.js.map +1 -0
- package/dist/predicate/capabilities/eq/eq-eq.d.ts +3 -0
- package/dist/predicate/capabilities/eq/eq-eq.d.ts.map +1 -0
- package/dist/predicate/capabilities/eq/eq-eq.js +53 -0
- package/dist/predicate/capabilities/eq/eq-eq.js.map +1 -0
- package/dist/predicate/capabilities/eq/eq-in.d.ts +3 -0
- package/dist/predicate/capabilities/eq/eq-in.d.ts.map +1 -0
- package/dist/predicate/capabilities/eq/eq-in.js +117 -0
- package/dist/predicate/capabilities/eq/eq-in.js.map +1 -0
- package/dist/predicate/capabilities/eq/eq-ne.d.ts +3 -0
- package/dist/predicate/capabilities/eq/eq-ne.d.ts.map +1 -0
- package/dist/predicate/capabilities/eq/eq-ne.js +37 -0
- package/dist/predicate/capabilities/eq/eq-ne.js.map +1 -0
- package/dist/predicate/capabilities/eq/eq-range.d.ts +3 -0
- package/dist/predicate/capabilities/eq/eq-range.d.ts.map +1 -0
- package/dist/predicate/capabilities/eq/eq-range.js +138 -0
- package/dist/predicate/capabilities/eq/eq-range.js.map +1 -0
- package/dist/predicate/capabilities/ne/ne-ne.d.ts +3 -0
- package/dist/predicate/capabilities/ne/ne-ne.d.ts.map +1 -0
- package/dist/predicate/capabilities/ne/ne-ne.js +44 -0
- package/dist/predicate/capabilities/ne/ne-ne.js.map +1 -0
- package/dist/predicate/capabilities/nin/nin-nin.d.ts +3 -0
- package/dist/predicate/capabilities/nin/nin-nin.d.ts.map +1 -0
- package/dist/predicate/capabilities/nin/nin-nin.js +45 -0
- package/dist/predicate/capabilities/nin/nin-nin.js.map +1 -0
- package/dist/predicate/capabilities/range/range-range.d.ts +3 -0
- package/dist/predicate/capabilities/range/range-range.d.ts.map +1 -0
- package/dist/predicate/capabilities/range/range-range.js +154 -0
- package/dist/predicate/capabilities/range/range-range.js.map +1 -0
- package/dist/predicate/capabilities/shared/capability-types.d.ts +11 -0
- package/dist/predicate/capabilities/shared/capability-types.d.ts.map +1 -0
- package/dist/predicate/capabilities/shared/capability-types.js +3 -0
- package/dist/predicate/capabilities/shared/capability-types.js.map +1 -0
- package/dist/predicate/capabilities/shared/relation-context.d.ts +13 -0
- package/dist/predicate/capabilities/shared/relation-context.d.ts.map +1 -0
- package/dist/predicate/capabilities/shared/relation-context.js +3 -0
- package/dist/predicate/capabilities/shared/relation-context.js.map +1 -0
- package/dist/predicate/capabilities/shared/relation-result.d.ts +12 -0
- package/dist/predicate/capabilities/shared/relation-result.d.ts.map +1 -0
- package/dist/predicate/capabilities/shared/relation-result.js +14 -0
- package/dist/predicate/capabilities/shared/relation-result.js.map +1 -0
- package/dist/predicate/index.d.ts +12 -0
- package/dist/predicate/index.d.ts.map +1 -0
- package/dist/predicate/index.js +22 -0
- package/dist/predicate/index.js.map +1 -0
- package/dist/predicate/ir/build-field-bundle.d.ts +7 -0
- package/dist/predicate/ir/build-field-bundle.d.ts.map +1 -0
- package/dist/predicate/ir/build-field-bundle.js +88 -0
- package/dist/predicate/ir/build-field-bundle.js.map +1 -0
- package/dist/predicate/ir/compile-field-bundle.d.ts +4 -0
- package/dist/predicate/ir/compile-field-bundle.d.ts.map +1 -0
- package/dist/predicate/ir/compile-field-bundle.js +57 -0
- package/dist/predicate/ir/compile-field-bundle.js.map +1 -0
- package/dist/predicate/ir/dedupe-atoms.d.ts +6 -0
- package/dist/predicate/ir/dedupe-atoms.d.ts.map +1 -0
- package/dist/predicate/ir/dedupe-atoms.js +42 -0
- package/dist/predicate/ir/dedupe-atoms.js.map +1 -0
- package/dist/predicate/ir/field-predicate-bundle.d.ts +16 -0
- package/dist/predicate/ir/field-predicate-bundle.d.ts.map +1 -0
- package/dist/predicate/ir/field-predicate-bundle.js +3 -0
- package/dist/predicate/ir/field-predicate-bundle.js.map +1 -0
- package/dist/predicate/ir/predicate-atom.d.ts +33 -0
- package/dist/predicate/ir/predicate-atom.d.ts.map +1 -0
- package/dist/predicate/ir/predicate-atom.js +3 -0
- package/dist/predicate/ir/predicate-atom.js.map +1 -0
- package/dist/predicate/local-normalize-result.d.ts +17 -0
- package/dist/predicate/local-normalize-result.d.ts.map +1 -0
- package/dist/predicate/local-normalize-result.js +3 -0
- package/dist/predicate/local-normalize-result.js.map +1 -0
- package/dist/predicate/meta/collect-predicate-meta.d.ts +16 -0
- package/dist/predicate/meta/collect-predicate-meta.d.ts.map +1 -0
- package/dist/predicate/meta/collect-predicate-meta.js +13 -0
- package/dist/predicate/meta/collect-predicate-meta.js.map +1 -0
- package/dist/predicate/normalize-field-predicate-bundle.d.ts +18 -0
- package/dist/predicate/normalize-field-predicate-bundle.d.ts.map +1 -0
- package/dist/predicate/normalize-field-predicate-bundle.js +126 -0
- package/dist/predicate/normalize-field-predicate-bundle.js.map +1 -0
- package/dist/predicate/normalize-predicate.d.ts +5 -0
- package/dist/predicate/normalize-predicate.d.ts.map +1 -0
- package/dist/predicate/normalize-predicate.js +10 -0
- package/dist/predicate/normalize-predicate.js.map +1 -0
- package/dist/predicate/planner/capability-selector.d.ts +8 -0
- package/dist/predicate/planner/capability-selector.d.ts.map +1 -0
- package/dist/predicate/planner/capability-selector.js +23 -0
- package/dist/predicate/planner/capability-selector.js.map +1 -0
- package/dist/predicate/planner/relation-plan.d.ts +10 -0
- package/dist/predicate/planner/relation-plan.d.ts.map +1 -0
- package/dist/predicate/planner/relation-plan.js +3 -0
- package/dist/predicate/planner/relation-plan.js.map +1 -0
- package/dist/predicate/planner/relation-planner.d.ts +5 -0
- package/dist/predicate/planner/relation-planner.d.ts.map +1 -0
- package/dist/predicate/planner/relation-planner.js +62 -0
- package/dist/predicate/planner/relation-planner.js.map +1 -0
- package/dist/predicate/registry/predicate-capability-registry.d.ts +3 -0
- package/dist/predicate/registry/predicate-capability-registry.d.ts.map +1 -0
- package/dist/predicate/registry/predicate-capability-registry.js +23 -0
- package/dist/predicate/registry/predicate-capability-registry.js.map +1 -0
- package/dist/predicate/safety/predicate-safety-policy.d.ts +9 -0
- package/dist/predicate/safety/predicate-safety-policy.d.ts.map +1 -0
- package/dist/predicate/safety/predicate-safety-policy.js +11 -0
- package/dist/predicate/safety/predicate-safety-policy.js.map +1 -0
- package/dist/predicate/utils/bson-compare.d.ts +2 -0
- package/dist/predicate/utils/bson-compare.d.ts.map +1 -0
- package/dist/predicate/utils/bson-compare.js +7 -0
- package/dist/predicate/utils/bson-compare.js.map +1 -0
- package/dist/predicate/utils/intersect-in-lists.d.ts +5 -0
- package/dist/predicate/utils/intersect-in-lists.d.ts.map +1 -0
- package/dist/predicate/utils/intersect-in-lists.js +15 -0
- package/dist/predicate/utils/intersect-in-lists.js.map +1 -0
- package/dist/predicate/utils/set-ops.d.ts +3 -0
- package/dist/predicate/utils/set-ops.d.ts.map +1 -0
- package/dist/predicate/utils/set-ops.js +18 -0
- package/dist/predicate/utils/set-ops.js.map +1 -0
- package/dist/predicate/utils/value-equality.d.ts +2 -0
- package/dist/predicate/utils/value-equality.d.ts.map +1 -0
- package/dist/predicate/utils/value-equality.js +8 -0
- package/dist/predicate/utils/value-equality.js.map +1 -0
- package/dist/rules/or-common-predicate/detect-common-predicates-in-or.d.ts +6 -0
- package/dist/rules/or-common-predicate/detect-common-predicates-in-or.d.ts.map +1 -0
- package/dist/rules/or-common-predicate/detect-common-predicates-in-or.js +83 -0
- package/dist/rules/or-common-predicate/detect-common-predicates-in-or.js.map +1 -0
- package/dist/rules/shape/collapse-single-child-logical.js +1 -1
- package/dist/rules/shape/collapse-single-child-logical.js.map +1 -1
- package/dist/rules/shape/dedupe-logical-children.js +1 -1
- package/dist/rules/shape/dedupe-logical-children.js.map +1 -1
- package/dist/rules/shape/flatten-logical.js +2 -2
- package/dist/rules/shape/flatten-logical.js.map +1 -1
- package/dist/rules/shape/remove-empty-logical.js +2 -2
- package/dist/rules/shape/remove-empty-logical.js.map +1 -1
- package/dist/scope/analysis/analyze-branch-coverage.d.ts +5 -0
- package/dist/scope/analysis/analyze-branch-coverage.d.ts.map +1 -0
- package/dist/scope/analysis/analyze-branch-coverage.js +8 -0
- package/dist/scope/analysis/analyze-branch-coverage.js.map +1 -0
- package/dist/scope/analysis/analyze-branch-satisfiability.d.ts +9 -0
- package/dist/scope/analysis/analyze-branch-satisfiability.d.ts.map +1 -0
- package/dist/scope/analysis/analyze-branch-satisfiability.js +33 -0
- package/dist/scope/analysis/analyze-branch-satisfiability.js.map +1 -0
- package/dist/scope/context/build-inherited-constraints.d.ts +6 -0
- package/dist/scope/context/build-inherited-constraints.d.ts.map +1 -0
- package/dist/scope/context/build-inherited-constraints.js +119 -0
- package/dist/scope/context/build-inherited-constraints.js.map +1 -0
- package/dist/scope/context/constraint-set.d.ts +19 -0
- package/dist/scope/context/constraint-set.d.ts.map +1 -0
- package/dist/scope/context/constraint-set.js +26 -0
- package/dist/scope/context/constraint-set.js.map +1 -0
- package/dist/scope/context/merge-constraint-sources.d.ts +4 -0
- package/dist/scope/context/merge-constraint-sources.d.ts.map +1 -0
- package/dist/scope/context/merge-constraint-sources.js +28 -0
- package/dist/scope/context/merge-constraint-sources.js.map +1 -0
- package/dist/scope/index.d.ts +8 -0
- package/dist/scope/index.d.ts.map +1 -0
- package/dist/scope/index.js +19 -0
- package/dist/scope/index.js.map +1 -0
- package/dist/scope/meta/collect-scope-meta.d.ts +5 -0
- package/dist/scope/meta/collect-scope-meta.d.ts.map +1 -0
- package/dist/scope/meta/collect-scope-meta.js +7 -0
- package/dist/scope/meta/collect-scope-meta.js.map +1 -0
- package/dist/scope/normalize-scope.d.ts +4 -0
- package/dist/scope/normalize-scope.d.ts.map +1 -0
- package/dist/scope/normalize-scope.js +149 -0
- package/dist/scope/normalize-scope.js.map +1 -0
- package/dist/scope/planner/scope-plan.d.ts +6 -0
- package/dist/scope/planner/scope-plan.d.ts.map +1 -0
- package/dist/scope/planner/scope-plan.js +9 -0
- package/dist/scope/planner/scope-plan.js.map +1 -0
- package/dist/scope/planner/scope-rewrite-planner.d.ts +4 -0
- package/dist/scope/planner/scope-rewrite-planner.d.ts.map +1 -0
- package/dist/scope/planner/scope-rewrite-planner.js +8 -0
- package/dist/scope/planner/scope-rewrite-planner.js.map +1 -0
- package/dist/scope/propagation/create-branch-local-bundle.d.ts +5 -0
- package/dist/scope/propagation/create-branch-local-bundle.d.ts.map +1 -0
- package/dist/scope/propagation/create-branch-local-bundle.js +16 -0
- package/dist/scope/propagation/create-branch-local-bundle.js.map +1 -0
- package/dist/scope/propagation/propagate-constraints-to-children.d.ts +6 -0
- package/dist/scope/propagation/propagate-constraints-to-children.d.ts.map +1 -0
- package/dist/scope/propagation/propagate-constraints-to-children.js +9 -0
- package/dist/scope/propagation/propagate-constraints-to-children.js.map +1 -0
- package/dist/scope/rewrite/collapse-single-branch.d.ts +5 -0
- package/dist/scope/rewrite/collapse-single-branch.d.ts.map +1 -0
- package/dist/scope/rewrite/collapse-single-branch.js +28 -0
- package/dist/scope/rewrite/collapse-single-branch.js.map +1 -0
- package/dist/scope/rewrite/prune-impossible-branches.d.ts +6 -0
- package/dist/scope/rewrite/prune-impossible-branches.d.ts.map +1 -0
- package/dist/scope/rewrite/prune-impossible-branches.js +32 -0
- package/dist/scope/rewrite/prune-impossible-branches.js.map +1 -0
- package/dist/scope/rewrite/remove-covered-local-constraints.d.ts +6 -0
- package/dist/scope/rewrite/remove-covered-local-constraints.d.ts.map +1 -0
- package/dist/scope/rewrite/remove-covered-local-constraints.js +76 -0
- package/dist/scope/rewrite/remove-covered-local-constraints.js.map +1 -0
- package/dist/scope/safety/scope-safety-policy.d.ts +10 -0
- package/dist/scope/safety/scope-safety-policy.d.ts.map +1 -0
- package/dist/scope/safety/scope-safety-policy.js +12 -0
- package/dist/scope/safety/scope-safety-policy.js.map +1 -0
- package/dist/types.d.ts +70 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -1
- package/dist/types.js.map +1 -1
- package/package.json +6 -4
package/README.zh-CN.md
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) | **中文**
|
|
4
4
|
|
|
5
|
-
一个面向 **MongoDB 查询对象**
|
|
5
|
+
一个面向 **MongoDB 查询对象** 的 **可观测、分层式** 规范化器。它以保守默认策略稳定查询 **shape**,并提供 **`predicate`** 与 **`scope`** 两个带有**文档化、测试兜底契约**的层级(见 [SPEC.zh-CN.md](SPEC.zh-CN.md) 与 [docs/normalization-matrix.zh-CN.md](docs/normalization-matrix.zh-CN.md);英文对照见 [SPEC.md](SPEC.md) 与 [docs/normalization-matrix.md](docs/normalization-matrix.md))。它返回**可预测**的输出与 **metadata**,而不是 MongoDB 查询规划器优化器。
|
|
6
6
|
|
|
7
|
-
>
|
|
7
|
+
> **默认策略:** **`shape`** 仅做结构规范化,适合作为**覆盖面最广**的默认路径。 **`predicate`**、**`scope`** 在 **SPEC**、**normalization-matrix** 与 **契约测试** 中有明确边界;仅在需要对应能力且接受「已建模算子」范围时启用;**opaque** 算子保持透传。
|
|
8
|
+
>
|
|
9
|
+
> **`v0.2.0` 起:** `predicate` 改写面有意收敛到显式验证能力(`eq.eq`、`eq.ne`、`eq.in`、`eq.range`、`range.range`)。高风险组合(如 `null`/缺失语义、数组敏感语义、`$exists`/`$nin`、整对象与点路径混用、opaque 混用)按设计保持保守处理。
|
|
8
10
|
|
|
9
11
|
---
|
|
10
12
|
|
|
@@ -20,8 +22,8 @@
|
|
|
20
22
|
|
|
21
23
|
## 核心特性
|
|
22
24
|
|
|
23
|
-
- **按 level 分层**:`shape` → `predicate` → `
|
|
24
|
-
- **默认保守**:开箱仅 `shape
|
|
25
|
+
- **按 level 分层**:`shape` → `predicate` → `scope`
|
|
26
|
+
- **默认保守**:开箱仅 `shape`(风险最小的结构层)
|
|
25
27
|
- **可观测的 `meta`**:变更、规则、告警、哈希、可选统计
|
|
26
28
|
- **稳定 / 幂等**(相同 options、未熔断时)
|
|
27
29
|
- **不透明(opaque)回退**:不支持的算子以透传为主,不做完整语义改写
|
|
@@ -51,19 +53,158 @@ console.log(result.meta);
|
|
|
51
53
|
|
|
52
54
|
---
|
|
53
55
|
|
|
56
|
+
## 完整使用说明
|
|
57
|
+
|
|
58
|
+
### 1) 最小可用(推荐默认)
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
import { normalizeQuery } from "mongo-query-normalizer";
|
|
62
|
+
|
|
63
|
+
const { query: normalizedQuery, meta } = normalizeQuery(inputQuery);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
- 不传 `options` 时,默认 `level: "shape"`。
|
|
67
|
+
- 适合日志归一化、缓存 key 稳定化、查询 diff 对齐等“低风险结构规范化”场景。
|
|
68
|
+
|
|
69
|
+
### 2) 显式选择 level
|
|
70
|
+
|
|
71
|
+
```ts
|
|
72
|
+
normalizeQuery(inputQuery, { level: "shape" }); // 仅结构层(默认)
|
|
73
|
+
normalizeQuery(inputQuery, { level: "predicate" }); // 启用已建模谓词整理
|
|
74
|
+
normalizeQuery(inputQuery, { level: "scope" }); // 启用 scope 传播/保守剪枝能力
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
- `shape`:结构稳定优先,风险最低。
|
|
78
|
+
- `predicate`:在已建模算子范围内做去重、合并、矛盾折叠。
|
|
79
|
+
- `scope`:在 `predicate` 之上增加继承约束传播与保守分支决策。
|
|
80
|
+
|
|
81
|
+
### 3) `options` 全量示例
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
import { normalizeQuery } from "mongo-query-normalizer";
|
|
85
|
+
|
|
86
|
+
const result = normalizeQuery(inputQuery, {
|
|
87
|
+
level: "scope",
|
|
88
|
+
rules: {
|
|
89
|
+
// shape 相关
|
|
90
|
+
flattenLogical: true,
|
|
91
|
+
removeEmptyLogical: true,
|
|
92
|
+
collapseSingleChildLogical: true,
|
|
93
|
+
dedupeLogicalChildren: true,
|
|
94
|
+
// predicate 相关
|
|
95
|
+
dedupeSameFieldPredicates: true,
|
|
96
|
+
mergeComparablePredicates: true,
|
|
97
|
+
collapseContradictions: true,
|
|
98
|
+
// 排序相关
|
|
99
|
+
sortLogicalChildren: true,
|
|
100
|
+
sortFieldPredicates: true,
|
|
101
|
+
// scope 观测规则(仅观测,不上提改写)
|
|
102
|
+
detectCommonPredicatesInOr: true,
|
|
103
|
+
},
|
|
104
|
+
safety: {
|
|
105
|
+
maxNormalizeDepth: 32,
|
|
106
|
+
maxNodeGrowthRatio: 1.5,
|
|
107
|
+
},
|
|
108
|
+
observe: {
|
|
109
|
+
collectWarnings: true,
|
|
110
|
+
collectMetrics: false,
|
|
111
|
+
collectPredicateTraces: false,
|
|
112
|
+
collectScopeTraces: false,
|
|
113
|
+
},
|
|
114
|
+
predicate: {
|
|
115
|
+
safetyPolicy: {
|
|
116
|
+
// 仅覆盖你关心的字段;其余使用默认值
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
scope: {
|
|
120
|
+
safetyPolicy: {
|
|
121
|
+
// 仅覆盖你关心的字段;其余使用默认值
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
});
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### 4) 用 `resolveNormalizeOptions` 查看最终生效配置
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
import { resolveNormalizeOptions } from "mongo-query-normalizer";
|
|
131
|
+
|
|
132
|
+
const resolvedOptions = resolveNormalizeOptions({
|
|
133
|
+
level: "predicate",
|
|
134
|
+
observe: { collectMetrics: true },
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
console.log(resolvedOptions);
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
- 适合排查“某个规则为何启用/未启用”。
|
|
141
|
+
- 适合在服务启动时打印一次“规范化配置快照”。
|
|
142
|
+
|
|
143
|
+
### 5) 处理返回值(`query` + `meta`)
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
const { query: normalizedQuery, meta } = normalizeQuery(inputQuery, options);
|
|
147
|
+
|
|
148
|
+
if (meta.bailedOut) {
|
|
149
|
+
logger.warn({ reason: meta.bailoutReason }, "normalization bailed out");
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (meta.changed) {
|
|
153
|
+
logger.info(
|
|
154
|
+
{
|
|
155
|
+
level: meta.level,
|
|
156
|
+
beforeHash: meta.beforeHash,
|
|
157
|
+
afterHash: meta.afterHash,
|
|
158
|
+
appliedRules: meta.appliedRules,
|
|
159
|
+
},
|
|
160
|
+
"query normalized"
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
- `query`:规范化后的查询对象。
|
|
166
|
+
- `meta`:观测信息(是否变化、规则轨迹、告警、哈希、可选统计与 trace)。
|
|
167
|
+
|
|
168
|
+
### 6) 常见接入模式
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
// A. 在数据访问层统一规范化
|
|
172
|
+
export function normalizeForFind(rawFilter) {
|
|
173
|
+
return normalizeQuery(rawFilter, { level: "shape" }).query;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// B. 需要更多收敛能力的离线路径(如批处理)
|
|
177
|
+
export function normalizeForBatch(rawFilter) {
|
|
178
|
+
return normalizeQuery(rawFilter, { level: "predicate" }).query;
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- 在线主路径优先 `shape`。
|
|
183
|
+
- `predicate` / `scope` 建议在有明确收益与测试兜底时再启用。
|
|
184
|
+
|
|
185
|
+
### 7) 错误与边界
|
|
186
|
+
|
|
187
|
+
- `level` 非法会抛错(例如拼写错误)。
|
|
188
|
+
- 不支持或未知算子通常按 opaque 保留,不保证参与语义合并。
|
|
189
|
+
- 本库目标是“稳定与可观测”,不是查询优化器。
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
54
193
|
## 默认行为说明
|
|
55
194
|
|
|
56
195
|
- **默认 `level` 为 `shape`**(见 `resolveNormalizeOptions()`)。
|
|
57
|
-
-
|
|
196
|
+
- `shape` 默认**不做**谓词级合并。**`scope`** 主路径是继承约束传播与保守分支决策;**`detectCommonPredicatesInOr`** 为**可选、仅观测**规则(告警/轨迹),**从不**做结构上提。
|
|
58
197
|
- 默认目标是 **稳定与可观测**,不是「智能优化」。
|
|
59
198
|
|
|
60
199
|
---
|
|
61
200
|
|
|
62
|
-
##
|
|
201
|
+
## 如何选择 level
|
|
202
|
+
|
|
203
|
+
- 仅需结构稳定时,用 **`shape`**。
|
|
204
|
+
- 需要同字段去重、可建模比较合并、矛盾折叠时,用 **`predicate`**(仅针对已建模算子)。
|
|
205
|
+
- 需要继承约束传播、保守剪枝与狭窄覆盖消除时,用 **`scope`**(详见 [SPEC.zh-CN.md](SPEC.zh-CN.md) 与 [docs/normalization-matrix.zh-CN.md](docs/normalization-matrix.zh-CN.md))。**`detectCommonPredicatesInOr`**(开启时)仅观测,不改写结构。
|
|
63
206
|
|
|
64
|
-
-
|
|
65
|
-
- `shape` 之上的 **`predicate`、`logical`、`experimental`** 属于**预览 / 不稳定**能力面,宜在**明确接受预览语义**的前提下,用于**离线分析**、**回放测试**、**语义验证**与**定向实验**,不宜作为全量在线请求的默认策略。
|
|
66
|
-
- 若启用**非 `shape`** 的 level,每次调用都会在 **`meta.warnings`** 中写入一条 **v0.1.0 版本边界说明**。在**非生产**环境(`NODE_ENV !== "production"`)下,还会在进程内对**同一 level 至多输出一次**与之对应的 **`console.warn`**,便于本地开发看到同样提示,又避免重复刷屏。
|
|
207
|
+
**行为边界**以 **SPEC**、**normalization-matrix** 与 **`test/contracts/`** 为准,而非仅靠 README 叙述。
|
|
67
208
|
|
|
68
209
|
---
|
|
69
210
|
|
|
@@ -71,34 +212,29 @@ console.log(result.meta);
|
|
|
71
212
|
|
|
72
213
|
### `shape`(默认)
|
|
73
214
|
|
|
74
|
-
|
|
215
|
+
**推荐默认路径**(风险最小):只做安全结构规范化,例如:
|
|
75
216
|
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
-
|
|
217
|
+
- 展平复合(`$and` / `$or`)节点
|
|
218
|
+
- 移除空复合节点
|
|
219
|
+
- 折叠单子复合节点
|
|
220
|
+
- 复合子节点去重
|
|
80
221
|
- canonical ordering
|
|
81
222
|
|
|
82
223
|
### `predicate`
|
|
83
224
|
|
|
84
|
-
|
|
225
|
+
在 `shape` 之上对**已建模**算子做**保守**谓词整理:
|
|
85
226
|
|
|
86
227
|
- 同字段谓词去重
|
|
87
228
|
- 可建模的比较类谓词合并
|
|
88
229
|
- 明确矛盾收敛为不可满足过滤器
|
|
89
230
|
- 在 `normalizePredicate` 中,**`$and` 下同名 field 的直接子 `FieldNode` 会先合并**,以便检出诸如 `{ $and: [{ a: 1 }, { a: 2 }] }` 的矛盾
|
|
90
231
|
|
|
91
|
-
### `
|
|
232
|
+
### `scope`
|
|
92
233
|
|
|
93
|
-
|
|
234
|
+
在 `predicate` 之上:
|
|
94
235
|
|
|
95
|
-
-
|
|
96
|
-
|
|
97
|
-
### `experimental`
|
|
98
|
-
|
|
99
|
-
**实验 / 预览层**:在 **v0.1.0** 中**不建议**作为一般生产环境的默认选择。
|
|
100
|
-
|
|
101
|
-
- 可在规则开启时对 `$or` 做 **hoist** 等实验性变换;**禁止**作为线上全量默认
|
|
236
|
+
- **继承约束传播**(phase-1 白名单)、**保守分支剪枝**;**覆盖消除**仅在狭窄、已测试场景且策略允许时进行
|
|
237
|
+
- 可选 **`detectCommonPredicatesInOr`**:仅观测(告警/轨迹);**不改写**查询结构
|
|
102
238
|
|
|
103
239
|
---
|
|
104
240
|
|
|
@@ -109,11 +245,13 @@ console.log(result.meta);
|
|
|
109
245
|
| `changed` | 输出相对输入是否变化(基于哈希) |
|
|
110
246
|
| `level` | 实际使用的规范化层级 |
|
|
111
247
|
| `appliedRules` / `skippedRules` | 规则应用轨迹 |
|
|
112
|
-
| `warnings` |
|
|
248
|
+
| `warnings` | `observe.collectWarnings` 为真时的非致命告警(规则说明、检测文案等) |
|
|
113
249
|
| `bailedOut` | 是否触发安全熔断 |
|
|
114
250
|
| `bailoutReason` | 熔断原因 |
|
|
115
251
|
| `beforeHash` / `afterHash` | 前后稳定哈希 |
|
|
116
252
|
| `stats` | 可选的前后树统计(`observe.collectMetrics`) |
|
|
253
|
+
| `predicateTraces` | `observe.collectPredicateTraces` 为真时:每字段 planner / 跳过 / 矛盾等轨迹 |
|
|
254
|
+
| `scopeTrace` | `observe.collectScopeTraces` 为真时:约束抽取拒绝原因与 scope 决策事件 |
|
|
117
255
|
|
|
118
256
|
---
|
|
119
257
|
|
|
@@ -140,23 +278,26 @@ console.log(result.meta);
|
|
|
140
278
|
## 必须明确的原则
|
|
141
279
|
|
|
142
280
|
1. 默认是 **`shape`**。
|
|
143
|
-
2.
|
|
144
|
-
3.
|
|
145
|
-
4.
|
|
146
|
-
5.
|
|
147
|
-
6. 在未熔断时,输出应对相同 options 保持 **幂等**。
|
|
148
|
-
7. 本库 **不是** MongoDB 的 planner optimizer。
|
|
281
|
+
2. **`predicate` / `scope`** 可能改变查询结构,但在已建模算子上追求 **语义等价**。
|
|
282
|
+
3. **opaque** 节点不会被语义重写。
|
|
283
|
+
4. 在未熔断时,输出应对相同 options 保持 **幂等**。
|
|
284
|
+
5. 本库 **不是** MongoDB 的 planner optimizer。
|
|
149
285
|
|
|
150
286
|
---
|
|
151
287
|
|
|
152
288
|
## 示例场景
|
|
153
289
|
|
|
154
|
-
|
|
155
|
-
|
|
290
|
+
**在线主路径** —— 使用默认(`shape`);在 `v0.2.0` 中仍是最稳妥的生产基线:
|
|
291
|
+
|
|
292
|
+
```ts
|
|
293
|
+
normalizeQuery(query);
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**Predicate 或 Scope** —— 显式传 `level`;请结合 [SPEC.zh-CN.md](SPEC.zh-CN.md) 与契约测试理解“可改写”与“保留”边界:
|
|
156
297
|
|
|
157
298
|
```ts
|
|
158
299
|
normalizeQuery(query, { level: "predicate" });
|
|
159
|
-
```
|
|
300
|
+
```
|
|
160
301
|
|
|
161
302
|
---
|
|
162
303
|
|
|
@@ -167,24 +308,202 @@ normalizeQuery(query, options?) => { query, meta }
|
|
|
167
308
|
resolveNormalizeOptions(options?) => ResolvedNormalizeOptions
|
|
168
309
|
```
|
|
169
310
|
|
|
170
|
-
类型:`NormalizeLevel`、`NormalizeOptions`、`NormalizeRules`、`NormalizeSafety`、`NormalizeObserve`、`ResolvedNormalizeOptions`、`NormalizeResult`、`NormalizeStats
|
|
311
|
+
类型:`NormalizeLevel`、`NormalizeOptions`、`NormalizeRules`、`NormalizeSafety`、`NormalizeObserve`、`ResolvedNormalizeOptions`、`NormalizeResult`、`NormalizeStats`、`PredicateSafetyPolicy`、`ScopeSafetyPolicy` 及轨迹相关类型(见包导出)。
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## 测试
|
|
316
|
+
|
|
317
|
+
### 测试布局
|
|
318
|
+
|
|
319
|
+
本仓库按 **对外 API**、**规范化 level** 与 **跨 level 契约** 组织测试,并保留更深的语义与回归套件。
|
|
320
|
+
|
|
321
|
+
### 目录职责
|
|
322
|
+
|
|
323
|
+
#### `test/api/`
|
|
324
|
+
|
|
325
|
+
覆盖对外 API 与配置面。
|
|
326
|
+
|
|
327
|
+
适合放在此处的验证包括:
|
|
328
|
+
|
|
329
|
+
* `normalizeQuery` 的返回形态与顶层行为
|
|
330
|
+
* `resolveNormalizeOptions`
|
|
331
|
+
* 包导出
|
|
332
|
+
|
|
333
|
+
**不要**把「某一 level 专属的规范化行为」放在这里。
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
#### `test/levels/`
|
|
338
|
+
|
|
339
|
+
覆盖每个 `NormalizeLevel` 的行为边界。
|
|
340
|
+
|
|
341
|
+
当前 level:
|
|
342
|
+
|
|
343
|
+
* `shape`
|
|
344
|
+
* `predicate`
|
|
345
|
+
* `scope`
|
|
346
|
+
|
|
347
|
+
每个 level 的测试文件宜聚焦四件事:
|
|
348
|
+
|
|
349
|
+
1. 该 level 的**正向能力**
|
|
350
|
+
2. 该 level **明确未启用**的行为
|
|
351
|
+
3. 与**相邻 level** 的对比
|
|
352
|
+
4. 少量**代表性契约**
|
|
353
|
+
|
|
354
|
+
断言上优先:
|
|
355
|
+
|
|
356
|
+
* 规范化后的 **query 结构**
|
|
357
|
+
* **跨 level 可观察的差异**
|
|
358
|
+
* **稳定的对外 meta**(如 `meta.level` 等)
|
|
359
|
+
|
|
360
|
+
尽量避免过度绑定:
|
|
361
|
+
|
|
362
|
+
* warning **逐字全文**
|
|
363
|
+
* 内部 **规则 ID 字符串**
|
|
364
|
+
* **子句顺序**(除非顺序本身就是契约的一部分)
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
#### `test/contracts/`
|
|
369
|
+
|
|
370
|
+
覆盖「应对所有 level 成立」的契约,或与单一 level 无关的默认行为。
|
|
371
|
+
|
|
372
|
+
适合放在此处的内容包括:
|
|
373
|
+
|
|
374
|
+
* 默认 level 行为
|
|
375
|
+
* 各 level 下的幂等
|
|
376
|
+
* 各 level 下的输出不变式
|
|
377
|
+
* 各 level 下的 opaque 子树保留
|
|
378
|
+
* **`predicate` / `scope` 的正式契约**(支持合并、opaque 保留、scope 策略护栏、规则开关)——见 `test/contracts/predicate-scope-stable-contract.test.js`
|
|
379
|
+
|
|
380
|
+
全 level 套件请配合 `test/helpers/level-contract-runner.js` 使用。
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
#### `test/semantic/`
|
|
385
|
+
|
|
386
|
+
对照真实执行行为做**语义等价**验证,确保规范化不改变含义。
|
|
387
|
+
|
|
388
|
+
该目录有意与 `levels/`、`contracts/` 分开。
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
#### `test/property/`
|
|
393
|
+
|
|
394
|
+
基于属性的随机测试与变形(metamorphic)行为。
|
|
395
|
+
|
|
396
|
+
适用于:
|
|
397
|
+
|
|
398
|
+
* 随机语义检查
|
|
399
|
+
* 变形不变式
|
|
400
|
+
* 较宽输入空间上的校验
|
|
401
|
+
|
|
402
|
+
**不要**把它当作表达「level 边界」的主战场。
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
#### `test/regression/`
|
|
407
|
+
|
|
408
|
+
已知历史失败与手工回归用例。
|
|
409
|
+
|
|
410
|
+
修复了一个不应再犯的 bug 时,把用例加在这里。
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
#### `test/performance/`
|
|
415
|
+
|
|
416
|
+
性能护栏或与复杂度相关的行为。
|
|
417
|
+
|
|
418
|
+
应聚焦性能相关预期,而非一般性的规范化结构细节。
|
|
419
|
+
|
|
420
|
+
---
|
|
421
|
+
|
|
422
|
+
### 辅助文件
|
|
423
|
+
|
|
424
|
+
#### `test/helpers/level-runner.js`
|
|
425
|
+
|
|
426
|
+
在指定 level 下执行 `normalizeQuery` 的共享封装。
|
|
427
|
+
|
|
428
|
+
#### `test/helpers/level-cases.js`
|
|
429
|
+
|
|
430
|
+
跨 level 测试共用的固定输入;优先把可复用的代表用例加在这里,避免在多个文件里复制同一段 fixture。
|
|
431
|
+
|
|
432
|
+
#### `test/helpers/level-contract-runner.js`
|
|
433
|
+
|
|
434
|
+
全 level 契约套件共用的 `LEVELS` 与 `forEachLevel` 等辅助逻辑。
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
### 新增测试时的规则
|
|
439
|
+
|
|
440
|
+
#### 新增一条规范化规则时
|
|
441
|
+
|
|
442
|
+
先问:
|
|
443
|
+
|
|
444
|
+
* 是否属于对外 API 行为?→ 加到 `test/api/`
|
|
445
|
+
* 是否仅在某一 level 启用?→ 加到 `test/levels/`
|
|
446
|
+
* 是否应对所有 level 成立?→ 加到 `test/contracts/`
|
|
447
|
+
* 是否关乎语义保持或随机验证?→ 加到 `test/semantic/` 或 `test/property/`
|
|
448
|
+
* 是否针对曾坏过的场景的修复?→ 加到 `test/regression/`
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
#### 新增一个 level 时
|
|
453
|
+
|
|
454
|
+
至少完成:
|
|
455
|
+
|
|
456
|
+
1. 新增 `test/levels/<level>-level.test.js`
|
|
457
|
+
2. 在 `test/helpers/level-contract-runner.js` 中注册该 level
|
|
458
|
+
3. 确保全 level 契约套件会跑到它
|
|
459
|
+
4. 至少补一条与相邻 level 的**对照**用例
|
|
460
|
+
|
|
461
|
+
---
|
|
462
|
+
|
|
463
|
+
### 测试风格建议
|
|
464
|
+
|
|
465
|
+
宜:
|
|
466
|
+
|
|
467
|
+
* 用**基于示例**的用例表达 level 边界
|
|
468
|
+
* 断言 **query 形状**
|
|
469
|
+
* 做**相邻 level 对照**
|
|
470
|
+
* **共享**代表性 fixture
|
|
471
|
+
|
|
472
|
+
忌:
|
|
473
|
+
|
|
474
|
+
* 把 level 测试绑死在易变的实现细节上
|
|
475
|
+
* 同一 fixture 只改断言表面、重复堆砌
|
|
476
|
+
* 把「默认 level」契约塞进某个具体 level 文件
|
|
477
|
+
* 把导出/API 测试与规范化行为测试混在同一文件语义里
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
### 实用对照
|
|
482
|
+
|
|
483
|
+
* `api/`:**库怎么用**
|
|
484
|
+
* `levels/`:**每一层做与不做**
|
|
485
|
+
* `contracts/`:**哪些必须恒真**
|
|
486
|
+
* `semantic` / `property` / `regression` / `performance`:**正确、稳健、效率是否仍成立**
|
|
171
487
|
|
|
172
488
|
---
|
|
173
489
|
|
|
174
|
-
|
|
490
|
+
### npm 脚本与 property 测试工具链
|
|
175
491
|
|
|
176
|
-
|
|
492
|
+
随机语义测试使用 **`mongodb-memory-server`** 与 **`fast-check`**,在固定文档 schema 与受限算子集合下,对比 normalize 前后真实 `find` 结果(相同 `sort` / `skip` / `limit`,投影 `{ _id: 1 }`),并断言 **`_id` 顺序一致**、返回 **`query` 幂等**;对 opaque 算子仅要求**不崩溃、第二次 normalize 稳定**。生成器见 `test/helpers/arbitraries.js`;**`FC_SEED` / `FC_RUNS` 默认值统一由 `test/helpers/fc-config.js` 管理**(也由 `arbitraries.js` 再导出)。
|
|
177
493
|
|
|
178
|
-
|
|
179
|
-
- `npm run test:semantic`:语义 + 全量回归 + property(默认 `FC_RUNS=200`,见 `fc-config.js`)
|
|
180
|
-
- `npm run test:semantic:quick`:本地快速跑:**降低 `FC_RUNS`(当前脚本为 45)**,仍包含 `test/regression/**` 与 `test/property/**`
|
|
181
|
-
- `npm run test:semantic:ci`:CI 较完整配置(脚本内 `FC_RUNS=200`、`FC_SEED=42`)
|
|
494
|
+
为**避免在线下载** MongoDB 二进制,可在运行语义测试前设置 **`MONGODB_BINARY`**、**`MONGOD_BINARY`** 或 **`MONGOMS_SYSTEM_BINARY`** 指向本机 `mongod`(见 `test/helpers/mongo-fixture.js`)。
|
|
182
495
|
|
|
183
|
-
|
|
496
|
+
* **`npm run test`**:先 build,再 `test:unit`,再 `test:semantic`。
|
|
497
|
+
* **`npm run test:api`**:仅 `test/api/**/*.test.js`。
|
|
498
|
+
* **`npm run test:levels`**:`test/levels/**/*.test.js` 与 `test/contracts/*.test.js`。
|
|
499
|
+
* **`npm run test:unit`**:除 `test/semantic/**`、`test/regression/**`、`test/property/**` 外的 `test/**/*.test.js`(含 `test/api/**`、`test/levels/**`、`test/contracts/**`、`test/performance/**` 等单元侧用例)。
|
|
500
|
+
* **`npm run test:semantic`**:语义 + 回归 + property(环境变量未设时的默认见 `fc-config.js`)。
|
|
501
|
+
* **`npm run test:semantic:quick`**:降低 **`FC_RUNS`(脚本内为 45)** 并设 **`FC_SEED=42`**,仍包含 `test/regression/**` 与 `test/property/**`。
|
|
502
|
+
* **`npm run test:semantic:ci`**:面向 CI(脚本内 `FC_RUNS=200`、`FC_SEED=42`)。
|
|
184
503
|
|
|
185
|
-
|
|
504
|
+
可通过 **`FC_SEED`**、**`FC_RUNS`**、可选 **`FC_QUICK=1`** 覆盖 property 参数(见 `fc-config.js`)。**property 失败如何复现、何时沉淀成固定用例**:见 [`test/REGRESSION.md`](test/REGRESSION.md)。
|
|
186
505
|
|
|
187
|
-
主随机语义等价**不包含**全文、地理、复杂 `$expr`、`$where`、聚合、collation 等;opaque 算子契约见
|
|
506
|
+
主随机语义等价**不包含**全文、地理、复杂 `$expr`、`$where`、聚合、collation 等;opaque 算子契约见 **`test/contracts/opaque-operators.all-levels.test.js`**。
|
|
188
507
|
|
|
189
508
|
---
|
|
190
509
|
|
package/dist/ast/types.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export type QueryNode = LogicalNode | FieldNode | TrueNode | FalseNode | OpaqueNode;
|
|
2
|
+
/**
|
|
3
|
+
* Compound query node for `$and` / `$or`.
|
|
4
|
+
* The `type` discriminant is `"logical"` for stable AST hashing (not a `NormalizeLevel` value).
|
|
5
|
+
*/
|
|
2
6
|
export interface LogicalNode {
|
|
3
7
|
type: "logical";
|
|
4
8
|
op: "$and" | "$or";
|
package/dist/ast/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ast/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpF,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,GAAG,KAAK,CAAC;IACnB,QAAQ,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,cAAc,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ast/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpF;;;GAGG;AACH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,MAAM,GAAG,KAAK,CAAC;IACnB,QAAQ,EAAE,SAAS,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,cAAc,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACvB,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export { normalizeQuery } from "./normalize";
|
|
2
2
|
export { resolveNormalizeOptions } from "./options/resolve";
|
|
3
|
-
export type { NormalizeLevel, NormalizeObserve, NormalizeOptions, NormalizeResult, NormalizeRules, NormalizeSafety, NormalizeStats, ResolvedNormalizeOptions, } from "./options/types";
|
|
3
|
+
export type { NormalizeLevel, NormalizeObserve, NormalizeOptions, NormalizePredicateOptions, NormalizeResult, NormalizeRules, NormalizeSafety, NormalizeStats, NormalizeScopeLayerOptions, PredicateFieldTrace, ResolvedNormalizeOptions, ScopeNormalizationTrace, ScopeTraceEvent, } from "./options/types";
|
|
4
|
+
export type { PredicateSafetyPolicy } from "./predicate/safety/predicate-safety-policy";
|
|
5
|
+
export type { ScopeSafetyPolicy } from "./scope/safety/scope-safety-policy";
|
|
6
|
+
export type { ConstraintExtractionRejection } from "./scope/context/constraint-set";
|
|
4
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,YAAY,EACR,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,eAAe,EACf,cAAc,EACd,wBAAwB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,YAAY,EACR,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,EACzB,eAAe,EACf,cAAc,EACd,eAAe,EACf,cAAc,EACd,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,GAClB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AACxF,YAAY,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,YAAY,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { NodeStats, ResolvedNormalizeOptions } from "./types";
|
|
1
|
+
import type { NodeStats, PredicateFieldTrace, ResolvedNormalizeOptions, ScopeTraceEvent } from "./types";
|
|
2
|
+
import type { ConstraintExtractionRejection } from "./scope/context/constraint-set";
|
|
2
3
|
export interface NormalizeContext {
|
|
3
4
|
options: ResolvedNormalizeOptions;
|
|
4
5
|
appliedRules: string[];
|
|
@@ -11,6 +12,9 @@ export interface NormalizeContext {
|
|
|
11
12
|
beforeStats?: NodeStats;
|
|
12
13
|
afterStats?: NodeStats;
|
|
13
14
|
depth: number;
|
|
15
|
+
predicateTraces?: PredicateFieldTrace[];
|
|
16
|
+
scopeTraceEvents?: ScopeTraceEvent[];
|
|
17
|
+
scopeConstraintRejections?: ConstraintExtractionRejection[];
|
|
14
18
|
}
|
|
15
19
|
export declare function createNormalizeContext(options: ResolvedNormalizeOptions): NormalizeContext;
|
|
16
20
|
//# sourceMappingURL=normalize-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize-context.d.ts","sourceRoot":"","sources":["../src/normalize-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"normalize-context.d.ts","sourceRoot":"","sources":["../src/normalize-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,SAAS,EACT,mBAAmB,EACnB,wBAAwB,EACxB,eAAe,EAClB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAEpF,MAAM,WAAW,gBAAgB;IAC7B,OAAO,EAAE,wBAAwB,CAAC;IAClC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC,yBAAyB,CAAC,EAAE,6BAA6B,EAAE,CAAC;CAC/D;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,wBAAwB,GAAG,gBAAgB,CAiB1F"}
|
|
@@ -14,6 +14,9 @@ function createNormalizeContext(options) {
|
|
|
14
14
|
beforeStats: undefined,
|
|
15
15
|
afterStats: undefined,
|
|
16
16
|
depth: 0,
|
|
17
|
+
predicateTraces: undefined,
|
|
18
|
+
scopeTraceEvents: undefined,
|
|
19
|
+
scopeConstraintRejections: undefined,
|
|
17
20
|
};
|
|
18
21
|
}
|
|
19
22
|
//# sourceMappingURL=normalize-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize-context.js","sourceRoot":"","sources":["../src/normalize-context.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"normalize-context.js","sourceRoot":"","sources":["../src/normalize-context.ts"],"names":[],"mappings":";;AAyBA,wDAiBC;AAjBD,SAAgB,sBAAsB,CAAC,OAAiC;IACpE,OAAO;QACH,OAAO;QACP,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE;QAChB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,KAAK;QAChB,aAAa,EAAE,SAAS;QACxB,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,SAAS;QACpB,WAAW,EAAE,SAAS;QACtB,UAAU,EAAE,SAAS;QACrB,KAAK,EAAE,CAAC;QACR,eAAe,EAAE,SAAS;QAC1B,gBAAgB,EAAE,SAAS;QAC3B,yBAAyB,EAAE,SAAS;KACvC,CAAC;AACN,CAAC"}
|
package/dist/normalize.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { NormalizeOptions, NormalizeResult, Query } from "./types";
|
|
2
2
|
/**
|
|
3
|
-
* 主入口:parse →(shape / predicate
|
|
3
|
+
* 主入口:parse →(shape / predicate / scope 直至稳定)→(scope 下可选 observe-only 的 detectCommonPredicatesInOr)→ canonicalize → compile。
|
|
4
4
|
*/
|
|
5
5
|
export declare function normalizeQuery(query: Query, options?: NormalizeOptions): NormalizeResult;
|
|
6
6
|
//# sourceMappingURL=normalize.d.ts.map
|
package/dist/normalize.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../src/normalize.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAiB,gBAAgB,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEvF;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAexF"}
|