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,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RULE_ID = void 0;
|
|
4
|
+
exports.collapseContradictions = collapseContradictions;
|
|
5
|
+
const builders_1 = require("../../ast/builders");
|
|
6
|
+
const guards_1 = require("../../ast/guards");
|
|
7
|
+
const warnings_1 = require("../../observe/warnings");
|
|
8
|
+
const deep_equal_1 = require("../../utils/deep-equal");
|
|
9
|
+
exports.RULE_ID = "predicate.collapseContradictions";
|
|
10
|
+
function hasExplicitContradiction(predicates, field, _normalizeContext) {
|
|
11
|
+
const eq = predicates.find((p) => p.op === "$eq");
|
|
12
|
+
const neList = predicates.filter((p) => p.op === "$ne");
|
|
13
|
+
const inList = predicates.filter((p) => p.op === "$in");
|
|
14
|
+
if (eq) {
|
|
15
|
+
for (const ne of neList) {
|
|
16
|
+
if ((0, deep_equal_1.deepEqual)(eq.value, ne.value)) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
for (const inPredicate of inList) {
|
|
21
|
+
if (!Array.isArray(inPredicate.value)) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
const found = inPredicate.value.some((item) => (0, deep_equal_1.deepEqual)(item, eq.value));
|
|
25
|
+
if (!found) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
function collapseContradictions(node, normalizeContext) {
|
|
33
|
+
if (!(0, guards_1.isFieldNode)(node)) {
|
|
34
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "node is not field");
|
|
35
|
+
return node;
|
|
36
|
+
}
|
|
37
|
+
const hasConflict = hasExplicitContradiction(node.predicates, node.field, normalizeContext);
|
|
38
|
+
if (!hasConflict) {
|
|
39
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "no explicit contradiction");
|
|
40
|
+
return node;
|
|
41
|
+
}
|
|
42
|
+
(0, warnings_1.markRuleApplied)(normalizeContext, exports.RULE_ID);
|
|
43
|
+
return (0, builders_1.falseNode)();
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=collapse-contradictions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collapse-contradictions.js","sourceRoot":"","sources":["../../../src/rules/predicate/collapse-contradictions.ts"],"names":[],"mappings":";;;AAmCA,wDAeC;AAlDD,iDAA+C;AAC/C,6CAA+C;AAG/C,qDAA0E;AAC1E,uDAAmD;AAEtC,QAAA,OAAO,GAAG,kCAAkC,CAAC;AAE1D,SAAS,wBAAwB,CAAC,UAA4B,EAAE,KAAa,EAAE,iBAAmC;IAC9G,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IACxD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAExD,IAAI,EAAE,EAAE,CAAC;QACL,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;YACtB,IAAI,IAAA,sBAAS,EAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,KAAK,MAAM,WAAW,IAAI,MAAM,EAAE,CAAC;YAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,SAAS;YACb,CAAC;YACD,MAAM,KAAK,GAAI,WAAW,CAAC,KAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,sBAAS,EAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YACzF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAgB,sBAAsB,CAAC,IAAe,EAAE,gBAAkC;IACtF,IAAI,CAAC,IAAA,oBAAW,EAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,mBAAmB,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,WAAW,GAAG,wBAAwB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAE5F,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,2BAA2B,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,CAAC,CAAC;IAC3C,OAAO,IAAA,oBAAS,GAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { QueryNode } from "../../ast/types";
|
|
2
|
+
import type { NormalizeContext } from "../../normalize-context";
|
|
3
|
+
export declare const RULE_ID = "predicate.dedupeSameFieldPredicates";
|
|
4
|
+
export declare function dedupeSameFieldPredicates(node: QueryNode, normalizeContext: NormalizeContext): QueryNode;
|
|
5
|
+
//# sourceMappingURL=dedupe-same-field-predicates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe-same-field-predicates.d.ts","sourceRoot":"","sources":["../../../src/rules/predicate/dedupe-same-field-predicates.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAkB,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,eAAO,MAAM,OAAO,wCAAwC,CAAC;AAgB7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAexG"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RULE_ID = void 0;
|
|
4
|
+
exports.dedupeSameFieldPredicates = dedupeSameFieldPredicates;
|
|
5
|
+
const builders_1 = require("../../ast/builders");
|
|
6
|
+
const guards_1 = require("../../ast/guards");
|
|
7
|
+
const warnings_1 = require("../../observe/warnings");
|
|
8
|
+
const deep_equal_1 = require("../../utils/deep-equal");
|
|
9
|
+
exports.RULE_ID = "predicate.dedupeSameFieldPredicates";
|
|
10
|
+
function uniquePredicates(predicates) {
|
|
11
|
+
const result = [];
|
|
12
|
+
for (const predicate of predicates) {
|
|
13
|
+
const exists = result.some((item) => item.op === predicate.op && (0, deep_equal_1.deepEqual)(item.value, predicate.value));
|
|
14
|
+
if (!exists) {
|
|
15
|
+
result.push(predicate);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
function dedupeSameFieldPredicates(node, normalizeContext) {
|
|
21
|
+
if (!(0, guards_1.isFieldNode)(node)) {
|
|
22
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "node is not field");
|
|
23
|
+
return node;
|
|
24
|
+
}
|
|
25
|
+
const nextPredicates = uniquePredicates(node.predicates);
|
|
26
|
+
if (nextPredicates.length === node.predicates.length) {
|
|
27
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "no duplicate predicates");
|
|
28
|
+
return node;
|
|
29
|
+
}
|
|
30
|
+
(0, warnings_1.markRuleApplied)(normalizeContext, exports.RULE_ID);
|
|
31
|
+
return (0, builders_1.fieldNode)(node.field, nextPredicates);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=dedupe-same-field-predicates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe-same-field-predicates.js","sourceRoot":"","sources":["../../../src/rules/predicate/dedupe-same-field-predicates.ts"],"names":[],"mappings":";;;AAuBA,8DAeC;AAtCD,iDAA+C;AAC/C,6CAA+C;AAG/C,qDAA0E;AAC1E,uDAAmD;AAEtC,QAAA,OAAO,GAAG,qCAAqC,CAAC;AAE7D,SAAS,gBAAgB,CAAC,UAA4B;IAClD,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,IAAI,IAAA,sBAAS,EAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAEzG,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAgB,yBAAyB,CAAC,IAAe,EAAE,gBAAkC;IACzF,IAAI,CAAC,IAAA,oBAAW,EAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,mBAAmB,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,cAAc,GAAG,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEzD,IAAI,cAAc,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACnD,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,yBAAyB,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,CAAC,CAAC;IAC3C,OAAO,IAAA,oBAAS,EAAC,IAAI,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { QueryNode } from "../../ast/types";
|
|
2
|
+
import type { NormalizeContext } from "../../normalize-context";
|
|
3
|
+
export declare const RULE_ID = "predicate.mergeComparablePredicates";
|
|
4
|
+
export declare function mergeComparablePredicates(node: QueryNode, normalizeContext: NormalizeContext): QueryNode;
|
|
5
|
+
//# sourceMappingURL=merge-comparable-predicates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-comparable-predicates.d.ts","sourceRoot":"","sources":["../../../src/rules/predicate/merge-comparable-predicates.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,eAAO,MAAM,OAAO,wCAAwC,CAAC;AAE7D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAwBxG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RULE_ID = void 0;
|
|
4
|
+
exports.mergeComparablePredicates = mergeComparablePredicates;
|
|
5
|
+
const builders_1 = require("../../ast/builders");
|
|
6
|
+
const guards_1 = require("../../ast/guards");
|
|
7
|
+
const hash_1 = require("../../ast/hash");
|
|
8
|
+
const warnings_1 = require("../../observe/warnings");
|
|
9
|
+
const merge_predicates_internal_1 = require("./merge-predicates-internal");
|
|
10
|
+
exports.RULE_ID = "predicate.mergeComparablePredicates";
|
|
11
|
+
function mergeComparablePredicates(node, normalizeContext) {
|
|
12
|
+
if (!(0, guards_1.isFieldNode)(node)) {
|
|
13
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "node is not field");
|
|
14
|
+
return node;
|
|
15
|
+
}
|
|
16
|
+
const merged = (0, merge_predicates_internal_1.mergePredicates)(node.predicates, normalizeContext, node.field);
|
|
17
|
+
if ((0, merge_predicates_internal_1.isMergeFalse)(merged)) {
|
|
18
|
+
(0, warnings_1.markRuleApplied)(normalizeContext, exports.RULE_ID);
|
|
19
|
+
return merged;
|
|
20
|
+
}
|
|
21
|
+
const unchanged = merged.length === node.predicates.length &&
|
|
22
|
+
merged.every((p, i) => (0, hash_1.hashPredicate)(p) === (0, hash_1.hashPredicate)(node.predicates[i]));
|
|
23
|
+
if (unchanged) {
|
|
24
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "no comparable predicate merge applied");
|
|
25
|
+
return node;
|
|
26
|
+
}
|
|
27
|
+
(0, warnings_1.markRuleApplied)(normalizeContext, exports.RULE_ID);
|
|
28
|
+
return (0, builders_1.fieldNode)(node.field, merged);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=merge-comparable-predicates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-comparable-predicates.js","sourceRoot":"","sources":["../../../src/rules/predicate/merge-comparable-predicates.ts"],"names":[],"mappings":";;;AAUA,8DAwBC;AAlCD,iDAA0D;AAC1D,6CAA+C;AAC/C,yCAA+C;AAG/C,qDAA0E;AAC1E,2EAA4E;AAE/D,QAAA,OAAO,GAAG,qCAAqC,CAAC;AAE7D,SAAgB,yBAAyB,CAAC,IAAe,EAAE,gBAAkC;IACzF,IAAI,CAAC,IAAA,oBAAW,EAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,mBAAmB,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,2CAAe,EAAC,IAAI,CAAC,UAAU,EAAE,gBAAgB,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAE9E,IAAI,IAAA,wCAAY,EAAC,MAAM,CAAC,EAAE,CAAC;QACvB,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,CAAC,CAAC;QAC3C,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GACX,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,UAAU,CAAC,MAAM;QACxC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAA,oBAAa,EAAC,CAAC,CAAC,KAAK,IAAA,oBAAa,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnF,IAAI,SAAS,EAAE,CAAC;QACZ,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,uCAAuC,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,CAAC,CAAC;IAC3C,OAAO,IAAA,oBAAS,EAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FalseNode } from "../../ast/types";
|
|
2
|
+
import type { FieldPredicate } from "../../ast/types";
|
|
3
|
+
import type { NormalizeContext } from "../../normalize-context";
|
|
4
|
+
export type MergePredicatesResult = FieldPredicate[] | FalseNode;
|
|
5
|
+
export declare function isMergeFalse(result: MergePredicatesResult): result is FalseNode;
|
|
6
|
+
export declare function mergePredicates(predicates: FieldPredicate[], normalizeContext: NormalizeContext, field: string): MergePredicatesResult;
|
|
7
|
+
//# sourceMappingURL=merge-predicates-internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-predicates-internal.d.ts","sourceRoot":"","sources":["../../../src/rules/predicate/merge-predicates-internal.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,MAAM,MAAM,qBAAqB,GAAG,cAAc,EAAE,GAAG,SAAS,CAAC;AAEjE,wBAAgB,YAAY,CAAC,MAAM,EAAE,qBAAqB,GAAG,MAAM,IAAI,SAAS,CAE/E;AAED,wBAAgB,eAAe,CAC3B,UAAU,EAAE,cAAc,EAAE,EAC5B,gBAAgB,EAAE,gBAAgB,EAClC,KAAK,EAAE,MAAM,GACd,qBAAqB,CA2BvB"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isMergeFalse = isMergeFalse;
|
|
4
|
+
exports.mergePredicates = mergePredicates;
|
|
5
|
+
const builders_1 = require("../../ast/builders");
|
|
6
|
+
const warnings_1 = require("../../observe/warnings");
|
|
7
|
+
const compare_values_1 = require("../../utils/compare-values");
|
|
8
|
+
const deep_equal_1 = require("../../utils/deep-equal");
|
|
9
|
+
function isMergeFalse(result) {
|
|
10
|
+
return typeof result === "object" && result !== null && "type" in result && result.type === "false";
|
|
11
|
+
}
|
|
12
|
+
function mergePredicates(predicates, normalizeContext, field) {
|
|
13
|
+
let current = predicates;
|
|
14
|
+
const afterEq = mergeEqPredicates(current, field, normalizeContext);
|
|
15
|
+
if (isMergeFalse(afterEq)) {
|
|
16
|
+
return afterEq;
|
|
17
|
+
}
|
|
18
|
+
current = afterEq;
|
|
19
|
+
const afterIn = mergeInPredicates(current, field, normalizeContext);
|
|
20
|
+
if (isMergeFalse(afterIn)) {
|
|
21
|
+
return afterIn;
|
|
22
|
+
}
|
|
23
|
+
current = afterIn;
|
|
24
|
+
const afterRange = mergeRangePredicates(current, field, normalizeContext);
|
|
25
|
+
if (isMergeFalse(afterRange)) {
|
|
26
|
+
return afterRange;
|
|
27
|
+
}
|
|
28
|
+
current = afterRange;
|
|
29
|
+
const afterEqRange = collapseEqRangeConflict(current);
|
|
30
|
+
if (isMergeFalse(afterEqRange)) {
|
|
31
|
+
return afterEqRange;
|
|
32
|
+
}
|
|
33
|
+
return afterEqRange;
|
|
34
|
+
}
|
|
35
|
+
/** $eq 与 $gt/$gte/$lt/$lte 同字段不可同时满足时归为不可满足 */
|
|
36
|
+
function collapseEqRangeConflict(predicates) {
|
|
37
|
+
const eq = predicates.find((p) => p.op === "$eq");
|
|
38
|
+
if (!eq || !(0, compare_values_1.isComparableScalar)(eq.value)) {
|
|
39
|
+
return predicates;
|
|
40
|
+
}
|
|
41
|
+
const v = eq.value;
|
|
42
|
+
for (const p of predicates) {
|
|
43
|
+
if ((p.op === "$gt" || p.op === "$gte" || p.op === "$lt" || p.op === "$lte") &&
|
|
44
|
+
(0, compare_values_1.isComparableScalar)(p.value)) {
|
|
45
|
+
const cmp = (0, compare_values_1.compareScalarValues)(v, p.value);
|
|
46
|
+
if (cmp === null) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (p.op === "$lt" && cmp >= 0) {
|
|
50
|
+
return (0, builders_1.falseNode)();
|
|
51
|
+
}
|
|
52
|
+
if (p.op === "$lte" && cmp > 0) {
|
|
53
|
+
return (0, builders_1.falseNode)();
|
|
54
|
+
}
|
|
55
|
+
if (p.op === "$gt" && cmp <= 0) {
|
|
56
|
+
return (0, builders_1.falseNode)();
|
|
57
|
+
}
|
|
58
|
+
if (p.op === "$gte" && cmp < 0) {
|
|
59
|
+
return (0, builders_1.falseNode)();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return predicates;
|
|
64
|
+
}
|
|
65
|
+
function mergeEqPredicates(predicates, field, _normalizeContext) {
|
|
66
|
+
const eqs = predicates.filter((p) => p.op === "$eq");
|
|
67
|
+
if (eqs.length <= 1) {
|
|
68
|
+
return predicates;
|
|
69
|
+
}
|
|
70
|
+
const first = eqs[0];
|
|
71
|
+
for (let i = 1; i < eqs.length; i += 1) {
|
|
72
|
+
if (!(0, deep_equal_1.deepEqual)(first.value, eqs[i].value)) {
|
|
73
|
+
return (0, builders_1.falseNode)();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return [first, ...predicates.filter((p) => p.op !== "$eq")];
|
|
77
|
+
}
|
|
78
|
+
function mergeInPredicates(predicates, field, normalizeContext) {
|
|
79
|
+
const eq = predicates.find((p) => p.op === "$eq");
|
|
80
|
+
const ins = predicates.filter((p) => p.op === "$in");
|
|
81
|
+
let current = predicates;
|
|
82
|
+
if (ins.length > 0) {
|
|
83
|
+
const normalizedIns = ins.map((p) => ({
|
|
84
|
+
...p,
|
|
85
|
+
value: Array.isArray(p.value) ? Array.from(new Set(p.value)) : p.value,
|
|
86
|
+
}));
|
|
87
|
+
current = [...predicates.filter((p) => p.op !== "$in"), ...normalizedIns];
|
|
88
|
+
}
|
|
89
|
+
if (eq) {
|
|
90
|
+
const inPredicates = current.filter((p) => p.op === "$in");
|
|
91
|
+
for (const inPredicate of inPredicates) {
|
|
92
|
+
if (!Array.isArray(inPredicate.value)) {
|
|
93
|
+
(0, warnings_1.addWarning)(normalizeContext, `field ${field}: $in value is not array`);
|
|
94
|
+
return predicates;
|
|
95
|
+
}
|
|
96
|
+
const found = inPredicate.value.some((item) => (0, deep_equal_1.deepEqual)(item, eq.value));
|
|
97
|
+
if (!found) {
|
|
98
|
+
return (0, builders_1.falseNode)();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return current;
|
|
103
|
+
}
|
|
104
|
+
function chooseStrongerLowerBound(lower, p) {
|
|
105
|
+
if (!lower) {
|
|
106
|
+
return p;
|
|
107
|
+
}
|
|
108
|
+
const cmp = (0, compare_values_1.compareScalarValues)(p.value, lower.value);
|
|
109
|
+
if (cmp === null) {
|
|
110
|
+
return lower;
|
|
111
|
+
}
|
|
112
|
+
if (cmp > 0) {
|
|
113
|
+
return p;
|
|
114
|
+
}
|
|
115
|
+
if (cmp < 0) {
|
|
116
|
+
return lower;
|
|
117
|
+
}
|
|
118
|
+
if (p.op === "$gt" && lower.op === "$gte") {
|
|
119
|
+
return p;
|
|
120
|
+
}
|
|
121
|
+
if (p.op === "$gte" && lower.op === "$gt") {
|
|
122
|
+
return lower;
|
|
123
|
+
}
|
|
124
|
+
return lower;
|
|
125
|
+
}
|
|
126
|
+
function chooseStrongerUpperBound(upper, p) {
|
|
127
|
+
if (!upper) {
|
|
128
|
+
return p;
|
|
129
|
+
}
|
|
130
|
+
const cmp = (0, compare_values_1.compareScalarValues)(p.value, upper.value);
|
|
131
|
+
if (cmp === null) {
|
|
132
|
+
return upper;
|
|
133
|
+
}
|
|
134
|
+
if (cmp < 0) {
|
|
135
|
+
return p;
|
|
136
|
+
}
|
|
137
|
+
if (cmp > 0) {
|
|
138
|
+
return upper;
|
|
139
|
+
}
|
|
140
|
+
if (p.op === "$lt" && upper.op === "$lte") {
|
|
141
|
+
return p;
|
|
142
|
+
}
|
|
143
|
+
if (p.op === "$lte" && upper.op === "$lt") {
|
|
144
|
+
return upper;
|
|
145
|
+
}
|
|
146
|
+
return upper;
|
|
147
|
+
}
|
|
148
|
+
function mergeRangePredicates(predicates, field, normalizeContext) {
|
|
149
|
+
let lower = null;
|
|
150
|
+
let upper = null;
|
|
151
|
+
const others = [];
|
|
152
|
+
for (const p of predicates) {
|
|
153
|
+
if (p.op !== "$gt" && p.op !== "$gte" && p.op !== "$lt" && p.op !== "$lte") {
|
|
154
|
+
others.push(p);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (!(0, compare_values_1.isComparableScalar)(p.value)) {
|
|
158
|
+
(0, warnings_1.addWarning)(normalizeContext, `field ${field}: predicate ${p.op} is not comparable`);
|
|
159
|
+
return predicates;
|
|
160
|
+
}
|
|
161
|
+
if (p.op === "$gt" || p.op === "$gte") {
|
|
162
|
+
lower = chooseStrongerLowerBound(lower, p);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
upper = chooseStrongerUpperBound(upper, p);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (lower && upper) {
|
|
169
|
+
const cmp = (0, compare_values_1.compareScalarValues)(lower.value, upper.value);
|
|
170
|
+
if (cmp === 1) {
|
|
171
|
+
return (0, builders_1.falseNode)();
|
|
172
|
+
}
|
|
173
|
+
if (cmp === 0 && (lower.op === "$gt" || upper.op === "$lt")) {
|
|
174
|
+
return (0, builders_1.falseNode)();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
const merged = [...others];
|
|
178
|
+
if (lower) {
|
|
179
|
+
merged.push(lower);
|
|
180
|
+
}
|
|
181
|
+
if (upper) {
|
|
182
|
+
merged.push(upper);
|
|
183
|
+
}
|
|
184
|
+
return merged;
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=merge-predicates-internal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-predicates-internal.js","sourceRoot":"","sources":["../../../src/rules/predicate/merge-predicates-internal.ts"],"names":[],"mappings":";;AAUA,oCAEC;AAED,0CA+BC;AA7CD,iDAA+C;AAI/C,qDAAoD;AACpD,+DAAqF;AACrF,uDAAmD;AAInD,SAAgB,YAAY,CAAC,MAA6B;IACtD,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC;AACxG,CAAC;AAED,SAAgB,eAAe,CAC3B,UAA4B,EAC5B,gBAAkC,EAClC,KAAa;IAEb,IAAI,OAAO,GAAqB,UAAU,CAAC;IAE3C,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACpE,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,OAAO,CAAC;IAElB,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IACpE,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,OAAO,CAAC;IAElB,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAC1E,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,OAAO,GAAG,UAAU,CAAC;IAErB,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7B,OAAO,YAAY,CAAC;IACxB,CAAC;IAED,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,+CAA+C;AAC/C,SAAS,uBAAuB,CAAC,UAA4B;IACzD,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,IAAI,CAAC,IAAA,mCAAkB,EAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,UAAU,CAAC;IACtB,CAAC;IACD,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;IAEnB,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QACzB,IACI,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC;YACxE,IAAA,mCAAkB,EAAC,CAAC,CAAC,KAAK,CAAC,EAC7B,CAAC;YACC,MAAM,GAAG,GAAG,IAAA,oCAAmB,EAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YAC5C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACf,SAAS;YACb,CAAC;YACD,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAA,oBAAS,GAAE,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAA,oBAAS,GAAE,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAA,oBAAS,GAAE,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,IAAA,oBAAS,GAAE,CAAC;YACvB,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,SAAS,iBAAiB,CAAC,UAA4B,EAAE,KAAa,EAAE,iBAAmC;IACvG,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAErD,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAClB,OAAO,UAAU,CAAC;IACtB,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAErB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,IAAA,sBAAS,EAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,OAAO,IAAA,oBAAS,GAAE,CAAC;QACvB,CAAC;IACL,CAAC;IAED,OAAO,CAAC,KAAK,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,iBAAiB,CAAC,UAA4B,EAAE,KAAa,EAAE,gBAAkC;IACtG,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;IAErD,IAAI,OAAO,GAAG,UAAU,CAAC;IAEzB,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjB,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAClC,GAAG,CAAC;YACJ,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;SACtF,CAAC,CAAC,CAAC;QAEJ,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,GAAG,aAAa,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,EAAE,EAAE,CAAC;QACL,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;QAC3D,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpC,IAAA,qBAAU,EAAC,gBAAgB,EAAE,SAAS,KAAK,0BAA0B,CAAC,CAAC;gBACvE,OAAO,UAAU,CAAC;YACtB,CAAC;YAED,MAAM,KAAK,GAAI,WAAW,CAAC,KAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAA,sBAAS,EAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;YACzF,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,OAAO,IAAA,oBAAS,GAAE,CAAC;YACvB,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAKD,SAAS,wBAAwB,CAAC,KAAwB,EAAE,CAAa;IACrE,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,CAAC,CAAC;IACb,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,oCAAmB,EAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACV,OAAO,CAAC,CAAC;IACb,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,CAAC,CAAC;IACb,CAAC;IACD,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAwB,EAAE,CAAa;IACrE,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,OAAO,CAAC,CAAC;IACb,CAAC;IACD,MAAM,GAAG,GAAG,IAAA,oCAAmB,EAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACV,OAAO,CAAC,CAAC;IACb,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;QACxC,OAAO,CAAC,CAAC;IACb,CAAC;IACD,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,UAA4B,EAAE,KAAa,EAAE,gBAAkC;IACzG,IAAI,KAAK,GAAsB,IAAI,CAAC;IACpC,IAAI,KAAK,GAAsB,IAAI,CAAC;IACpC,MAAM,MAAM,GAAqB,EAAE,CAAC;IAEpC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YACzE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,SAAS;QACb,CAAC;QAED,IAAI,CAAC,IAAA,mCAAkB,EAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAA,qBAAU,EAAC,gBAAgB,EAAE,SAAS,KAAK,eAAe,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC;YACpF,OAAO,UAAU,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;YACpC,KAAK,GAAG,wBAAwB,CAAC,KAAK,EAAE,CAAe,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACJ,KAAK,GAAG,wBAAwB,CAAC,KAAK,EAAE,CAAe,CAAC,CAAC;QAC7D,CAAC;IACL,CAAC;IAED,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,IAAA,oCAAmB,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAE1D,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YACZ,OAAO,IAAA,oBAAS,GAAE,CAAC;QACvB,CAAC;QACD,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAA,oBAAS,GAAE,CAAC;QACvB,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAqB,CAAC,GAAG,MAAM,CAAC,CAAC;IAC7C,IAAI,KAAK,EAAE,CAAC;QACR,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACR,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { QueryNode } from "../../ast/types";
|
|
2
|
+
import type { NormalizeContext } from "../../normalize-context";
|
|
3
|
+
export declare const RULE_ID = "shape.collapseSingleChildLogical";
|
|
4
|
+
export declare function collapseSingleChildLogical(node: QueryNode, normalizeContext: NormalizeContext): QueryNode;
|
|
5
|
+
//# sourceMappingURL=collapse-single-child-logical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collapse-single-child-logical.d.ts","sourceRoot":"","sources":["../../../src/rules/shape/collapse-single-child-logical.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,eAAO,MAAM,OAAO,qCAAqC,CAAC;AAE1D,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAazG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RULE_ID = void 0;
|
|
4
|
+
exports.collapseSingleChildLogical = collapseSingleChildLogical;
|
|
5
|
+
const guards_1 = require("../../ast/guards");
|
|
6
|
+
const warnings_1 = require("../../observe/warnings");
|
|
7
|
+
exports.RULE_ID = "shape.collapseSingleChildLogical";
|
|
8
|
+
function collapseSingleChildLogical(node, normalizeContext) {
|
|
9
|
+
if (!(0, guards_1.isLogicalNode)(node)) {
|
|
10
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "node is not logical");
|
|
11
|
+
return node;
|
|
12
|
+
}
|
|
13
|
+
if (node.children.length !== 1) {
|
|
14
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "child count is not 1");
|
|
15
|
+
return node;
|
|
16
|
+
}
|
|
17
|
+
(0, warnings_1.markRuleApplied)(normalizeContext, exports.RULE_ID);
|
|
18
|
+
return node.children[0];
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=collapse-single-child-logical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collapse-single-child-logical.js","sourceRoot":"","sources":["../../../src/rules/shape/collapse-single-child-logical.ts"],"names":[],"mappings":";;;AAOA,gEAaC;AApBD,6CAAiD;AAGjD,qDAA0E;AAE7D,QAAA,OAAO,GAAG,kCAAkC,CAAC;AAE1D,SAAgB,0BAA0B,CAAC,IAAe,EAAE,gBAAkC;IAC1F,IAAI,CAAC,IAAA,sBAAa,EAAC,IAAI,CAAC,EAAE,CAAC;QACvB,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,qBAAqB,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,sBAAsB,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { QueryNode } from "../../ast/types";
|
|
2
|
+
import type { NormalizeContext } from "../../normalize-context";
|
|
3
|
+
export declare const RULE_ID = "shape.dedupeLogicalChildren";
|
|
4
|
+
export declare function uniqueChildrenByHash(children: QueryNode[]): QueryNode[];
|
|
5
|
+
export declare function dedupeLogicalChildren(node: QueryNode, normalizeContext: NormalizeContext): QueryNode;
|
|
6
|
+
//# sourceMappingURL=dedupe-logical-children.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe-logical-children.d.ts","sourceRoot":"","sources":["../../../src/rules/shape/dedupe-logical-children.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,eAAO,MAAM,OAAO,gCAAgC,CAAC;AAErD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAcvE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAepG"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RULE_ID = void 0;
|
|
4
|
+
exports.uniqueChildrenByHash = uniqueChildrenByHash;
|
|
5
|
+
exports.dedupeLogicalChildren = dedupeLogicalChildren;
|
|
6
|
+
const hash_1 = require("../../ast/hash");
|
|
7
|
+
const builders_1 = require("../../ast/builders");
|
|
8
|
+
const guards_1 = require("../../ast/guards");
|
|
9
|
+
const warnings_1 = require("../../observe/warnings");
|
|
10
|
+
exports.RULE_ID = "shape.dedupeLogicalChildren";
|
|
11
|
+
function uniqueChildrenByHash(children) {
|
|
12
|
+
const seen = new Set();
|
|
13
|
+
const result = [];
|
|
14
|
+
for (const child of children) {
|
|
15
|
+
const key = (0, hash_1.hashNode)(child);
|
|
16
|
+
if (seen.has(key)) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
seen.add(key);
|
|
20
|
+
result.push(child);
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
function dedupeLogicalChildren(node, normalizeContext) {
|
|
25
|
+
if (!(0, guards_1.isLogicalNode)(node)) {
|
|
26
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "node is not logical");
|
|
27
|
+
return node;
|
|
28
|
+
}
|
|
29
|
+
const deduped = uniqueChildrenByHash(node.children);
|
|
30
|
+
if (deduped.length === node.children.length) {
|
|
31
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "no duplicate children");
|
|
32
|
+
return node;
|
|
33
|
+
}
|
|
34
|
+
(0, warnings_1.markRuleApplied)(normalizeContext, exports.RULE_ID);
|
|
35
|
+
return node.op === "$and" ? (0, builders_1.andNode)(deduped) : (0, builders_1.orNode)(deduped);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=dedupe-logical-children.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedupe-logical-children.js","sourceRoot":"","sources":["../../../src/rules/shape/dedupe-logical-children.ts"],"names":[],"mappings":";;;AASA,oDAcC;AAED,sDAeC;AAxCD,yCAA0C;AAC1C,iDAAqD;AACrD,6CAAiD;AAGjD,qDAA0E;AAE7D,QAAA,OAAO,GAAG,6BAA6B,CAAC;AAErD,SAAgB,oBAAoB,CAAC,QAAqB;IACtD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAA,eAAQ,EAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,SAAS;QACb,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAgB,qBAAqB,CAAC,IAAe,EAAE,gBAAkC;IACrF,IAAI,CAAC,IAAA,sBAAa,EAAC,IAAI,CAAC,EAAE,CAAC;QACvB,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,qBAAqB,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEpD,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC1C,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,uBAAuB,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAA,kBAAO,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,OAAO,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LogicalNode, QueryNode } from "../../ast/types";
|
|
2
|
+
import type { NormalizeContext } from "../../normalize-context";
|
|
3
|
+
export declare const RULE_ID = "shape.flattenLogical";
|
|
4
|
+
export declare function flattenLogicalChildren(node: LogicalNode): QueryNode[];
|
|
5
|
+
export declare function flattenLogical(node: QueryNode, normalizeContext: NormalizeContext): QueryNode;
|
|
6
|
+
//# sourceMappingURL=flatten-logical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten-logical.d.ts","sourceRoot":"","sources":["../../../src/rules/shape/flatten-logical.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,eAAO,MAAM,OAAO,yBAAyB,CAAC;AAE9C,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,EAAE,CAYrE;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAmB7F"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RULE_ID = void 0;
|
|
4
|
+
exports.flattenLogicalChildren = flattenLogicalChildren;
|
|
5
|
+
exports.flattenLogical = flattenLogical;
|
|
6
|
+
const builders_1 = require("../../ast/builders");
|
|
7
|
+
const guards_1 = require("../../ast/guards");
|
|
8
|
+
const warnings_1 = require("../../observe/warnings");
|
|
9
|
+
exports.RULE_ID = "shape.flattenLogical";
|
|
10
|
+
function flattenLogicalChildren(node) {
|
|
11
|
+
const result = [];
|
|
12
|
+
for (const child of node.children) {
|
|
13
|
+
if ((0, guards_1.isLogicalNode)(child) && child.op === node.op) {
|
|
14
|
+
result.push(...child.children);
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
result.push(child);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
function flattenLogical(node, normalizeContext) {
|
|
23
|
+
if (!(0, guards_1.isLogicalNode)(node)) {
|
|
24
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "node is not logical");
|
|
25
|
+
return node;
|
|
26
|
+
}
|
|
27
|
+
const nextChildren = flattenLogicalChildren(node);
|
|
28
|
+
const changed = nextChildren.length !== node.children.length ||
|
|
29
|
+
nextChildren.some((c, i) => c !== node.children[i]);
|
|
30
|
+
if (changed) {
|
|
31
|
+
(0, warnings_1.markRuleApplied)(normalizeContext, exports.RULE_ID);
|
|
32
|
+
return node.op === "$and" ? (0, builders_1.andNode)(nextChildren) : (0, builders_1.orNode)(nextChildren);
|
|
33
|
+
}
|
|
34
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "no nested same-op logical nodes");
|
|
35
|
+
return node;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=flatten-logical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flatten-logical.js","sourceRoot":"","sources":["../../../src/rules/shape/flatten-logical.ts"],"names":[],"mappings":";;;AAQA,wDAYC;AAED,wCAmBC;AAzCD,iDAAqD;AACrD,6CAAiD;AAGjD,qDAA0E;AAE7D,QAAA,OAAO,GAAG,sBAAsB,CAAC;AAE9C,SAAgB,sBAAsB,CAAC,IAAiB;IACpD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChC,IAAI,IAAA,sBAAa,EAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAgB,cAAc,CAAC,IAAe,EAAE,gBAAkC;IAC9E,IAAI,CAAC,IAAA,sBAAa,EAAC,IAAI,CAAC,EAAE,CAAC;QACvB,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,qBAAqB,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,YAAY,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAElD,MAAM,OAAO,GACT,YAAY,CAAC,MAAM,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM;QAC5C,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAExD,IAAI,OAAO,EAAE,CAAC;QACV,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAA,kBAAO,EAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAA,iBAAM,EAAC,YAAY,CAAC,CAAC;IAC7E,CAAC;IAED,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,iCAAiC,CAAC,CAAC;IAC9E,OAAO,IAAI,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { QueryNode } from "../../ast/types";
|
|
2
|
+
import type { NormalizeContext } from "../../normalize-context";
|
|
3
|
+
export declare const RULE_ID = "shape.removeEmptyLogical";
|
|
4
|
+
export declare function removeEmptyLogical(node: QueryNode, normalizeContext: NormalizeContext): QueryNode;
|
|
5
|
+
//# sourceMappingURL=remove-empty-logical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-empty-logical.d.ts","sourceRoot":"","sources":["../../../src/rules/shape/remove-empty-logical.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,eAAO,MAAM,OAAO,6BAA6B,CAAC;AAElD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAajG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RULE_ID = void 0;
|
|
4
|
+
exports.removeEmptyLogical = removeEmptyLogical;
|
|
5
|
+
const builders_1 = require("../../ast/builders");
|
|
6
|
+
const guards_1 = require("../../ast/guards");
|
|
7
|
+
const warnings_1 = require("../../observe/warnings");
|
|
8
|
+
exports.RULE_ID = "shape.removeEmptyLogical";
|
|
9
|
+
function removeEmptyLogical(node, normalizeContext) {
|
|
10
|
+
if (!(0, guards_1.isLogicalNode)(node)) {
|
|
11
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "node is not logical");
|
|
12
|
+
return node;
|
|
13
|
+
}
|
|
14
|
+
if (node.children.length > 0) {
|
|
15
|
+
(0, warnings_1.markRuleSkipped)(normalizeContext, exports.RULE_ID, "logical node is not empty");
|
|
16
|
+
return node;
|
|
17
|
+
}
|
|
18
|
+
(0, warnings_1.markRuleApplied)(normalizeContext, exports.RULE_ID);
|
|
19
|
+
return node.op === "$and" ? (0, builders_1.trueNode)() : (0, builders_1.falseNode)();
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=remove-empty-logical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remove-empty-logical.js","sourceRoot":"","sources":["../../../src/rules/shape/remove-empty-logical.ts"],"names":[],"mappings":";;;AAQA,gDAaC;AArBD,iDAAyD;AACzD,6CAAiD;AAGjD,qDAA0E;AAE7D,QAAA,OAAO,GAAG,0BAA0B,CAAC;AAElD,SAAgB,kBAAkB,CAAC,IAAe,EAAE,gBAAkC;IAClF,IAAI,CAAC,IAAA,sBAAa,EAAC,IAAI,CAAC,EAAE,CAAC;QACvB,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,qBAAqB,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,EAAE,2BAA2B,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,IAAA,0BAAe,EAAC,gBAAgB,EAAE,eAAO,CAAC,CAAC;IAC3C,OAAO,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAA,mBAAQ,GAAE,CAAC,CAAC,CAAC,IAAA,oBAAS,GAAE,CAAC;AACzD,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB 查询对象(规范化入口的输入/输出形状)
|
|
3
|
+
*/
|
|
4
|
+
export type Query = Record<string, unknown>;
|
|
5
|
+
export type NormalizeLevel = "shape" | "predicate" | "logical" | "experimental";
|
|
6
|
+
export interface NormalizeRules {
|
|
7
|
+
flattenLogical: boolean;
|
|
8
|
+
removeEmptyLogical: boolean;
|
|
9
|
+
collapseSingleChildLogical: boolean;
|
|
10
|
+
dedupeLogicalChildren: boolean;
|
|
11
|
+
dedupeSameFieldPredicates: boolean;
|
|
12
|
+
mergeComparablePredicates: boolean;
|
|
13
|
+
collapseContradictions: boolean;
|
|
14
|
+
sortLogicalChildren: boolean;
|
|
15
|
+
sortFieldPredicates: boolean;
|
|
16
|
+
detectCommonPredicatesInOr: boolean;
|
|
17
|
+
hoistCommonPredicatesFromOr: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface NormalizeSafety {
|
|
20
|
+
maxNormalizeDepth: number;
|
|
21
|
+
maxNodeGrowthRatio: number;
|
|
22
|
+
}
|
|
23
|
+
export interface NormalizeObserve {
|
|
24
|
+
collectWarnings: boolean;
|
|
25
|
+
collectMetrics: boolean;
|
|
26
|
+
}
|
|
27
|
+
export interface NormalizeOptions {
|
|
28
|
+
level?: NormalizeLevel;
|
|
29
|
+
rules?: Partial<NormalizeRules>;
|
|
30
|
+
safety?: Partial<NormalizeSafety>;
|
|
31
|
+
observe?: Partial<NormalizeObserve>;
|
|
32
|
+
}
|
|
33
|
+
export interface ResolvedNormalizeOptions {
|
|
34
|
+
level: NormalizeLevel;
|
|
35
|
+
rules: NormalizeRules;
|
|
36
|
+
safety: NormalizeSafety;
|
|
37
|
+
observe: NormalizeObserve;
|
|
38
|
+
}
|
|
39
|
+
export interface NodeStats {
|
|
40
|
+
nodeCount: number;
|
|
41
|
+
maxDepth: number;
|
|
42
|
+
andCount: number;
|
|
43
|
+
orCount: number;
|
|
44
|
+
}
|
|
45
|
+
/** 对外名称:`meta.stats` 中 before/after 的树统计。 */
|
|
46
|
+
export type NormalizeStats = NodeStats;
|
|
47
|
+
export interface NormalizeMeta {
|
|
48
|
+
changed: boolean;
|
|
49
|
+
level: NormalizeLevel;
|
|
50
|
+
appliedRules: string[];
|
|
51
|
+
skippedRules: string[];
|
|
52
|
+
warnings: string[];
|
|
53
|
+
bailedOut: boolean;
|
|
54
|
+
bailoutReason?: string;
|
|
55
|
+
beforeHash?: string;
|
|
56
|
+
afterHash?: string;
|
|
57
|
+
stats?: {
|
|
58
|
+
before: NodeStats;
|
|
59
|
+
after: NodeStats;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export interface NormalizeResult<Q = Query> {
|
|
63
|
+
query: Q;
|
|
64
|
+
meta: NormalizeMeta;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* FalseNode 编译结果:不可满足选择器(与设计文档一致)
|
|
68
|
+
*/
|
|
69
|
+
export declare const IMPOSSIBLE_SELECTOR: Query;
|
|
70
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS,GAAG,cAAc,CAAC;AAEhF,MAAM,WAAW,cAAc;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,0BAA0B,EAAE,OAAO,CAAC;IACpC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,yBAAyB,EAAE,OAAO,CAAC;IACnC,yBAAyB,EAAE,OAAO,CAAC;IACnC,sBAAsB,EAAE,OAAO,CAAC;IAChC,mBAAmB,EAAE,OAAO,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,0BAA0B,EAAE,OAAO,CAAC;IACpC,2BAA2B,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,wBAAwB;IACrC,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,gBAAgB,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,6CAA6C;AAC7C,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,cAAc,CAAC;IACtB,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,KAAK,CAAC,EAAE;QACJ,MAAM,EAAE,SAAS,CAAC;QAClB,KAAK,EAAE,SAAS,CAAC;KACpB,CAAC;CACL;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,KAAK;IACtC,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,aAAa,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAA2C,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AA4EA;;GAEG;AACU,QAAA,mBAAmB,GAAU,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAW,CAAC"}
|