@ifc-lite/data 3.5.0 → 4.0.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/dist/color.d.ts +17 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +24 -0
- package/dist/color.js.map +1 -0
- package/dist/decomposition.d.ts +32 -0
- package/dist/decomposition.d.ts.map +1 -0
- package/dist/decomposition.js +57 -0
- package/dist/decomposition.js.map +1 -0
- package/dist/entity-table.d.ts +6 -0
- package/dist/entity-table.d.ts.map +1 -1
- package/dist/entity-table.js +5 -0
- package/dist/entity-table.js.map +1 -1
- package/dist/exact-type-name.d.ts +59 -0
- package/dist/exact-type-name.d.ts.map +1 -0
- package/dist/exact-type-name.js +50 -0
- package/dist/exact-type-name.js.map +1 -0
- package/dist/group-property-sets.d.ts +15 -0
- package/dist/group-property-sets.d.ts.map +1 -0
- package/dist/group-property-sets.js +33 -0
- package/dist/group-property-sets.js.map +1 -0
- package/dist/group-quantity-sets.d.ts +17 -0
- package/dist/group-quantity-sets.d.ts.map +1 -0
- package/dist/group-quantity-sets.js +37 -0
- package/dist/group-quantity-sets.js.map +1 -0
- package/dist/ifc-schema/descendants.d.ts +20 -0
- package/dist/ifc-schema/descendants.d.ts.map +1 -0
- package/dist/ifc-schema/descendants.js +279 -0
- package/dist/ifc-schema/descendants.js.map +1 -0
- package/dist/ifc-schema/entity-aliases.d.ts +61 -0
- package/dist/ifc-schema/entity-aliases.d.ts.map +1 -0
- package/dist/ifc-schema/entity-aliases.js +71 -0
- package/dist/ifc-schema/entity-aliases.js.map +1 -0
- package/dist/ifc-schema/index.d.ts +1 -0
- package/dist/ifc-schema/index.d.ts.map +1 -1
- package/dist/ifc-schema/index.js +4 -1
- package/dist/ifc-schema/index.js.map +1 -1
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/property-table.d.ts.map +1 -1
- package/dist/property-table.js +2 -16
- package/dist/property-table.js.map +1 -1
- package/dist/quantity-table.d.ts +5 -0
- package/dist/quantity-table.d.ts.map +1 -1
- package/dist/quantity-table.js +8 -18
- package/dist/quantity-table.js.map +1 -1
- package/dist/relationship-graph-helpers.d.ts +68 -0
- package/dist/relationship-graph-helpers.d.ts.map +1 -0
- package/dist/relationship-graph-helpers.js +100 -0
- package/dist/relationship-graph-helpers.js.map +1 -0
- package/dist/relationship-graph.d.ts +59 -8
- package/dist/relationship-graph.d.ts.map +1 -1
- package/dist/relationship-graph.js +99 -26
- package/dist/relationship-graph.js.map +1 -1
- package/dist/step-serializers.d.ts +20 -0
- package/dist/step-serializers.d.ts.map +1 -1
- package/dist/step-serializers.js +4 -4
- package/dist/step-serializers.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -4
- package/dist/types.js.map +1 -1
- package/package.json +4 -4
package/dist/property-table.js
CHANGED
|
@@ -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 { PropertyValueType } from './types.js';
|
|
5
|
+
import { groupPropertySetsByInstance } from './group-property-sets.js';
|
|
5
6
|
export class PropertyTableBuilder {
|
|
6
7
|
strings;
|
|
7
8
|
rows = [];
|
|
@@ -105,22 +106,7 @@ export function propertyTableFromColumns(columns, strings) {
|
|
|
105
106
|
propIndex,
|
|
106
107
|
getForEntity: (id) => {
|
|
107
108
|
const rowIndices = entityIndex.get(id) || [];
|
|
108
|
-
|
|
109
|
-
for (const idx of rowIndices) {
|
|
110
|
-
const psetNameStr = strings.get(psetName[idx]);
|
|
111
|
-
const psetGlobalIdStr = strings.get(psetGlobalId[idx]);
|
|
112
|
-
if (!psets.has(psetNameStr)) {
|
|
113
|
-
psets.set(psetNameStr, { name: psetNameStr, globalId: psetGlobalIdStr, properties: [] });
|
|
114
|
-
}
|
|
115
|
-
const pset = psets.get(psetNameStr);
|
|
116
|
-
const propNameStr = strings.get(propName[idx]);
|
|
117
|
-
pset.properties.push({
|
|
118
|
-
name: propNameStr,
|
|
119
|
-
type: propType[idx],
|
|
120
|
-
value: getPropertyValue(table, idx, strings),
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
return Array.from(psets.values());
|
|
109
|
+
return groupPropertySetsByInstance(rowIndices, psetName, psetGlobalId, propName, propType, strings, (idx) => getPropertyValue(table, idx, strings));
|
|
124
110
|
},
|
|
125
111
|
getPropertyValue: (id, pset, prop) => {
|
|
126
112
|
const rowIndices = entityIndex.get(id) || [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"property-table.js","sourceRoot":"","sources":["../src/property-table.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAQ/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"property-table.js","sourceRoot":"","sources":["../src/property-table.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAQ/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AA0DvE,MAAM,OAAO,oBAAoB;IACvB,OAAO,CAAc;IACrB,IAAI,GAAkB,EAAE,CAAC;IAEjC,YAAY,OAAoB;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,GAAgB;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,KAAK;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QAE/B,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,YAAY,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa;QAChE,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9C,cAAc;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEzB,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC;YAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtD,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAEtD,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;YAC1B,YAAY,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;YAClC,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;YAC1B,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC;YAE3B,4BAA4B;YAC5B,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACrB,KAAK,iBAAiB,CAAC,MAAM,CAAC;gBAC9B,KAAK,iBAAiB,CAAC,KAAK,CAAC;gBAC7B,KAAK,iBAAiB,CAAC,UAAU,CAAC;gBAClC,KAAK,iBAAiB,CAAC,IAAI,CAAC;gBAC5B,KAAK,iBAAiB,CAAC,IAAI;oBACzB,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAe,CAAC,CAAC;oBAC1D,MAAM;gBACR,KAAK,iBAAiB,CAAC,IAAI;oBACzB,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAe,CAAC;oBACnC,MAAM;gBACR,KAAK,iBAAiB,CAAC,OAAO;oBAC5B,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAe,CAAC;oBAClC,MAAM;gBACR,KAAK,iBAAiB,CAAC,OAAO,CAAC;gBAC/B,KAAK,iBAAiB,CAAC,OAAO;oBAC5B,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;oBACtE,MAAM;gBACR,KAAK,iBAAiB,CAAC,IAAI;oBACzB,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;oBAChE,MAAM;YACV,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,wBAAwB,CAC7B;YACE,KAAK;YACL,QAAQ;YACR,QAAQ;YACR,YAAY;YACZ,QAAQ;YACR,QAAQ;YACR,WAAW;YACX,SAAS;YACT,QAAQ;YACR,SAAS;YACT,MAAM;SACP,EACD,IAAI,CAAC,OAAO,CACb,CAAC;IACJ,CAAC;CACF;AAqBD,4EAA4E;AAC5E,MAAM,UAAU,wBAAwB,CAAC,OAA6B,EAAE,OAAoB;IAC1F,MAAM,EACJ,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAQ,EACR,SAAS,EACT,MAAM,GACP,GAAG,OAAO,CAAC;IAEZ,MAAM,WAAW,GAAG,IAAI,GAAG,EAAoB,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,KAAK,GAAkB;QAC3B,KAAK;QACL,QAAQ;QACR,QAAQ;QACR,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,SAAS;QACT,QAAQ;QACR,SAAS;QACT,MAAM;QACN,WAAW;QACX,SAAS;QACT,SAAS;QAET,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE;YACnB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAC7C,OAAO,2BAA2B,CAChC,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAC/C,CAAC;QACJ,CAAC;QAED,gBAAgB,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACnC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,OAAO,EAAE,CAAC;oBAC3D,OAAO,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,cAAc,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC;YAC3B,yEAAyE;YACzE,sEAAsE;YACtE,mBAAmB;YACnB,MAAM,OAAO,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChE,IAAI,IAAI,KAAK,SAAS,IAAI,OAAO,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC;YACjD,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,IAAI,OAAO,IAAI,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,OAAO;oBAAE,SAAS;gBACxD,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBACxD,IAAI,qBAAqB,CAAC,SAAS,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;oBACtD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,sBAAsB,CAAC,KAAoB;IACzD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC;AAYD,SAAS,UAAU,CAAC,KAA4B,EAAE,GAAW,EAAE,KAAa;IAC1E,IAAI,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,IAAI,GAAG,EAAE,CAAC;QACV,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,IAAI,qBAAqB,GAAG,KAAK,CAAC;AAElC,iFAAiF;AACjF,MAAM,UAAU,4BAA4B;IAC1C,qBAAqB,GAAG,KAAK,CAAC;AAChC,CAAC;AAED,SAAS,wBAAwB,CAAC,OAAe,EAAE,GAAY;IAC7D,IAAI,qBAAqB;QAAE,OAAO;IAClC,qBAAqB,GAAG,IAAI,CAAC;IAC7B,OAAO,CAAC,IAAI,CACV,wEAAwE;QACtE,2CAA2C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,EACpF,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAoB,EAAE,GAAW,EAAE,OAAwB;IACnF,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAEjC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,iBAAiB,CAAC,MAAM,CAAC;QAC9B,KAAK,iBAAiB,CAAC,KAAK,CAAC;QAC7B,KAAK,iBAAiB,CAAC,UAAU,CAAC;QAClC,KAAK,iBAAiB,CAAC,IAAI,CAAC;QAC5B,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAClC,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,CAAC;QACD,KAAK,iBAAiB,CAAC,IAAI;YACzB,OAAO,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9B,KAAK,iBAAiB,CAAC,OAAO;YAC5B,OAAO,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC7B,KAAK,iBAAiB,CAAC,OAAO,CAAC;QAC/B,KAAK,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACrC,OAAO,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC;QAChD,CAAC;QACD,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5B,oEAAoE;YACpE,wEAAwE;YACxE,uEAAuE;YACvE,sEAAsE;YACtE,0CAA0C;YAC1C,MAAM,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,OAAO,KAAK,EAAE;gBAAE,OAAO,IAAI,CAAC;YAChC,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,wBAAwB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;gBACvC,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAwB,EAAE,QAAgB,EAAE,KAAoB;IACpG,IAAI,SAAS,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAEvD,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/D,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,IAAI;gBACP,OAAO,SAAS,IAAI,KAAK,CAAC;YAC5B,KAAK,GAAG;gBACN,OAAO,SAAS,GAAG,KAAK,CAAC;YAC3B,KAAK,IAAI;gBACP,OAAO,SAAS,IAAI,KAAK,CAAC;YAC5B,KAAK,GAAG;gBACN,OAAO,SAAS,GAAG,KAAK,CAAC;YAC3B,KAAK,GAAG,CAAC;YACT,KAAK,IAAI;gBACP,OAAO,SAAS,KAAK,KAAK,CAAC;YAC7B,KAAK,IAAI;gBACP,OAAO,SAAS,KAAK,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC/D,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,GAAG,CAAC;YACT,KAAK,IAAI;gBACP,OAAO,SAAS,KAAK,KAAK,CAAC;YAC7B,KAAK,IAAI;gBACP,OAAO,SAAS,KAAK,KAAK,CAAC;YAC7B,KAAK,UAAU;gBACb,OAAO,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACnC,KAAK,YAAY;gBACf,OAAO,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,IAAI,OAAO,SAAS,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QACjE,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,GAAG,CAAC;YACT,KAAK,IAAI;gBACP,OAAO,SAAS,KAAK,KAAK,CAAC;YAC7B,KAAK,IAAI;gBACP,OAAO,SAAS,KAAK,KAAK,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/quantity-table.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ import { type PropertyValue } from './property-table.js';
|
|
|
7
7
|
import { QuantityType } from './types.js';
|
|
8
8
|
export interface QuantitySet {
|
|
9
9
|
name: string;
|
|
10
|
+
/** GlobalId of the source `IfcElementQuantity` instance, when known. */
|
|
11
|
+
globalId?: string;
|
|
10
12
|
quantities: Quantity[];
|
|
11
13
|
}
|
|
12
14
|
export interface Quantity {
|
|
@@ -20,6 +22,7 @@ export interface QuantityTable {
|
|
|
20
22
|
readonly count: number;
|
|
21
23
|
entityId: Uint32Array;
|
|
22
24
|
qsetName: Uint32Array;
|
|
25
|
+
qsetGlobalId: Uint32Array;
|
|
23
26
|
quantityName: Uint32Array;
|
|
24
27
|
quantityType: Uint8Array;
|
|
25
28
|
value: Float64Array;
|
|
@@ -74,6 +77,7 @@ export interface QuantityTableColumns {
|
|
|
74
77
|
count: number;
|
|
75
78
|
entityId: Uint32Array;
|
|
76
79
|
qsetName: Uint32Array;
|
|
80
|
+
qsetGlobalId: Uint32Array;
|
|
77
81
|
quantityName: Uint32Array;
|
|
78
82
|
quantityType: Uint8Array;
|
|
79
83
|
value: Float64Array;
|
|
@@ -87,6 +91,7 @@ export declare function quantityTableToColumns(table: QuantityTable): QuantityTa
|
|
|
87
91
|
interface QuantityRow {
|
|
88
92
|
entityId: number;
|
|
89
93
|
qsetName: string;
|
|
94
|
+
qsetGlobalId?: string;
|
|
90
95
|
quantityName: string;
|
|
91
96
|
quantityType: QuantityType;
|
|
92
97
|
value: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quantity-table.d.ts","sourceRoot":"","sources":["../src/quantity-table.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"quantity-table.d.ts","sourceRoot":"","sources":["../src/quantity-table.ts"],"names":[],"mappings":"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"}
|
package/dist/quantity-table.js
CHANGED
|
@@ -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 { comparePropertyValues } from './property-table.js';
|
|
5
|
+
import { groupQuantitySetsByInstance } from './group-quantity-sets.js';
|
|
5
6
|
export class QuantityTableBuilder {
|
|
6
7
|
strings;
|
|
7
8
|
rows = [];
|
|
@@ -15,6 +16,7 @@ export class QuantityTableBuilder {
|
|
|
15
16
|
const count = this.rows.length;
|
|
16
17
|
const entityId = new Uint32Array(count);
|
|
17
18
|
const qsetName = new Uint32Array(count);
|
|
19
|
+
const qsetGlobalId = new Uint32Array(count);
|
|
18
20
|
const quantityName = new Uint32Array(count);
|
|
19
21
|
const quantityType = new Uint8Array(count);
|
|
20
22
|
const value = new Float64Array(count);
|
|
@@ -24,6 +26,7 @@ export class QuantityTableBuilder {
|
|
|
24
26
|
const row = this.rows[i];
|
|
25
27
|
entityId[i] = row.entityId;
|
|
26
28
|
qsetName[i] = this.strings.intern(row.qsetName);
|
|
29
|
+
qsetGlobalId[i] = this.strings.intern(row.qsetGlobalId ?? '');
|
|
27
30
|
quantityName[i] = this.strings.intern(row.quantityName);
|
|
28
31
|
quantityType[i] = row.quantityType;
|
|
29
32
|
value[i] = row.value;
|
|
@@ -32,12 +35,12 @@ export class QuantityTableBuilder {
|
|
|
32
35
|
if (row.formula)
|
|
33
36
|
formula[i] = this.strings.intern(row.formula);
|
|
34
37
|
}
|
|
35
|
-
return quantityTableFromColumns({ count, entityId, qsetName, quantityName, quantityType, value, unitId, formula }, this.strings);
|
|
38
|
+
return quantityTableFromColumns({ count, entityId, qsetName, qsetGlobalId, quantityName, quantityType, value, unitId, formula }, this.strings);
|
|
36
39
|
}
|
|
37
40
|
}
|
|
38
41
|
/** Rebuild a live `QuantityTable` (closures + indices) from column data. */
|
|
39
42
|
export function quantityTableFromColumns(columns, strings) {
|
|
40
|
-
const { count, entityId, qsetName, quantityName, quantityType, value, unitId, formula } = columns;
|
|
43
|
+
const { count, entityId, qsetName, qsetGlobalId, quantityName, quantityType, value, unitId, formula } = columns;
|
|
41
44
|
const entityIndex = new Map();
|
|
42
45
|
const qsetIndex = new Map();
|
|
43
46
|
const quantityIndex = new Map();
|
|
@@ -50,6 +53,7 @@ export function quantityTableFromColumns(columns, strings) {
|
|
|
50
53
|
count,
|
|
51
54
|
entityId,
|
|
52
55
|
qsetName,
|
|
56
|
+
qsetGlobalId,
|
|
53
57
|
quantityName,
|
|
54
58
|
quantityType,
|
|
55
59
|
value,
|
|
@@ -60,22 +64,7 @@ export function quantityTableFromColumns(columns, strings) {
|
|
|
60
64
|
quantityIndex,
|
|
61
65
|
getForEntity: (id) => {
|
|
62
66
|
const rowIndices = entityIndex.get(id) || [];
|
|
63
|
-
|
|
64
|
-
for (const idx of rowIndices) {
|
|
65
|
-
const qsetNameStr = strings.get(qsetName[idx]);
|
|
66
|
-
if (!qsets.has(qsetNameStr)) {
|
|
67
|
-
qsets.set(qsetNameStr, { name: qsetNameStr, quantities: [] });
|
|
68
|
-
}
|
|
69
|
-
const qset = qsets.get(qsetNameStr);
|
|
70
|
-
const quantNameStr = strings.get(quantityName[idx]);
|
|
71
|
-
qset.quantities.push({
|
|
72
|
-
name: quantNameStr,
|
|
73
|
-
type: quantityType[idx],
|
|
74
|
-
value: value[idx],
|
|
75
|
-
formula: formula[idx] > 0 ? strings.get(formula[idx]) : undefined,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
return Array.from(qsets.values());
|
|
67
|
+
return groupQuantitySetsByInstance(rowIndices, qsetName, qsetGlobalId, quantityName, quantityType, value, formula, strings);
|
|
79
68
|
},
|
|
80
69
|
getQuantityValue: (id, qset, quant) => {
|
|
81
70
|
const rowIndices = entityIndex.get(id) || [];
|
|
@@ -128,6 +117,7 @@ export function quantityTableToColumns(table) {
|
|
|
128
117
|
count: table.count,
|
|
129
118
|
entityId: table.entityId,
|
|
130
119
|
qsetName: table.qsetName,
|
|
120
|
+
qsetGlobalId: table.qsetGlobalId,
|
|
131
121
|
quantityName: table.quantityName,
|
|
132
122
|
quantityType: table.quantityType,
|
|
133
123
|
value: table.value,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quantity-table.js","sourceRoot":"","sources":["../src/quantity-table.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAQ/D,OAAO,EAAE,qBAAqB,EAAsB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"quantity-table.js","sourceRoot":"","sources":["../src/quantity-table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Consumer-side helpers for `RelationshipGraph`'s deduped edges (#3760):
|
|
3
|
+
* `RelationshipGraphBuilder.addEdge` folds a repeated `IfcRel*` naming the
|
|
4
|
+
* same (source, target, type) triple into the surviving edge's
|
|
5
|
+
* `shadowedRelationshipIds` rather than dropping it. Split out from
|
|
6
|
+
* `relationship-graph.ts` (the CSR builder itself) since these operate on
|
|
7
|
+
* the public `Edge`/`RelationshipEdges` surface, not the builder internals.
|
|
8
|
+
*/
|
|
9
|
+
import type { Edge, RelationshipEdges } from './relationship-graph.js';
|
|
10
|
+
import type { RelationshipType } from './types.js';
|
|
11
|
+
/**
|
|
12
|
+
* True if the connection `edge` represents still exists once some
|
|
13
|
+
* `IfcRel*` instances may have been deleted. A deduped edge remembers every
|
|
14
|
+
* `IfcRel*` that named the same (source, target, type) triple — the edge
|
|
15
|
+
* survives a delete as long as any one of `relationshipId` or
|
|
16
|
+
* `shadowedRelationshipIds` is still live. Shared by the CLI and MCP
|
|
17
|
+
* backends so their delete-then-query logic can't drift out of sync with
|
|
18
|
+
* each other or with the graph's own dedupe (#3782 review).
|
|
19
|
+
*/
|
|
20
|
+
export declare function edgeSurvives(edge: Edge, isDeleted: (relationshipId: number) => boolean): boolean;
|
|
21
|
+
/** One flattened relationship row; see `flattenRelationshipEdges`. */
|
|
22
|
+
export interface FlattenedRelationshipEdge {
|
|
23
|
+
sourceId: number;
|
|
24
|
+
targetId: number;
|
|
25
|
+
type: RelationshipType;
|
|
26
|
+
relationshipId: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Flatten one CSR half (`RelationshipEdges`) to row-based form — one row
|
|
30
|
+
* per `IfcRel*` STEP record that named this (source, target, type) triple,
|
|
31
|
+
* not one row per deduped edge. Two `IfcRel*` instances can legally name
|
|
32
|
+
* the same triple (#3760); `RelationshipGraphBuilder.addEdge` collapses
|
|
33
|
+
* that to one edge and keeps the extra ids in `shadowedRelationshipIds`
|
|
34
|
+
* rather than dropping them, so an exporter that walked the raw
|
|
35
|
+
* `edgeRelIds` column alone (Parquet's `Relationships.parquet`, the DuckDB
|
|
36
|
+
* `relationships` table) would silently drop that STEP record from its
|
|
37
|
+
* output (#3782 review). Both use this shared helper instead of
|
|
38
|
+
* hand-rolling the CSR walk so they cannot drift out of sync on it again.
|
|
39
|
+
*
|
|
40
|
+
* Walks `edges.offsets` to find source ids, so it needs a real CSR half —
|
|
41
|
+
* an accessor that only implements `getEdges`/`getTargets`/`hasAnyEdges`
|
|
42
|
+
* over a facade with empty `offsets`/`counts` (e.g. the server-loaded-model
|
|
43
|
+
* path's hand-rolled `RelationshipEdges`) yields nothing here, regardless
|
|
44
|
+
* of what `getEdges` itself would answer.
|
|
45
|
+
*/
|
|
46
|
+
export declare function flattenRelationshipEdges(edges: RelationshipEdges): FlattenedRelationshipEdge[];
|
|
47
|
+
/** Output of `buildShadowedColumns`; see `RelationshipEdges.shadowedEdgeIndex`. */
|
|
48
|
+
export interface ShadowedColumns {
|
|
49
|
+
shadowedEdgeIndex: Uint32Array;
|
|
50
|
+
shadowedGroupOffsets: Uint32Array;
|
|
51
|
+
shadowedRelIds: Uint32Array;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Pack `(edgePosition, extraIds)` pairs collected during a CSR scatter into
|
|
55
|
+
* the three sparse typed-array columns `RelationshipEdges` stores them as.
|
|
56
|
+
* `buildCSR`'s only caller in-package; not re-exported from the package
|
|
57
|
+
* index (see `binarySearchU32`, which the `@ifc-lite/cache` reader does
|
|
58
|
+
* share). `pairs` need not be pre-sorted by position. An entry with an
|
|
59
|
+
* empty `ids` array is dropped rather than packed as an empty group — it
|
|
60
|
+
* would violate `Edge.shadowedRelationshipIds`'s "present implies
|
|
61
|
+
* non-empty" invariant (#3782 review). Returns `undefined` when nothing is
|
|
62
|
+
* left to pack, so a caller can omit the columns entirely rather than
|
|
63
|
+
* write out empty arrays — they're optional on `RelationshipEdges`.
|
|
64
|
+
*/
|
|
65
|
+
export declare function buildShadowedColumns(pairs: Array<[position: number, ids: number[]]>): ShadowedColumns | undefined;
|
|
66
|
+
/** Binary search for `target` in an ascending-sorted `Uint32Array`; -1 if absent. */
|
|
67
|
+
export declare function binarySearchU32(arr: Uint32Array, target: number): number;
|
|
68
|
+
//# sourceMappingURL=relationship-graph-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationship-graph-helpers.d.ts","sourceRoot":"","sources":["../src/relationship-graph-helpers.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAGhG;AAED,sEAAsE;AACtE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,yBAAyB,EAAE,CAa9F;AAED,mFAAmF;AACnF,MAAM,WAAW,eAAe;IAC9B,iBAAiB,EAAE,WAAW,CAAC;IAC/B,oBAAoB,EAAE,WAAW,CAAC;IAClC,cAAc,EAAE,WAAW,CAAC;CAC7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,eAAe,GAAG,SAAS,CAkBjH;AAED,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAWxE"}
|
|
@@ -0,0 +1,100 @@
|
|
|
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
|
+
* True if the connection `edge` represents still exists once some
|
|
6
|
+
* `IfcRel*` instances may have been deleted. A deduped edge remembers every
|
|
7
|
+
* `IfcRel*` that named the same (source, target, type) triple — the edge
|
|
8
|
+
* survives a delete as long as any one of `relationshipId` or
|
|
9
|
+
* `shadowedRelationshipIds` is still live. Shared by the CLI and MCP
|
|
10
|
+
* backends so their delete-then-query logic can't drift out of sync with
|
|
11
|
+
* each other or with the graph's own dedupe (#3782 review).
|
|
12
|
+
*/
|
|
13
|
+
export function edgeSurvives(edge, isDeleted) {
|
|
14
|
+
if (!isDeleted(edge.relationshipId))
|
|
15
|
+
return true;
|
|
16
|
+
return edge.shadowedRelationshipIds?.some((id) => !isDeleted(id)) ?? false;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Flatten one CSR half (`RelationshipEdges`) to row-based form — one row
|
|
20
|
+
* per `IfcRel*` STEP record that named this (source, target, type) triple,
|
|
21
|
+
* not one row per deduped edge. Two `IfcRel*` instances can legally name
|
|
22
|
+
* the same triple (#3760); `RelationshipGraphBuilder.addEdge` collapses
|
|
23
|
+
* that to one edge and keeps the extra ids in `shadowedRelationshipIds`
|
|
24
|
+
* rather than dropping them, so an exporter that walked the raw
|
|
25
|
+
* `edgeRelIds` column alone (Parquet's `Relationships.parquet`, the DuckDB
|
|
26
|
+
* `relationships` table) would silently drop that STEP record from its
|
|
27
|
+
* output (#3782 review). Both use this shared helper instead of
|
|
28
|
+
* hand-rolling the CSR walk so they cannot drift out of sync on it again.
|
|
29
|
+
*
|
|
30
|
+
* Walks `edges.offsets` to find source ids, so it needs a real CSR half —
|
|
31
|
+
* an accessor that only implements `getEdges`/`getTargets`/`hasAnyEdges`
|
|
32
|
+
* over a facade with empty `offsets`/`counts` (e.g. the server-loaded-model
|
|
33
|
+
* path's hand-rolled `RelationshipEdges`) yields nothing here, regardless
|
|
34
|
+
* of what `getEdges` itself would answer.
|
|
35
|
+
*/
|
|
36
|
+
export function flattenRelationshipEdges(edges) {
|
|
37
|
+
const out = [];
|
|
38
|
+
for (const sourceId of edges.offsets.keys()) {
|
|
39
|
+
for (const edge of edges.getEdges(sourceId)) {
|
|
40
|
+
out.push({ sourceId, targetId: edge.target, type: edge.type, relationshipId: edge.relationshipId });
|
|
41
|
+
if (edge.shadowedRelationshipIds) {
|
|
42
|
+
for (const id of edge.shadowedRelationshipIds) {
|
|
43
|
+
out.push({ sourceId, targetId: edge.target, type: edge.type, relationshipId: id });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Pack `(edgePosition, extraIds)` pairs collected during a CSR scatter into
|
|
52
|
+
* the three sparse typed-array columns `RelationshipEdges` stores them as.
|
|
53
|
+
* `buildCSR`'s only caller in-package; not re-exported from the package
|
|
54
|
+
* index (see `binarySearchU32`, which the `@ifc-lite/cache` reader does
|
|
55
|
+
* share). `pairs` need not be pre-sorted by position. An entry with an
|
|
56
|
+
* empty `ids` array is dropped rather than packed as an empty group — it
|
|
57
|
+
* would violate `Edge.shadowedRelationshipIds`'s "present implies
|
|
58
|
+
* non-empty" invariant (#3782 review). Returns `undefined` when nothing is
|
|
59
|
+
* left to pack, so a caller can omit the columns entirely rather than
|
|
60
|
+
* write out empty arrays — they're optional on `RelationshipEdges`.
|
|
61
|
+
*/
|
|
62
|
+
export function buildShadowedColumns(pairs) {
|
|
63
|
+
const nonEmpty = pairs.filter(([, ids]) => ids.length > 0);
|
|
64
|
+
if (nonEmpty.length === 0)
|
|
65
|
+
return undefined;
|
|
66
|
+
const sorted = nonEmpty.sort((a, b) => a[0] - b[0]);
|
|
67
|
+
const shadowedEdgeIndex = new Uint32Array(sorted.length);
|
|
68
|
+
const shadowedGroupOffsets = new Uint32Array(sorted.length + 1);
|
|
69
|
+
let totalIds = 0;
|
|
70
|
+
for (const [, ids] of sorted)
|
|
71
|
+
totalIds += ids.length;
|
|
72
|
+
const shadowedRelIds = new Uint32Array(totalIds);
|
|
73
|
+
let cursor = 0;
|
|
74
|
+
for (let g = 0; g < sorted.length; g++) {
|
|
75
|
+
const [pos, ids] = sorted[g];
|
|
76
|
+
shadowedEdgeIndex[g] = pos;
|
|
77
|
+
shadowedGroupOffsets[g] = cursor;
|
|
78
|
+
for (const id of ids)
|
|
79
|
+
shadowedRelIds[cursor++] = id;
|
|
80
|
+
}
|
|
81
|
+
shadowedGroupOffsets[sorted.length] = cursor;
|
|
82
|
+
return { shadowedEdgeIndex, shadowedGroupOffsets, shadowedRelIds };
|
|
83
|
+
}
|
|
84
|
+
/** Binary search for `target` in an ascending-sorted `Uint32Array`; -1 if absent. */
|
|
85
|
+
export function binarySearchU32(arr, target) {
|
|
86
|
+
let lo = 0;
|
|
87
|
+
let hi = arr.length - 1;
|
|
88
|
+
while (lo <= hi) {
|
|
89
|
+
const mid = (lo + hi) >>> 1;
|
|
90
|
+
const v = arr[mid];
|
|
91
|
+
if (v === target)
|
|
92
|
+
return mid;
|
|
93
|
+
if (v < target)
|
|
94
|
+
lo = mid + 1;
|
|
95
|
+
else
|
|
96
|
+
hi = mid - 1;
|
|
97
|
+
}
|
|
98
|
+
return -1;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=relationship-graph-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationship-graph-helpers.js","sourceRoot":"","sources":["../src/relationship-graph-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,17 @@ export interface Edge {
|
|
|
7
7
|
target: number;
|
|
8
8
|
type: RelationshipType;
|
|
9
9
|
relationshipId: number;
|
|
10
|
+
/**
|
|
11
|
+
* Express ids of other `IfcRel*` instances that named the same
|
|
12
|
+
* (source, target, type) triple and were collapsed into this edge by the
|
|
13
|
+
* dedupe in `RelationshipGraphBuilder.addEdge` (#3760). A consumer that
|
|
14
|
+
* needs to know whether the *connection* still exists after a delete —
|
|
15
|
+
* not just whether `relationshipId` was deleted — must check these too:
|
|
16
|
+
* use `edgeSurvives` (`relationship-graph-helpers.js`) rather than
|
|
17
|
+
* testing `relationshipId` alone. Invariant: present implies non-empty —
|
|
18
|
+
* `undefined` means "nothing collapsed into this edge", never `[]`.
|
|
19
|
+
*/
|
|
20
|
+
shadowedRelationshipIds?: number[];
|
|
10
21
|
}
|
|
11
22
|
export interface RelationshipEdges {
|
|
12
23
|
offsets: Map<number, number>;
|
|
@@ -14,6 +25,19 @@ export interface RelationshipEdges {
|
|
|
14
25
|
edgeTargets: Uint32Array;
|
|
15
26
|
edgeTypes: Uint16Array;
|
|
16
27
|
edgeRelIds: Uint32Array;
|
|
28
|
+
/**
|
|
29
|
+
* Sparse "shadowed" ids collapsed by the (source, target, type) dedupe
|
|
30
|
+
* (#3760/#3782): three small, Transferable typed arrays rather than one
|
|
31
|
+
* `(number[] | undefined)[]` slot per edge — the dense shape
|
|
32
|
+
* structured-clones (not transfers) across the worker boundary, measured
|
|
33
|
+
* +1.2s/+190MB on a 12M-edge model for a field that's empty almost
|
|
34
|
+
* everywhere. `shadowedEdgeIndex[g]` (ascending) names the edge whose ids
|
|
35
|
+
* live at `shadowedRelIds[shadowedGroupOffsets[g]..shadowedGroupOffsets[g+1])`.
|
|
36
|
+
* Absent together when nothing was collapsed — read via `?.`.
|
|
37
|
+
*/
|
|
38
|
+
shadowedEdgeIndex?: Uint32Array;
|
|
39
|
+
shadowedGroupOffsets?: Uint32Array;
|
|
40
|
+
shadowedRelIds?: Uint32Array;
|
|
17
41
|
getEdges(entityId: number, type?: RelationshipType): Edge[];
|
|
18
42
|
getTargets(entityId: number, type?: RelationshipType): number[];
|
|
19
43
|
hasAnyEdges(entityId: number): boolean;
|
|
@@ -29,18 +53,39 @@ export interface RelationshipInfo {
|
|
|
29
53
|
relationshipId: number;
|
|
30
54
|
type: RelationshipType;
|
|
31
55
|
typeName: string;
|
|
56
|
+
/** See `Edge.shadowedRelationshipIds`. */
|
|
57
|
+
shadowedRelationshipIds?: number[];
|
|
32
58
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Structure-of-Arrays relationship graph builder.
|
|
35
|
-
* Uses parallel number arrays instead of object arrays to avoid millions of
|
|
36
|
-
* small object allocations. Build phase uses counting sort (O(n)) instead
|
|
37
|
-
* of comparison sort (O(n log n)) for massive speedup on large files.
|
|
38
|
-
*/
|
|
39
59
|
export declare class RelationshipGraphBuilder {
|
|
40
60
|
private _sources;
|
|
41
61
|
private _targets;
|
|
42
62
|
private _types;
|
|
43
63
|
private _relIds;
|
|
64
|
+
/**
|
|
65
|
+
* Extra `IfcRel*` ids collapsed into an already-recorded edge, keyed by
|
|
66
|
+
* that edge's index in `_sources`/`_targets`/`_types`/`_relIds`. Sparse —
|
|
67
|
+
* only entities with an actual duplicate get an entry — rather than a
|
|
68
|
+
* slot per edge, so a builder that never sees a duplicate pays nothing
|
|
69
|
+
* for this beyond one empty `Map`.
|
|
70
|
+
*/
|
|
71
|
+
private _shadowedRelIds;
|
|
72
|
+
/**
|
|
73
|
+
* Edges already recorded, keyed by source, then by `target * TYPE_SPAN + type`,
|
|
74
|
+
* mapping to the edge's index in `_sources`/`_targets`/`_types`/`_relIds`.
|
|
75
|
+
* Nothing in EXPRESS forbids two `IfcRel*` instances from naming the same
|
|
76
|
+
* (relating, related) pair, so a schema-legal file can hand us the same edge
|
|
77
|
+
* twice; every consumer that walks the raw edge list would then count the
|
|
78
|
+
* target twice (#3760).
|
|
79
|
+
*/
|
|
80
|
+
private _seen;
|
|
81
|
+
/**
|
|
82
|
+
* Adds one edge, folding a repeat of a `(source, target, type)` triple
|
|
83
|
+
* already present into the surviving edge instead of dropping it outright.
|
|
84
|
+
* The first instance's express id becomes `relationshipId`; later repeats
|
|
85
|
+
* are kept in `_shadowedRelIds` so deleting one of several `IfcRel*`
|
|
86
|
+
* instances that named the same pair doesn't make the connection
|
|
87
|
+
* disappear while a sibling instance still exists (#3782 review).
|
|
88
|
+
*/
|
|
44
89
|
addEdge(source: number, target: number, type: RelationshipType, relId: number): void;
|
|
45
90
|
build(): RelationshipGraph;
|
|
46
91
|
}
|
|
@@ -55,6 +100,10 @@ export interface RelationshipEdgesColumns {
|
|
|
55
100
|
edgeTargets: Uint32Array;
|
|
56
101
|
edgeTypes: Uint16Array;
|
|
57
102
|
edgeRelIds: Uint32Array;
|
|
103
|
+
/** See `RelationshipEdges.shadowedEdgeIndex` et al. */
|
|
104
|
+
shadowedEdgeIndex?: Uint32Array;
|
|
105
|
+
shadowedGroupOffsets?: Uint32Array;
|
|
106
|
+
shadowedRelIds?: Uint32Array;
|
|
58
107
|
}
|
|
59
108
|
/**
|
|
60
109
|
* Plain-data representation of a complete bidirectional `RelationshipGraph`.
|
|
@@ -71,9 +120,11 @@ export interface RelationshipGraphColumns {
|
|
|
71
120
|
*
|
|
72
121
|
* Exported because the graph can be reconstructed from raw edge arrays
|
|
73
122
|
* (e.g. when merging or rebuilding a graph) without going through the
|
|
74
|
-
* `RelationshipGraphBuilder` mutation API.
|
|
123
|
+
* `RelationshipGraphBuilder` mutation API. `shadowedRelIds` maps a
|
|
124
|
+
* pre-scatter edge index (in `keys`/`values`/`types`/`relIds`) to the extra
|
|
125
|
+
* `IfcRel*` ids collapsed into it; pass an empty `Map` when none.
|
|
75
126
|
*/
|
|
76
|
-
export declare function buildCSR(n: number, keys: number[] | Uint32Array, values: number[] | Uint32Array, types: number[] | Uint16Array, relIds: number[] | Uint32Array): RelationshipEdges;
|
|
127
|
+
export declare function buildCSR(n: number, keys: number[] | Uint32Array, values: number[] | Uint32Array, types: number[] | Uint16Array, relIds: number[] | Uint32Array, shadowedRelIds: Map<number, number[]>): RelationshipEdges;
|
|
77
128
|
/**
|
|
78
129
|
* Rebuild the closure-bearing `RelationshipEdges` view (one direction of
|
|
79
130
|
* the graph) from raw CSR columns. Used by both the in-process builder and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relationship-graph.d.ts","sourceRoot":"","sources":["../src/relationship-graph.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"relationship-graph.d.ts","sourceRoot":"","sources":["../src/relationship-graph.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB;;;;;;;;;OASG;IACH,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,EAAE,WAAW,CAAC;IACxB;;;;;;;;;OASG;IACH,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,oBAAoB,CAAC,EAAE,WAAW,CAAC;IACnC,cAAc,CAAC,EAAE,WAAW,CAAC;IAE7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,IAAI,EAAE,CAAC;IAC5D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAAC;IAChE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;CACxC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,OAAO,EAAE,iBAAiB,CAAC;IAE3B,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,EAAE,CAAC;IACpG,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC;IACzF,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAAC;CACjF;AAED,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,gBAAgB,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAC;CACpC;AAWD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,QAAQ,CAAgB;IAChC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,OAAO,CAAgB;IAC/B;;;;;;OAMG;IACH,OAAO,CAAC,eAAe,CAA+B;IAEtD;;;;;;;OAOG;IACH,OAAO,CAAC,KAAK,CAA0C;IAEvD;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IA0BpF,KAAK,IAAI,iBAAiB;CAM3B;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,WAAW,CAAC;IACvB,UAAU,EAAE,WAAW,CAAC;IACxB,uDAAuD;IACvD,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,oBAAoB,CAAC,EAAE,WAAW,CAAC;IACnC,cAAc,CAAC,EAAE,WAAW,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,wBAAwB,CAAC;IAClC,OAAO,EAAE,wBAAwB,CAAC;CACnC;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CACtB,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,EAC5B,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAC9B,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,EAC7B,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAC9B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACpC,iBAAiB,CAiDnB;AAYD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAyCjG;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,iBAAiB,GACzB,iBAAiB,CA2BnB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAKjG;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,iBAAiB,GAAG,wBAAwB,CAoB7F"}
|