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,18 @@
|
|
|
1
|
+
import type { SelectorAST } from "./ast/types";
|
|
2
|
+
import type { Selector } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* 仅对 AST 做优化(不 parse、不 compile),便于复用 AST 优化逻辑或做 AST 级测试/模糊测试。
|
|
5
|
+
* 管线:normalize → predicateMerge → fieldConditionNormalize → simplify → canonicalize。
|
|
6
|
+
*
|
|
7
|
+
* @param ast - 已解析的选择器 AST
|
|
8
|
+
* @returns 优化后的 AST,语义等价
|
|
9
|
+
*/
|
|
10
|
+
export declare function optimizeAst(ast: SelectorAST): SelectorAST;
|
|
11
|
+
/**
|
|
12
|
+
* 重写 MongoDB 查询/过滤条件:先递归修剪分支(冲突舍弃、合并同类项),再按结合律打平并规范化;
|
|
13
|
+
*
|
|
14
|
+
* @param selector - 原始选择器
|
|
15
|
+
* @returns 重写后的选择器,语义等价或更严
|
|
16
|
+
*/
|
|
17
|
+
export declare function rewriteQuerySelector(selector: Selector): Selector;
|
|
18
|
+
//# sourceMappingURL=optimize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize.d.ts","sourceRoot":"","sources":["../src/optimize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKxC;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,WAAW,GAAG,WAAW,CAMzD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAIjE"}
|
package/dist/optimize.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.optimizeAst = optimizeAst;
|
|
4
|
+
exports.rewriteQuerySelector = rewriteQuerySelector;
|
|
5
|
+
const core_1 = require("./core");
|
|
6
|
+
const compile_1 = require("./operations/compile");
|
|
7
|
+
const parse_1 = require("./operations/parse");
|
|
8
|
+
/**
|
|
9
|
+
* 仅对 AST 做优化(不 parse、不 compile),便于复用 AST 优化逻辑或做 AST 级测试/模糊测试。
|
|
10
|
+
* 管线:normalize → predicateMerge → fieldConditionNormalize → simplify → canonicalize。
|
|
11
|
+
*
|
|
12
|
+
* @param ast - 已解析的选择器 AST
|
|
13
|
+
* @returns 优化后的 AST,语义等价
|
|
14
|
+
*/
|
|
15
|
+
function optimizeAst(ast) {
|
|
16
|
+
const normalized = (0, core_1.normalize)(ast);
|
|
17
|
+
const merged = (0, core_1.predicateMerge)(normalized);
|
|
18
|
+
const fieldNormalized = (0, core_1.fieldConditionNormalize)(merged);
|
|
19
|
+
const simplified = (0, core_1.simplify)(fieldNormalized);
|
|
20
|
+
return (0, core_1.canonicalize)(simplified);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 重写 MongoDB 查询/过滤条件:先递归修剪分支(冲突舍弃、合并同类项),再按结合律打平并规范化;
|
|
24
|
+
*
|
|
25
|
+
* @param selector - 原始选择器
|
|
26
|
+
* @returns 重写后的选择器,语义等价或更严
|
|
27
|
+
*/
|
|
28
|
+
function rewriteQuerySelector(selector) {
|
|
29
|
+
const ast = (0, parse_1.parseSelector)(selector);
|
|
30
|
+
const canonical = optimizeAst(ast);
|
|
31
|
+
return (0, compile_1.compileSelector)(canonical);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=optimize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize.js","sourceRoot":"","sources":["../src/optimize.ts"],"names":[],"mappings":";;AAaA,kCAMC;AAQD,oDAIC;AA7BD,iCAAoG;AACpG,kDAAuD;AACvD,8CAAmD;AAEnD;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,GAAgB;IACxC,MAAM,UAAU,GAAG,IAAA,gBAAS,EAAC,GAAG,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAA,qBAAc,EAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,IAAA,8BAAuB,EAAC,MAAM,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,IAAA,eAAQ,EAAC,eAAe,CAAC,CAAC;IAC7C,OAAO,IAAA,mBAAY,EAAC,UAAU,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,oBAAoB,CAAC,QAAkB;IACnD,MAAM,GAAG,GAAG,IAAA,qBAAa,EAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,IAAA,yBAAe,EAAC,SAAS,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { NormalizeLevel, NormalizeObserve, NormalizeRules, NormalizeSafety } from "../types";
|
|
2
|
+
export declare const DEFAULT_LEVEL: NormalizeLevel;
|
|
3
|
+
export declare const DEFAULT_SAFETY: NormalizeSafety;
|
|
4
|
+
export declare const DEFAULT_OBSERVE: NormalizeObserve;
|
|
5
|
+
export declare const DEFAULT_RULES_BY_LEVEL: Record<NormalizeLevel, NormalizeRules>;
|
|
6
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/options/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAElG,eAAO,MAAM,aAAa,EAAE,cAAwB,CAAC;AAErD,eAAO,MAAM,cAAc,EAAE,eAG5B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,gBAG7B,CAAC;AA4EF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,CAKzE,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_RULES_BY_LEVEL = exports.DEFAULT_OBSERVE = exports.DEFAULT_SAFETY = exports.DEFAULT_LEVEL = void 0;
|
|
4
|
+
exports.DEFAULT_LEVEL = "shape";
|
|
5
|
+
exports.DEFAULT_SAFETY = {
|
|
6
|
+
maxNormalizeDepth: 32,
|
|
7
|
+
maxNodeGrowthRatio: 1.5,
|
|
8
|
+
};
|
|
9
|
+
exports.DEFAULT_OBSERVE = {
|
|
10
|
+
collectWarnings: true,
|
|
11
|
+
collectMetrics: false,
|
|
12
|
+
};
|
|
13
|
+
const SORT_RULES = {
|
|
14
|
+
sortLogicalChildren: true,
|
|
15
|
+
sortFieldPredicates: true,
|
|
16
|
+
};
|
|
17
|
+
const BASE_SHAPE_RULES = {
|
|
18
|
+
flattenLogical: true,
|
|
19
|
+
removeEmptyLogical: true,
|
|
20
|
+
collapseSingleChildLogical: true,
|
|
21
|
+
dedupeLogicalChildren: true,
|
|
22
|
+
};
|
|
23
|
+
const PREDICATE_RULES = {
|
|
24
|
+
dedupeSameFieldPredicates: true,
|
|
25
|
+
mergeComparablePredicates: true,
|
|
26
|
+
collapseContradictions: true,
|
|
27
|
+
};
|
|
28
|
+
const LOGICAL_EXTRA = {
|
|
29
|
+
detectCommonPredicatesInOr: true,
|
|
30
|
+
};
|
|
31
|
+
const EXPERIMENTAL_EXTRA = {
|
|
32
|
+
hoistCommonPredicatesFromOr: true,
|
|
33
|
+
};
|
|
34
|
+
function rulesForLevel(level) {
|
|
35
|
+
const base = {
|
|
36
|
+
...BASE_SHAPE_RULES,
|
|
37
|
+
dedupeSameFieldPredicates: false,
|
|
38
|
+
mergeComparablePredicates: false,
|
|
39
|
+
collapseContradictions: false,
|
|
40
|
+
...SORT_RULES,
|
|
41
|
+
detectCommonPredicatesInOr: false,
|
|
42
|
+
hoistCommonPredicatesFromOr: false,
|
|
43
|
+
};
|
|
44
|
+
if (level === "shape") {
|
|
45
|
+
return base;
|
|
46
|
+
}
|
|
47
|
+
const withPredicate = {
|
|
48
|
+
...base,
|
|
49
|
+
...PREDICATE_RULES,
|
|
50
|
+
};
|
|
51
|
+
if (level === "predicate") {
|
|
52
|
+
return withPredicate;
|
|
53
|
+
}
|
|
54
|
+
const withLogical = {
|
|
55
|
+
...withPredicate,
|
|
56
|
+
...LOGICAL_EXTRA,
|
|
57
|
+
};
|
|
58
|
+
if (level === "logical") {
|
|
59
|
+
return withLogical;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
...withLogical,
|
|
63
|
+
...EXPERIMENTAL_EXTRA,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
exports.DEFAULT_RULES_BY_LEVEL = {
|
|
67
|
+
shape: rulesForLevel("shape"),
|
|
68
|
+
predicate: rulesForLevel("predicate"),
|
|
69
|
+
logical: rulesForLevel("logical"),
|
|
70
|
+
experimental: rulesForLevel("experimental"),
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/options/constants.ts"],"names":[],"mappings":";;;AAEa,QAAA,aAAa,GAAmB,OAAO,CAAC;AAExC,QAAA,cAAc,GAAoB;IAC3C,iBAAiB,EAAE,EAAE;IACrB,kBAAkB,EAAE,GAAG;CAC1B,CAAC;AAEW,QAAA,eAAe,GAAqB;IAC7C,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,KAAK;CACxB,CAAC;AAEF,MAAM,UAAU,GAAwE;IACpF,mBAAmB,EAAE,IAAI;IACzB,mBAAmB,EAAE,IAAI;CAC5B,CAAC;AAEF,MAAM,gBAAgB,GAMlB;IACA,cAAc,EAAE,IAAI;IACpB,kBAAkB,EAAE,IAAI;IACxB,0BAA0B,EAAE,IAAI;IAChC,qBAAqB,EAAE,IAAI;CAC9B,CAAC;AAEF,MAAM,eAAe,GAGjB;IACA,yBAAyB,EAAE,IAAI;IAC/B,yBAAyB,EAAE,IAAI;IAC/B,sBAAsB,EAAE,IAAI;CAC/B,CAAC;AAEF,MAAM,aAAa,GAAuD;IACtE,0BAA0B,EAAE,IAAI;CACnC,CAAC;AAEF,MAAM,kBAAkB,GAAwD;IAC5E,2BAA2B,EAAE,IAAI;CACpC,CAAC;AAEF,SAAS,aAAa,CAAC,KAAqB;IACxC,MAAM,IAAI,GAAmB;QACzB,GAAG,gBAAgB;QACnB,yBAAyB,EAAE,KAAK;QAChC,yBAAyB,EAAE,KAAK;QAChC,sBAAsB,EAAE,KAAK;QAC7B,GAAG,UAAU;QACb,0BAA0B,EAAE,KAAK;QACjC,2BAA2B,EAAE,KAAK;KACrC,CAAC;IAEF,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,aAAa,GAAmB;QAClC,GAAG,IAAI;QACP,GAAG,eAAe;KACrB,CAAC;IAEF,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;QACxB,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,MAAM,WAAW,GAAmB;QAChC,GAAG,aAAa;QAChB,GAAG,aAAa;KACnB,CAAC;IAEF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,OAAO;QACH,GAAG,WAAW;QACd,GAAG,kBAAkB;KACxB,CAAC;AACN,CAAC;AAEY,QAAA,sBAAsB,GAA2C;IAC1E,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC;IAC7B,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC;IACrC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC;IACjC,YAAY,EAAE,aAAa,CAAC,cAAc,CAAC;CAC9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/options/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAQ3F,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,wBAAwB,CAS5F"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveNormalizeOptions = resolveNormalizeOptions;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
function resolveNormalizeOptions(options) {
|
|
6
|
+
const level = resolveLevel(options?.level);
|
|
7
|
+
return {
|
|
8
|
+
level,
|
|
9
|
+
rules: mergeRules(level, options?.rules),
|
|
10
|
+
safety: mergeSafety(options?.safety),
|
|
11
|
+
observe: mergeObserve(options?.observe),
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function resolveLevel(level) {
|
|
15
|
+
return level ?? constants_1.DEFAULT_LEVEL;
|
|
16
|
+
}
|
|
17
|
+
function mergeRules(level, rules) {
|
|
18
|
+
return {
|
|
19
|
+
...constants_1.DEFAULT_RULES_BY_LEVEL[level],
|
|
20
|
+
...(rules ?? {}),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function mergeSafety(safety) {
|
|
24
|
+
return {
|
|
25
|
+
...constants_1.DEFAULT_SAFETY,
|
|
26
|
+
...(safety ?? {}),
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function mergeObserve(observe) {
|
|
30
|
+
return {
|
|
31
|
+
...constants_1.DEFAULT_OBSERVE,
|
|
32
|
+
...(observe ?? {}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/options/resolve.ts"],"names":[],"mappings":";;AAQA,0DASC;AAhBD,2CAKqB;AAErB,SAAgB,uBAAuB,CAAC,OAA0B;IAC9D,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE3C,OAAO;QACH,KAAK;QACL,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC;QACxC,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC;QACpC,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC;KAC1C,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,KAAsB;IACxC,OAAO,KAAK,IAAI,yBAAa,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,KAAqB,EAAE,KAAkD;IACzF,OAAO;QACH,GAAG,kCAAsB,CAAC,KAAK,CAAC;QAChC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;KACnB,CAAC;AACN,CAAC;AAED,SAAS,WAAW,CAAC,MAAoD;IACrE,OAAO;QACH,GAAG,0BAAc;QACjB,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC;KACpB,CAAC;AACN,CAAC;AAED,SAAS,YAAY,CAAC,OAAsD;IACxE,OAAO;QACH,GAAG,2BAAe;QAClB,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;KACrB,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,eAAe,EACf,cAAc,EACd,wBAAwB,GAC3B,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/options/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/parse/parse.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAkB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAI7D,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,GAAG,SAAS,CAMzF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseQuery = parseQuery;
|
|
4
|
+
const builders_1 = require("../ast/builders");
|
|
5
|
+
const is_opaque_1 = require("../utils/is-opaque");
|
|
6
|
+
const plain_object_1 = require("./plain-object");
|
|
7
|
+
function parseQuery(query, _normalizeContext) {
|
|
8
|
+
if (!(0, plain_object_1.isPlainObject)(query)) {
|
|
9
|
+
return (0, builders_1.opaqueNode)({}, "root query is not a plain object");
|
|
10
|
+
}
|
|
11
|
+
return parseRootObject(query, _normalizeContext);
|
|
12
|
+
}
|
|
13
|
+
function parseRootObject(input, normalizeContext) {
|
|
14
|
+
const children = [];
|
|
15
|
+
for (const [key, value] of Object.entries(input)) {
|
|
16
|
+
children.push(parseEntry(key, value, normalizeContext));
|
|
17
|
+
}
|
|
18
|
+
if (children.length === 0) {
|
|
19
|
+
return (0, builders_1.trueNode)();
|
|
20
|
+
}
|
|
21
|
+
if (children.length === 1) {
|
|
22
|
+
return children[0];
|
|
23
|
+
}
|
|
24
|
+
return (0, builders_1.andNode)(children);
|
|
25
|
+
}
|
|
26
|
+
function parseEntry(key, value, normalizeContext) {
|
|
27
|
+
if (key === "$and" || key === "$or") {
|
|
28
|
+
return parseLogicalNode(key, value, normalizeContext);
|
|
29
|
+
}
|
|
30
|
+
if (key.startsWith("$")) {
|
|
31
|
+
return (0, builders_1.opaqueNode)({ [key]: value }, `unsupported top-level operator ${key}`);
|
|
32
|
+
}
|
|
33
|
+
return parseFieldNode(key, value, normalizeContext);
|
|
34
|
+
}
|
|
35
|
+
function parseLogicalNode(op, value, normalizeContext) {
|
|
36
|
+
if (!Array.isArray(value)) {
|
|
37
|
+
return (0, builders_1.opaqueNode)({ [op]: value }, `${op} value is not array`);
|
|
38
|
+
}
|
|
39
|
+
const children = value.map((item) => {
|
|
40
|
+
if (!(0, plain_object_1.isPlainObject)(item)) {
|
|
41
|
+
return (0, builders_1.opaqueNode)(item, `${op} child is not plain object`);
|
|
42
|
+
}
|
|
43
|
+
return parseRootObject(item, normalizeContext);
|
|
44
|
+
});
|
|
45
|
+
if (op === "$and" && children.length === 0) {
|
|
46
|
+
return (0, builders_1.trueNode)();
|
|
47
|
+
}
|
|
48
|
+
if (op === "$or" && children.length === 0) {
|
|
49
|
+
return (0, builders_1.falseNode)();
|
|
50
|
+
}
|
|
51
|
+
return op === "$and" ? (0, builders_1.andNode)(children) : (0, builders_1.orNode)(children);
|
|
52
|
+
}
|
|
53
|
+
function parseFieldNode(field, value, normalizeContext) {
|
|
54
|
+
if ((0, is_opaque_1.shouldTreatAsOpaque)(value)) {
|
|
55
|
+
return (0, builders_1.opaqueNode)({ [field]: value }, `field ${field}: opaque operator object`);
|
|
56
|
+
}
|
|
57
|
+
const predicates = parseFieldPredicates(field, value, normalizeContext);
|
|
58
|
+
if (predicates.length === 0) {
|
|
59
|
+
return (0, builders_1.opaqueNode)({ [field]: value }, `field ${field} produced no predicates`);
|
|
60
|
+
}
|
|
61
|
+
return (0, builders_1.fieldNode)(field, predicates);
|
|
62
|
+
}
|
|
63
|
+
function isOperatorObject(value) {
|
|
64
|
+
return (!!value &&
|
|
65
|
+
typeof value === "object" &&
|
|
66
|
+
!Array.isArray(value) &&
|
|
67
|
+
Object.keys(value).some((k) => k.startsWith("$")));
|
|
68
|
+
}
|
|
69
|
+
function parseFieldPredicates(field, value, _normalizeContext) {
|
|
70
|
+
if (!isOperatorObject(value)) {
|
|
71
|
+
return [parseDirectEquality(value)];
|
|
72
|
+
}
|
|
73
|
+
const predicates = [];
|
|
74
|
+
const obj = value;
|
|
75
|
+
for (const [op, opValue] of Object.entries(obj)) {
|
|
76
|
+
if (!op.startsWith("$")) {
|
|
77
|
+
return [{ op: "raw", value, opaque: true }];
|
|
78
|
+
}
|
|
79
|
+
if (isOpaqueOperatorName(op)) {
|
|
80
|
+
return [{ op: "raw", value, opaque: true }];
|
|
81
|
+
}
|
|
82
|
+
switch (op) {
|
|
83
|
+
case "$eq":
|
|
84
|
+
case "$ne":
|
|
85
|
+
case "$in":
|
|
86
|
+
case "$nin":
|
|
87
|
+
case "$gt":
|
|
88
|
+
case "$gte":
|
|
89
|
+
case "$lt":
|
|
90
|
+
case "$lte":
|
|
91
|
+
case "$exists":
|
|
92
|
+
predicates.push({ op, value: opValue });
|
|
93
|
+
break;
|
|
94
|
+
default:
|
|
95
|
+
return [{ op: "raw", value, opaque: true }];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return predicates;
|
|
99
|
+
}
|
|
100
|
+
function isOpaqueOperatorName(op) {
|
|
101
|
+
return (op === "$regex" ||
|
|
102
|
+
op === "$not" ||
|
|
103
|
+
op === "$elemMatch" ||
|
|
104
|
+
op === "$expr" ||
|
|
105
|
+
op === "$geoWithin" ||
|
|
106
|
+
op === "$geoIntersects" ||
|
|
107
|
+
op === "$near" ||
|
|
108
|
+
op === "$nearSphere" ||
|
|
109
|
+
op === "$text");
|
|
110
|
+
}
|
|
111
|
+
function parseDirectEquality(value) {
|
|
112
|
+
return { op: "$eq", value };
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/parse/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plain-object.d.ts","sourceRoot":"","sources":["../../src/parse/plain-object.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAE9E"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isPlainObject = isPlainObject;
|
|
4
|
+
function isPlainObject(value) {
|
|
5
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=plain-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plain-object.js","sourceRoot":"","sources":["../../src/parse/plain-object.ts"],"names":[],"mappings":";;AAAA,sCAEC;AAFD,SAAgB,aAAa,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ParsedOp, SelectorContentItem } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* 将「不含 $and/$or/$nor 等逻辑子句」的扁平 selector 解析为 { field, op, value } 列表。
|
|
4
|
+
* 仅用于单层字段条件,逻辑子句应在调用前拆出并分别解析。
|
|
5
|
+
*
|
|
6
|
+
* @param selector - 单层 selector(不含顶层 $and/$or/$nor)
|
|
7
|
+
* @returns 解析后的条件列表
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseSelector(selector: Record<string, unknown>): ParsedOp[];
|
|
10
|
+
/**
|
|
11
|
+
* 将某字段的 selector 值(可能是字面量或 { $eq, $in, $gt, ... })转为统一的「操作符-值」列表,
|
|
12
|
+
* 用于冲突检测、合并时的比较与归并。
|
|
13
|
+
*
|
|
14
|
+
* @param value - 字段对应的值或操作符对象
|
|
15
|
+
* @returns 标准化后的 operator + value 列表
|
|
16
|
+
*/
|
|
17
|
+
export declare function getSelectorContent(value: unknown): SelectorContentItem[];
|
|
18
|
+
//# sourceMappingURL=parse-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-selector.d.ts","sourceRoot":"","sources":["../src/parse-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,QAAQ,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE1E;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAE,CAI3E;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,mBAAmB,EAAE,CAIxE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseSelector = parseSelector;
|
|
4
|
+
exports.getSelectorContent = getSelectorContent;
|
|
5
|
+
/**
|
|
6
|
+
* 将「不含 $and/$or/$nor 等逻辑子句」的扁平 selector 解析为 { field, op, value } 列表。
|
|
7
|
+
* 仅用于单层字段条件,逻辑子句应在调用前拆出并分别解析。
|
|
8
|
+
*
|
|
9
|
+
* @param selector - 单层 selector(不含顶层 $and/$or/$nor)
|
|
10
|
+
* @returns 解析后的条件列表
|
|
11
|
+
*/
|
|
12
|
+
function parseSelector(selector) {
|
|
13
|
+
// TODO: 实现解析逻辑
|
|
14
|
+
void selector;
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 将某字段的 selector 值(可能是字面量或 { $eq, $in, $gt, ... })转为统一的「操作符-值」列表,
|
|
19
|
+
* 用于冲突检测、合并时的比较与归并。
|
|
20
|
+
*
|
|
21
|
+
* @param value - 字段对应的值或操作符对象
|
|
22
|
+
* @returns 标准化后的 operator + value 列表
|
|
23
|
+
*/
|
|
24
|
+
function getSelectorContent(value) {
|
|
25
|
+
// TODO: 实现(如字面量 -> [{ operator: '$eq', value }],多操作符 -> 多项)
|
|
26
|
+
void value;
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=parse-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-selector.js","sourceRoot":"","sources":["../src/parse-selector.ts"],"names":[],"mappings":";;AASA,sCAIC;AASD,gDAIC;AAxBD;;;;;;GAMG;AACH,SAAgB,aAAa,CAAC,QAAiC;IAC7D,eAAe;IACf,KAAK,QAAQ,CAAC;IACd,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,KAAc;IAC/C,4DAA4D;IAC5D,KAAK,KAAK,CAAC;IACX,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonicalize.d.ts","sourceRoot":"","sources":["../../src/passes/canonicalize.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAkB,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAG7D,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAE3F"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.canonicalize = canonicalize;
|
|
4
|
+
const builders_1 = require("../ast/builders");
|
|
5
|
+
const guards_1 = require("../ast/guards");
|
|
6
|
+
const hash_1 = require("../ast/hash");
|
|
7
|
+
const stable_sort_1 = require("../utils/stable-sort");
|
|
8
|
+
function canonicalize(node, normalizeContext) {
|
|
9
|
+
return canonicalizeRecursive(node, normalizeContext);
|
|
10
|
+
}
|
|
11
|
+
function canonicalizeRecursive(node, normalizeContext) {
|
|
12
|
+
if ((0, guards_1.isLogicalNode)(node)) {
|
|
13
|
+
let children = node.children.map((child) => canonicalizeRecursive(child, normalizeContext));
|
|
14
|
+
if (normalizeContext.options.rules.sortLogicalChildren) {
|
|
15
|
+
children = sortChildren(children);
|
|
16
|
+
}
|
|
17
|
+
return node.op === "$and" ? (0, builders_1.andNode)(children) : (0, builders_1.orNode)(children);
|
|
18
|
+
}
|
|
19
|
+
if ((0, guards_1.isFieldNode)(node)) {
|
|
20
|
+
let predicates = node.predicates;
|
|
21
|
+
if (normalizeContext.options.rules.sortFieldPredicates) {
|
|
22
|
+
predicates = sortPredicates(predicates);
|
|
23
|
+
}
|
|
24
|
+
return (0, builders_1.fieldNode)(node.field, predicates);
|
|
25
|
+
}
|
|
26
|
+
return node;
|
|
27
|
+
}
|
|
28
|
+
function sortPredicates(predicates) {
|
|
29
|
+
return (0, stable_sort_1.stableSort)(predicates, (a, b) => {
|
|
30
|
+
const opCmp = a.op.localeCompare(b.op);
|
|
31
|
+
if (opCmp !== 0) {
|
|
32
|
+
return opCmp;
|
|
33
|
+
}
|
|
34
|
+
return (0, hash_1.hashPredicate)(a).localeCompare((0, hash_1.hashPredicate)(b));
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
function sortChildren(children) {
|
|
38
|
+
return (0, stable_sort_1.stableSort)(children, (a, b) => (0, hash_1.hashNode)(a).localeCompare((0, hash_1.hashNode)(b)));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=canonicalize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonicalize.js","sourceRoot":"","sources":["../../src/passes/canonicalize.ts"],"names":[],"mappings":";;AAOA,oCAEC;AATD,8CAA6D;AAC7D,0CAA2D;AAC3D,sCAAsD;AAGtD,sDAAkD;AAElD,SAAgB,YAAY,CAAC,IAAe,EAAE,gBAAkC;IAC5E,OAAO,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAe,EAAE,gBAAkC;IAC9E,IAAI,IAAA,sBAAa,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAE5F,IAAI,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;YACrD,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAA,kBAAO,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,QAAQ,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,IAAA,oBAAW,EAAC,IAAI,CAAC,EAAE,CAAC;QACpB,IAAI,UAAU,GAAqB,IAAI,CAAC,UAAU,CAAC;QAEnD,IAAI,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC;YACrD,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,IAAA,oBAAS,EAAC,IAAI,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,cAAc,CAAC,UAA4B;IAChD,OAAO,IAAA,wBAAU,EAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAA,oBAAa,EAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAA,oBAAa,EAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,YAAY,CAAC,QAAqB;IACvC,OAAO,IAAA,wBAAU,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAA,eAAQ,EAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAA,eAAQ,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-predicate.d.ts","sourceRoot":"","sources":["../../src/passes/normalize-predicate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAA6B,SAAS,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAK7D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAEjG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizePredicate = normalizePredicate;
|
|
4
|
+
const builders_1 = require("../ast/builders");
|
|
5
|
+
const guards_1 = require("../ast/guards");
|
|
6
|
+
const collapse_contradictions_1 = require("../rules/predicate/collapse-contradictions");
|
|
7
|
+
const dedupe_same_field_predicates_1 = require("../rules/predicate/dedupe-same-field-predicates");
|
|
8
|
+
const merge_comparable_predicates_1 = require("../rules/predicate/merge-comparable-predicates");
|
|
9
|
+
function normalizePredicate(node, normalizeContext) {
|
|
10
|
+
return normalizePredicateRecursive(node, normalizeContext);
|
|
11
|
+
}
|
|
12
|
+
function normalizePredicateRecursive(node, normalizeContext) {
|
|
13
|
+
if ((0, guards_1.isLogicalNode)(node)) {
|
|
14
|
+
const nextChildren = node.children.map((child) => normalizePredicateRecursive(child, normalizeContext));
|
|
15
|
+
const mergedChildren = node.op === "$and" ? mergeAndSiblingFieldNodesUnderAnd(nextChildren, normalizeContext) : nextChildren;
|
|
16
|
+
return node.op === "$and" ? (0, builders_1.andNode)(mergedChildren) : (0, builders_1.orNode)(mergedChildren);
|
|
17
|
+
}
|
|
18
|
+
if ((0, guards_1.isFieldNode)(node)) {
|
|
19
|
+
return applyPredicateRulesToField(node, normalizeContext);
|
|
20
|
+
}
|
|
21
|
+
return node;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 同一 `$and` 层上合并同名字段子句,再跑谓词规则(可检出 `{ $and: [{ a: 1 }, { a: 2 }] }` 等矛盾)。
|
|
25
|
+
*/
|
|
26
|
+
function mergeAndSiblingFieldNodesUnderAnd(children, normalizeContext) {
|
|
27
|
+
const byField = new Map();
|
|
28
|
+
const rest = [];
|
|
29
|
+
for (const child of children) {
|
|
30
|
+
if ((0, guards_1.isFieldNode)(child)) {
|
|
31
|
+
const cur = byField.get(child.field) ?? [];
|
|
32
|
+
byField.set(child.field, [...cur, ...child.predicates]);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
rest.push(child);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const merged = [];
|
|
39
|
+
for (const [field, preds] of byField) {
|
|
40
|
+
merged.push(applyPredicateRulesToField((0, builders_1.fieldNode)(field, preds), normalizeContext));
|
|
41
|
+
}
|
|
42
|
+
return [...rest, ...merged];
|
|
43
|
+
}
|
|
44
|
+
function applyPredicateRulesToField(node, normalizeContext) {
|
|
45
|
+
let current = node;
|
|
46
|
+
if (normalizeContext.options.rules.dedupeSameFieldPredicates) {
|
|
47
|
+
current = (0, dedupe_same_field_predicates_1.dedupeSameFieldPredicates)(current, normalizeContext);
|
|
48
|
+
}
|
|
49
|
+
if ((0, guards_1.isFieldNode)(current) && normalizeContext.options.rules.mergeComparablePredicates) {
|
|
50
|
+
current = (0, merge_comparable_predicates_1.mergeComparablePredicates)(current, normalizeContext);
|
|
51
|
+
}
|
|
52
|
+
if ((0, guards_1.isFieldNode)(current) && normalizeContext.options.rules.collapseContradictions) {
|
|
53
|
+
current = (0, collapse_contradictions_1.collapseContradictions)(current, normalizeContext);
|
|
54
|
+
}
|
|
55
|
+
return current;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=normalize-predicate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-predicate.js","sourceRoot":"","sources":["../../src/passes/normalize-predicate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-shape.d.ts","sourceRoot":"","sources":["../../src/passes/normalize-shape.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAM7D,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAE7F"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeShape = normalizeShape;
|
|
4
|
+
const builders_1 = require("../ast/builders");
|
|
5
|
+
const guards_1 = require("../ast/guards");
|
|
6
|
+
const collapse_single_child_logical_1 = require("../rules/shape/collapse-single-child-logical");
|
|
7
|
+
const dedupe_logical_children_1 = require("../rules/shape/dedupe-logical-children");
|
|
8
|
+
const flatten_logical_1 = require("../rules/shape/flatten-logical");
|
|
9
|
+
const remove_empty_logical_1 = require("../rules/shape/remove-empty-logical");
|
|
10
|
+
function normalizeShape(node, normalizeContext) {
|
|
11
|
+
return normalizeShapeRecursive(node, normalizeContext);
|
|
12
|
+
}
|
|
13
|
+
function normalizeShapeRecursive(node, normalizeContext) {
|
|
14
|
+
if ((0, guards_1.isLogicalNode)(node)) {
|
|
15
|
+
const normalizedChildren = node.children.map((child) => normalizeShapeRecursive(child, normalizeContext));
|
|
16
|
+
const rebuilt = node.op === "$and" ? (0, builders_1.andNode)(normalizedChildren) : (0, builders_1.orNode)(normalizedChildren);
|
|
17
|
+
return applyShapeRules(rebuilt, normalizeContext);
|
|
18
|
+
}
|
|
19
|
+
return node;
|
|
20
|
+
}
|
|
21
|
+
function applyShapeRules(node, normalizeContext) {
|
|
22
|
+
let current = node;
|
|
23
|
+
if (normalizeContext.options.rules.flattenLogical) {
|
|
24
|
+
current = (0, flatten_logical_1.flattenLogical)(current, normalizeContext);
|
|
25
|
+
}
|
|
26
|
+
if (normalizeContext.options.rules.removeEmptyLogical) {
|
|
27
|
+
current = (0, remove_empty_logical_1.removeEmptyLogical)(current, normalizeContext);
|
|
28
|
+
}
|
|
29
|
+
if (normalizeContext.options.rules.collapseSingleChildLogical) {
|
|
30
|
+
current = (0, collapse_single_child_logical_1.collapseSingleChildLogical)(current, normalizeContext);
|
|
31
|
+
}
|
|
32
|
+
if (normalizeContext.options.rules.dedupeLogicalChildren) {
|
|
33
|
+
current = (0, dedupe_logical_children_1.dedupeLogicalChildren)(current, normalizeContext);
|
|
34
|
+
}
|
|
35
|
+
return current;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=normalize-shape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-shape.js","sourceRoot":"","sources":["../../src/passes/normalize-shape.ts"],"names":[],"mappings":";;AASA,wCAEC;AAXD,8CAAkD;AAClD,0CAA8C;AAG9C,gGAA0F;AAC1F,oFAA+E;AAC/E,oEAAgE;AAChE,8EAAyE;AAEzE,SAAgB,cAAc,CAAC,IAAe,EAAE,gBAAkC;IAC9E,OAAO,uBAAuB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,uBAAuB,CAAC,IAAe,EAAE,gBAAkC;IAChF,IAAI,IAAA,sBAAa,EAAC,IAAI,CAAC,EAAE,CAAC;QACtB,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,uBAAuB,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAE1G,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAA,kBAAO,EAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,kBAAkB,CAAC,CAAC;QAE9F,OAAO,eAAe,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,eAAe,CAAC,IAAe,EAAE,gBAAkC;IACxE,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,IAAI,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;QAChD,OAAO,GAAG,IAAA,gCAAc,EAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC;QACpD,OAAO,GAAG,IAAA,yCAAkB,EAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC;QAC5D,OAAO,GAAG,IAAA,0DAA0B,EAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;QACvD,OAAO,GAAG,IAAA,+CAAqB,EAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simplify.d.ts","sourceRoot":"","sources":["../../src/passes/simplify.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAEvF"}
|