@bldrs-ai/conway 1.560.1539 → 1.566.1541
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/compiled/examples/browser-bundled.cjs +1 -1
- package/compiled/examples/cli-bundled.cjs +378 -37
- package/compiled/examples/cli-step-bundled.cjs +1 -1
- package/compiled/examples/validator-bundled.cjs +1 -1
- package/compiled/src/compat/web-ifc/aggregate_prefetch_paging.test.d.ts +2 -0
- package/compiled/src/compat/web-ifc/aggregate_prefetch_paging.test.d.ts.map +1 -0
- package/compiled/src/compat/web-ifc/aggregate_prefetch_paging.test.js +325 -0
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts +16 -11
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.d.ts.map +1 -1
- package/compiled/src/compat/web-ifc/ifc_api_proxy_ifc.js +19 -14
- package/compiled/src/ifc/ifc_demand_extraction.test.js +140 -0
- package/compiled/src/ifc/ifc_geometry_extraction.d.ts +293 -0
- package/compiled/src/ifc/ifc_geometry_extraction.d.ts.map +1 -1
- package/compiled/src/ifc/ifc_geometry_extraction.js +484 -54
- package/compiled/src/version/version.js +1 -1
- package/compiled/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -30,7 +30,7 @@ var import_node_process = require("node:process");
|
|
|
30
30
|
var readline = __toESM(require("node:readline"), 1);
|
|
31
31
|
|
|
32
32
|
// compiled/src/version/version.js
|
|
33
|
-
var versionString = "Conway v1.
|
|
33
|
+
var versionString = "Conway v1.566.1541";
|
|
34
34
|
|
|
35
35
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
36
36
|
var wasmType = "";
|
|
@@ -14965,7 +14965,7 @@ ${t5.join("\n")}` : "";
|
|
|
14965
14965
|
var import_process = require("process");
|
|
14966
14966
|
|
|
14967
14967
|
// compiled/src/version/version.js
|
|
14968
|
-
var versionString = "Conway v1.
|
|
14968
|
+
var versionString = "Conway v1.566.1541";
|
|
14969
14969
|
|
|
14970
14970
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
14971
14971
|
function pThreadsAllowed() {
|
|
@@ -89338,6 +89338,9 @@ var FACES_FIELD_DEPTH = 4;
|
|
|
89338
89338
|
var REL_AGGREGATES_RELATED_OFFSET = 5;
|
|
89339
89339
|
var REL_AGGREGATES_RELATED_BASE = 4;
|
|
89340
89340
|
var REL_AGGREGATES_RELATED_DEPTH = 3;
|
|
89341
|
+
var REL_AGGREGATES_RELATING_OFFSET = 4;
|
|
89342
|
+
var REL_AGGREGATES_RELATING_BASE = 4;
|
|
89343
|
+
var REL_AGGREGATES_RELATING_DEPTH = 3;
|
|
89341
89344
|
var REL_ASSOCIATES_RELATED_OFFSET = 4;
|
|
89342
89345
|
var REL_ASSOCIATES_RELATED_BASE = 4;
|
|
89343
89346
|
var REL_ASSOCIATES_RELATED_DEPTH = 2;
|
|
@@ -93909,23 +93912,67 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
93909
93912
|
return !isFace(id) && typeID !== entity_types_ifc_gen_default.IFCPOLYGONALFACESET && typeID !== entity_types_ifc_gen_default.IFCTRIANGULATEDFACESET;
|
|
93910
93913
|
};
|
|
93911
93914
|
const claimed = /* @__PURE__ */ new Set();
|
|
93912
|
-
|
|
93915
|
+
let visited;
|
|
93916
|
+
try {
|
|
93917
|
+
visited = await this.model.ensureResidentClosureByLocalID(localID, extra, seen, descend, leafSpans, isFace, claimed);
|
|
93918
|
+
} catch (error) {
|
|
93919
|
+
if (seen !== void 0) {
|
|
93920
|
+
try {
|
|
93921
|
+
await this.pageStyleSeeds_(localID, claimed, seen, descend, isFace, leafSpans);
|
|
93922
|
+
} catch {
|
|
93923
|
+
}
|
|
93924
|
+
}
|
|
93925
|
+
throw error;
|
|
93926
|
+
}
|
|
93927
|
+
await this.pageStyleSeeds_(localID, claimed, visited, descend, isFace, leafSpans);
|
|
93928
|
+
await this.ensureResidentVisitedFacesetPayloads_(claimed, visited, leafSpans);
|
|
93929
|
+
return visited;
|
|
93930
|
+
}
|
|
93931
|
+
/**
|
|
93932
|
+
* Page the styled-item and material-definition records seeded by
|
|
93933
|
+
* `claimed` — the records ONE closure walk actually paged — so the
|
|
93934
|
+
* synchronous extract that follows can read them.
|
|
93935
|
+
*
|
|
93936
|
+
* `claimed`, not the walk's returned set: the walk returns the CALLER'S
|
|
93937
|
+
* set, which the aggregate prefetch shares across every related product
|
|
93938
|
+
* of one IfcRelAggregates (see ensureResidentForAggregateExtract).
|
|
93939
|
+
* Scanning that per product is O(products x model), not O(product) — on
|
|
93940
|
+
* SKYLARK250 (1,992 products under two relationships, ~3,000 records of
|
|
93941
|
+
* closure each) it reaches ~6 M lookups on the last product and costs
|
|
93942
|
+
* minutes before the first mesh, inside one un-yielding await chain
|
|
93943
|
+
* (conway#561). Every record lands in exactly one walk's `claimed`, so
|
|
93944
|
+
* the union of seeds collected across the walks sharing a set is
|
|
93945
|
+
* unchanged; only the repetition goes. Same distinction conway#526 drew
|
|
93946
|
+
* for {@link ensureResidentVisitedFacesetPayloads_}.
|
|
93947
|
+
*
|
|
93948
|
+
* That "exactly one walk" holds only for walks that COMPLETE, which is
|
|
93949
|
+
* why the aborted path calls this too — see the catch in
|
|
93950
|
+
* {@link ensureResidentForProductExtractUnguarded_}.
|
|
93951
|
+
*
|
|
93952
|
+
* @param localID The product whose walk claimed these records.
|
|
93953
|
+
* @param claimed Records this walk paged.
|
|
93954
|
+
* @param seen The set the walk pinned through, extended by this one.
|
|
93955
|
+
* @param descend Closure-walk descent predicate.
|
|
93956
|
+
* @param isFace Closure-walk packed-leaf predicate.
|
|
93957
|
+
* @param leafSpans Optional out-array of coalesced pin ranges.
|
|
93958
|
+
* @return {Promise<void>} Resolves when the seeds are resident.
|
|
93959
|
+
*/
|
|
93960
|
+
async pageStyleSeeds_(localID, claimed, seen, descend, isFace, leafSpans) {
|
|
93913
93961
|
const styleExtra = [];
|
|
93914
|
-
for (const
|
|
93915
|
-
const styled = this.materials.styledItemMap.get(
|
|
93962
|
+
for (const claimedID of claimed) {
|
|
93963
|
+
const styled = this.materials.styledItemMap.get(claimedID);
|
|
93916
93964
|
if (styled !== void 0) {
|
|
93917
93965
|
styleExtra.push(styled);
|
|
93918
93966
|
}
|
|
93919
|
-
const definition = this.materials.materialDefinitionsMap.get(
|
|
93967
|
+
const definition = this.materials.materialDefinitionsMap.get(claimedID);
|
|
93920
93968
|
if (definition !== void 0) {
|
|
93921
93969
|
styleExtra.push(definition);
|
|
93922
93970
|
}
|
|
93923
93971
|
}
|
|
93924
|
-
if (styleExtra.length
|
|
93925
|
-
|
|
93972
|
+
if (styleExtra.length === 0) {
|
|
93973
|
+
return;
|
|
93926
93974
|
}
|
|
93927
|
-
await this.
|
|
93928
|
-
return visited;
|
|
93975
|
+
await this.model.ensureResidentClosureByLocalID(localID, styleExtra, seen, descend, leafSpans, isFace, claimed);
|
|
93929
93976
|
}
|
|
93930
93977
|
/**
|
|
93931
93978
|
* Page a faceset's Coordinates record and its Faces[] run as one
|
|
@@ -93987,7 +94034,16 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
93987
94034
|
* acquire: the relationship, the relating product (and its voids)
|
|
93988
94035
|
* and every related product.
|
|
93989
94036
|
*
|
|
94037
|
+
* The whole relationship at once, which is what a caller that extracts
|
|
94038
|
+
* it in one synchronous call needs. A caller that steps the
|
|
94039
|
+
* relationship (the demand pump, through
|
|
94040
|
+
* {@link extractRelAggregateGeometryIncremental}) wants
|
|
94041
|
+
* {@link beginAggregateExtract} instead: this one pins every related
|
|
94042
|
+
* product's closure simultaneously, which on an aggregate-structured
|
|
94043
|
+
* model is the whole file (conway#561 §5).
|
|
94044
|
+
*
|
|
93990
94045
|
* @param relAggregate The relationship to prefetch.
|
|
94046
|
+
* @param leafSpans Coalesced Faces[] pin ranges — caller unpins.
|
|
93991
94047
|
* @return {Promise<Set<number>>} Pinned local IDs — caller must unpin
|
|
93992
94048
|
* after extract.
|
|
93993
94049
|
*/
|
|
@@ -93996,11 +94052,163 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
93996
94052
|
return /* @__PURE__ */ new Set();
|
|
93997
94053
|
}
|
|
93998
94054
|
const pinned = /* @__PURE__ */ new Set();
|
|
93999
|
-
|
|
94055
|
+
await this.ensureResidentForAggregateBase(relAggregate, pinned, leafSpans);
|
|
94056
|
+
const products = this.relatedAggregateProductLocalIDs(relAggregate);
|
|
94057
|
+
if (products === void 0) {
|
|
94058
|
+
await this.ensureResidentForRelatedObjectsByGetter(relAggregate, pinned, leafSpans);
|
|
94059
|
+
return pinned;
|
|
94060
|
+
}
|
|
94061
|
+
await this.ensureResidentForAggregateProducts(products, 0, products.length, pinned, leafSpans);
|
|
94062
|
+
return pinned;
|
|
94063
|
+
}
|
|
94064
|
+
/**
|
|
94065
|
+
* The part of an aggregate prefetch that has to be resident for the
|
|
94066
|
+
* WHOLE relationship: the relationship record itself and the relating
|
|
94067
|
+
* product's closure (its rel-voids become the master override every
|
|
94068
|
+
* related product is cut with).
|
|
94069
|
+
*
|
|
94070
|
+
* Only the RELATING object's record is paged ahead of the getter that
|
|
94071
|
+
* hydrates it, deliberately — not the relationship's whole 1-hop, which
|
|
94072
|
+
* is what this used to do. On a model whose products are all aggregate
|
|
94073
|
+
* targets the 1-hop is every related product's record, scattered the
|
|
94074
|
+
* length of the file, so pinning it pins essentially every chunk before
|
|
94075
|
+
* a single mesh exists: 384 MiB held against a 64 MiB window on
|
|
94076
|
+
* SKYLARK250 (conway#561 §5). The related records are paged by the
|
|
94077
|
+
* caller instead, per product or per wave.
|
|
94078
|
+
*
|
|
94079
|
+
* Seam for {@link AggregateExtractPager}, which lives in this module.
|
|
94080
|
+
*
|
|
94081
|
+
* @param relAggregate The relationship to prefetch.
|
|
94082
|
+
* @param pinned Set to extend — caller unpins.
|
|
94083
|
+
* @param leafSpans Coalesced Faces[] pin ranges — caller unpins.
|
|
94084
|
+
* @return {Promise<void>} Resolves when the base is resident.
|
|
94085
|
+
*/
|
|
94086
|
+
async ensureResidentForAggregateBase(relAggregate, pinned, leafSpans) {
|
|
94087
|
+
if (!this.model.isSourceExternal) {
|
|
94088
|
+
return;
|
|
94089
|
+
}
|
|
94000
94090
|
this.model.pinByLocalID(relAggregate.localID);
|
|
94001
94091
|
pinned.add(relAggregate.localID);
|
|
94092
|
+
await this.model.ensureResidentByLocalID(relAggregate.localID);
|
|
94093
|
+
const relatingLocalID = relAggregate.extractReferenceLocalID(REL_AGGREGATES_RELATING_OFFSET, REL_AGGREGATES_RELATING_BASE, REL_AGGREGATES_RELATING_DEPTH, true);
|
|
94094
|
+
if (relatingLocalID !== null) {
|
|
94095
|
+
this.model.pinByLocalID(relatingLocalID);
|
|
94096
|
+
await this.model.ensureResidentByLocalID(relatingLocalID);
|
|
94097
|
+
}
|
|
94098
|
+
try {
|
|
94099
|
+
const relating = relAggregate.RelatingObject;
|
|
94100
|
+
if (relating !== null && relating !== void 0) {
|
|
94101
|
+
await this.ensureResidentForProductExtract(relating.localID, pinned, leafSpans);
|
|
94102
|
+
}
|
|
94103
|
+
} finally {
|
|
94104
|
+
if (relatingLocalID !== null) {
|
|
94105
|
+
this.model.unpinByLocalID(relatingLocalID);
|
|
94106
|
+
}
|
|
94107
|
+
}
|
|
94108
|
+
}
|
|
94109
|
+
/**
|
|
94110
|
+
* The local IDs one relationship's aggregates pass will actually extract:
|
|
94111
|
+
* its RelatedObjects that are `IfcProduct`s, in record order.
|
|
94112
|
+
*
|
|
94113
|
+
* The n-th entry is the product
|
|
94114
|
+
* {@link extractRelAggregateGeometryIncremental} extracts for its n-th
|
|
94115
|
+
* yield — that pass materialises every related object, extracts and
|
|
94116
|
+
* yields for the ones that are products, and walks past the rest. So a
|
|
94117
|
+
* prefetch keyed on this list is in exact lockstep with the stepper, and
|
|
94118
|
+
* a run of non-products between two products costs it nothing.
|
|
94119
|
+
*
|
|
94120
|
+
* **Non-products are dropped, not skipped-but-paged.** Deciding an entry
|
|
94121
|
+
* is not a product costs no source bytes: `getTypedElementByExpressID`
|
|
94122
|
+
* builds its descriptor from the columns, and only
|
|
94123
|
+
* {@link extractProductGeometry} — products only — reads a record. Swept
|
|
94124
|
+
* that exact path (materialise as `IfcObjectDefinition`, test
|
|
94125
|
+
* `instanceof IfcProduct`) over every record of SKYLARK250 (7,818,778),
|
|
94126
|
+
* SEESTRASSE (294,704) and the whole in-repo corpus behind a deliberately
|
|
94127
|
+
* exhausted 4 KiB x 4 window: 0 throws, 0 store bytes read. Paging a
|
|
94128
|
+
* non-product's closure is therefore work that serves nothing — and it is
|
|
94129
|
+
* unbounded work, because a wave that had to span a run of them would
|
|
94130
|
+
* page the whole run at once, `waveSize` notwithstanding (conway#566
|
|
94131
|
+
* review). An `IfcTypeObject` carrying `RepresentationMaps` measures
|
|
94132
|
+
* 1,607 records of closure on its own.
|
|
94133
|
+
*
|
|
94134
|
+
* Classification goes through {@link relatedProductByExpressID_}, the same
|
|
94135
|
+
* call the pass itself makes — one test rather than two that have to
|
|
94136
|
+
* agree. A typeID-column test does NOT agree: a STEP complex instance is
|
|
94137
|
+
* recorded as type 0 (`EXTERNALMAPPINGCONTAINER`) while the pass finds the
|
|
94138
|
+
* `IfcProduct` among its `multiMapping` variants, and the product would
|
|
94139
|
+
* then be extracted without ever being paged (conway#566 review).
|
|
94140
|
+
*
|
|
94141
|
+
* Note {@link aggregateTargetLocalIDs} still reads the column, and has the
|
|
94142
|
+
* same blind spot — a complex product is not deferred, so it is extracted
|
|
94143
|
+
* by both passes. That is pre-existing and independent of paging: it costs
|
|
94144
|
+
* a duplicate extraction, not a non-resident read.
|
|
94145
|
+
*
|
|
94146
|
+
* Seam for {@link AggregateExtractPager}, which lives in this module.
|
|
94147
|
+
*
|
|
94148
|
+
* @param relAggregate The relationship to read.
|
|
94149
|
+
* @return {number[] | undefined} The related products' local IDs, or
|
|
94150
|
+
* undefined when the list holds something only the generated getter can
|
|
94151
|
+
* resolve (see {@link relatedObjectExpressIDs_}).
|
|
94152
|
+
*/
|
|
94153
|
+
relatedAggregateProductLocalIDs(relAggregate) {
|
|
94154
|
+
const relatedExpressIDs = this.relatedObjectExpressIDs_(relAggregate);
|
|
94155
|
+
if (relatedExpressIDs === void 0) {
|
|
94156
|
+
return void 0;
|
|
94157
|
+
}
|
|
94158
|
+
const productLocalIDs = [];
|
|
94159
|
+
for (const relatedExpressID of relatedExpressIDs) {
|
|
94160
|
+
let relatedProduct;
|
|
94161
|
+
try {
|
|
94162
|
+
relatedProduct = this.relatedProductByExpressID_(relatedExpressID);
|
|
94163
|
+
} catch {
|
|
94164
|
+
break;
|
|
94165
|
+
}
|
|
94166
|
+
if (relatedProduct !== void 0) {
|
|
94167
|
+
productLocalIDs.push(relatedProduct.localID);
|
|
94168
|
+
}
|
|
94169
|
+
}
|
|
94170
|
+
return productLocalIDs;
|
|
94171
|
+
}
|
|
94172
|
+
/**
|
|
94173
|
+
* Page the closures of a contiguous run of
|
|
94174
|
+
* {@link relatedAggregateProductLocalIDs} entries.
|
|
94175
|
+
*
|
|
94176
|
+
* Seam for {@link AggregateExtractPager}, which lives in this module.
|
|
94177
|
+
*
|
|
94178
|
+
* @param productLocalIDs The related products, in record order.
|
|
94179
|
+
* @param from First index to page.
|
|
94180
|
+
* @param to One past the last index to page.
|
|
94181
|
+
* @param pinned Set to extend — caller unpins.
|
|
94182
|
+
* @param leafSpans Coalesced Faces[] pin ranges — caller unpins.
|
|
94183
|
+
* @return {Promise<void>} Resolves when the run is resident.
|
|
94184
|
+
*/
|
|
94185
|
+
async ensureResidentForAggregateProducts(productLocalIDs, from, to, pinned, leafSpans) {
|
|
94186
|
+
for (let where = from; where < to; ++where) {
|
|
94187
|
+
await this.ensureResidentForProductExtract(productLocalIDs[where], pinned, leafSpans);
|
|
94188
|
+
}
|
|
94189
|
+
}
|
|
94190
|
+
/**
|
|
94191
|
+
* Whole-relationship prefetch for a RelatedObjects list that
|
|
94192
|
+
* {@link relatedAggregateProductLocalIDs} could not read as references — an
|
|
94193
|
+
* inline entity, `$` or junk.
|
|
94194
|
+
*
|
|
94195
|
+
* Only the generated getter can resolve (or reject) such a list, and it
|
|
94196
|
+
* materialises the whole array at once, so there is no per-entry cursor
|
|
94197
|
+
* to page against: this path keeps the pre-#561 shape, whole 1-hop and
|
|
94198
|
+
* all, because it is the one case that genuinely cannot be paged
|
|
94199
|
+
* incrementally. It is also the path that needs the 1-hop pinned — the
|
|
94200
|
+
* getter reads every related record while it materialises them.
|
|
94201
|
+
*
|
|
94202
|
+
* Seam for {@link AggregateExtractPager}, which lives in this module.
|
|
94203
|
+
*
|
|
94204
|
+
* @param relAggregate The relationship to prefetch.
|
|
94205
|
+
* @param pinned Set to extend — caller unpins.
|
|
94206
|
+
* @param leafSpans Coalesced Faces[] pin ranges — caller unpins.
|
|
94207
|
+
* @return {Promise<void>} Resolves when the relationship is resident.
|
|
94208
|
+
*/
|
|
94209
|
+
async ensureResidentForRelatedObjectsByGetter(relAggregate, pinned, leafSpans) {
|
|
94210
|
+
const hop = [];
|
|
94002
94211
|
try {
|
|
94003
|
-
await this.model.ensureResidentByLocalID(relAggregate.localID);
|
|
94004
94212
|
for (const expressID of this.model.referencedExpressIDs(relAggregate.localID)) {
|
|
94005
94213
|
const localID = this.model.resolveExpressID(expressID);
|
|
94006
94214
|
if (localID === void 0 || pinned.has(localID)) {
|
|
@@ -94010,34 +94218,37 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
94010
94218
|
hop.push(localID);
|
|
94011
94219
|
await this.model.ensureResidentByLocalID(localID);
|
|
94012
94220
|
}
|
|
94013
|
-
const
|
|
94014
|
-
if (
|
|
94015
|
-
|
|
94016
|
-
|
|
94017
|
-
const relatedExpressIDs = this.relatedObjectExpressIDs_(relAggregate);
|
|
94018
|
-
if (relatedExpressIDs === void 0) {
|
|
94019
|
-
const related = relAggregate.RelatedObjects;
|
|
94020
|
-
if (related !== null && related !== void 0) {
|
|
94021
|
-
for (const product of related) {
|
|
94022
|
-
await this.ensureResidentForProductExtract(product.localID, pinned, leafSpans);
|
|
94023
|
-
}
|
|
94024
|
-
}
|
|
94025
|
-
} else {
|
|
94026
|
-
for (const relatedExpressID of relatedExpressIDs) {
|
|
94027
|
-
const relatedLocalID = this.model.resolveExpressID(relatedExpressID);
|
|
94028
|
-
if (relatedLocalID === void 0) {
|
|
94029
|
-
continue;
|
|
94030
|
-
}
|
|
94031
|
-
await this.ensureResidentForProductExtract(relatedLocalID, pinned, leafSpans);
|
|
94221
|
+
const related = relAggregate.RelatedObjects;
|
|
94222
|
+
if (related !== null && related !== void 0) {
|
|
94223
|
+
for (const product of related) {
|
|
94224
|
+
await this.ensureResidentForProductExtract(product.localID, pinned, leafSpans);
|
|
94032
94225
|
}
|
|
94033
94226
|
}
|
|
94034
|
-
return pinned;
|
|
94035
94227
|
} finally {
|
|
94036
94228
|
for (const localID of hop) {
|
|
94037
94229
|
this.model.unpinByLocalID(localID);
|
|
94038
94230
|
}
|
|
94039
94231
|
}
|
|
94040
94232
|
}
|
|
94233
|
+
/**
|
|
94234
|
+
* Begin a WAVE-PAGED residency for one relationship, for a caller that
|
|
94235
|
+
* steps it through {@link extractRelAggregateGeometryIncremental}.
|
|
94236
|
+
*
|
|
94237
|
+
* The windowed twin of {@link ensureResidentForAggregateExtract}: same
|
|
94238
|
+
* records, paged a wave at a time as the stepper reaches them and
|
|
94239
|
+
* released a wave at a time behind it, instead of all of them before the
|
|
94240
|
+
* first step. See {@link AggregateExtractPager}.
|
|
94241
|
+
*
|
|
94242
|
+
* @param relAggregate The relationship to prefetch.
|
|
94243
|
+
* @param waveSize Related products paged and held at once.
|
|
94244
|
+
* @return {Promise<AggregateExtractPager>} The paging handle — caller
|
|
94245
|
+
* must {@link AggregateExtractPager.release} it.
|
|
94246
|
+
*/
|
|
94247
|
+
async beginAggregateExtract(relAggregate, waveSize = _IfcGeometryExtraction.AGGREGATE_PREFETCH_WAVE_SIZE_) {
|
|
94248
|
+
const pager = new AggregateExtractPager(this, relAggregate, waveSize);
|
|
94249
|
+
await pager.begin();
|
|
94250
|
+
return pager;
|
|
94251
|
+
}
|
|
94041
94252
|
/**
|
|
94042
94253
|
* The whole-model walk's SECOND product pass, shared with the demand
|
|
94043
94254
|
* pump: for every IfcRelAggregates, re-extract the related products
|
|
@@ -94096,6 +94307,47 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
94096
94307
|
});
|
|
94097
94308
|
return allReferences ? expressIDs : void 0;
|
|
94098
94309
|
}
|
|
94310
|
+
/**
|
|
94311
|
+
* How the rel-aggregates pass classifies ONE `RelatedObjects` entry: the
|
|
94312
|
+
* product it will extract, or undefined for an entry it walks past.
|
|
94313
|
+
*
|
|
94314
|
+
* **The single definition of "is this related object a product".** Both
|
|
94315
|
+
* the pass itself ({@link extractRelAggregateGeometryIncremental}) and the
|
|
94316
|
+
* prefetch that has to page ahead of it
|
|
94317
|
+
* ({@link relatedAggregateProductLocalIDs}) go through here, so they
|
|
94318
|
+
* cannot disagree — which they did, twice, when the prefetch derived its
|
|
94319
|
+
* own answer from the typeID column. A STEP complex/external-mapping
|
|
94320
|
+
* instance is the case that breaks a column test: the parser records the
|
|
94321
|
+
* container as type 0 (`EXTERNALMAPPINGCONTAINER`, see step_parser.ts)
|
|
94322
|
+
* while `getTypedElementByExpressID` searches the entry's `multiMapping`
|
|
94323
|
+
* variants and hands back the `IfcProduct` among them. On a windowed
|
|
94324
|
+
* source a prefetch that missed one would leave the pass reading a
|
|
94325
|
+
* non-resident record, and its permissive catch abandons the REST of the
|
|
94326
|
+
* relationship — geometry lost with a log line, not an error
|
|
94327
|
+
* (conway#566 review).
|
|
94328
|
+
*
|
|
94329
|
+
* Materialising the entry is what makes the two agree, and it is cheap:
|
|
94330
|
+
* `getTypedElementByExpressID` builds from the columns and reads no
|
|
94331
|
+
* source bytes. Measured by sweeping this exact call over every record of
|
|
94332
|
+
* SKYLARK250 (7,818,778), SEESTRASSE (294,704) and the in-repo corpus
|
|
94333
|
+
* behind a deliberately exhausted 4 KiB x 4 window — 0 throws, 0 store
|
|
94334
|
+
* bytes. The pass materialises every entry anyway; the prefetch just
|
|
94335
|
+
* reaches them first.
|
|
94336
|
+
*
|
|
94337
|
+
* @param relatedExpressID The RelatedObjects entry to classify.
|
|
94338
|
+
* @throws {Error} When the reference resolves to nothing, or to something
|
|
94339
|
+
* that is not an `IfcObjectDefinition` — what the generated getter throws
|
|
94340
|
+
* for the same entry, and what the pass has always thrown here.
|
|
94341
|
+
* @return {IfcProduct | undefined} The product to extract, or undefined
|
|
94342
|
+
* for a related object that is not one.
|
|
94343
|
+
*/
|
|
94344
|
+
relatedProductByExpressID_(relatedExpressID) {
|
|
94345
|
+
const relatedObject = this.model.getTypedElementByExpressID(relatedExpressID, IfcObjectDefinition);
|
|
94346
|
+
if (relatedObject === void 0) {
|
|
94347
|
+
throw new Error("Value in STEP was incorrectly typed");
|
|
94348
|
+
}
|
|
94349
|
+
return relatedObject instanceof IfcProduct ? relatedObject : void 0;
|
|
94350
|
+
}
|
|
94099
94351
|
/**
|
|
94100
94352
|
* Extract one IfcRelAggregates' related products with the relating
|
|
94101
94353
|
* object's ("master") rel-voids — the shared per-item body of the
|
|
@@ -94155,12 +94407,9 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
94155
94407
|
}
|
|
94156
94408
|
} else {
|
|
94157
94409
|
for (const relatedExpressID of relatedExpressIDs) {
|
|
94158
|
-
const
|
|
94159
|
-
if (
|
|
94160
|
-
|
|
94161
|
-
}
|
|
94162
|
-
if (relatedObject instanceof IfcProduct) {
|
|
94163
|
-
this.extractProductGeometry(relatedObject, masterRelVoids);
|
|
94410
|
+
const relatedProduct = this.relatedProductByExpressID_(relatedExpressID);
|
|
94411
|
+
if (relatedProduct !== void 0) {
|
|
94412
|
+
this.extractProductGeometry(relatedProduct, masterRelVoids);
|
|
94164
94413
|
yield ++extractedCount;
|
|
94165
94414
|
}
|
|
94166
94415
|
}
|
|
@@ -94432,6 +94681,98 @@ var IfcGeometryExtraction = class _IfcGeometryExtraction {
|
|
|
94432
94681
|
}
|
|
94433
94682
|
};
|
|
94434
94683
|
IfcGeometryExtraction.AGGREGATE_TARGET_WAVE_SIZE_ = 512;
|
|
94684
|
+
IfcGeometryExtraction.AGGREGATE_PREFETCH_WAVE_SIZE_ = 8;
|
|
94685
|
+
var AggregateExtractPager = class {
|
|
94686
|
+
/**
|
|
94687
|
+
* Construct paging for one relationship.
|
|
94688
|
+
*
|
|
94689
|
+
* @param extraction_ The extraction whose model is being paged.
|
|
94690
|
+
* @param relAggregate_ The relationship this pages for.
|
|
94691
|
+
* @param waveSize Related products paged and held at once.
|
|
94692
|
+
*/
|
|
94693
|
+
constructor(extraction_, relAggregate_, waveSize) {
|
|
94694
|
+
this.extraction_ = extraction_;
|
|
94695
|
+
this.relAggregate_ = relAggregate_;
|
|
94696
|
+
this.basePins_ = /* @__PURE__ */ new Set();
|
|
94697
|
+
this.baseSpans_ = [];
|
|
94698
|
+
this.wavePins_ = /* @__PURE__ */ new Set();
|
|
94699
|
+
this.waveSpans_ = [];
|
|
94700
|
+
this.waveStart_ = 0;
|
|
94701
|
+
this.pagedThrough_ = 0;
|
|
94702
|
+
this.released_ = false;
|
|
94703
|
+
this.waveSize_ = Math.max(1, Math.floor(waveSize));
|
|
94704
|
+
}
|
|
94705
|
+
/**
|
|
94706
|
+
* Page what has to be resident for every step of this relationship.
|
|
94707
|
+
*
|
|
94708
|
+
* @return {Promise<void>} Resolves when the base is resident.
|
|
94709
|
+
*/
|
|
94710
|
+
async begin() {
|
|
94711
|
+
if (!this.extraction_.model.isSourceExternal) {
|
|
94712
|
+
return;
|
|
94713
|
+
}
|
|
94714
|
+
await this.extraction_.ensureResidentForAggregateBase(this.relAggregate_, this.basePins_, this.baseSpans_);
|
|
94715
|
+
this.products_ = this.extraction_.relatedAggregateProductLocalIDs(this.relAggregate_);
|
|
94716
|
+
if (this.products_ !== void 0) {
|
|
94717
|
+
return;
|
|
94718
|
+
}
|
|
94719
|
+
await this.extraction_.ensureResidentForRelatedObjectsByGetter(this.relAggregate_, this.basePins_, this.baseSpans_);
|
|
94720
|
+
}
|
|
94721
|
+
/**
|
|
94722
|
+
* Make the product the stepper extracts for yield `step` resident,
|
|
94723
|
+
* rolling the wave forward if it does not already cover it.
|
|
94724
|
+
*
|
|
94725
|
+
* At most `waveSize` product closures are pinned at any moment, whatever
|
|
94726
|
+
* the related-object list holds between them.
|
|
94727
|
+
*
|
|
94728
|
+
* @param step Zero-based index of the stepper's next yield.
|
|
94729
|
+
* @return {Promise<void>} Resolves when that product is resident.
|
|
94730
|
+
*/
|
|
94731
|
+
async ensureForStep(step) {
|
|
94732
|
+
const products = this.products_;
|
|
94733
|
+
if (products === void 0 || step >= products.length) {
|
|
94734
|
+
return;
|
|
94735
|
+
}
|
|
94736
|
+
if (step < this.pagedThrough_) {
|
|
94737
|
+
return;
|
|
94738
|
+
}
|
|
94739
|
+
this.releaseWave_();
|
|
94740
|
+
this.waveStart_ = step;
|
|
94741
|
+
this.pagedThrough_ = Math.min(products.length, step + this.waveSize_);
|
|
94742
|
+
await this.extraction_.ensureResidentForAggregateProducts(products, this.waveStart_, this.pagedThrough_, this.wavePins_, this.waveSpans_);
|
|
94743
|
+
}
|
|
94744
|
+
/**
|
|
94745
|
+
* Drop every pin this holds. Idempotent.
|
|
94746
|
+
*/
|
|
94747
|
+
release() {
|
|
94748
|
+
if (this.released_) {
|
|
94749
|
+
return;
|
|
94750
|
+
}
|
|
94751
|
+
this.released_ = true;
|
|
94752
|
+
this.releaseWave_();
|
|
94753
|
+
const model = this.extraction_.model;
|
|
94754
|
+
model.releaseSourceViews(this.basePins_);
|
|
94755
|
+
model.unpinLocalIDs(this.basePins_);
|
|
94756
|
+
this.basePins_.clear();
|
|
94757
|
+
for (const span of this.baseSpans_) {
|
|
94758
|
+
model.unpinAddressRange(span.address, span.length);
|
|
94759
|
+
}
|
|
94760
|
+
this.baseSpans_.length = 0;
|
|
94761
|
+
}
|
|
94762
|
+
/**
|
|
94763
|
+
* Drop the current wave's pins and views.
|
|
94764
|
+
*/
|
|
94765
|
+
releaseWave_() {
|
|
94766
|
+
const model = this.extraction_.model;
|
|
94767
|
+
model.releaseSourceViews(this.wavePins_);
|
|
94768
|
+
model.unpinLocalIDs(this.wavePins_);
|
|
94769
|
+
for (const span of this.waveSpans_) {
|
|
94770
|
+
model.unpinAddressRange(span.address, span.length);
|
|
94771
|
+
}
|
|
94772
|
+
this.wavePins_ = /* @__PURE__ */ new Set();
|
|
94773
|
+
this.waveSpans_ = [];
|
|
94774
|
+
}
|
|
94775
|
+
};
|
|
94435
94776
|
|
|
94436
94777
|
// compiled/src/ifc/ifc_property_extraction.js
|
|
94437
94778
|
var PropertyExtractResult;
|
|
@@ -15943,7 +15943,7 @@ var ParsingBuffer = class {
|
|
|
15943
15943
|
};
|
|
15944
15944
|
|
|
15945
15945
|
// compiled/src/version/version.js
|
|
15946
|
-
var versionString = "Conway v1.
|
|
15946
|
+
var versionString = "Conway v1.566.1541";
|
|
15947
15947
|
|
|
15948
15948
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
15949
15949
|
function pThreadsAllowed() {
|
|
@@ -944,7 +944,7 @@ var EntityTypesIfcCount = 909;
|
|
|
944
944
|
var entity_types_ifc_gen_default = EntityTypesIfc;
|
|
945
945
|
|
|
946
946
|
// compiled/src/version/version.js
|
|
947
|
-
var versionString = "Conway v1.
|
|
947
|
+
var versionString = "Conway v1.566.1541";
|
|
948
948
|
|
|
949
949
|
// compiled/dependencies/conway-geom/interface/conway_geometry.js
|
|
950
950
|
var wasmType = "";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate_prefetch_paging.test.d.ts","sourceRoot":"","sources":["../../../../src/compat/web-ifc/aggregate_prefetch_paging.test.ts"],"names":[],"mappings":""}
|