@ifc-lite/rules 0.3.2 → 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-compare.js +3 -3
- package/dist/engine/rule-engine-compare.js.map +1 -1
- package/dist/engine/rule-engine-requirements.d.ts.map +1 -1
- package/dist/engine/rule-engine-requirements.js +13 -8
- 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 +7 -6
- 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 +22 -17
- package/dist/filter/filter-match.d.ts.map +1 -1
- package/dist/filter/filter-match.js +97 -130
- package/dist/filter/filter-match.js.map +1 -1
- package/dist/filter/filter-model-fact.js +2 -2
- package/dist/filter/filter-model-fact.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 +5 -2
- package/dist/filter/read-measure-subject.d.ts.map +1 -1
- package/dist/filter/read-measure-subject.js +31 -12
- package/dist/filter/read-measure-subject.js.map +1 -1
- package/dist/filter/read-subject.d.ts +9 -0
- package/dist/filter/read-subject.d.ts.map +1 -1
- package/dist/filter/read-subject.js +14 -1
- package/dist/filter/read-subject.js.map +1 -1
- package/dist/filter/subject-match.d.ts.map +1 -1
- package/dist/filter/subject-match.js +7 -0
- package/dist/filter/subject-match.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,109 @@
|
|
|
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
|
+
// ── Storey lookup fallback ────────────────────────────────────────────────────
|
|
5
|
+
/**
|
|
6
|
+
* Storey id an element belongs to: its own direct containment
|
|
7
|
+
* (`elementToStorey`, set for an element the storey directly contains plus
|
|
8
|
+
* its `IfcRelAggregates`-aggregated parts) OR — one hop through a
|
|
9
|
+
* containing `IfcSpace`/`IfcSpatialZone` — the storey THAT space belongs
|
|
10
|
+
* to. A space is itself mapped to its storey in `elementToStorey`
|
|
11
|
+
* (`SpatialHierarchyBuilder` walks a storey's own spatial children), so
|
|
12
|
+
* this is a composition of two maps that already exist plus
|
|
13
|
+
* `getContainingSpace` (`@ifc-lite/data`'s `spatialLookups`), not a new
|
|
14
|
+
* traversal. The single home for "which storey" so the per-entity
|
|
15
|
+
* evaluator (`defaultStoreyName`/`storeyMatchesRefs`) and the bulk index
|
|
16
|
+
* prefilter (`unionByStorey`) cannot answer it two different ways.
|
|
17
|
+
*
|
|
18
|
+
* Reaches exactly one level down from the storey: an element inside a
|
|
19
|
+
* space nested inside another space (rather than directly under the
|
|
20
|
+
* storey) is not resolved — see `docs/guide/selector-syntax.md`.
|
|
21
|
+
*/
|
|
22
|
+
function storeyIdOf(hierarchy, expressId) {
|
|
23
|
+
const direct = hierarchy.elementToStorey.get(expressId);
|
|
24
|
+
if (direct !== undefined)
|
|
25
|
+
return direct;
|
|
26
|
+
// `getContainingSpace` is part of the `spatialLookups()` contract every
|
|
27
|
+
// real hierarchy carries, but several tests in this suite build a
|
|
28
|
+
// hand-rolled partial `spatialHierarchy` mock (`byStorey`/`elementToStorey`
|
|
29
|
+
// only) to exercise the ref/name-matching paths in isolation — guard
|
|
30
|
+
// rather than assume every field is present.
|
|
31
|
+
const spaceId = hierarchy.getContainingSpace?.(expressId);
|
|
32
|
+
if (spaceId == null)
|
|
33
|
+
return undefined;
|
|
34
|
+
return hierarchy.elementToStorey.get(spaceId);
|
|
35
|
+
}
|
|
36
|
+
/** Every element `bySpace` lists for a space belonging to `storeyId` — the
|
|
37
|
+
* bulk-prefilter twin of {@link storeyIdOf}'s one-hop space widening.
|
|
38
|
+
* `bySpace` is absent on the same partial test mocks {@link storeyIdOf}
|
|
39
|
+
* guards against. */
|
|
40
|
+
function spaceElementsOfStorey(hierarchy, storeyId) {
|
|
41
|
+
const out = [];
|
|
42
|
+
if (!hierarchy.bySpace)
|
|
43
|
+
return out;
|
|
44
|
+
for (const [spaceId, elements] of hierarchy.bySpace) {
|
|
45
|
+
if (hierarchy.elementToStorey.get(spaceId) !== storeyId)
|
|
46
|
+
continue;
|
|
47
|
+
for (const id of elements)
|
|
48
|
+
out.push(id);
|
|
49
|
+
}
|
|
50
|
+
return out;
|
|
51
|
+
}
|
|
52
|
+
export function defaultStoreyName(store, expressId) {
|
|
53
|
+
const hierarchy = store.spatialHierarchy;
|
|
54
|
+
if (!hierarchy)
|
|
55
|
+
return '';
|
|
56
|
+
const storeyId = storeyIdOf(hierarchy, expressId);
|
|
57
|
+
if (!storeyId)
|
|
58
|
+
return '';
|
|
59
|
+
return store.entities.getName(storeyId);
|
|
60
|
+
}
|
|
61
|
+
/** Does `expressId` (in `modelId`) sit in a storey ref'd by `rule.refs`?
|
|
62
|
+
* `IfcBuildingStorey.Name` isn't unique, so once a `StoreyRule` carries
|
|
63
|
+
* an exact (modelId, expressId) ref (mirrored from a HierarchyPanel
|
|
64
|
+
* click), matching bypasses Name entirely. Reaches through a containing
|
|
65
|
+
* space via {@link storeyIdOf}, same as the Name-matched path. */
|
|
66
|
+
export function storeyMatchesRefs(store, expressId, modelId, rule) {
|
|
67
|
+
const hierarchy = store.spatialHierarchy;
|
|
68
|
+
const storeyId = hierarchy ? storeyIdOf(hierarchy, expressId) : undefined;
|
|
69
|
+
return storeyId != null && !!rule.refs?.some((r) => r.modelId === modelId && r.expressId === storeyId);
|
|
70
|
+
}
|
|
71
|
+
/** Index-prefilter twin of {@link storeyMatchesRefs}/Name matching: the
|
|
72
|
+
* bucket of elements a `storey op:'in'` rule narrows to for `modelId`.
|
|
73
|
+
* Includes each matched storey's directly-contained elements AND every
|
|
74
|
+
* element `bySpace` lists for a space belonging to that storey, so this
|
|
75
|
+
* prefilter can never exclude a candidate the (also widened) per-entity
|
|
76
|
+
* check in `filter-evaluate.ts` would go on to match. */
|
|
77
|
+
export function unionByStorey(store, rule, modelId) {
|
|
78
|
+
const hierarchy = store.spatialHierarchy;
|
|
79
|
+
if (!hierarchy)
|
|
80
|
+
return null;
|
|
81
|
+
const out = [];
|
|
82
|
+
if (rule.refs) {
|
|
83
|
+
for (const ref of rule.refs) {
|
|
84
|
+
if (ref.modelId !== modelId)
|
|
85
|
+
continue;
|
|
86
|
+
const elements = hierarchy.byStorey.get(ref.expressId);
|
|
87
|
+
if (elements)
|
|
88
|
+
for (const id of elements)
|
|
89
|
+
out.push(id);
|
|
90
|
+
for (const id of spaceElementsOfStorey(hierarchy, ref.expressId))
|
|
91
|
+
out.push(id);
|
|
92
|
+
}
|
|
93
|
+
return out.length > 0 ? out : null;
|
|
94
|
+
}
|
|
95
|
+
const wanted = new Set(rule.values.map((n) => n.toLowerCase()));
|
|
96
|
+
for (const storeyId of hierarchy.byStorey.keys()) {
|
|
97
|
+
const name = store.entities.getName(storeyId);
|
|
98
|
+
if (!wanted.has(name.toLowerCase()))
|
|
99
|
+
continue;
|
|
100
|
+
const elements = hierarchy.byStorey.get(storeyId);
|
|
101
|
+
if (elements)
|
|
102
|
+
for (const id of elements)
|
|
103
|
+
out.push(id);
|
|
104
|
+
for (const id of spaceElementsOfStorey(hierarchy, storeyId))
|
|
105
|
+
out.push(id);
|
|
106
|
+
}
|
|
107
|
+
return out.length > 0 ? out : null;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=filter-storey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-storey.js","sourceRoot":"","sources":["../../src/filter/filter-storey.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/** Pure, total operator conversion for persisted Lens and List filters (#5892).
|
|
2
|
+
* Callers supply the target field as a rule template; the adapter changes only
|
|
3
|
+
* the comparison, so a missing field or unknown saved operator is never lost
|
|
4
|
+
* through an unrelated source conversion. */
|
|
5
|
+
import type { AttributeRule, PropertyRule } from './filter-rules.js';
|
|
6
|
+
type ValueRule = AttributeRule | PropertyRule;
|
|
7
|
+
type Vocabulary = 'lens' | 'lists';
|
|
8
|
+
export type LegacyOperatorResult<T> = {
|
|
9
|
+
status: 'readable';
|
|
10
|
+
value: T;
|
|
11
|
+
} | {
|
|
12
|
+
status: 'unreadable';
|
|
13
|
+
vocabulary: Vocabulary;
|
|
14
|
+
operator: string;
|
|
15
|
+
};
|
|
16
|
+
declare const LENS_OPS: {
|
|
17
|
+
readonly equals: "eq";
|
|
18
|
+
readonly contains: "contains";
|
|
19
|
+
readonly exists: "isNotNull";
|
|
20
|
+
readonly ne: "ne";
|
|
21
|
+
readonly gt: "gt";
|
|
22
|
+
readonly gte: "gte";
|
|
23
|
+
readonly lt: "lt";
|
|
24
|
+
readonly lte: "lte";
|
|
25
|
+
};
|
|
26
|
+
/** Operators stored in v1 Lens JSON. Kept private so rules has no Lens package edge. */
|
|
27
|
+
type PersistedLensOperator = keyof typeof LENS_OPS;
|
|
28
|
+
declare const LIST_OPS: {
|
|
29
|
+
readonly equals: "eq";
|
|
30
|
+
readonly notEquals: "ne";
|
|
31
|
+
readonly contains: "contains";
|
|
32
|
+
readonly exists: "isNonEmpty";
|
|
33
|
+
readonly gt: "gt";
|
|
34
|
+
readonly gte: "gte";
|
|
35
|
+
readonly lt: "lt";
|
|
36
|
+
readonly lte: "lte";
|
|
37
|
+
};
|
|
38
|
+
/** Operators stored in v1 List JSON. Kept private so Lists can depend on Rules. */
|
|
39
|
+
type PersistedListOperator = keyof typeof LIST_OPS;
|
|
40
|
+
/** Lens equality is exact for text, but folds case for true/false only. */
|
|
41
|
+
export declare function legacyLensOperatorToFilterRule<T extends ValueRule>(operator: string, template: T): LegacyOperatorResult<T>;
|
|
42
|
+
/** Lists preserve case for text except IFC boolean/logical values; Number() parses comparisons. */
|
|
43
|
+
export declare function legacyListOperatorToFilterRule<T extends ValueRule>(operator: string, template: T): LegacyOperatorResult<T>;
|
|
44
|
+
export declare function filterRuleToLegacyLensOperator(rule: ValueRule): LegacyOperatorResult<PersistedLensOperator>;
|
|
45
|
+
export declare function filterRuleToLegacyListOperator(rule: ValueRule): LegacyOperatorResult<PersistedListOperator>;
|
|
46
|
+
export {};
|
|
47
|
+
//# sourceMappingURL=legacy-operator-adapters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-operator-adapters.d.ts","sourceRoot":"","sources":["../../src/filter/legacy-operator-adapters.ts"],"names":[],"mappings":"AAIA;;;6CAG6C;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAA4B,MAAM,mBAAmB,CAAC;AAE/F,KAAK,SAAS,GAAG,aAAa,GAAG,YAAY,CAAC;AAC9C,KAAK,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAEnC,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAC9B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAChC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvE,QAAA,MAAM,QAAQ;;;;;;;;;CAG8B,CAAC;AAE7C,wFAAwF;AACxF,KAAK,qBAAqB,GAAG,MAAM,OAAO,QAAQ,CAAC;AAEnD,QAAA,MAAM,QAAQ;;;;;;;;;CAG8B,CAAC;AAE7C,mFAAmF;AACnF,KAAK,qBAAqB,GAAG,MAAM,OAAO,QAAQ,CAAC;AAQnD,2EAA2E;AAC3E,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,SAAS,EAChE,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,GACV,oBAAoB,CAAC,CAAC,CAAC,CAYzB;AAED,mGAAmG;AACnG,wBAAgB,8BAA8B,CAAC,CAAC,SAAS,SAAS,EAChE,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,CAAC,GACV,oBAAoB,CAAC,CAAC,CAAC,CAWzB;AAoBD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,SAAS,GAAG,oBAAoB,CAAC,qBAAqB,CAAC,CAU3G;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,SAAS,GAAG,oBAAoB,CAAC,qBAAqB,CAAC,CAM3G"}
|
|
@@ -0,0 +1,74 @@
|
|
|
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
|
+
const LENS_OPS = {
|
|
5
|
+
equals: 'eq', contains: 'contains', exists: 'isNotNull', ne: 'ne',
|
|
6
|
+
gt: 'gt', gte: 'gte', lt: 'lt', lte: 'lte',
|
|
7
|
+
};
|
|
8
|
+
const LIST_OPS = {
|
|
9
|
+
equals: 'eq', notEquals: 'ne', contains: 'contains', exists: 'isNonEmpty',
|
|
10
|
+
gt: 'gt', gte: 'gte', lt: 'lt', lte: 'lte',
|
|
11
|
+
};
|
|
12
|
+
function mapped(vocabulary, operator, table) {
|
|
13
|
+
return Object.hasOwn(table, operator)
|
|
14
|
+
? { status: 'readable', value: table[operator] }
|
|
15
|
+
: { status: 'unreadable', vocabulary, operator };
|
|
16
|
+
}
|
|
17
|
+
/** Lens equality is exact for text, but folds case for true/false only. */
|
|
18
|
+
export function legacyLensOperatorToFilterRule(operator, template) {
|
|
19
|
+
const result = mapped('lens', operator, LENS_OPS);
|
|
20
|
+
if (result.status === 'unreadable')
|
|
21
|
+
return result;
|
|
22
|
+
const op = operator === 'exists' && template.kind === 'attribute' ? 'isNonEmpty' : result.value;
|
|
23
|
+
return { status: 'readable', value: {
|
|
24
|
+
...template,
|
|
25
|
+
op,
|
|
26
|
+
comparison: {
|
|
27
|
+
caseMode: operator === 'equals' ? 'lensBoolean' : 'fold',
|
|
28
|
+
numericMode: 'prefix',
|
|
29
|
+
},
|
|
30
|
+
} };
|
|
31
|
+
}
|
|
32
|
+
/** Lists preserve case for text except IFC boolean/logical values; Number() parses comparisons. */
|
|
33
|
+
export function legacyListOperatorToFilterRule(operator, template) {
|
|
34
|
+
const result = mapped('lists', operator, LIST_OPS);
|
|
35
|
+
if (result.status === 'unreadable')
|
|
36
|
+
return result;
|
|
37
|
+
return { status: 'readable', value: {
|
|
38
|
+
...template,
|
|
39
|
+
op: result.value,
|
|
40
|
+
comparison: {
|
|
41
|
+
caseMode: operator === 'equals' || operator === 'notEquals' ? 'ifcBoolean' : 'fold',
|
|
42
|
+
numericMode: 'strict',
|
|
43
|
+
},
|
|
44
|
+
} };
|
|
45
|
+
}
|
|
46
|
+
function inverse(vocabulary, op, entries) {
|
|
47
|
+
const match = entries.find(([, canonical]) => canonical === op);
|
|
48
|
+
return match ? { status: 'readable', value: match[0] } : { status: 'unreadable', vocabulary, operator: op };
|
|
49
|
+
}
|
|
50
|
+
function legacyComparison(comparison, caseMode, numericMode) {
|
|
51
|
+
if (!comparison)
|
|
52
|
+
return false;
|
|
53
|
+
return comparison.caseMode === caseMode && comparison.numericMode === numericMode;
|
|
54
|
+
}
|
|
55
|
+
export function filterRuleToLegacyLensOperator(rule) {
|
|
56
|
+
const caseMode = rule.op === 'eq' ? 'lensBoolean' : 'fold';
|
|
57
|
+
if (!legacyComparison(rule.comparison, caseMode, 'prefix')) {
|
|
58
|
+
return { status: 'unreadable', vocabulary: 'lens', operator: rule.op };
|
|
59
|
+
}
|
|
60
|
+
if (rule.op === 'isNonEmpty' && rule.kind === 'attribute')
|
|
61
|
+
return { status: 'readable', value: 'exists' };
|
|
62
|
+
if (rule.op === 'isNotNull' && rule.kind === 'attribute') {
|
|
63
|
+
return { status: 'unreadable', vocabulary: 'lens', operator: rule.op };
|
|
64
|
+
}
|
|
65
|
+
return inverse('lens', rule.op, Object.entries(LENS_OPS));
|
|
66
|
+
}
|
|
67
|
+
export function filterRuleToLegacyListOperator(rule) {
|
|
68
|
+
const caseMode = rule.op === 'eq' || rule.op === 'ne' ? 'ifcBoolean' : 'fold';
|
|
69
|
+
if (!legacyComparison(rule.comparison, caseMode, 'strict')) {
|
|
70
|
+
return { status: 'unreadable', vocabulary: 'lists', operator: rule.op };
|
|
71
|
+
}
|
|
72
|
+
return inverse('lists', rule.op, Object.entries(LIST_OPS));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=legacy-operator-adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-operator-adapters.js","sourceRoot":"","sources":["../../src/filter/legacy-operator-adapters.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `property` and `quantity` subjects for `readSubject`: the values, the
|
|
3
|
-
* unit each is recorded in (#5300), its SI factor (#5225),
|
|
4
|
-
* `inherit` option (#5433)
|
|
3
|
+
* unit each is recorded in (#5300), its SI factor (#5225), the
|
|
4
|
+
* `inherit` option (#5433), and a property's complex-property
|
|
5
|
+
* `memberPath` (#5475). Split out of `read-subject.ts` for size.
|
|
5
6
|
*
|
|
6
7
|
* `inherit` (`SubjectReadOptions`):
|
|
7
8
|
* - absent: the element's own values; a property also reads its type's
|
|
@@ -22,6 +23,8 @@ export interface MeasureValue {
|
|
|
22
23
|
unit?: string;
|
|
23
24
|
valueUnits: ReadonlyArray<string | undefined>;
|
|
24
25
|
valueSiScales: ReadonlyArray<number | undefined>;
|
|
26
|
+
/** Properties only: one display value per matched property, a list or table as its joined text. */
|
|
27
|
+
displayValues?: ReadonlyArray<string>;
|
|
25
28
|
}
|
|
26
29
|
export declare function readMeasureSubject(subject: MeasureSubject, store: IfcDataStore, expressId: number): MeasureValue;
|
|
27
30
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-measure-subject.d.ts","sourceRoot":"","sources":["../../src/filter/read-measure-subject.ts"],"names":[],"mappings":"AAIA
|
|
1
|
+
{"version":3,"file":"read-measure-subject.d.ts","sourceRoot":"","sources":["../../src/filter/read-measure-subject.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAQL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAIpE,KAAK,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,OAAO,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC;AAE5G,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC9C,aAAa,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,mGAAmG;IACnG,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACvC;AA4FD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,CAiBhH"}
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
/**
|
|
5
5
|
* `property` and `quantity` subjects for `readSubject`: the values, the
|
|
6
|
-
* unit each is recorded in (#5300), its SI factor (#5225),
|
|
7
|
-
* `inherit` option (#5433)
|
|
6
|
+
* unit each is recorded in (#5300), its SI factor (#5225), the
|
|
7
|
+
* `inherit` option (#5433), and a property's complex-property
|
|
8
|
+
* `memberPath` (#5475). Split out of `read-subject.ts` for size.
|
|
8
9
|
*
|
|
9
10
|
* `inherit` (`SubjectReadOptions`):
|
|
10
11
|
* - absent: the element's own values; a property also reads its type's
|
|
@@ -18,7 +19,7 @@
|
|
|
18
19
|
*/
|
|
19
20
|
import { extractPropertiesOnDemand, extractQuantitiesOnDemand, extractTypePropertiesOnDemand, extractTypeQuantitiesOnDemand, mergeInheritedPropertySets, mergeInheritedQuantitySets, } from '@ifc-lite/parser';
|
|
20
21
|
import { RelationshipType } from '@ifc-lite/data';
|
|
21
|
-
import { nameMatches, stringifyValue } from './filter-match.js';
|
|
22
|
+
import { nameMatches, propertyCandidates, stringifyValue } from './filter-match.js';
|
|
22
23
|
import { projectSiScale, projectUnitSymbol, quantityValueSiScale, QUANTITY_MEASURE_TYPE } from './measure-units.js';
|
|
23
24
|
/** `expressId`'s type-level property sets via `IfcRelDefinesByType`. */
|
|
24
25
|
function inheritedTypePsets(store, expressId) {
|
|
@@ -32,25 +33,43 @@ function inheritedTypePsets(store, expressId) {
|
|
|
32
33
|
}
|
|
33
34
|
return (store.properties?.getForEntity?.(typeIds[0]) ?? []);
|
|
34
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* The members of `property` that `memberPath` names, one level per entry
|
|
38
|
+
* (#5475): only an `IfcComplexProperty` has members, so any other property,
|
|
39
|
+
* or a name no member has, yields none. No `memberPath`: the property itself.
|
|
40
|
+
*/
|
|
41
|
+
function complexMembers(property, memberPath) {
|
|
42
|
+
let level = [property];
|
|
43
|
+
for (const name of memberPath ?? []) {
|
|
44
|
+
const wanted = name.toLowerCase();
|
|
45
|
+
level = level.flatMap((p) => (p.members ?? []).filter((m) => m.name.toLowerCase() === wanted));
|
|
46
|
+
}
|
|
47
|
+
return level;
|
|
48
|
+
}
|
|
35
49
|
function readProperty(subject, store, expressId) {
|
|
36
50
|
const merged = mergeInheritedPropertySets(extractPropertiesOnDemand(store, expressId), inheritedTypePsets(store, expressId));
|
|
37
51
|
const values = [];
|
|
38
52
|
const valueUnits = [];
|
|
39
53
|
const valueSiScales = [];
|
|
54
|
+
const displayValues = [];
|
|
40
55
|
for (const set of merged) {
|
|
41
56
|
if (!nameMatches(subject.setName, set.name, subject.setNameKind))
|
|
42
57
|
continue;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
const named = set.properties.filter((p) => nameMatches(subject.propertyName, p.name, subject.propertyNameKind));
|
|
59
|
+
for (const p of named.flatMap((property) => complexMembers(property, subject.memberPath))) {
|
|
60
|
+
// Every candidate of a list, enumerated or table value (#5475); they
|
|
61
|
+
// share the property's unit.
|
|
62
|
+
const unit = p.unit ?? projectUnitSymbol(store, p.dataType);
|
|
63
|
+
const siScale = p.unit !== undefined ? p.unitSiScale : projectSiScale(store, p.dataType);
|
|
64
|
+
displayValues.push(stringifyValue(p.value));
|
|
65
|
+
for (const value of propertyCandidates(p)) {
|
|
66
|
+
values.push(value);
|
|
67
|
+
valueUnits.push(unit);
|
|
68
|
+
valueSiScales.push(siScale);
|
|
69
|
+
}
|
|
51
70
|
}
|
|
52
71
|
}
|
|
53
|
-
return { present: values.some((v) => v.trim().length > 0), values, valueUnits, valueSiScales };
|
|
72
|
+
return { present: values.some((v) => v.trim().length > 0), values, valueUnits, valueSiScales, displayValues };
|
|
54
73
|
}
|
|
55
74
|
/**
|
|
56
75
|
* `expressId`'s type-level quantity sets: parsed from the source, or for a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-measure-subject.js","sourceRoot":"","sources":["../../src/filter/read-measure-subject.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D
|
|
1
|
+
{"version":3,"file":"read-measure-subject.js","sourceRoot":"","sources":["../../src/filter/read-measure-subject.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,7 +61,16 @@ export interface SubjectValue {
|
|
|
61
61
|
* `valueUnits`; `undefined` for a value with no unit (#5225).
|
|
62
62
|
*/
|
|
63
63
|
valueSiScales?: ReadonlyArray<number | undefined>;
|
|
64
|
+
/**
|
|
65
|
+
* Property subjects only: one value per matched property, a list, enumerated
|
|
66
|
+
* or table value as its joined display text, where `values` holds each
|
|
67
|
+
* member (#5475). The set checks (`unique`, `aggregate`, `compare`) read
|
|
68
|
+
* a property as ONE value, so they use these; element checks match members.
|
|
69
|
+
*/
|
|
70
|
+
displayValues?: ReadonlyArray<string>;
|
|
64
71
|
}
|
|
72
|
+
/** `subject` read as whole values: each property once, as the set checks compare it (#5475). */
|
|
73
|
+
export declare function readSubjectWhole(subject: Subject, ctx: ReadSubjectContext): SubjectValue;
|
|
65
74
|
/**
|
|
66
75
|
* Read one `Subject`'s raw values off `ctx.expressId`. Callers may pass a
|
|
67
76
|
* full `FilterRule` in place of a `Subject` — every rule kind's shape is a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-subject.d.ts","sourceRoot":"","sources":["../../src/filter/read-subject.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"read-subject.d.ts","sourceRoot":"","sources":["../../src/filter/read-subject.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAQvD;;6DAE6D;AAC7D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IACvC,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/C;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAClD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,gGAAgG;AAChG,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,GAAG,YAAY,CASxF;AAiBD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB,GAAG,YAAY,CAiEnF"}
|
|
@@ -36,11 +36,24 @@
|
|
|
36
36
|
*/
|
|
37
37
|
import { extractAllEntityAttributes, extractAllMaterialsOnDemand, extractClassificationsOnDemand, } from '@ifc-lite/parser';
|
|
38
38
|
import { RelationshipType, collectSpatialAncestors } from '@ifc-lite/data';
|
|
39
|
-
import { stringifyValue,
|
|
39
|
+
import { stringifyValue, materialNamesOf } from './filter-match.js';
|
|
40
|
+
import { defaultStoreyName } from './filter-storey.js';
|
|
40
41
|
import { resolveEntityPredefinedType } from './entity-predefined-type.js';
|
|
41
42
|
import { readMeasureSubject } from './read-measure-subject.js';
|
|
42
43
|
import { assignedGroupNames } from './filter-group-rule.js';
|
|
43
44
|
import { readModelFact } from './filter-model-fact.js';
|
|
45
|
+
/** `subject` read as whole values: each property once, as the set checks compare it (#5475). */
|
|
46
|
+
export function readSubjectWhole(subject, ctx) {
|
|
47
|
+
const read = readSubject(subject, ctx);
|
|
48
|
+
if (!read.displayValues)
|
|
49
|
+
return read;
|
|
50
|
+
// Per-member unit arrays no longer line up with one value per property; drop them.
|
|
51
|
+
return {
|
|
52
|
+
present: read.displayValues.some((v) => v.trim().length > 0),
|
|
53
|
+
values: read.displayValues,
|
|
54
|
+
...(read.unit !== undefined ? { unit: read.unit } : {}),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
44
57
|
function fromStrings(values) {
|
|
45
58
|
const defined = values.filter((v) => v !== undefined);
|
|
46
59
|
return { present: defined.some((v) => v.trim().length > 0), values: defined };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"read-subject.js","sourceRoot":"","sources":["../../src/filter/read-subject.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,8BAA8B,GAE/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"read-subject.js","sourceRoot":"","sources":["../../src/filter/read-subject.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject-match.d.ts","sourceRoot":"","sources":["../../src/filter/subject-match.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"subject-match.d.ts","sourceRoot":"","sources":["../../src/filter/subject-match.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGnE;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAgB9D;AAED,sDAAsD;AACtD,wBAAgB,eAAe,CAC7B,IAAI,EAAE,YAAY,GAAG,YAAY,EACjC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,GAChB,YAAY,CAGd;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,YAAY,GAAG,YAAY,EACjC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAcT"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
import { numericOpMatches, valueOpMatches } from './filter-ops.js';
|
|
5
5
|
import { readSubject } from './read-subject.js';
|
|
6
|
+
import { NEGATED_VALUE_OP } from './filter-match.js';
|
|
6
7
|
/**
|
|
7
8
|
* `subject` with every value that has a unit converted to SI base units.
|
|
8
9
|
* A value with no SI factor (a label, a count) is left as it is.
|
|
@@ -47,6 +48,12 @@ export function matchRuleThroughSubject(rule, store, expressId) {
|
|
|
47
48
|
return subject.present;
|
|
48
49
|
if (rule.op === 'isNotSet')
|
|
49
50
|
return !subject.present;
|
|
51
|
+
// Same NONE rule as `matchPropertyRule` for a list / table read member by member (#5475).
|
|
52
|
+
const positive = NEGATED_VALUE_OP[rule.op];
|
|
53
|
+
if (positive) {
|
|
54
|
+
return subject.values.length > 0
|
|
55
|
+
&& !subject.values.some((v) => valueOpMatches(positive, String(v), rule.value, rule.valueKind));
|
|
56
|
+
}
|
|
50
57
|
return subject.values.some((v) => valueOpMatches(rule.op, String(v), rule.value, rule.valueKind));
|
|
51
58
|
}
|
|
52
59
|
//# sourceMappingURL=subject-match.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject-match.js","sourceRoot":"","sources":["../../src/filter/subject-match.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAe/D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAqB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"subject-match.js","sourceRoot":"","sources":["../../src/filter/subject-match.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,22 @@ export interface SubjectReadOptions {
|
|
|
28
28
|
*/
|
|
29
29
|
inherit?: 'type' | 'aggregation';
|
|
30
30
|
}
|
|
31
|
+
/** Read options only a `property` rule or subject takes. */
|
|
32
|
+
export interface PropertyReadOptions extends SubjectReadOptions {
|
|
33
|
+
/**
|
|
34
|
+
* The member of an `IfcComplexProperty` to read, by `Name`, one entry per
|
|
35
|
+
* nesting level: `['Width']`, or `['Frame', 'Width']` for a member of a
|
|
36
|
+
* nested complex property (#5475). Names compare case-insensitively, like
|
|
37
|
+
* property names. A property that is not complex, or has no such member,
|
|
38
|
+
* reads as absent. Absent: a complex property reads as its members'
|
|
39
|
+
* joined text.
|
|
40
|
+
*/
|
|
41
|
+
memberPath?: string[];
|
|
42
|
+
}
|
|
31
43
|
/** Whether `rule` has to be matched through the subject reader. */
|
|
32
|
-
export declare function readsThroughSubject(rule:
|
|
44
|
+
export declare function readsThroughSubject(rule: PropertyReadOptions): boolean;
|
|
45
|
+
/** A `memberPath` a rule or subject may carry: a non-empty list of non-empty names. */
|
|
46
|
+
export declare function isMemberPath(value: unknown): value is string[];
|
|
47
|
+
/** How a `memberPath` reads in a label: ` › Frame › Width`, or `''` without one. */
|
|
48
|
+
export declare function memberPathLabel(memberPath: readonly string[] | undefined): string;
|
|
33
49
|
//# sourceMappingURL=subject-read-options.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject-read-options.d.ts","sourceRoot":"","sources":["../../src/filter/subject-read-options.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CAClC;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"subject-read-options.d.ts","sourceRoot":"","sources":["../../src/filter/subject-read-options.ts"],"names":[],"mappings":"AAIA;;;;;;;;;GASG;AAEH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CAClC;AAED,4DAA4D;AAC5D,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAEtE;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,EAAE,CAE9D;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,GAAG,MAAM,CAEjF"}
|
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
|
4
4
|
/** Whether `rule` has to be matched through the subject reader. */
|
|
5
5
|
export function readsThroughSubject(rule) {
|
|
6
|
-
return rule.valueUnit !== undefined || rule.inherit !== undefined;
|
|
6
|
+
return rule.valueUnit !== undefined || rule.inherit !== undefined || rule.memberPath !== undefined;
|
|
7
|
+
}
|
|
8
|
+
/** A `memberPath` a rule or subject may carry: a non-empty list of non-empty names. */
|
|
9
|
+
export function isMemberPath(value) {
|
|
10
|
+
return Array.isArray(value) && value.length > 0 && value.every((s) => typeof s === 'string' && s.length > 0);
|
|
11
|
+
}
|
|
12
|
+
/** How a `memberPath` reads in a label: ` › Frame › Width`, or `''` without one. */
|
|
13
|
+
export function memberPathLabel(memberPath) {
|
|
14
|
+
return (memberPath ?? []).map((name) => ` › ${name}`).join('');
|
|
7
15
|
}
|
|
8
16
|
//# sourceMappingURL=subject-read-options.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject-read-options.js","sourceRoot":"","sources":["../../src/filter/subject-read-options.ts"],"names":[],"mappings":"AAAA;;+DAE+D;
|
|
1
|
+
{"version":3,"file":"subject-read-options.js","sourceRoot":"","sources":["../../src/filter/subject-read-options.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AA+C/D,mEAAmE;AACnE,MAAM,UAAU,mBAAmB,CAAC,IAAyB;IAC3D,OAAO,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,CAAC;AACrG,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,YAAY,CAAC,KAAc;IACzC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/G,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,UAAyC;IACvE,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-to-ids-facets.d.ts","sourceRoot":"","sources":["../../src/ids/rule-to-ids-facets.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAyB,YAAY,EAAE,YAAY,EAAY,MAAM,2BAA2B,CAAC;AAG7G,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,aAAa,CAAC;AAExD,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACjD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAgErC;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,KAAK,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-to-ids-facets.d.ts","sourceRoot":"","sources":["../../src/ids/rule-to-ids-facets.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAiB,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAyB,YAAY,EAAE,YAAY,EAAY,MAAM,2BAA2B,CAAC;AAG7G,MAAM,MAAM,SAAS,GAAG,eAAe,GAAG,aAAa,CAAC;AAExD,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACjD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAgErC;;;;;GAKG;AACH,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,YAAY,KAAK,eAAe,CAAC;AA2LvF,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,GAAE,iBAA4B,GAAG,WAAW,CAsCrH"}
|
|
@@ -116,6 +116,8 @@ function mapRule(rule, scaleOf) {
|
|
|
116
116
|
return { reason: 'group membership by name or by class-with-subclasses has no IDS facet (partOf matches one exact class)' };
|
|
117
117
|
case 'modelFact':
|
|
118
118
|
return { reason: 'a model-level fact (georeferencing, units, header) has no IDS facet' };
|
|
119
|
+
case 'listCondition':
|
|
120
|
+
return { reason: 'a Lists condition reads viewer list data and has no IDS facet' };
|
|
119
121
|
case 'globalId':
|
|
120
122
|
return { facet: { type: 'attribute', name: { type: 'simpleValue', value: 'GlobalId' }, value: simpleOrEnumeration(rule.values) } };
|
|
121
123
|
case 'name':
|
|
@@ -131,6 +133,9 @@ function mapRule(rule, scaleOf) {
|
|
|
131
133
|
}
|
|
132
134
|
case 'property':
|
|
133
135
|
case 'quantity': {
|
|
136
|
+
if (rule.kind === 'property' && rule.memberPath) {
|
|
137
|
+
return { reason: 'a complex-property member (memberPath) has no IDS facet' };
|
|
138
|
+
}
|
|
134
139
|
const isQuantity = rule.kind === 'quantity';
|
|
135
140
|
const setName = nameConstraint(rule.setName, rule.setNameKind);
|
|
136
141
|
const baseName = isQuantity
|