@ifc-lite/rules 0.4.1 → 0.5.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/README.md +2 -0
- package/dist/engine/rule-engine-requirements.d.ts.map +1 -1
- package/dist/engine/rule-engine-requirements.js +3 -2
- package/dist/engine/rule-engine-requirements.js.map +1 -1
- package/dist/engine/rule-engine-sets.d.ts.map +1 -1
- package/dist/engine/rule-engine-sets.js +2 -1
- package/dist/engine/rule-engine-sets.js.map +1 -1
- package/dist/filter/filter-evaluate-groups.d.ts.map +1 -1
- package/dist/filter/filter-evaluate-groups.js +4 -0
- package/dist/filter/filter-evaluate-groups.js.map +1 -1
- package/dist/filter/filter-evaluate.d.ts +5 -0
- package/dist/filter/filter-evaluate.d.ts.map +1 -1
- package/dist/filter/filter-evaluate.js +38 -56
- package/dist/filter/filter-evaluate.js.map +1 -1
- package/dist/filter/filter-iteration-source.d.ts.map +1 -1
- package/dist/filter/filter-iteration-source.js +3 -1
- package/dist/filter/filter-iteration-source.js.map +1 -1
- package/dist/filter/filter-list-condition.d.ts +57 -0
- package/dist/filter/filter-list-condition.d.ts.map +1 -0
- package/dist/filter/filter-list-condition.js +68 -0
- package/dist/filter/filter-list-condition.js.map +1 -0
- package/dist/filter/filter-match.d.ts +8 -17
- package/dist/filter/filter-match.d.ts.map +1 -1
- package/dist/filter/filter-match.js +61 -118
- package/dist/filter/filter-match.js.map +1 -1
- package/dist/filter/filter-operator-types.d.ts +46 -0
- package/dist/filter/filter-operator-types.d.ts.map +1 -0
- package/dist/filter/filter-operator-types.js +5 -0
- package/dist/filter/filter-operator-types.js.map +1 -0
- package/dist/filter/filter-ops.d.ts +2 -2
- package/dist/filter/filter-ops.d.ts.map +1 -1
- package/dist/filter/filter-ops.js +25 -5
- package/dist/filter/filter-ops.js.map +1 -1
- package/dist/filter/filter-rule-guards.d.ts.map +1 -1
- package/dist/filter/filter-rule-guards.js +31 -3
- package/dist/filter/filter-rule-guards.js.map +1 -1
- package/dist/filter/filter-rules.d.ts +15 -39
- package/dist/filter/filter-rules.d.ts.map +1 -1
- package/dist/filter/filter-rules.js +2 -1
- package/dist/filter/filter-rules.js.map +1 -1
- package/dist/filter/filter-storey.d.ts +18 -0
- package/dist/filter/filter-storey.d.ts.map +1 -0
- package/dist/filter/filter-storey.js +109 -0
- package/dist/filter/filter-storey.js.map +1 -0
- package/dist/filter/legacy-operator-adapters.d.ts +47 -0
- package/dist/filter/legacy-operator-adapters.d.ts.map +1 -0
- package/dist/filter/legacy-operator-adapters.js +74 -0
- package/dist/filter/legacy-operator-adapters.js.map +1 -0
- package/dist/filter/read-measure-subject.d.ts +3 -2
- package/dist/filter/read-measure-subject.d.ts.map +1 -1
- package/dist/filter/read-measure-subject.js +18 -5
- package/dist/filter/read-measure-subject.js.map +1 -1
- package/dist/filter/read-subject.d.ts.map +1 -1
- package/dist/filter/read-subject.js +2 -1
- package/dist/filter/read-subject.js.map +1 -1
- package/dist/filter/subject-read-options.d.ts +17 -1
- package/dist/filter/subject-read-options.d.ts.map +1 -1
- package/dist/filter/subject-read-options.js +9 -1
- package/dist/filter/subject-read-options.js.map +1 -1
- package/dist/ids/rule-to-ids-facets.d.ts.map +1 -1
- package/dist/ids/rule-to-ids-facets.js +5 -0
- package/dist/ids/rule-to-ids-facets.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/rule-set/between-chip.js +1 -1
- package/dist/rule-set/between-chip.js.map +1 -1
- package/dist/rule-set/requirement-text.d.ts.map +1 -1
- package/dist/rule-set/requirement-text.js +1 -0
- package/dist/rule-set/requirement-text.js.map +1 -1
- package/dist/rule-set/rule-set-io-requirement.d.ts.map +1 -1
- package/dist/rule-set/rule-set-io-requirement.js +2 -0
- package/dist/rule-set/rule-set-io-requirement.js.map +1 -1
- package/dist/rule-set/rule-set-io-subject.d.ts.map +1 -1
- package/dist/rule-set/rule-set-io-subject.js +5 -0
- package/dist/rule-set/rule-set-io-subject.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `listCondition` (#6190): a Lists value predicate carried inside a Rules
|
|
3
|
+
* `FilterGroup`, as an explicit adapter rather than a canonical kind.
|
|
4
|
+
*
|
|
5
|
+
* The fields are the saved Lists condition, verbatim: `source`, `psetName`
|
|
6
|
+
* (a pset/qto name, or the durable zone-SET id for `zone`), `propertyName`
|
|
7
|
+
* (an attribute/property/quantity name, the spatial level for `spatial`, the
|
|
8
|
+
* zone display mode for `zone`, the axis for `geometry`), `operator`, `value`
|
|
9
|
+
* and `inherit`. Their meaning is the Lists engine's and nothing else's:
|
|
10
|
+
* this package never reads the value itself. The host supplies a
|
|
11
|
+
* {@link ListConditionMatcher} on the evaluator model (`@ifc-lite/lists`'
|
|
12
|
+
* `listConditionMatcher(provider)`), so one implementation answers the
|
|
13
|
+
* predicate whether it runs as a list scope or inside an OR group.
|
|
14
|
+
*
|
|
15
|
+
* Why not canonical kinds: the canonical readers differ from the Lists ones
|
|
16
|
+
* on purpose. `material` also matches Categories and skips layer labels,
|
|
17
|
+
* `storey` hops through a containing space, `model` compares a durable
|
|
18
|
+
* source fingerprint rather than the file name, `attribute` rejects
|
|
19
|
+
* `GlobalId`, and property inheritance merges per property. Converting a
|
|
20
|
+
* saved Lists predicate to one of them would change which rows it keeps.
|
|
21
|
+
* Zones and world coordinates are viewer data the IFC store does not hold.
|
|
22
|
+
*/
|
|
23
|
+
export declare const LIST_CONDITION_SOURCES: readonly ["attribute", "property", "quantity", "material", "classification", "spatial", "model", "zone", "geometry"];
|
|
24
|
+
export type ListConditionSource = (typeof LIST_CONDITION_SOURCES)[number];
|
|
25
|
+
export declare const LIST_CONDITION_OPERATORS: readonly ["equals", "notEquals", "contains", "gt", "lt", "gte", "lte", "exists"];
|
|
26
|
+
export type ListConditionOperator = (typeof LIST_CONDITION_OPERATORS)[number];
|
|
27
|
+
export interface ListConditionRule {
|
|
28
|
+
kind: 'listCondition';
|
|
29
|
+
source: ListConditionSource;
|
|
30
|
+
/** Pset / qto name; the durable zone-SET id for `zone`. */
|
|
31
|
+
psetName?: string;
|
|
32
|
+
/** Attribute, property or quantity name; spatial level; zone display mode; axis. */
|
|
33
|
+
propertyName: string;
|
|
34
|
+
operator: ListConditionOperator;
|
|
35
|
+
value: string | number | boolean;
|
|
36
|
+
/** property / quantity only (#5433). */
|
|
37
|
+
inherit?: 'type' | 'aggregation';
|
|
38
|
+
}
|
|
39
|
+
/** Answers one `listCondition` rule for one element of the model it is attached to. */
|
|
40
|
+
export type ListConditionMatcher = (expressId: number, rule: ListConditionRule) => boolean;
|
|
41
|
+
/** Structural guard: every field the Lists engine reads has the type it reads. */
|
|
42
|
+
export declare function isListConditionRule(value: unknown): value is ListConditionRule;
|
|
43
|
+
export declare function listConditionRule(condition: Omit<ListConditionRule, 'kind'>): ListConditionRule;
|
|
44
|
+
/** Refuse, before any element is read, a run whose rules hold a `listCondition`
|
|
45
|
+
* but whose model has no matcher. Checked up front rather than when the rule is
|
|
46
|
+
* reached: a cheaper failing rule earlier in an AND group would otherwise
|
|
47
|
+
* short-circuit past it, and the run would return no rows instead of saying why. */
|
|
48
|
+
export declare function assertListConditionsAnswerable(rules: readonly {
|
|
49
|
+
kind: string;
|
|
50
|
+
}[], models: readonly {
|
|
51
|
+
id: string;
|
|
52
|
+
listConditions?: ListConditionMatcher;
|
|
53
|
+
store?: unknown;
|
|
54
|
+
}[]): void;
|
|
55
|
+
/** A model without a matcher cannot answer the predicate; saying so beats matching nothing. */
|
|
56
|
+
export declare function matchListConditionRule(rule: ListConditionRule, expressId: number, matcher: ListConditionMatcher | undefined): boolean;
|
|
57
|
+
//# sourceMappingURL=filter-list-condition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-list-condition.d.ts","sourceRoot":"","sources":["../../src/filter/filter-list-condition.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,eAAO,MAAM,sBAAsB,sHAEzB,CAAC;AACX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE1E,eAAO,MAAM,wBAAwB,kFAE3B,CAAC;AACX,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oFAAoF;IACpF,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACjC,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CAClC;AAED,uFAAuF;AACvF,MAAM,MAAM,oBAAoB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,KAAK,OAAO,CAAC;AAK3F,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAQ9E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAAG,iBAAiB,CAE/F;AAED;;;oFAGoF;AACpF,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAClC,MAAM,EAAE,SAAS;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,GACxF,IAAI,CAON;AAED,+FAA+F;AAC/F,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,iBAAiB,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,oBAAoB,GAAG,SAAS,GACxC,OAAO,CAKT"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
/**
|
|
5
|
+
* `listCondition` (#6190): a Lists value predicate carried inside a Rules
|
|
6
|
+
* `FilterGroup`, as an explicit adapter rather than a canonical kind.
|
|
7
|
+
*
|
|
8
|
+
* The fields are the saved Lists condition, verbatim: `source`, `psetName`
|
|
9
|
+
* (a pset/qto name, or the durable zone-SET id for `zone`), `propertyName`
|
|
10
|
+
* (an attribute/property/quantity name, the spatial level for `spatial`, the
|
|
11
|
+
* zone display mode for `zone`, the axis for `geometry`), `operator`, `value`
|
|
12
|
+
* and `inherit`. Their meaning is the Lists engine's and nothing else's:
|
|
13
|
+
* this package never reads the value itself. The host supplies a
|
|
14
|
+
* {@link ListConditionMatcher} on the evaluator model (`@ifc-lite/lists`'
|
|
15
|
+
* `listConditionMatcher(provider)`), so one implementation answers the
|
|
16
|
+
* predicate whether it runs as a list scope or inside an OR group.
|
|
17
|
+
*
|
|
18
|
+
* Why not canonical kinds: the canonical readers differ from the Lists ones
|
|
19
|
+
* on purpose. `material` also matches Categories and skips layer labels,
|
|
20
|
+
* `storey` hops through a containing space, `model` compares a durable
|
|
21
|
+
* source fingerprint rather than the file name, `attribute` rejects
|
|
22
|
+
* `GlobalId`, and property inheritance merges per property. Converting a
|
|
23
|
+
* saved Lists predicate to one of them would change which rows it keeps.
|
|
24
|
+
* Zones and world coordinates are viewer data the IFC store does not hold.
|
|
25
|
+
*/
|
|
26
|
+
export const LIST_CONDITION_SOURCES = [
|
|
27
|
+
'attribute', 'property', 'quantity', 'material', 'classification', 'spatial', 'model', 'zone', 'geometry',
|
|
28
|
+
];
|
|
29
|
+
export const LIST_CONDITION_OPERATORS = [
|
|
30
|
+
'equals', 'notEquals', 'contains', 'gt', 'lt', 'gte', 'lte', 'exists',
|
|
31
|
+
];
|
|
32
|
+
const SOURCES = new Set(LIST_CONDITION_SOURCES);
|
|
33
|
+
const OPERATORS = new Set(LIST_CONDITION_OPERATORS);
|
|
34
|
+
/** Structural guard: every field the Lists engine reads has the type it reads. */
|
|
35
|
+
export function isListConditionRule(value) {
|
|
36
|
+
if (typeof value !== 'object' || value === null)
|
|
37
|
+
return false;
|
|
38
|
+
const r = value;
|
|
39
|
+
return r.kind === 'listCondition' && SOURCES.has(r.source) && OPERATORS.has(r.operator)
|
|
40
|
+
&& typeof r.propertyName === 'string'
|
|
41
|
+
&& (r.psetName === undefined || typeof r.psetName === 'string')
|
|
42
|
+
&& (typeof r.value === 'string' || typeof r.value === 'number' || typeof r.value === 'boolean')
|
|
43
|
+
&& (r.inherit === undefined || r.inherit === 'type' || r.inherit === 'aggregation');
|
|
44
|
+
}
|
|
45
|
+
export function listConditionRule(condition) {
|
|
46
|
+
return { kind: 'listCondition', ...condition };
|
|
47
|
+
}
|
|
48
|
+
/** Refuse, before any element is read, a run whose rules hold a `listCondition`
|
|
49
|
+
* but whose model has no matcher. Checked up front rather than when the rule is
|
|
50
|
+
* reached: a cheaper failing rule earlier in an AND group would otherwise
|
|
51
|
+
* short-circuit past it, and the run would return no rows instead of saying why. */
|
|
52
|
+
export function assertListConditionsAnswerable(rules, models) {
|
|
53
|
+
const rule = rules.find((r) => r.kind === 'listCondition');
|
|
54
|
+
if (!rule)
|
|
55
|
+
return;
|
|
56
|
+
const model = models.find((m) => m.store !== null && !m.listConditions);
|
|
57
|
+
if (model) {
|
|
58
|
+
throw new Error(`A Lists ${rule.source} condition needs the Lists data provider for model "${model.id}"; run it through a list.`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** A model without a matcher cannot answer the predicate; saying so beats matching nothing. */
|
|
62
|
+
export function matchListConditionRule(rule, expressId, matcher) {
|
|
63
|
+
if (!matcher) {
|
|
64
|
+
throw new Error(`A Lists ${rule.source} condition needs the Lists data provider; run it through a list.`);
|
|
65
|
+
}
|
|
66
|
+
return matcher(expressId, rule);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=filter-list-condition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-list-condition.js","sourceRoot":"","sources":["../../src/filter/filter-list-condition.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU;CACjG,CAAC;AAGX,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ;CAC7D,CAAC;AAmBX,MAAM,OAAO,GAAyB,IAAI,GAAG,CAAC,sBAAsB,CAAC,CAAC;AACtE,MAAM,SAAS,GAAyB,IAAI,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAE1E,kFAAkF;AAClF,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,OAAO,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;WAClF,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;WAClC,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;WAC5D,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC;WAC5F,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,IAAI,CAAC,CAAC,OAAO,KAAK,aAAa,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAA0C;IAC1E,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,SAAS,EAAE,CAAC;AACjD,CAAC;AAED;;;oFAGoF;AACpF,MAAM,UAAU,8BAA8B,CAC5C,KAAkC,EAClC,MAAyF;IAEzF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAA0B,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC;IACnF,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACxE,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,MAAM,uDAAuD,KAAK,CAAC,EAAE,2BAA2B,CAAC,CAAC;IACpI,CAAC;AACH,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,sBAAsB,CACpC,IAAuB,EACvB,SAAiB,EACjB,OAAyC;IAEzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,MAAM,kEAAkE,CAAC,CAAC;IAC5G,CAAC;IACD,OAAO,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* `filter-evaluate.test.ts` via the evaluator's `__internal` re-export.
|
|
8
8
|
*/
|
|
9
9
|
import { extractPropertiesOnDemand, extractQuantitiesOnDemand, type IfcDataStore, type MaterialInfo, type ClassificationInfo } from '@ifc-lite/parser';
|
|
10
|
-
import { type PropertyRule, type QuantityRule, type ClassificationRule, type AttributeRule, type
|
|
10
|
+
import { type PropertyRule, type QuantityRule, type ClassificationRule, type AttributeRule, type ParentRule, type TextKind, type ValueOp } from './filter-rules.js';
|
|
11
11
|
/**
|
|
12
12
|
* Compare a rule's property-set / property name against a row's.
|
|
13
13
|
*
|
|
@@ -28,11 +28,16 @@ import { type PropertyRule, type QuantityRule, type ClassificationRule, type Att
|
|
|
28
28
|
* docstring for the full contract. This function does not catch that; it
|
|
29
29
|
* propagates to `filter-evaluate.ts`'s caller, which must.
|
|
30
30
|
*/
|
|
31
|
-
export declare function nameMatches(rulePattern: string, rowName: string, kind?: TextKind): boolean;
|
|
31
|
+
export declare function nameMatches(rulePattern: string, rowName: string, kind?: TextKind, caseMode?: 'exact'): boolean;
|
|
32
32
|
export interface PsetRow {
|
|
33
33
|
setName: string;
|
|
34
34
|
propertyName: string;
|
|
35
35
|
value: string;
|
|
36
|
+
/** Retain primitive type so a converted Bulk condition cannot match a different typed value. */
|
|
37
|
+
valueType?: 'string' | 'number' | 'boolean' | 'null';
|
|
38
|
+
/** The scalar display value read by saved v1 Lists before multi-value
|
|
39
|
+
* expansion. `null` is different from an explicitly empty value. */
|
|
40
|
+
legacyListValue?: string | null;
|
|
36
41
|
}
|
|
37
42
|
export type PsetRows = ReadonlyArray<PsetRow>;
|
|
38
43
|
export interface QtyRow {
|
|
@@ -53,7 +58,7 @@ export declare function propertyCandidates(p: {
|
|
|
53
58
|
values?: readonly string[];
|
|
54
59
|
structure?: string;
|
|
55
60
|
}): string[];
|
|
56
|
-
export declare function flattenPsets(psets: ReturnType<typeof extractPropertiesOnDemand
|
|
61
|
+
export declare function flattenPsets(psets: ReturnType<typeof extractPropertiesOnDemand>, includeLegacyListValues?: boolean): PsetRows;
|
|
57
62
|
export declare function flattenQtys(qtos: ReturnType<typeof extractQuantitiesOnDemand>): QtyRows;
|
|
58
63
|
export declare function stringifyValue(value: unknown): string;
|
|
59
64
|
export declare function matchPropertyRule(rule: PropertyRule, rows: PsetRows): boolean;
|
|
@@ -75,20 +80,6 @@ export type AttrRows = ReadonlyArray<{
|
|
|
75
80
|
*/
|
|
76
81
|
export declare function matchAttributeRule(rule: AttributeRule, attrs: AttrRows): boolean;
|
|
77
82
|
export declare function matchQuantityRule(rule: QuantityRule, rows: QtyRows): boolean;
|
|
78
|
-
export declare function defaultStoreyName(store: IfcDataStore, expressId: number): string;
|
|
79
|
-
/** Does `expressId` (in `modelId`) sit in a storey ref'd by `rule.refs`?
|
|
80
|
-
* `IfcBuildingStorey.Name` isn't unique, so once a `StoreyRule` carries
|
|
81
|
-
* an exact (modelId, expressId) ref (mirrored from a HierarchyPanel
|
|
82
|
-
* click), matching bypasses Name entirely. Reaches through a containing
|
|
83
|
-
* space via {@link storeyIdOf}, same as the Name-matched path. */
|
|
84
|
-
export declare function storeyMatchesRefs(store: IfcDataStore, expressId: number, modelId: string, rule: StoreyRule): boolean;
|
|
85
|
-
/** Index-prefilter twin of {@link storeyMatchesRefs}/Name matching: the
|
|
86
|
-
* bucket of elements a `storey op:'in'` rule narrows to for `modelId`.
|
|
87
|
-
* Includes each matched storey's directly-contained elements AND every
|
|
88
|
-
* element `bySpace` lists for a space belonging to that storey, so this
|
|
89
|
-
* prefilter can never exclude a candidate the (also widened) per-entity
|
|
90
|
-
* check in `filter-evaluate.ts` would go on to match. */
|
|
91
|
-
export declare function unionByStorey(store: IfcDataStore, rule: StoreyRule, modelId: string | undefined): number[] | null;
|
|
92
83
|
/** Collect the *individual* material names an element exposes - each layer /
|
|
93
84
|
* constituent / profile material, or the single plain material - for the
|
|
94
85
|
* multi-valued `material` rule matcher and the material dropdown. Shares the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-match.d.ts","sourceRoot":"","sources":["../../src/filter/filter-match.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACxB,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,
|
|
1
|
+
{"version":3,"file":"filter-match.d.ts","sourceRoot":"","sources":["../../src/filter/filter-match.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { collectSpatialAncestors } from '@ifc-lite/data';
|
|
|
6
6
|
import { valueOpMatches, numericOpMatches, matchStringAnyNone } from './filter-ops.js';
|
|
7
7
|
import { lensMaterialNames } from './lens-material-names.js';
|
|
8
8
|
import { parsePropertyValue } from '@ifc-lite/encoding';
|
|
9
|
-
import { compileNameMatcher, isNamePattern } from '@ifc-lite/
|
|
9
|
+
import { compileNameMatcher, isNamePattern } from '@ifc-lite/regex-guard';
|
|
10
10
|
/**
|
|
11
11
|
* Compare a rule's property-set / property name against a row's.
|
|
12
12
|
*
|
|
@@ -27,11 +27,13 @@ import { compileNameMatcher, isNamePattern } from '@ifc-lite/lists';
|
|
|
27
27
|
* docstring for the full contract. This function does not catch that; it
|
|
28
28
|
* propagates to `filter-evaluate.ts`'s caller, which must.
|
|
29
29
|
*/
|
|
30
|
-
export function nameMatches(rulePattern, rowName, kind) {
|
|
30
|
+
export function nameMatches(rulePattern, rowName, kind, caseMode) {
|
|
31
31
|
if (kind === 'regex')
|
|
32
32
|
return compileNameMatcher(`/${rulePattern}/`)(rowName);
|
|
33
33
|
if (kind === undefined && isNamePattern(rulePattern))
|
|
34
34
|
return compileNameMatcher(rulePattern)(rowName);
|
|
35
|
+
if (caseMode === 'exact')
|
|
36
|
+
return rowName === rulePattern;
|
|
35
37
|
return rowName.toLowerCase() === rulePattern.toLowerCase();
|
|
36
38
|
}
|
|
37
39
|
/** Structures whose `values` are the candidates a rule reads (#5475). */
|
|
@@ -48,10 +50,27 @@ export function propertyCandidates(p) {
|
|
|
48
50
|
return [...p.values];
|
|
49
51
|
return [stringifyValue(p.value)];
|
|
50
52
|
}
|
|
51
|
-
|
|
53
|
+
function legacyListValue(value) {
|
|
54
|
+
if (value === null || value === undefined)
|
|
55
|
+
return null;
|
|
56
|
+
const display = parsePropertyValue(value).displayValue;
|
|
57
|
+
if (display === '\u2014')
|
|
58
|
+
return null;
|
|
59
|
+
if (typeof value === 'number')
|
|
60
|
+
return String(value);
|
|
61
|
+
if (Array.isArray(value) && value.length === 2 && typeof value[1] === 'number')
|
|
62
|
+
return String(value[1]);
|
|
63
|
+
return display;
|
|
64
|
+
}
|
|
65
|
+
export function flattenPsets(psets, includeLegacyListValues = false) {
|
|
52
66
|
const out = [];
|
|
53
67
|
for (const set of psets) {
|
|
54
68
|
for (const p of set.properties) {
|
|
69
|
+
const valueType = p.value === null || p.value === undefined ? 'null'
|
|
70
|
+
: typeof p.value === 'string' ? 'string'
|
|
71
|
+
: typeof p.value === 'number' ? 'number'
|
|
72
|
+
: typeof p.value === 'boolean' ? 'boolean' : undefined;
|
|
73
|
+
const firstValue = includeLegacyListValues ? legacyListValue(p.value) : undefined;
|
|
55
74
|
for (const value of propertyCandidates(p))
|
|
56
75
|
out.push({
|
|
57
76
|
setName: set.name,
|
|
@@ -65,6 +84,8 @@ export function flattenPsets(psets) {
|
|
|
65
84
|
// are case-insensitive, so this doesn't change matching outcomes
|
|
66
85
|
// for either the search chips or free-typed "true"/"false".
|
|
67
86
|
value,
|
|
87
|
+
valueType,
|
|
88
|
+
...(includeLegacyListValues ? { legacyListValue: firstValue } : {}),
|
|
68
89
|
});
|
|
69
90
|
}
|
|
70
91
|
}
|
|
@@ -93,22 +114,43 @@ export function stringifyValue(value) {
|
|
|
93
114
|
return String(value);
|
|
94
115
|
}
|
|
95
116
|
export function matchPropertyRule(rule, rows) {
|
|
96
|
-
//
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
117
|
+
// V1 Lists only stored value comparisons and isNonEmpty. Rules presence
|
|
118
|
+
// operators keep their ordinary row-presence semantics on this public flag.
|
|
119
|
+
if (rule.legacyListFirst && rule.op !== 'isSet' && rule.op !== 'isNotSet'
|
|
120
|
+
&& rule.op !== 'isNull' && rule.op !== 'isNotNull') {
|
|
121
|
+
const first = rows.find((r) => nameMatches(rule.setName, r.setName, rule.setNameKind, rule.nameCaseMode) &&
|
|
122
|
+
nameMatches(rule.propertyName, r.propertyName, rule.propertyNameKind, rule.nameCaseMode));
|
|
123
|
+
const value = first?.legacyListValue === undefined
|
|
124
|
+
? first?.valueType === 'null' ? null : first?.value ?? null
|
|
125
|
+
: first.legacyListValue;
|
|
126
|
+
if (rule.op === 'isNonEmpty')
|
|
127
|
+
return value !== null && value !== '';
|
|
128
|
+
if (value === null)
|
|
129
|
+
return false;
|
|
130
|
+
return valueOpMatches(rule.op, value, rule.value, rule.valueKind, rule.comparison);
|
|
101
131
|
}
|
|
102
|
-
const matching = rows.filter((r) => nameMatches(rule.setName, r.setName, rule.setNameKind) &&
|
|
103
|
-
nameMatches(rule.propertyName, r.propertyName, rule.propertyNameKind));
|
|
132
|
+
const matching = rows.filter((r) => nameMatches(rule.setName, r.setName, rule.setNameKind, rule.nameCaseMode) &&
|
|
133
|
+
nameMatches(rule.propertyName, r.propertyName, rule.propertyNameKind, rule.nameCaseMode));
|
|
134
|
+
// Presence, non-null and non-empty are distinct in imported filters.
|
|
135
|
+
if (rule.op === 'isSet')
|
|
136
|
+
return matching.length > 0;
|
|
137
|
+
if (rule.op === 'isNotSet')
|
|
138
|
+
return matching.length === 0;
|
|
139
|
+
if (rule.op === 'isNull')
|
|
140
|
+
return matching.length === 0 || matching.some((r) => r.valueType === 'null');
|
|
141
|
+
if (rule.op === 'isNotNull')
|
|
142
|
+
return matching.some((r) => r.valueType !== 'null');
|
|
143
|
+
if (rule.op === 'isNonEmpty')
|
|
144
|
+
return matching.some((r) => r.valueType !== 'null' && r.value.length > 0);
|
|
145
|
+
const comparable = rule.comparison ? matching.filter((r) => r.valueType !== 'null') : matching;
|
|
104
146
|
// A negated op holds when NO candidate has the value (a list [A, B] is
|
|
105
147
|
// not "!= A"), the ANY/NONE convention `material` and `parent` use and
|
|
106
148
|
// validation's `checkValueOp` applies (#5475). With a single candidate
|
|
107
149
|
// this is the same answer as before.
|
|
108
150
|
const positive = NEGATED_VALUE_OP[rule.op];
|
|
109
151
|
if (positive)
|
|
110
|
-
return
|
|
111
|
-
return
|
|
152
|
+
return comparable.length > 0 && !comparable.some((r) => valueOpMatches(positive, r.value, rule.value, rule.valueKind, rule.comparison));
|
|
153
|
+
return comparable.some((r) => valueOpMatches(rule.op, r.value, rule.value, rule.valueKind, rule.comparison));
|
|
112
154
|
}
|
|
113
155
|
/** A negated value op's positive form: the negation holds when NO candidate satisfies it (#5475). */
|
|
114
156
|
export const NEGATED_VALUE_OP = { ne: 'eq', notContains: 'contains', notMatches: 'matches' };
|
|
@@ -128,120 +170,21 @@ export function matchAttributeRule(rule, attrs) {
|
|
|
128
170
|
const present = (stringified ?? '').length > 0;
|
|
129
171
|
return rule.op === 'isSet' ? present : !present;
|
|
130
172
|
}
|
|
173
|
+
if (rule.op === 'isNull')
|
|
174
|
+
return found === undefined;
|
|
175
|
+
if (rule.op === 'isNotNull')
|
|
176
|
+
return found !== undefined;
|
|
177
|
+
if (rule.op === 'isNonEmpty')
|
|
178
|
+
return (stringified ?? '').length > 0;
|
|
131
179
|
if (stringified === undefined)
|
|
132
180
|
return false;
|
|
133
|
-
return valueOpMatches(rule.op, stringified, rule.value, rule.valueKind);
|
|
181
|
+
return valueOpMatches(rule.op, stringified, rule.value, rule.valueKind, rule.comparison);
|
|
134
182
|
}
|
|
135
183
|
export function matchQuantityRule(rule, rows) {
|
|
136
184
|
return rows.some((r) => nameMatches(rule.setName, r.setName, rule.setNameKind) &&
|
|
137
185
|
nameMatches(rule.quantityName, r.quantityName, rule.quantityNameKind) &&
|
|
138
186
|
numericOpMatches(rule.op, r.value, rule.value));
|
|
139
187
|
}
|
|
140
|
-
// ── Storey lookup fallback ────────────────────────────────────────────────────
|
|
141
|
-
/**
|
|
142
|
-
* Storey id an element belongs to: its own direct containment
|
|
143
|
-
* (`elementToStorey`, set for an element the storey directly contains plus
|
|
144
|
-
* its `IfcRelAggregates`-aggregated parts) OR — one hop through a
|
|
145
|
-
* containing `IfcSpace`/`IfcSpatialZone` — the storey THAT space belongs
|
|
146
|
-
* to. A space is itself mapped to its storey in `elementToStorey`
|
|
147
|
-
* (`SpatialHierarchyBuilder` walks a storey's own spatial children), so
|
|
148
|
-
* this is a composition of two maps that already exist plus
|
|
149
|
-
* `getContainingSpace` (`@ifc-lite/data`'s `spatialLookups`), not a new
|
|
150
|
-
* traversal. The single home for "which storey" so the per-entity
|
|
151
|
-
* evaluator (`defaultStoreyName`/`storeyMatchesRefs`) and the bulk index
|
|
152
|
-
* prefilter (`unionByStorey`) cannot answer it two different ways.
|
|
153
|
-
*
|
|
154
|
-
* Reaches exactly one level down from the storey: an element inside a
|
|
155
|
-
* space nested inside another space (rather than directly under the
|
|
156
|
-
* storey) is not resolved — see `docs/guide/selector-syntax.md`.
|
|
157
|
-
*/
|
|
158
|
-
function storeyIdOf(hierarchy, expressId) {
|
|
159
|
-
const direct = hierarchy.elementToStorey.get(expressId);
|
|
160
|
-
if (direct !== undefined)
|
|
161
|
-
return direct;
|
|
162
|
-
// `getContainingSpace` is part of the `spatialLookups()` contract every
|
|
163
|
-
// real hierarchy carries, but several tests in this suite build a
|
|
164
|
-
// hand-rolled partial `spatialHierarchy` mock (`byStorey`/`elementToStorey`
|
|
165
|
-
// only) to exercise the ref/name-matching paths in isolation — guard
|
|
166
|
-
// rather than assume every field is present.
|
|
167
|
-
const spaceId = hierarchy.getContainingSpace?.(expressId);
|
|
168
|
-
if (spaceId == null)
|
|
169
|
-
return undefined;
|
|
170
|
-
return hierarchy.elementToStorey.get(spaceId);
|
|
171
|
-
}
|
|
172
|
-
/** Every element `bySpace` lists for a space belonging to `storeyId` — the
|
|
173
|
-
* bulk-prefilter twin of {@link storeyIdOf}'s one-hop space widening.
|
|
174
|
-
* `bySpace` is absent on the same partial test mocks {@link storeyIdOf}
|
|
175
|
-
* guards against. */
|
|
176
|
-
function spaceElementsOfStorey(hierarchy, storeyId) {
|
|
177
|
-
const out = [];
|
|
178
|
-
if (!hierarchy.bySpace)
|
|
179
|
-
return out;
|
|
180
|
-
for (const [spaceId, elements] of hierarchy.bySpace) {
|
|
181
|
-
if (hierarchy.elementToStorey.get(spaceId) !== storeyId)
|
|
182
|
-
continue;
|
|
183
|
-
for (const id of elements)
|
|
184
|
-
out.push(id);
|
|
185
|
-
}
|
|
186
|
-
return out;
|
|
187
|
-
}
|
|
188
|
-
export function defaultStoreyName(store, expressId) {
|
|
189
|
-
const hierarchy = store.spatialHierarchy;
|
|
190
|
-
if (!hierarchy)
|
|
191
|
-
return '';
|
|
192
|
-
const storeyId = storeyIdOf(hierarchy, expressId);
|
|
193
|
-
if (!storeyId)
|
|
194
|
-
return '';
|
|
195
|
-
return store.entities.getName(storeyId);
|
|
196
|
-
}
|
|
197
|
-
/** Does `expressId` (in `modelId`) sit in a storey ref'd by `rule.refs`?
|
|
198
|
-
* `IfcBuildingStorey.Name` isn't unique, so once a `StoreyRule` carries
|
|
199
|
-
* an exact (modelId, expressId) ref (mirrored from a HierarchyPanel
|
|
200
|
-
* click), matching bypasses Name entirely. Reaches through a containing
|
|
201
|
-
* space via {@link storeyIdOf}, same as the Name-matched path. */
|
|
202
|
-
export function storeyMatchesRefs(store, expressId, modelId, rule) {
|
|
203
|
-
const hierarchy = store.spatialHierarchy;
|
|
204
|
-
const storeyId = hierarchy ? storeyIdOf(hierarchy, expressId) : undefined;
|
|
205
|
-
return storeyId != null && !!rule.refs?.some((r) => r.modelId === modelId && r.expressId === storeyId);
|
|
206
|
-
}
|
|
207
|
-
/** Index-prefilter twin of {@link storeyMatchesRefs}/Name matching: the
|
|
208
|
-
* bucket of elements a `storey op:'in'` rule narrows to for `modelId`.
|
|
209
|
-
* Includes each matched storey's directly-contained elements AND every
|
|
210
|
-
* element `bySpace` lists for a space belonging to that storey, so this
|
|
211
|
-
* prefilter can never exclude a candidate the (also widened) per-entity
|
|
212
|
-
* check in `filter-evaluate.ts` would go on to match. */
|
|
213
|
-
export function unionByStorey(store, rule, modelId) {
|
|
214
|
-
const hierarchy = store.spatialHierarchy;
|
|
215
|
-
if (!hierarchy)
|
|
216
|
-
return null;
|
|
217
|
-
const out = [];
|
|
218
|
-
if (rule.refs) {
|
|
219
|
-
for (const ref of rule.refs) {
|
|
220
|
-
if (ref.modelId !== modelId)
|
|
221
|
-
continue;
|
|
222
|
-
const elements = hierarchy.byStorey.get(ref.expressId);
|
|
223
|
-
if (elements)
|
|
224
|
-
for (const id of elements)
|
|
225
|
-
out.push(id);
|
|
226
|
-
for (const id of spaceElementsOfStorey(hierarchy, ref.expressId))
|
|
227
|
-
out.push(id);
|
|
228
|
-
}
|
|
229
|
-
return out.length > 0 ? out : null;
|
|
230
|
-
}
|
|
231
|
-
const wanted = new Set(rule.values.map((n) => n.toLowerCase()));
|
|
232
|
-
for (const storeyId of hierarchy.byStorey.keys()) {
|
|
233
|
-
const name = store.entities.getName(storeyId);
|
|
234
|
-
if (!wanted.has(name.toLowerCase()))
|
|
235
|
-
continue;
|
|
236
|
-
const elements = hierarchy.byStorey.get(storeyId);
|
|
237
|
-
if (elements)
|
|
238
|
-
for (const id of elements)
|
|
239
|
-
out.push(id);
|
|
240
|
-
for (const id of spaceElementsOfStorey(hierarchy, storeyId))
|
|
241
|
-
out.push(id);
|
|
242
|
-
}
|
|
243
|
-
return out.length > 0 ? out : null;
|
|
244
|
-
}
|
|
245
188
|
// ── Material / classification / elevation resolution ─────────────────────────
|
|
246
189
|
/** Collect the *individual* material names an element exposes - each layer /
|
|
247
190
|
* constituent / profile material, or the single plain material - for the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-match.js","sourceRoot":"","sources":["../../src/filter/filter-match.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAkB/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"filter-match.js","sourceRoot":"","sources":["../../src/filter/filter-match.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/** Set-membership: storey, ifcType, predefinedType. */
|
|
2
|
+
export type SetOp = 'in' | 'notIn';
|
|
3
|
+
/** String comparisons (Name rule). */
|
|
4
|
+
export type StringOp = 'eq' | 'ne' | 'contains' | 'notContains' | 'startsWith' | 'matches' | 'notMatches';
|
|
5
|
+
/** Numeric comparisons (Quantity rule). */
|
|
6
|
+
export type NumericOp = 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte';
|
|
7
|
+
/** Mixed string+numeric+presence ops for Property values. */
|
|
8
|
+
export type ValueOp = 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'contains' | 'notContains' | 'startsWith' | 'endsWith' | 'matches' | 'notMatches' | 'isSet' | 'isNotSet' | 'isNonEmpty' | 'isNull' | 'isNotNull';
|
|
9
|
+
/** Comparison details needed when a saved Lens or List condition is
|
|
10
|
+
* converted to the common rule vocabulary (#5892). Defaults keep existing
|
|
11
|
+
* search/validation behavior. */
|
|
12
|
+
export interface ValueComparison {
|
|
13
|
+
/** Search folds case; saved Lens/List equality keeps significant case except IFC booleans. */
|
|
14
|
+
caseMode?: 'fold' | 'exact' | 'lensBoolean' | 'ifcBoolean';
|
|
15
|
+
/** Lists use Number(), while search and Lens use parseFloat() for numeric comparisons. */
|
|
16
|
+
numericMode?: 'prefix' | 'strict';
|
|
17
|
+
}
|
|
18
|
+
/** Classification value+presence ops. A classification is matched against
|
|
19
|
+
* its code / name string, so this is the StringOp comparison subset plus
|
|
20
|
+
* presence — numeric ops don't apply. */
|
|
21
|
+
export type ClassificationOp = 'eq' | 'ne' | 'contains' | 'notContains' | 'matches' | 'notMatches' | 'isSet' | 'isNotSet';
|
|
22
|
+
/** Top-level rule combinator. */
|
|
23
|
+
export type Combinator = 'AND' | 'OR';
|
|
24
|
+
/**
|
|
25
|
+
* How a rule reads one of its strings — the producer saying so, because the
|
|
26
|
+
* string itself cannot.
|
|
27
|
+
*
|
|
28
|
+
* `'regex'` is a regular-expression SOURCE: the WHOLE string is the pattern,
|
|
29
|
+
* slashes included. `'literal'` is exact text that is never a pattern, however
|
|
30
|
+
* it happens to be spelled. Absent means free text a human typed into a chip
|
|
31
|
+
* field, which keeps the Lists-panel convention (#1591): a `/body/flags`
|
|
32
|
+
* literal is a pattern, anything else is plain text.
|
|
33
|
+
*
|
|
34
|
+
* Guessing this back out of the text is the #4091 defect class — matched the
|
|
35
|
+
* wrong thing, said nothing — reappearing at the adapter seam. The selector
|
|
36
|
+
* grammar knows which it parsed: quoting is its ONLY escape hatch for a
|
|
37
|
+
* literal name, so `"/Wall/".FireRating` is the plain name `/Wall/`, and
|
|
38
|
+
* `Name=/\/tmp\//` is the source `/tmp/`. Sniffed for slashes, the first
|
|
39
|
+
* matches every `…Wall…` set and the second matches `tmp`.
|
|
40
|
+
*
|
|
41
|
+
* A property-set or property NAME has no operator beside it, so both kinds
|
|
42
|
+
* have to be declared. A VALUE's op already says whether it is a pattern, so
|
|
43
|
+
* only `'regex'` is ever recorded there.
|
|
44
|
+
*/
|
|
45
|
+
export type TextKind = 'literal' | 'regex';
|
|
46
|
+
//# sourceMappingURL=filter-operator-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-operator-types.d.ts","sourceRoot":"","sources":["../../src/filter/filter-operator-types.ts"],"names":[],"mappings":"AAKA,uDAAuD;AACvD,MAAM,MAAM,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC;AAEnC,sCAAsC;AACtC,MAAM,MAAM,QAAQ,GAChB,IAAI,GACJ,IAAI,GACJ,UAAU,GACV,aAAa,GACb,YAAY,GACZ,SAAS,GACT,YAAY,CAAC;AAEjB,2CAA2C;AAC3C,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,CAAC;AAElE,6DAA6D;AAC7D,MAAM,MAAM,OAAO,GACf,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,IAAI,GACJ,KAAK,GACL,UAAU,GACV,aAAa,GACb,YAAY,GACZ,UAAU,GACV,SAAS,GACT,YAAY,GACZ,OAAO,GACP,UAAU,GACV,YAAY,GACZ,QAAQ,GACR,WAAW,CAAC;AAEhB;;iCAEiC;AACjC,MAAM,WAAW,eAAe;IAC9B,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,aAAa,GAAG,YAAY,CAAC;IAC3D,0FAA0F;IAC1F,WAAW,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CACnC;AAED;;0CAE0C;AAC1C,MAAM,MAAM,gBAAgB,GACxB,IAAI,GACJ,IAAI,GACJ,UAAU,GACV,aAAa,GACb,SAAS,GACT,YAAY,GACZ,OAAO,GACP,UAAU,CAAC;AAEf,iCAAiC;AACjC,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;AAEtC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
2
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
3
|
+
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
|
+
export {};
|
|
5
|
+
//# sourceMappingURL=filter-operator-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-operator-types.js","sourceRoot":"","sources":["../../src/filter/filter-operator-types.ts"],"names":[],"mappings":"AAAA;;+DAE+D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { NumericOp, SetOp, StringOp, TextKind, ValueOp } from './filter-rules.js';
|
|
1
|
+
import type { NumericOp, SetOp, StringOp, TextKind, ValueComparison, ValueOp } from './filter-rules.js';
|
|
2
2
|
/**
|
|
3
3
|
* Trailing options accepted by every op-matching function below (#5138 PR 3).
|
|
4
4
|
* Omitted entirely = today's behaviour EXACTLY: search, saved filters and
|
|
@@ -86,5 +86,5 @@ export declare function numericOpMatches(op: NumericOp, candidate: number, value
|
|
|
86
86
|
* (filter-evaluate.ts) decides them before calling here — but we still
|
|
87
87
|
* accept them so the function is total.
|
|
88
88
|
*/
|
|
89
|
-
export declare function valueOpMatches(op: ValueOp, psetVal: string, ruleVal: string, valueKind?: TextKind, opts?: OpMatchOptions): boolean;
|
|
89
|
+
export declare function valueOpMatches(op: ValueOp, psetVal: string, ruleVal: string, valueKind?: TextKind, opts?: OpMatchOptions & ValueComparison): boolean;
|
|
90
90
|
//# sourceMappingURL=filter-ops.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-ops.d.ts","sourceRoot":"","sources":["../../src/filter/filter-ops.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"filter-ops.d.ts","sourceRoot":"","sources":["../../src/filter/filter-ops.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAExG;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAgCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAIpG;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,KAAK,EACT,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAIT;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAGlG;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,EACZ,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,QAAQ,EACpB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAyBT;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,QAAQ,EACZ,UAAU,EAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,EAC3C,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,QAAQ,EACpB,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAeT;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAyBhH;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,QAAQ,EACpB,IAAI,CAAC,EAAE,cAAc,GAAG,eAAe,GACtC,OAAO,CA0BT"}
|