@ifc-lite/data 1.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.
@@ -0,0 +1,214 @@
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
+ import { PropertyValueType } from './types.js';
5
+ export class PropertyTableBuilder {
6
+ strings;
7
+ rows = [];
8
+ constructor(strings) {
9
+ this.strings = strings;
10
+ }
11
+ add(row) {
12
+ this.rows.push(row);
13
+ }
14
+ build() {
15
+ const count = this.rows.length;
16
+ // Allocate columnar arrays
17
+ const entityId = new Uint32Array(count);
18
+ const psetName = new Uint32Array(count);
19
+ const psetGlobalId = new Uint32Array(count);
20
+ const propName = new Uint32Array(count);
21
+ const propType = new Uint8Array(count);
22
+ const valueString = new Uint32Array(count);
23
+ const valueReal = new Float64Array(count);
24
+ const valueInt = new Int32Array(count);
25
+ const valueBool = new Uint8Array(count).fill(255); // 255 = null
26
+ const unitId = new Int32Array(count).fill(-1);
27
+ // Build indices
28
+ const entityIndex = new Map();
29
+ const psetIndex = new Map();
30
+ const propIndex = new Map();
31
+ // Fill arrays
32
+ for (let i = 0; i < count; i++) {
33
+ const row = this.rows[i];
34
+ entityId[i] = row.entityId;
35
+ const psetNameIdx = this.strings.intern(row.psetName);
36
+ const psetGlobalIdIdx = this.strings.intern(row.psetGlobalId);
37
+ const propNameIdx = this.strings.intern(row.propName);
38
+ psetName[i] = psetNameIdx;
39
+ psetGlobalId[i] = psetGlobalIdIdx;
40
+ propName[i] = propNameIdx;
41
+ propType[i] = row.propType;
42
+ // Store value based on type
43
+ switch (row.propType) {
44
+ case PropertyValueType.String:
45
+ case PropertyValueType.Label:
46
+ case PropertyValueType.Identifier:
47
+ case PropertyValueType.Text:
48
+ case PropertyValueType.Enum:
49
+ valueString[i] = this.strings.intern(row.value);
50
+ break;
51
+ case PropertyValueType.Real:
52
+ valueReal[i] = row.value;
53
+ break;
54
+ case PropertyValueType.Integer:
55
+ valueInt[i] = row.value;
56
+ break;
57
+ case PropertyValueType.Boolean:
58
+ case PropertyValueType.Logical:
59
+ valueBool[i] = row.value === true ? 1 : row.value === false ? 0 : 255;
60
+ break;
61
+ case PropertyValueType.List:
62
+ valueString[i] = this.strings.intern(JSON.stringify(row.value));
63
+ break;
64
+ }
65
+ if (row.unitId !== undefined) {
66
+ unitId[i] = row.unitId;
67
+ }
68
+ // Build indices
69
+ addToIndex(entityIndex, row.entityId, i);
70
+ addToIndex(psetIndex, psetNameIdx, i);
71
+ addToIndex(propIndex, propNameIdx, i);
72
+ }
73
+ const strings = this.strings;
74
+ const table = {
75
+ count,
76
+ entityId,
77
+ psetName,
78
+ psetGlobalId,
79
+ propName,
80
+ propType,
81
+ valueString,
82
+ valueReal,
83
+ valueInt,
84
+ valueBool,
85
+ unitId,
86
+ entityIndex,
87
+ psetIndex,
88
+ propIndex,
89
+ getForEntity: (id) => {
90
+ const rowIndices = entityIndex.get(id) || [];
91
+ const psets = new Map();
92
+ for (const idx of rowIndices) {
93
+ const psetNameStr = strings.get(psetName[idx]);
94
+ const psetGlobalIdStr = strings.get(psetGlobalId[idx]);
95
+ if (!psets.has(psetNameStr)) {
96
+ psets.set(psetNameStr, {
97
+ name: psetNameStr,
98
+ globalId: psetGlobalIdStr,
99
+ properties: [],
100
+ });
101
+ }
102
+ const pset = psets.get(psetNameStr);
103
+ const propNameStr = strings.get(propName[idx]);
104
+ const propValue = getPropertyValue(table, idx, strings);
105
+ pset.properties.push({
106
+ name: propNameStr,
107
+ type: propType[idx],
108
+ value: propValue,
109
+ });
110
+ }
111
+ return Array.from(psets.values());
112
+ },
113
+ getPropertyValue: (id, pset, prop) => {
114
+ const rowIndices = entityIndex.get(id) || [];
115
+ const psetIdx = strings.indexOf(pset);
116
+ const propIdx = strings.indexOf(prop);
117
+ for (const idx of rowIndices) {
118
+ if (psetName[idx] === psetIdx && propName[idx] === propIdx) {
119
+ return getPropertyValue(table, idx, strings);
120
+ }
121
+ }
122
+ return null;
123
+ },
124
+ findByProperty: (prop, operator, value) => {
125
+ const propIdx = strings.indexOf(prop);
126
+ if (propIdx < 0)
127
+ return [];
128
+ const rowIndices = propIndex.get(propIdx) || [];
129
+ const results = [];
130
+ for (const idx of rowIndices) {
131
+ const propValue = getPropertyValue(table, idx, strings);
132
+ if (compareValues(propValue, operator, value)) {
133
+ results.push(entityId[idx]);
134
+ }
135
+ }
136
+ return results;
137
+ },
138
+ };
139
+ return table;
140
+ }
141
+ }
142
+ function addToIndex(index, key, value) {
143
+ let list = index.get(key);
144
+ if (!list) {
145
+ list = [];
146
+ index.set(key, list);
147
+ }
148
+ list.push(value);
149
+ }
150
+ function getPropertyValue(table, idx, strings) {
151
+ const type = table.propType[idx];
152
+ switch (type) {
153
+ case PropertyValueType.String:
154
+ case PropertyValueType.Label:
155
+ case PropertyValueType.Identifier:
156
+ case PropertyValueType.Text:
157
+ case PropertyValueType.Enum:
158
+ return table.valueString[idx] >= 0 ? strings.get(table.valueString[idx]) : null;
159
+ case PropertyValueType.Real:
160
+ return table.valueReal[idx];
161
+ case PropertyValueType.Integer:
162
+ return table.valueInt[idx];
163
+ case PropertyValueType.Boolean:
164
+ case PropertyValueType.Logical:
165
+ const boolVal = table.valueBool[idx];
166
+ return boolVal === 255 ? null : boolVal === 1;
167
+ case PropertyValueType.List:
168
+ const listStr = strings.get(table.valueString[idx]);
169
+ try {
170
+ return JSON.parse(listStr);
171
+ }
172
+ catch {
173
+ return [];
174
+ }
175
+ default:
176
+ return null;
177
+ }
178
+ }
179
+ function compareValues(propValue, operator, value) {
180
+ if (propValue === null || value === null)
181
+ return false;
182
+ if (typeof propValue === 'number' && typeof value === 'number') {
183
+ switch (operator) {
184
+ case '>=':
185
+ return propValue >= value;
186
+ case '>':
187
+ return propValue > value;
188
+ case '<=':
189
+ return propValue <= value;
190
+ case '<':
191
+ return propValue < value;
192
+ case '=':
193
+ case '==':
194
+ return propValue === value;
195
+ case '!=':
196
+ return propValue !== value;
197
+ }
198
+ }
199
+ if (typeof propValue === 'string' && typeof value === 'string') {
200
+ switch (operator) {
201
+ case '=':
202
+ case '==':
203
+ return propValue === value;
204
+ case '!=':
205
+ return propValue !== value;
206
+ case 'contains':
207
+ return propValue.includes(value);
208
+ case 'startsWith':
209
+ return propValue.startsWith(value);
210
+ }
211
+ }
212
+ return false;
213
+ }
214
+ //# sourceMappingURL=property-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-table.js","sourceRoot":"","sources":["../src/property-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Quantity table - columnar storage for quantities
3
+ * Similar to properties but always numeric
4
+ */
5
+ import type { StringTable } from './string-table.js';
6
+ import { QuantityType } from './types.js';
7
+ export interface QuantitySet {
8
+ name: string;
9
+ quantities: Quantity[];
10
+ }
11
+ export interface Quantity {
12
+ name: string;
13
+ type: QuantityType;
14
+ value: number;
15
+ unit?: string;
16
+ formula?: string;
17
+ }
18
+ export interface QuantityTable {
19
+ readonly count: number;
20
+ entityId: Uint32Array;
21
+ qsetName: Uint32Array;
22
+ quantityName: Uint32Array;
23
+ quantityType: Uint8Array;
24
+ value: Float64Array;
25
+ unitId: Int32Array;
26
+ formula: Uint32Array;
27
+ entityIndex: Map<number, number[]>;
28
+ qsetIndex: Map<number, number[]>;
29
+ quantityIndex: Map<number, number[]>;
30
+ getForEntity(expressId: number): QuantitySet[];
31
+ getQuantityValue(expressId: number, qsetName: string, quantName: string): number | null;
32
+ sumByType(quantityName: string, elementType?: number): number;
33
+ }
34
+ export declare class QuantityTableBuilder {
35
+ private strings;
36
+ private rows;
37
+ constructor(strings: StringTable);
38
+ add(row: QuantityRow): void;
39
+ build(): QuantityTable;
40
+ }
41
+ interface QuantityRow {
42
+ entityId: number;
43
+ qsetName: string;
44
+ quantityName: string;
45
+ quantityType: QuantityType;
46
+ value: number;
47
+ unitId?: number;
48
+ formula?: string;
49
+ }
50
+ export {};
51
+ //# sourceMappingURL=quantity-table.d.ts.map
@@ -0,0 +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,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,QAAQ,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,EAAE,WAAW,CAAC;IAC1B,YAAY,EAAE,UAAU,CAAC;IACzB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,WAAW,CAAC;IAErB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACnC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACjC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAErC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC;IAC/C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACxF,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/D;AAED,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,IAAI,CAAqB;gBAErB,OAAO,EAAE,WAAW;IAIhC,GAAG,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAI3B,KAAK,IAAI,aAAa;CA0GvB;AAED,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,109 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ export class QuantityTableBuilder {
5
+ strings;
6
+ rows = [];
7
+ constructor(strings) {
8
+ this.strings = strings;
9
+ }
10
+ add(row) {
11
+ this.rows.push(row);
12
+ }
13
+ build() {
14
+ const count = this.rows.length;
15
+ const entityId = new Uint32Array(count);
16
+ const qsetName = new Uint32Array(count);
17
+ const quantityName = new Uint32Array(count);
18
+ const quantityType = new Uint8Array(count);
19
+ const value = new Float64Array(count);
20
+ const unitId = new Int32Array(count).fill(-1);
21
+ const formula = new Uint32Array(count).fill(0);
22
+ const entityIndex = new Map();
23
+ const qsetIndex = new Map();
24
+ const quantityIndex = new Map();
25
+ for (let i = 0; i < count; i++) {
26
+ const row = this.rows[i];
27
+ entityId[i] = row.entityId;
28
+ qsetName[i] = this.strings.intern(row.qsetName);
29
+ quantityName[i] = this.strings.intern(row.quantityName);
30
+ quantityType[i] = row.quantityType;
31
+ value[i] = row.value;
32
+ if (row.unitId !== undefined) {
33
+ unitId[i] = row.unitId;
34
+ }
35
+ if (row.formula) {
36
+ formula[i] = this.strings.intern(row.formula);
37
+ }
38
+ addToIndex(entityIndex, row.entityId, i);
39
+ addToIndex(qsetIndex, qsetName[i], i);
40
+ addToIndex(quantityIndex, quantityName[i], i);
41
+ }
42
+ return {
43
+ count,
44
+ entityId,
45
+ qsetName,
46
+ quantityName,
47
+ quantityType,
48
+ value,
49
+ unitId,
50
+ formula,
51
+ entityIndex,
52
+ qsetIndex,
53
+ quantityIndex,
54
+ getForEntity: (id) => {
55
+ const rowIndices = entityIndex.get(id) || [];
56
+ const qsets = new Map();
57
+ for (const idx of rowIndices) {
58
+ const qsetNameStr = this.strings.get(qsetName[idx]);
59
+ if (!qsets.has(qsetNameStr)) {
60
+ qsets.set(qsetNameStr, {
61
+ name: qsetNameStr,
62
+ quantities: [],
63
+ });
64
+ }
65
+ const qset = qsets.get(qsetNameStr);
66
+ const quantNameStr = this.strings.get(quantityName[idx]);
67
+ qset.quantities.push({
68
+ name: quantNameStr,
69
+ type: quantityType[idx],
70
+ value: value[idx],
71
+ formula: formula[idx] > 0 ? this.strings.get(formula[idx]) : undefined,
72
+ });
73
+ }
74
+ return Array.from(qsets.values());
75
+ },
76
+ getQuantityValue: (id, qset, quant) => {
77
+ const rowIndices = entityIndex.get(id) || [];
78
+ const qsetIdx = this.strings.indexOf(qset);
79
+ const quantIdx = this.strings.indexOf(quant);
80
+ for (const idx of rowIndices) {
81
+ if (qsetName[idx] === qsetIdx && quantityName[idx] === quantIdx) {
82
+ return value[idx];
83
+ }
84
+ }
85
+ return null;
86
+ },
87
+ sumByType: (quantName) => {
88
+ const quantIdx = this.strings.indexOf(quantName);
89
+ if (quantIdx < 0)
90
+ return 0;
91
+ const rowIndices = quantityIndex.get(quantIdx) || [];
92
+ let sum = 0;
93
+ for (const idx of rowIndices) {
94
+ sum += value[idx];
95
+ }
96
+ return sum;
97
+ },
98
+ };
99
+ }
100
+ }
101
+ function addToIndex(index, key, value) {
102
+ let list = index.get(key);
103
+ if (!list) {
104
+ list = [];
105
+ index.set(key, list);
106
+ }
107
+ list.push(value);
108
+ }
109
+ //# sourceMappingURL=quantity-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quantity-table.js","sourceRoot":"","sources":["../src/quantity-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Relationship graph - bidirectional graph using CSR format
3
+ * Enables fast traversal in both directions
4
+ */
5
+ import { RelationshipType } from './types.js';
6
+ export interface Edge {
7
+ target: number;
8
+ type: RelationshipType;
9
+ relationshipId: number;
10
+ }
11
+ export interface RelationshipEdges {
12
+ offsets: Map<number, number>;
13
+ counts: Map<number, number>;
14
+ edgeTargets: Uint32Array;
15
+ edgeTypes: Uint16Array;
16
+ edgeRelIds: Uint32Array;
17
+ getEdges(entityId: number, type?: RelationshipType): Edge[];
18
+ getTargets(entityId: number, type?: RelationshipType): number[];
19
+ hasAnyEdges(entityId: number): boolean;
20
+ }
21
+ export interface RelationshipGraph {
22
+ forward: RelationshipEdges;
23
+ inverse: RelationshipEdges;
24
+ getRelated(entityId: number, relType: RelationshipType, direction: 'forward' | 'inverse'): number[];
25
+ hasRelationship(sourceId: number, targetId: number, relType?: RelationshipType): boolean;
26
+ getRelationshipsBetween(sourceId: number, targetId: number): RelationshipInfo[];
27
+ }
28
+ export interface RelationshipInfo {
29
+ relationshipId: number;
30
+ type: RelationshipType;
31
+ typeName: string;
32
+ }
33
+ export declare class RelationshipGraphBuilder {
34
+ private edges;
35
+ addEdge(source: number, target: number, type: RelationshipType, relId: number): void;
36
+ build(): RelationshipGraph;
37
+ private buildEdges;
38
+ }
39
+ //# sourceMappingURL=relationship-graph.d.ts.map
@@ -0,0 +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;AAE9C,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;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;IAExB,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;CAClB;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,KAAK,CAAwF;IAErG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIpF,KAAK,IAAI,iBAAiB;IAqC1B,OAAO,CAAC,UAAU;CAgEnB"}
@@ -0,0 +1,115 @@
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
+ * Relationship graph - bidirectional graph using CSR format
6
+ * Enables fast traversal in both directions
7
+ */
8
+ import { RelationshipType } from './types.js';
9
+ export class RelationshipGraphBuilder {
10
+ edges = [];
11
+ addEdge(source, target, type, relId) {
12
+ this.edges.push({ source, target, type, relId });
13
+ }
14
+ build() {
15
+ // Sort edges by source for forward CSR, by target for inverse CSR
16
+ const forwardEdges = [...this.edges].sort((a, b) => a.source - b.source);
17
+ const inverseEdges = [...this.edges].sort((a, b) => a.target - b.target);
18
+ const forward = this.buildEdges(forwardEdges, 'source', 'target');
19
+ const inverse = this.buildEdges(inverseEdges, 'target', 'source');
20
+ return {
21
+ forward,
22
+ inverse,
23
+ getRelated: (entityId, relType, direction) => {
24
+ const edges = direction === 'forward'
25
+ ? forward.getEdges(entityId, relType)
26
+ : inverse.getEdges(entityId, relType);
27
+ return edges.map((e) => e.target);
28
+ },
29
+ hasRelationship: (sourceId, targetId, relType) => {
30
+ const edges = forward.getEdges(sourceId, relType);
31
+ return edges.some((e) => e.target === targetId);
32
+ },
33
+ getRelationshipsBetween: (sourceId, targetId) => {
34
+ const edges = forward.getEdges(sourceId);
35
+ return edges
36
+ .filter((e) => e.target === targetId)
37
+ .map((e) => ({
38
+ relationshipId: e.relationshipId,
39
+ type: e.type,
40
+ typeName: RelationshipTypeToString(e.type),
41
+ }));
42
+ },
43
+ };
44
+ }
45
+ buildEdges(sortedEdges, keyField, valueField) {
46
+ const offsets = new Map();
47
+ const counts = new Map();
48
+ const edgeTargets = new Uint32Array(sortedEdges.length);
49
+ const edgeTypes = new Uint16Array(sortedEdges.length);
50
+ const edgeRelIds = new Uint32Array(sortedEdges.length);
51
+ let currentKey = -1;
52
+ for (let i = 0; i < sortedEdges.length; i++) {
53
+ const edge = sortedEdges[i];
54
+ const key = edge[keyField];
55
+ if (key !== currentKey) {
56
+ offsets.set(key, i);
57
+ currentKey = key;
58
+ }
59
+ counts.set(key, (counts.get(key) ?? 0) + 1);
60
+ edgeTargets[i] = edge[valueField];
61
+ edgeTypes[i] = edge.type;
62
+ edgeRelIds[i] = edge.relId;
63
+ }
64
+ return {
65
+ offsets,
66
+ counts,
67
+ edgeTargets,
68
+ edgeTypes,
69
+ edgeRelIds,
70
+ getEdges(entityId, type) {
71
+ const offset = offsets.get(entityId);
72
+ if (offset === undefined)
73
+ return [];
74
+ const count = counts.get(entityId);
75
+ const edges = [];
76
+ for (let i = offset; i < offset + count; i++) {
77
+ if (type === undefined || edgeTypes[i] === type) {
78
+ edges.push({
79
+ target: edgeTargets[i],
80
+ type: edgeTypes[i],
81
+ relationshipId: edgeRelIds[i],
82
+ });
83
+ }
84
+ }
85
+ return edges;
86
+ },
87
+ getTargets(entityId, type) {
88
+ return this.getEdges(entityId, type).map(e => e.target);
89
+ },
90
+ hasAnyEdges(entityId) {
91
+ return offsets.has(entityId);
92
+ },
93
+ };
94
+ }
95
+ }
96
+ function RelationshipTypeToString(type) {
97
+ const names = {
98
+ [RelationshipType.ContainsElements]: 'IfcRelContainedInSpatialStructure',
99
+ [RelationshipType.Aggregates]: 'IfcRelAggregates',
100
+ [RelationshipType.DefinesByProperties]: 'IfcRelDefinesByProperties',
101
+ [RelationshipType.DefinesByType]: 'IfcRelDefinesByType',
102
+ [RelationshipType.AssociatesMaterial]: 'IfcRelAssociatesMaterial',
103
+ [RelationshipType.AssociatesClassification]: 'IfcRelAssociatesClassification',
104
+ [RelationshipType.VoidsElement]: 'IfcRelVoidsElement',
105
+ [RelationshipType.FillsElement]: 'IfcRelFillsElement',
106
+ [RelationshipType.ConnectsPathElements]: 'IfcRelConnectsPathElements',
107
+ [RelationshipType.ConnectsElements]: 'IfcRelConnectsElements',
108
+ [RelationshipType.SpaceBoundary]: 'IfcRelSpaceBoundary',
109
+ [RelationshipType.AssignsToGroup]: 'IfcRelAssignsToGroup',
110
+ [RelationshipType.AssignsToProduct]: 'IfcRelAssignsToProduct',
111
+ [RelationshipType.ReferencedInSpatialStructure]: 'ReferencedInSpatialStructure',
112
+ };
113
+ return names[type] || 'Unknown';
114
+ }
115
+ //# sourceMappingURL=relationship-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relationship-graph.js","sourceRoot":"","sources":["../src/relationship-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * String table - deduplicated string storage
3
+ * Reduces memory by storing each unique string once
4
+ */
5
+ export declare class StringTable {
6
+ private strings;
7
+ private index;
8
+ readonly NULL_INDEX = -1;
9
+ get count(): number;
10
+ /**
11
+ * Get string by index
12
+ */
13
+ get(idx: number): string;
14
+ /**
15
+ * Intern string (add if not exists, return index)
16
+ */
17
+ intern(value: string | null | undefined): number;
18
+ /**
19
+ * Check if string exists
20
+ */
21
+ has(value: string): boolean;
22
+ /**
23
+ * Get index of string (returns -1 if not found)
24
+ */
25
+ indexOf(value: string): number;
26
+ /**
27
+ * Get all strings (for debugging/export)
28
+ */
29
+ getAll(): string[];
30
+ }
31
+ //# sourceMappingURL=string-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-table.d.ts","sourceRoot":"","sources":["../src/string-table.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,KAAK,CAA2C;IAExD,QAAQ,CAAC,UAAU,MAAM;IAEzB,IAAI,KAAK,IAAI,MAAM,CAElB;IAED;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAOxB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM;IAgBhD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3B;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI9B;;OAEG;IACH,MAAM,IAAI,MAAM,EAAE;CAGnB"}
@@ -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
+ * String table - deduplicated string storage
6
+ * Reduces memory by storing each unique string once
7
+ */
8
+ export class StringTable {
9
+ strings = [''];
10
+ index = new Map([['', 0]]);
11
+ NULL_INDEX = -1;
12
+ get count() {
13
+ return this.strings.length;
14
+ }
15
+ /**
16
+ * Get string by index
17
+ */
18
+ get(idx) {
19
+ if (idx < 0 || idx >= this.strings.length) {
20
+ return '';
21
+ }
22
+ return this.strings[idx];
23
+ }
24
+ /**
25
+ * Intern string (add if not exists, return index)
26
+ */
27
+ intern(value) {
28
+ if (value === null || value === undefined) {
29
+ return this.NULL_INDEX;
30
+ }
31
+ const existing = this.index.get(value);
32
+ if (existing !== undefined) {
33
+ return existing;
34
+ }
35
+ const newIndex = this.strings.length;
36
+ this.strings.push(value);
37
+ this.index.set(value, newIndex);
38
+ return newIndex;
39
+ }
40
+ /**
41
+ * Check if string exists
42
+ */
43
+ has(value) {
44
+ return this.index.has(value);
45
+ }
46
+ /**
47
+ * Get index of string (returns -1 if not found)
48
+ */
49
+ indexOf(value) {
50
+ return this.index.get(value) ?? -1;
51
+ }
52
+ /**
53
+ * Get all strings (for debugging/export)
54
+ */
55
+ getAll() {
56
+ return [...this.strings];
57
+ }
58
+ }
59
+ //# sourceMappingURL=string-table.js.map