@ifc-lite/mutations 1.4.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,281 @@
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
+ * Bulk Query Engine for mass property updates
6
+ */
7
+ export class BulkQueryEngine {
8
+ entities;
9
+ spatialHierarchy;
10
+ properties;
11
+ mutationView;
12
+ strings;
13
+ constructor(entities, mutationView, spatialHierarchy, properties, strings) {
14
+ this.entities = entities;
15
+ this.mutationView = mutationView;
16
+ this.spatialHierarchy = spatialHierarchy || null;
17
+ this.properties = properties || null;
18
+ this.strings = strings || null;
19
+ }
20
+ /**
21
+ * Select entities matching criteria
22
+ */
23
+ select(criteria) {
24
+ let candidates = this.getAllEntityIds();
25
+ // Filter by entity types
26
+ if (criteria.entityTypes && criteria.entityTypes.length > 0) {
27
+ const typeSet = new Set(criteria.entityTypes);
28
+ candidates = candidates.filter((id) => {
29
+ const idx = this.findEntityIndex(id);
30
+ return idx !== -1 && typeSet.has(this.entities.typeEnum[idx]);
31
+ });
32
+ }
33
+ // Filter by storeys
34
+ if (criteria.storeys && criteria.storeys.length > 0 && this.spatialHierarchy) {
35
+ const storeySet = new Set(criteria.storeys);
36
+ const storeyElements = new Set();
37
+ for (const storeyId of storeySet) {
38
+ const elements = this.spatialHierarchy.byStorey.get(storeyId);
39
+ if (elements) {
40
+ for (const el of elements) {
41
+ storeyElements.add(el);
42
+ }
43
+ }
44
+ }
45
+ candidates = candidates.filter((id) => storeyElements.has(id));
46
+ }
47
+ // Filter by buildings
48
+ if (criteria.buildings && criteria.buildings.length > 0 && this.spatialHierarchy) {
49
+ const buildingSet = new Set(criteria.buildings);
50
+ const buildingElements = new Set();
51
+ for (const buildingId of buildingSet) {
52
+ const elements = this.spatialHierarchy.byBuilding.get(buildingId);
53
+ if (elements) {
54
+ for (const el of elements) {
55
+ buildingElements.add(el);
56
+ }
57
+ }
58
+ }
59
+ candidates = candidates.filter((id) => buildingElements.has(id));
60
+ }
61
+ // Filter by spaces
62
+ if (criteria.spaces && criteria.spaces.length > 0 && this.spatialHierarchy) {
63
+ const spaceSet = new Set(criteria.spaces);
64
+ const spaceElements = new Set();
65
+ for (const spaceId of spaceSet) {
66
+ const elements = this.spatialHierarchy.bySpace.get(spaceId);
67
+ if (elements) {
68
+ for (const el of elements) {
69
+ spaceElements.add(el);
70
+ }
71
+ }
72
+ }
73
+ candidates = candidates.filter((id) => spaceElements.has(id));
74
+ }
75
+ // Filter by express IDs (direct selection)
76
+ if (criteria.expressIds && criteria.expressIds.length > 0) {
77
+ const idSet = new Set(criteria.expressIds);
78
+ candidates = candidates.filter((id) => idSet.has(id));
79
+ }
80
+ // Filter by global IDs
81
+ if (criteria.globalIds && criteria.globalIds.length > 0 && this.strings) {
82
+ const globalIdSet = new Set(criteria.globalIds);
83
+ candidates = candidates.filter((id) => {
84
+ const idx = this.findEntityIndex(id);
85
+ if (idx === -1)
86
+ return false;
87
+ const globalIdIdx = this.entities.globalId[idx];
88
+ const globalId = this.strings.get(globalIdIdx);
89
+ return globalIdSet.has(globalId);
90
+ });
91
+ }
92
+ // Filter by name pattern
93
+ if (criteria.namePattern && this.strings) {
94
+ const regex = new RegExp(criteria.namePattern, 'i');
95
+ candidates = candidates.filter((id) => {
96
+ const idx = this.findEntityIndex(id);
97
+ if (idx === -1)
98
+ return false;
99
+ const nameIdx = this.entities.name[idx];
100
+ const name = this.strings.get(nameIdx);
101
+ return regex.test(name);
102
+ });
103
+ }
104
+ // Filter by property conditions
105
+ if (criteria.propertyFilters && criteria.propertyFilters.length > 0) {
106
+ for (const filter of criteria.propertyFilters) {
107
+ candidates = this.filterByProperty(candidates, filter);
108
+ }
109
+ }
110
+ return candidates;
111
+ }
112
+ /**
113
+ * Preview a bulk query without executing
114
+ */
115
+ preview(query) {
116
+ const matchedEntityIds = this.select(query.select);
117
+ return {
118
+ matchedEntityIds,
119
+ matchedCount: matchedEntityIds.length,
120
+ estimatedMutations: matchedEntityIds.length,
121
+ };
122
+ }
123
+ /**
124
+ * Execute a bulk query
125
+ */
126
+ execute(query) {
127
+ const entityIds = this.select(query.select);
128
+ const mutations = [];
129
+ const errors = [];
130
+ for (const entityId of entityIds) {
131
+ try {
132
+ const mutation = this.applyAction(entityId, query.action);
133
+ if (mutation) {
134
+ mutations.push(mutation);
135
+ }
136
+ }
137
+ catch (error) {
138
+ errors.push(`Entity ${entityId}: ${error instanceof Error ? error.message : 'Unknown error'}`);
139
+ }
140
+ }
141
+ return {
142
+ mutations,
143
+ affectedEntityCount: mutations.length,
144
+ success: errors.length === 0,
145
+ errors: errors.length > 0 ? errors : undefined,
146
+ };
147
+ }
148
+ /**
149
+ * Apply an action to a single entity
150
+ */
151
+ applyAction(entityId, action) {
152
+ switch (action.type) {
153
+ case 'SET_PROPERTY':
154
+ return this.mutationView.setProperty(entityId, action.psetName, action.propName, action.value, action.valueType);
155
+ case 'DELETE_PROPERTY':
156
+ return this.mutationView.deleteProperty(entityId, action.psetName, action.propName);
157
+ case 'SET_ATTRIBUTE':
158
+ // Attribute mutations would need to be implemented
159
+ // For now, we'll skip these
160
+ return null;
161
+ default:
162
+ return null;
163
+ }
164
+ }
165
+ /**
166
+ * Filter candidates by property condition
167
+ */
168
+ filterByProperty(candidates, filter) {
169
+ return candidates.filter((entityId) => {
170
+ // Get property value from mutation view (includes mutations)
171
+ const value = filter.psetName
172
+ ? this.mutationView.getPropertyValue(entityId, filter.psetName, filter.propName)
173
+ : this.findPropertyByName(entityId, filter.propName);
174
+ return this.matchesFilter(value, filter);
175
+ });
176
+ }
177
+ /**
178
+ * Find a property by name across all property sets
179
+ */
180
+ findPropertyByName(entityId, propName) {
181
+ if (!this.properties)
182
+ return null;
183
+ const psets = this.properties.getForEntity(entityId);
184
+ for (const pset of psets) {
185
+ for (const prop of pset.properties) {
186
+ if (prop.name === propName) {
187
+ return prop.value;
188
+ }
189
+ }
190
+ }
191
+ return null;
192
+ }
193
+ /**
194
+ * Check if a value matches a filter condition
195
+ */
196
+ matchesFilter(value, filter) {
197
+ // Handle null checks
198
+ if (filter.operator === 'IS_NULL') {
199
+ return value === null || value === undefined;
200
+ }
201
+ if (filter.operator === 'IS_NOT_NULL') {
202
+ return value !== null && value !== undefined;
203
+ }
204
+ // For other operators, null values don't match
205
+ if (value === null || value === undefined) {
206
+ return false;
207
+ }
208
+ const filterValue = filter.value;
209
+ // String operations
210
+ if (typeof value === 'string' && typeof filterValue === 'string') {
211
+ switch (filter.operator) {
212
+ case '=':
213
+ return value === filterValue;
214
+ case '!=':
215
+ return value !== filterValue;
216
+ case 'CONTAINS':
217
+ return value.toLowerCase().includes(filterValue.toLowerCase());
218
+ case 'STARTS_WITH':
219
+ return value.toLowerCase().startsWith(filterValue.toLowerCase());
220
+ case 'ENDS_WITH':
221
+ return value.toLowerCase().endsWith(filterValue.toLowerCase());
222
+ default:
223
+ return false;
224
+ }
225
+ }
226
+ // Numeric operations
227
+ if (typeof value === 'number' && typeof filterValue === 'number') {
228
+ switch (filter.operator) {
229
+ case '=':
230
+ return value === filterValue;
231
+ case '!=':
232
+ return value !== filterValue;
233
+ case '>':
234
+ return value > filterValue;
235
+ case '<':
236
+ return value < filterValue;
237
+ case '>=':
238
+ return value >= filterValue;
239
+ case '<=':
240
+ return value <= filterValue;
241
+ default:
242
+ return false;
243
+ }
244
+ }
245
+ // Boolean operations
246
+ if (typeof value === 'boolean') {
247
+ const boolFilterValue = filterValue === true || filterValue === 'true';
248
+ switch (filter.operator) {
249
+ case '=':
250
+ return value === boolFilterValue;
251
+ case '!=':
252
+ return value !== boolFilterValue;
253
+ default:
254
+ return false;
255
+ }
256
+ }
257
+ return false;
258
+ }
259
+ /**
260
+ * Get all entity IDs
261
+ */
262
+ getAllEntityIds() {
263
+ const ids = [];
264
+ for (let i = 0; i < this.entities.count; i++) {
265
+ ids.push(this.entities.expressId[i]);
266
+ }
267
+ return ids;
268
+ }
269
+ /**
270
+ * Find the index of an entity by ID
271
+ */
272
+ findEntityIndex(expressId) {
273
+ for (let i = 0; i < this.entities.count; i++) {
274
+ if (this.entities.expressId[i] === expressId) {
275
+ return i;
276
+ }
277
+ }
278
+ return -1;
279
+ }
280
+ }
281
+ //# sourceMappingURL=bulk-query-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-query-engine.js","sourceRoot":"","sources":["../src/bulk-query-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Change set management for IFC mutations
3
+ */
4
+ import type { ChangeSet, Mutation } from './types.js';
5
+ /**
6
+ * Manages collections of mutations as named change sets
7
+ */
8
+ export declare class ChangeSetManager {
9
+ private changeSets;
10
+ private activeChangeSetId;
11
+ /**
12
+ * Create a new change set
13
+ */
14
+ createChangeSet(name: string): ChangeSet;
15
+ /**
16
+ * Get the active change set
17
+ */
18
+ getActiveChangeSet(): ChangeSet | null;
19
+ /**
20
+ * Set the active change set
21
+ */
22
+ setActiveChangeSet(id: string | null): void;
23
+ /**
24
+ * Add a mutation to the active change set
25
+ */
26
+ addMutation(mutation: Mutation): void;
27
+ /**
28
+ * Get a change set by ID
29
+ */
30
+ getChangeSet(id: string): ChangeSet | null;
31
+ /**
32
+ * Get all change sets
33
+ */
34
+ getAllChangeSets(): ChangeSet[];
35
+ /**
36
+ * Delete a change set
37
+ */
38
+ deleteChangeSet(id: string): boolean;
39
+ /**
40
+ * Rename a change set
41
+ */
42
+ renameChangeSet(id: string, newName: string): void;
43
+ /**
44
+ * Mark a change set as applied
45
+ */
46
+ markApplied(id: string): void;
47
+ /**
48
+ * Merge multiple change sets into one
49
+ */
50
+ mergeChangeSets(ids: string[], newName: string): ChangeSet;
51
+ /**
52
+ * Export a change set as JSON
53
+ */
54
+ exportChangeSet(id: string): string;
55
+ /**
56
+ * Import a change set from JSON
57
+ */
58
+ importChangeSet(json: string): ChangeSet;
59
+ /**
60
+ * Get statistics about all change sets
61
+ */
62
+ getStatistics(): {
63
+ totalChangeSets: number;
64
+ totalMutations: number;
65
+ affectedEntities: number;
66
+ affectedModels: number;
67
+ };
68
+ /**
69
+ * Clear all change sets
70
+ */
71
+ clear(): void;
72
+ }
73
+ //# sourceMappingURL=change-set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-set.d.ts","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtD;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,iBAAiB,CAAuB;IAEhD;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAexC;;OAEG;IACH,kBAAkB,IAAI,SAAS,GAAG,IAAI;IAKtC;;OAEG;IACH,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAO3C;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAWrC;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAI1C;;OAEG;IACH,gBAAgB,IAAI,SAAS,EAAE;IAI/B;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAOpC;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAOlD;;OAEG;IACH,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAO7B;;OAEG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS;IAyB1D;;OAEG;IACH,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;IAanC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAiBxC;;OAEG;IACH,aAAa,IAAI;QACf,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;QACvB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;KACxB;IAqBD;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}
@@ -0,0 +1,178 @@
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 { generateChangeSetId } from './types.js';
5
+ /**
6
+ * Manages collections of mutations as named change sets
7
+ */
8
+ export class ChangeSetManager {
9
+ changeSets = new Map();
10
+ activeChangeSetId = null;
11
+ /**
12
+ * Create a new change set
13
+ */
14
+ createChangeSet(name) {
15
+ const changeSet = {
16
+ id: generateChangeSetId(),
17
+ name,
18
+ createdAt: Date.now(),
19
+ mutations: [],
20
+ applied: false,
21
+ };
22
+ this.changeSets.set(changeSet.id, changeSet);
23
+ this.activeChangeSetId = changeSet.id;
24
+ return changeSet;
25
+ }
26
+ /**
27
+ * Get the active change set
28
+ */
29
+ getActiveChangeSet() {
30
+ if (!this.activeChangeSetId)
31
+ return null;
32
+ return this.changeSets.get(this.activeChangeSetId) || null;
33
+ }
34
+ /**
35
+ * Set the active change set
36
+ */
37
+ setActiveChangeSet(id) {
38
+ if (id && !this.changeSets.has(id)) {
39
+ throw new Error(`Change set ${id} not found`);
40
+ }
41
+ this.activeChangeSetId = id;
42
+ }
43
+ /**
44
+ * Add a mutation to the active change set
45
+ */
46
+ addMutation(mutation) {
47
+ const changeSet = this.getActiveChangeSet();
48
+ if (!changeSet) {
49
+ // Auto-create a default change set
50
+ const newChangeSet = this.createChangeSet('Unsaved Changes');
51
+ newChangeSet.mutations.push(mutation);
52
+ }
53
+ else {
54
+ changeSet.mutations.push(mutation);
55
+ }
56
+ }
57
+ /**
58
+ * Get a change set by ID
59
+ */
60
+ getChangeSet(id) {
61
+ return this.changeSets.get(id) || null;
62
+ }
63
+ /**
64
+ * Get all change sets
65
+ */
66
+ getAllChangeSets() {
67
+ return Array.from(this.changeSets.values());
68
+ }
69
+ /**
70
+ * Delete a change set
71
+ */
72
+ deleteChangeSet(id) {
73
+ if (this.activeChangeSetId === id) {
74
+ this.activeChangeSetId = null;
75
+ }
76
+ return this.changeSets.delete(id);
77
+ }
78
+ /**
79
+ * Rename a change set
80
+ */
81
+ renameChangeSet(id, newName) {
82
+ const changeSet = this.changeSets.get(id);
83
+ if (changeSet) {
84
+ changeSet.name = newName;
85
+ }
86
+ }
87
+ /**
88
+ * Mark a change set as applied
89
+ */
90
+ markApplied(id) {
91
+ const changeSet = this.changeSets.get(id);
92
+ if (changeSet) {
93
+ changeSet.applied = true;
94
+ }
95
+ }
96
+ /**
97
+ * Merge multiple change sets into one
98
+ */
99
+ mergeChangeSets(ids, newName) {
100
+ const mutations = [];
101
+ for (const id of ids) {
102
+ const changeSet = this.changeSets.get(id);
103
+ if (changeSet) {
104
+ mutations.push(...changeSet.mutations);
105
+ }
106
+ }
107
+ // Sort by timestamp
108
+ mutations.sort((a, b) => a.timestamp - b.timestamp);
109
+ const merged = {
110
+ id: generateChangeSetId(),
111
+ name: newName,
112
+ createdAt: Date.now(),
113
+ mutations,
114
+ applied: false,
115
+ };
116
+ this.changeSets.set(merged.id, merged);
117
+ return merged;
118
+ }
119
+ /**
120
+ * Export a change set as JSON
121
+ */
122
+ exportChangeSet(id) {
123
+ const changeSet = this.changeSets.get(id);
124
+ if (!changeSet) {
125
+ throw new Error(`Change set ${id} not found`);
126
+ }
127
+ return JSON.stringify({
128
+ version: 1,
129
+ changeSet,
130
+ exportedAt: Date.now(),
131
+ }, null, 2);
132
+ }
133
+ /**
134
+ * Import a change set from JSON
135
+ */
136
+ importChangeSet(json) {
137
+ const data = JSON.parse(json);
138
+ if (!data.changeSet) {
139
+ throw new Error('Invalid change set format');
140
+ }
141
+ const changeSet = {
142
+ ...data.changeSet,
143
+ id: generateChangeSetId(), // Generate new ID to avoid conflicts
144
+ applied: false,
145
+ };
146
+ this.changeSets.set(changeSet.id, changeSet);
147
+ return changeSet;
148
+ }
149
+ /**
150
+ * Get statistics about all change sets
151
+ */
152
+ getStatistics() {
153
+ const entities = new Set();
154
+ const models = new Set();
155
+ let totalMutations = 0;
156
+ for (const changeSet of this.changeSets.values()) {
157
+ totalMutations += changeSet.mutations.length;
158
+ for (const mutation of changeSet.mutations) {
159
+ entities.add(`${mutation.modelId}:${mutation.entityId}`);
160
+ models.add(mutation.modelId);
161
+ }
162
+ }
163
+ return {
164
+ totalChangeSets: this.changeSets.size,
165
+ totalMutations,
166
+ affectedEntities: entities.size,
167
+ affectedModels: models.size,
168
+ };
169
+ }
170
+ /**
171
+ * Clear all change sets
172
+ */
173
+ clear() {
174
+ this.changeSets.clear();
175
+ this.activeChangeSetId = null;
176
+ }
177
+ }
178
+ //# sourceMappingURL=change-set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-set.js","sourceRoot":"","sources":["../src/change-set.ts"],"names":[],"mappings":"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"}