@ifc-lite/query 1.14.14 → 1.14.15

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 CHANGED
@@ -48,11 +48,26 @@ query.spaces().execute();
48
48
  query
49
49
  .ofType('IfcWall')
50
50
  .whereProperty('Qto_WallBaseQuantities', 'NetVolume', '>', 5.0)
51
- .whereProperty('Pset_WallCommon', 'FireRating', '!=', null)
51
+ .whereProperty('Pset_WallCommon', 'FireRating', 'startsWith', 'REI')
52
52
  .execute();
53
53
  ```
54
54
 
55
- Supported: `=`, `!=`, `>`, `<`, `>=`, `<=`, `contains`, `startsWith`.
55
+ Supported: `=`, `!=`, `>`, `<`, `>=`, `<=`, `contains`, `startsWith`. The first
56
+ argument names either a property set (`Pset_*`) or a quantity set (`Qto_*`).
57
+
58
+ Comparisons are same-type only — `'60'` does not match `60` — and a `null` on
59
+ either side never matches, including with `!=`. A filter matches when *any*
60
+ property of that name, in *any* set of that name, satisfies it.
61
+
62
+ On a STEP (`.ifc`) model the property sets are resolved lazily from the source
63
+ buffer rather than from a pre-built index, so `whereProperty` does work per
64
+ *candidate* entity. Narrow with `ofType(...)` / `onStorey(...)` before filtering:
65
+ `query.all().whereProperty(...)` resolves every entity in the model and on a
66
+ large one costs many times the type-scoped form. A cache-restored `.ifc` model
67
+ behaves the same way: the cache stores the property table as it was built, and a
68
+ STEP parse leaves it empty. What decides the path is the store rather than the
69
+ file format — a query answers from the property index whenever the store carries
70
+ table rows. Both paths return the same entities.
56
71
 
57
72
  ## Graph traversal
58
73
 
@@ -26,6 +26,59 @@ export declare class EntityQuery {
26
26
  count(): Promise<number>;
27
27
  first(): Promise<QueryResultEntity | null>;
28
28
  private getCandidateIds;
29
+ /**
30
+ * Narrow `ids` to those satisfying every registered property filter.
31
+ *
32
+ * A filter's first argument names either a property set or a quantity set,
33
+ * so both tables are consulted and their matches unioned. Two strategies,
34
+ * picked per store:
35
+ *
36
+ * - **Indexed** whenever `store.properties` does not report an explicit zero
37
+ * row count. It is the store that decides this, not the file format:
38
+ * `@ifc-lite/ifcx` builds real rows via `PropertyTableBuilder`, so an IFCX
39
+ * file carrying properties lands here (one carrying none still reports zero
40
+ * rows and takes the branch below), as does a cache written from such an
41
+ * already materialised store. `findByProperty` and `findByQuantity` answer off the
42
+ * name indices, so cost scales with the number of rows carrying that name,
43
+ * not with the candidate count.
44
+ * - **Resolved sets** when the property table reports `count === 0`. A STEP
45
+ * parse deliberately leaves the property/quantity tables at zero rows and
46
+ * routes reads through the on-demand maps (issue #577), so `findByProperty`
47
+ * there can only ever return `[]` — which is what made `whereProperty`
48
+ * silently match nothing on every `.ifc` file. This also covers a
49
+ * **cache restored from a STEP parse**: the writer serialises
50
+ * `dataStore.properties` verbatim, so an empty table round-trips empty
51
+ * (`findByProperty` survives as a method but indexes nothing) and the
52
+ * viewer rebuilds the on-demand maps on restore. Since the viewer only
53
+ * writes caches on the `.ifc` load path, cache-restored models take this
54
+ * branch in practice. The server-converted viewer store also reports
55
+ * `count: 0` and lands here. The filter then resolves the candidates
56
+ * through `store.getProperties` / `store.getQuantities`, the same
57
+ * accessors the read path (`EntityNode.property`,
58
+ * `QueryResultEntity.getProperty`) uses.
59
+ *
60
+ * Only an *explicit* zero selects the fallback: a store whose table omits
61
+ * `count` altogether keeps the indexed path, because every store predating
62
+ * `count` on `IfcStoreBase` implements `findByProperty` for real.
63
+ *
64
+ * The fallback is candidate-scoped, never store-wide: only the ids that
65
+ * survived the type/id filter are resolved, and each is resolved at most once
66
+ * *per source* across all filters — `psetCache` and `qsetCache` are separate,
67
+ * so an entity reached by both sides costs one `getProperties` and one
68
+ * `getQuantities`, never one per filter. It is still O(candidates x source
69
+ * extraction), so scope
70
+ * with `ofType(...)` before `whereProperty(...)` on large models — the note in
71
+ * `docs/guide/querying.md` says the same thing to callers.
72
+ *
73
+ * Matching is ANY-match: an entity passes when *any* property of that name in
74
+ * *any* set of that name satisfies the operator. That is what
75
+ * `PropertyTable.findByProperty` does (it walks every row of that property
76
+ * name), so the two strategies agree with each other. It deliberately does
77
+ * *not* agree with the single-value read path (`EntityNode.property` and
78
+ * `QueryResultEntity.getProperty` return the *first* match), which differs
79
+ * only for an entity carrying the same property name twice; that divergence
80
+ * is pinned by a test in `where-property-fallback.test.ts`.
81
+ */
29
82
  private applyPropertyFilters;
30
83
  }
31
84
  //# sourceMappingURL=entity-query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity-query.d.ts","sourceRoot":"","sources":["../src/entity-query.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,UAAU,GAAG,YAAY,CAAC;AAElG,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,eAAe,CAAiF;IACxG,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAA0E;gBAElF,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,GAAE,MAAM,EAAE,GAAG,IAAW;IAUzF,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAKjG,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS3B,eAAe,IAAI,IAAI;IAKvB,iBAAiB,IAAI,IAAI;IAKzB,iBAAiB,IAAI,IAAI;IAKzB,UAAU,IAAI,IAAI;IASlB,OAAO,IAAI,iBAAiB,EAAE;IA6BxB,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQxB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAMxB,KAAK,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAShD,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,oBAAoB;CAkB7B"}
1
+ {"version":3,"file":"entity-query.d.ts","sourceRoot":"","sources":["../src/entity-query.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,IAAI,YAAY,EAA4B,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,MAAM,kBAAkB,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,UAAU,GAAG,YAAY,CAAC;AAElG,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,eAAe,CAAiF;IACxG,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAA0E;gBAElF,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,GAAE,MAAM,EAAE,GAAG,IAAW;IAUzF,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAKjG,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS3B,eAAe,IAAI,IAAI;IAKvB,iBAAiB,IAAI,IAAI;IAKzB,iBAAiB,IAAI,IAAI;IAKzB,UAAU,IAAI,IAAI;IASlB,OAAO,IAAI,iBAAiB,EAAE;IA6BxB,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQxB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAMxB,KAAK,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAShD,OAAO,CAAC,eAAe;IAiBvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAoDG;IACH,OAAO,CAAC,oBAAoB;CAgF7B"}
@@ -2,6 +2,7 @@
2
2
  * License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  import { QueryResultEntity } from './query-result-entity.js';
5
+ import { matchesPsetFilter, matchesQsetFilter } from './property-filter.js';
5
6
  export class EntityQuery {
6
7
  store;
7
8
  typeFilter;
@@ -114,14 +115,135 @@ export class EntityQuery {
114
115
  }
115
116
  return allIds;
116
117
  }
118
+ /**
119
+ * Narrow `ids` to those satisfying every registered property filter.
120
+ *
121
+ * A filter's first argument names either a property set or a quantity set,
122
+ * so both tables are consulted and their matches unioned. Two strategies,
123
+ * picked per store:
124
+ *
125
+ * - **Indexed** whenever `store.properties` does not report an explicit zero
126
+ * row count. It is the store that decides this, not the file format:
127
+ * `@ifc-lite/ifcx` builds real rows via `PropertyTableBuilder`, so an IFCX
128
+ * file carrying properties lands here (one carrying none still reports zero
129
+ * rows and takes the branch below), as does a cache written from such an
130
+ * already materialised store. `findByProperty` and `findByQuantity` answer off the
131
+ * name indices, so cost scales with the number of rows carrying that name,
132
+ * not with the candidate count.
133
+ * - **Resolved sets** when the property table reports `count === 0`. A STEP
134
+ * parse deliberately leaves the property/quantity tables at zero rows and
135
+ * routes reads through the on-demand maps (issue #577), so `findByProperty`
136
+ * there can only ever return `[]` — which is what made `whereProperty`
137
+ * silently match nothing on every `.ifc` file. This also covers a
138
+ * **cache restored from a STEP parse**: the writer serialises
139
+ * `dataStore.properties` verbatim, so an empty table round-trips empty
140
+ * (`findByProperty` survives as a method but indexes nothing) and the
141
+ * viewer rebuilds the on-demand maps on restore. Since the viewer only
142
+ * writes caches on the `.ifc` load path, cache-restored models take this
143
+ * branch in practice. The server-converted viewer store also reports
144
+ * `count: 0` and lands here. The filter then resolves the candidates
145
+ * through `store.getProperties` / `store.getQuantities`, the same
146
+ * accessors the read path (`EntityNode.property`,
147
+ * `QueryResultEntity.getProperty`) uses.
148
+ *
149
+ * Only an *explicit* zero selects the fallback: a store whose table omits
150
+ * `count` altogether keeps the indexed path, because every store predating
151
+ * `count` on `IfcStoreBase` implements `findByProperty` for real.
152
+ *
153
+ * The fallback is candidate-scoped, never store-wide: only the ids that
154
+ * survived the type/id filter are resolved, and each is resolved at most once
155
+ * *per source* across all filters — `psetCache` and `qsetCache` are separate,
156
+ * so an entity reached by both sides costs one `getProperties` and one
157
+ * `getQuantities`, never one per filter. It is still O(candidates x source
158
+ * extraction), so scope
159
+ * with `ofType(...)` before `whereProperty(...)` on large models — the note in
160
+ * `docs/guide/querying.md` says the same thing to callers.
161
+ *
162
+ * Matching is ANY-match: an entity passes when *any* property of that name in
163
+ * *any* set of that name satisfies the operator. That is what
164
+ * `PropertyTable.findByProperty` does (it walks every row of that property
165
+ * name), so the two strategies agree with each other. It deliberately does
166
+ * *not* agree with the single-value read path (`EntityNode.property` and
167
+ * `QueryResultEntity.getProperty` return the *first* match), which differs
168
+ * only for an entity carrying the same property name twice; that divergence
169
+ * is pinned by a test in `where-property-fallback.test.ts`.
170
+ */
117
171
  applyPropertyFilters(ids) {
118
172
  if (this.propertyFilters.length === 0)
119
173
  return ids;
174
+ const properties = this.store.properties;
175
+ const quantities = this.store.quantities;
176
+ // Explicit zero only — see the doc comment above and the `count` contract
177
+ // on `IfcStoreBase`'s property table.
178
+ const useTable = properties.count !== 0;
179
+ // The two tables choose independently. Gating the quantity side off
180
+ // `properties.count` would mean a store that materialised one table but not
181
+ // the other got the wrong strategy for the other: a populated property table
182
+ // beside an empty quantity table would query an empty `findByQuantity` and
183
+ // match no quantities at all, and the inverse would resolve candidates one
184
+ // at a time while a populated quantity index sat unused.
185
+ const useQuantityTable = quantities.count !== 0;
186
+ // `quantities` and `getQuantities` are both REQUIRED on `IfcStoreBase`, so
187
+ // neither is guarded here: a store missing either is already out of
188
+ // contract, and half-guarding it (optional-chaining the table but calling
189
+ // `getQuantities` unconditionally two branches down) would only move the
190
+ // TypeError, not prevent it. `findByQuantity` is the one genuinely optional
191
+ // member, so that is the only existence check.
192
+ // Bound to the table so the optional method keeps its receiver.
193
+ const findByQuantity = useQuantityTable && quantities.findByQuantity
194
+ ? quantities.findByQuantity.bind(quantities)
195
+ : undefined;
196
+ // Shared across all filters: resolving a pset/qset costs a source
197
+ // extraction on the on-demand path, so never resolve the same entity twice.
198
+ const psetCache = new Map();
199
+ const qsetCache = new Map();
120
200
  let filteredIds = ids;
121
201
  for (const filter of this.propertyFilters) {
122
- const matchingIds = this.store.properties.findByProperty(filter.prop, filter.op, filter.value, filter.pset);
123
- const matchingSet = new Set(matchingIds);
124
- filteredIds = filteredIds.filter(id => matchingSet.has(id));
202
+ const matches = new Set();
203
+ if (useTable) {
204
+ for (const id of properties.findByProperty(filter.prop, filter.op, filter.value, filter.pset)) {
205
+ matches.add(id);
206
+ }
207
+ }
208
+ else {
209
+ for (const id of filteredIds) {
210
+ let psets = psetCache.get(id);
211
+ if (!psets) {
212
+ psets = this.store.getProperties(id);
213
+ psetCache.set(id, psets);
214
+ }
215
+ if (matchesPsetFilter(psets, filter.pset, filter.prop, filter.op, filter.value))
216
+ matches.add(id);
217
+ }
218
+ }
219
+ // Quantity side: `whereProperty('Qto_WallBaseQuantities', 'NetArea', '>', 10)`
220
+ // is documented (docs/guide/querying.md, packages/query/README.md) but
221
+ // quantities live in a separate table, so a Qto_ filter matched nothing on
222
+ // every path. Union rather than "only when the property side came back
223
+ // empty" — a conditional would drop entities matched via quantities as
224
+ // soon as any other entity matched via properties.
225
+ if (findByQuantity) {
226
+ for (const id of findByQuantity(filter.prop, filter.op, filter.value, filter.pset)) {
227
+ matches.add(id);
228
+ }
229
+ }
230
+ else {
231
+ // No index available: the on-demand path (where the columnar quantity
232
+ // table is empty by construction), or a duck-typed table that does not
233
+ // implement `findByQuantity`.
234
+ for (const id of filteredIds) {
235
+ if (matches.has(id))
236
+ continue;
237
+ let qsets = qsetCache.get(id);
238
+ if (!qsets) {
239
+ qsets = this.store.getQuantities(id);
240
+ qsetCache.set(id, qsets);
241
+ }
242
+ if (matchesQsetFilter(qsets, filter.pset, filter.prop, filter.op, filter.value))
243
+ matches.add(id);
244
+ }
245
+ }
246
+ filteredIds = filteredIds.filter(id => matches.has(id));
125
247
  }
126
248
  return filteredIds;
127
249
  }
@@ -1 +1 @@
1
- {"version":3,"file":"entity-query.js","sourceRoot":"","sources":["../src/entity-query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entity-query.js","sourceRoot":"","sources":["../src/entity-query.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Set-shaped property/quantity matching for `EntityQuery.whereProperty`.
3
+ *
4
+ * Used only when the store's columnar property table is empty and the filter
5
+ * has to be answered from resolved `PropertySet[]` / `QuantitySet[]` instead
6
+ * (the STEP on-demand shape, see `applyPropertyFilters`). The comparison itself
7
+ * is `comparePropertyValues` from `@ifc-lite/data` — the same function
8
+ * `PropertyTable.findByProperty` uses — so the two strategies cannot drift.
9
+ *
10
+ * Internal to the package: not re-exported from `index.ts`.
11
+ */
12
+ import { type PropertySet, type PropertyValue, type QuantitySet } from '@ifc-lite/data';
13
+ /**
14
+ * True when ANY property named `propName`, in ANY property set named
15
+ * `psetName`, satisfies `operator`/`value`.
16
+ *
17
+ * ANY-match rather than first-match is what `findByProperty` does: it walks
18
+ * every row of that property name. A model may legitimately carry the same
19
+ * property in two same-named sets (two `IfcRelDefinesByProperties` pointing at
20
+ * distinct `IfcPropertySet`s), and stopping at the first hit would answer
21
+ * differently from the table path for exactly those entities.
22
+ */
23
+ export declare function matchesPsetFilter(psets: readonly PropertySet[], psetName: string, propName: string, operator: string, value: PropertyValue): boolean;
24
+ /**
25
+ * True when ANY quantity named `quantityName`, in ANY quantity set named
26
+ * `qsetName`, satisfies `operator`/`value`.
27
+ *
28
+ * `Quantity.value` is always a number, so only the numeric branch of
29
+ * `comparePropertyValues` can fire here.
30
+ */
31
+ export declare function matchesQsetFilter(qsets: readonly QuantitySet[], qsetName: string, quantityName: string, operator: string, value: PropertyValue): boolean;
32
+ //# sourceMappingURL=property-filter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-filter.d.ts","sourceRoot":"","sources":["../src/property-filter.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,OAAO,EAAyB,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE/G;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,GACnB,OAAO,CAST;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,GACnB,OAAO,CAST"}
@@ -0,0 +1,59 @@
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
+ * Set-shaped property/quantity matching for `EntityQuery.whereProperty`.
6
+ *
7
+ * Used only when the store's columnar property table is empty and the filter
8
+ * has to be answered from resolved `PropertySet[]` / `QuantitySet[]` instead
9
+ * (the STEP on-demand shape, see `applyPropertyFilters`). The comparison itself
10
+ * is `comparePropertyValues` from `@ifc-lite/data` — the same function
11
+ * `PropertyTable.findByProperty` uses — so the two strategies cannot drift.
12
+ *
13
+ * Internal to the package: not re-exported from `index.ts`.
14
+ */
15
+ import { comparePropertyValues } from '@ifc-lite/data';
16
+ /**
17
+ * True when ANY property named `propName`, in ANY property set named
18
+ * `psetName`, satisfies `operator`/`value`.
19
+ *
20
+ * ANY-match rather than first-match is what `findByProperty` does: it walks
21
+ * every row of that property name. A model may legitimately carry the same
22
+ * property in two same-named sets (two `IfcRelDefinesByProperties` pointing at
23
+ * distinct `IfcPropertySet`s), and stopping at the first hit would answer
24
+ * differently from the table path for exactly those entities.
25
+ */
26
+ export function matchesPsetFilter(psets, psetName, propName, operator, value) {
27
+ for (const pset of psets) {
28
+ if (pset.name !== psetName)
29
+ continue;
30
+ for (const prop of pset.properties) {
31
+ if (prop.name !== propName)
32
+ continue;
33
+ if (comparePropertyValues(prop.value, operator, value))
34
+ return true;
35
+ }
36
+ }
37
+ return false;
38
+ }
39
+ /**
40
+ * True when ANY quantity named `quantityName`, in ANY quantity set named
41
+ * `qsetName`, satisfies `operator`/`value`.
42
+ *
43
+ * `Quantity.value` is always a number, so only the numeric branch of
44
+ * `comparePropertyValues` can fire here.
45
+ */
46
+ export function matchesQsetFilter(qsets, qsetName, quantityName, operator, value) {
47
+ for (const qset of qsets) {
48
+ if (qset.name !== qsetName)
49
+ continue;
50
+ for (const quantity of qset.quantities) {
51
+ if (quantity.name !== quantityName)
52
+ continue;
53
+ if (comparePropertyValues(quantity.value, operator, value))
54
+ return true;
55
+ }
56
+ }
57
+ return false;
58
+ }
59
+ //# sourceMappingURL=property-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-filter.js","sourceRoot":"","sources":["../src/property-filter.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,qBAAqB,EAA0D,MAAM,gBAAgB,CAAC;AAE/G;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAA6B,EAC7B,QAAgB,EAChB,QAAgB,EAChB,QAAgB,EAChB,KAAoB;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACrC,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QACtE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAA6B,EAC7B,QAAgB,EAChB,YAAoB,EACpB,QAAgB,EAChB,KAAoB;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,SAAS;QACrC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY;gBAAE,SAAS;YAC7C,IAAI,qBAAqB,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC1E,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ifc-lite/query",
3
- "version": "1.14.14",
3
+ "version": "1.14.15",
4
4
  "description": "Query system for IFC-Lite",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,7 +14,7 @@
14
14
  },
15
15
  "dependencies": {
16
16
  "@ifc-lite/parser": "^3.11.0",
17
- "@ifc-lite/data": "^3.0.0",
17
+ "@ifc-lite/data": "^3.1.0",
18
18
  "@ifc-lite/spatial": "^1.14.12",
19
19
  "@ifc-lite/geometry": "^3.5.0"
20
20
  },