@ifc-lite/query 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.
- package/LICENSE +373 -0
- package/dist/parser/src/classification-extractor.d.ts +73 -0
- package/dist/parser/src/classification-extractor.d.ts.map +1 -0
- package/dist/parser/src/classification-extractor.js +218 -0
- package/dist/parser/src/classification-extractor.js.map +1 -0
- package/dist/parser/src/columnar-parser.d.ts +43 -0
- package/dist/parser/src/columnar-parser.d.ts.map +1 -0
- package/dist/parser/src/columnar-parser.js +226 -0
- package/dist/parser/src/columnar-parser.js.map +1 -0
- package/dist/parser/src/entity-extractor.d.ts +15 -0
- package/dist/parser/src/entity-extractor.d.ts.map +1 -0
- package/dist/parser/src/entity-extractor.js +144 -0
- package/dist/parser/src/entity-extractor.js.map +1 -0
- package/dist/parser/src/entity-index.d.ts +11 -0
- package/dist/parser/src/entity-index.d.ts.map +1 -0
- package/dist/parser/src/entity-index.js +24 -0
- package/dist/parser/src/entity-index.js.map +1 -0
- package/dist/parser/src/generated/entities.d.ts +6198 -0
- package/dist/parser/src/generated/entities.d.ts.map +1 -0
- package/dist/parser/src/generated/entities.js +5 -0
- package/dist/parser/src/generated/entities.js.map +1 -0
- package/dist/parser/src/generated/enums.d.ts +2260 -0
- package/dist/parser/src/generated/enums.d.ts.map +1 -0
- package/dist/parser/src/generated/enums.js +2470 -0
- package/dist/parser/src/generated/enums.js.map +1 -0
- package/dist/parser/src/generated/schema-registry.d.ts +50 -0
- package/dist/parser/src/generated/schema-registry.d.ts.map +1 -0
- package/dist/parser/src/generated/schema-registry.js +60518 -0
- package/dist/parser/src/generated/schema-registry.js.map +1 -0
- package/dist/parser/src/georef-extractor.d.ts +60 -0
- package/dist/parser/src/georef-extractor.d.ts.map +1 -0
- package/dist/parser/src/georef-extractor.js +200 -0
- package/dist/parser/src/georef-extractor.js.map +1 -0
- package/dist/parser/src/ifc-schema.d.ts +13 -0
- package/dist/parser/src/ifc-schema.d.ts.map +1 -0
- package/dist/parser/src/ifc-schema.js +203 -0
- package/dist/parser/src/ifc-schema.js.map +1 -0
- package/dist/parser/src/index.d.ts +43 -0
- package/dist/parser/src/index.d.ts.map +1 -0
- package/dist/parser/src/index.js +150 -0
- package/dist/parser/src/index.js.map +1 -0
- package/dist/parser/src/material-extractor.d.ts +97 -0
- package/dist/parser/src/material-extractor.d.ts.map +1 -0
- package/dist/parser/src/material-extractor.js +283 -0
- package/dist/parser/src/material-extractor.js.map +1 -0
- package/dist/parser/src/property-extractor.d.ts +23 -0
- package/dist/parser/src/property-extractor.d.ts.map +1 -0
- package/dist/parser/src/property-extractor.js +102 -0
- package/dist/parser/src/property-extractor.js.map +1 -0
- package/dist/parser/src/quantity-extractor.d.ts +64 -0
- package/dist/parser/src/quantity-extractor.d.ts.map +1 -0
- package/dist/parser/src/quantity-extractor.js +202 -0
- package/dist/parser/src/quantity-extractor.js.map +1 -0
- package/dist/parser/src/relationship-extractor.d.ts +18 -0
- package/dist/parser/src/relationship-extractor.d.ts.map +1 -0
- package/dist/parser/src/relationship-extractor.js +91 -0
- package/dist/parser/src/relationship-extractor.js.map +1 -0
- package/dist/parser/src/spatial-hierarchy-builder.d.ts +21 -0
- package/dist/parser/src/spatial-hierarchy-builder.d.ts.map +1 -0
- package/dist/parser/src/spatial-hierarchy-builder.js +201 -0
- package/dist/parser/src/spatial-hierarchy-builder.js.map +1 -0
- package/dist/parser/src/style-extractor.d.ts +83 -0
- package/dist/parser/src/style-extractor.d.ts.map +1 -0
- package/dist/parser/src/style-extractor.js +327 -0
- package/dist/parser/src/style-extractor.js.map +1 -0
- package/dist/parser/src/tokenizer.d.ts +26 -0
- package/dist/parser/src/tokenizer.d.ts.map +1 -0
- package/dist/parser/src/tokenizer.js +181 -0
- package/dist/parser/src/tokenizer.js.map +1 -0
- package/dist/parser/src/types.d.ts +42 -0
- package/dist/parser/src/types.d.ts.map +1 -0
- package/dist/parser/src/types.js +5 -0
- package/dist/parser/src/types.js.map +1 -0
- package/dist/query/src/duckdb-integration.d.ts +59 -0
- package/dist/query/src/duckdb-integration.d.ts.map +1 -0
- package/dist/query/src/duckdb-integration.js +380 -0
- package/dist/query/src/duckdb-integration.js.map +1 -0
- package/dist/query/src/entity-node.d.ts +30 -0
- package/dist/query/src/entity-node.d.ts.map +1 -0
- package/dist/query/src/entity-node.js +114 -0
- package/dist/query/src/entity-node.js.map +1 -0
- package/dist/query/src/entity-query.d.ts +31 -0
- package/dist/query/src/entity-query.d.ts.map +1 -0
- package/dist/query/src/entity-query.js +129 -0
- package/dist/query/src/entity-query.js.map +1 -0
- package/dist/query/src/entity-table.d.ts +26 -0
- package/dist/query/src/entity-table.d.ts.map +1 -0
- package/dist/query/src/entity-table.js +37 -0
- package/dist/query/src/entity-table.js.map +1 -0
- package/dist/query/src/fluent-api.d.ts +45 -0
- package/dist/query/src/fluent-api.d.ts.map +1 -0
- package/dist/query/src/fluent-api.js +81 -0
- package/dist/query/src/fluent-api.js.map +1 -0
- package/dist/query/src/ifc-query.d.ts +34 -0
- package/dist/query/src/ifc-query.d.ts.map +1 -0
- package/dist/query/src/ifc-query.js +117 -0
- package/dist/query/src/ifc-query.js.map +1 -0
- package/dist/query/src/index.d.ts +12 -0
- package/dist/query/src/index.d.ts.map +1 -0
- package/dist/query/src/index.js +15 -0
- package/dist/query/src/index.js.map +1 -0
- package/dist/query/src/property-table.d.ts +30 -0
- package/dist/query/src/property-table.d.ts.map +1 -0
- package/dist/query/src/property-table.js +79 -0
- package/dist/query/src/property-table.js.map +1 -0
- package/dist/query/src/query-result-entity.d.ts +33 -0
- package/dist/query/src/query-result-entity.d.ts.map +1 -0
- package/dist/query/src/query-result-entity.js +84 -0
- package/dist/query/src/query-result-entity.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,380 @@
|
|
|
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 { IfcTypeEnumToString, PropertyValueType, QuantityType, RelationshipType } from '@ifc-lite/data';
|
|
5
|
+
export class DuckDBIntegration {
|
|
6
|
+
db = null;
|
|
7
|
+
conn = null;
|
|
8
|
+
initPromise = null;
|
|
9
|
+
initialized = false;
|
|
10
|
+
/**
|
|
11
|
+
* Initialize DuckDB (lazy-loaded)
|
|
12
|
+
*/
|
|
13
|
+
async init(store) {
|
|
14
|
+
if (this.initialized)
|
|
15
|
+
return;
|
|
16
|
+
if (this.initPromise)
|
|
17
|
+
return this.initPromise;
|
|
18
|
+
this.initPromise = (async () => {
|
|
19
|
+
try {
|
|
20
|
+
// Dynamic import using Function constructor to prevent Vite static analysis
|
|
21
|
+
// DuckDB is optional - this will fail gracefully if not installed
|
|
22
|
+
// @ts-ignore - DuckDB is optional dependency
|
|
23
|
+
const duckdb = await new Function('return import("@duckdb/duckdb-wasm")')();
|
|
24
|
+
// @ts-ignore
|
|
25
|
+
const bundle = await duckdb.selectBundle(duckdb.getJsDelivrBundles());
|
|
26
|
+
const worker = new Worker(bundle.mainWorker);
|
|
27
|
+
// @ts-ignore
|
|
28
|
+
this.db = new duckdb.AsyncDuckDB(new duckdb.ConsoleLogger(), worker);
|
|
29
|
+
await this.db.instantiate(bundle.mainModule, bundle.pthreadWorker);
|
|
30
|
+
this.conn = await this.db.connect();
|
|
31
|
+
await this.registerTables(store);
|
|
32
|
+
await this.createViews();
|
|
33
|
+
this.initialized = true;
|
|
34
|
+
console.log('[DuckDB] Initialization complete');
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
throw new Error(`Failed to initialize DuckDB: ${error}`);
|
|
38
|
+
}
|
|
39
|
+
})();
|
|
40
|
+
return this.initPromise;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Execute SQL query
|
|
44
|
+
*/
|
|
45
|
+
async query(sql) {
|
|
46
|
+
if (!this.initialized) {
|
|
47
|
+
throw new Error('DuckDB not initialized. Call init() first.');
|
|
48
|
+
}
|
|
49
|
+
const result = await this.conn.query(sql);
|
|
50
|
+
const rows = result.toArray();
|
|
51
|
+
return {
|
|
52
|
+
columns: result.schema.fields.map((f) => f.name),
|
|
53
|
+
rows: rows,
|
|
54
|
+
toArray: () => rows,
|
|
55
|
+
toJSON: () => rows.map((row) => {
|
|
56
|
+
const obj = {};
|
|
57
|
+
result.schema.fields.forEach((field, i) => {
|
|
58
|
+
// Handle DuckDB row format (could be array or object)
|
|
59
|
+
obj[field.name] = Array.isArray(row) ? row[i] : row[field.name];
|
|
60
|
+
});
|
|
61
|
+
return obj;
|
|
62
|
+
}),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Register tables from columnar store using SQL INSERT statements
|
|
67
|
+
* This approach works without Arrow dependencies and is more portable
|
|
68
|
+
*/
|
|
69
|
+
async registerTables(store) {
|
|
70
|
+
console.log('[DuckDB] Registering tables from store with', store.entities.count, 'entities');
|
|
71
|
+
// Create and populate entities table
|
|
72
|
+
await this.createEntitiesTable(store);
|
|
73
|
+
// Create and populate properties table
|
|
74
|
+
await this.createPropertiesTable(store);
|
|
75
|
+
// Create and populate quantities table
|
|
76
|
+
await this.createQuantitiesTable(store);
|
|
77
|
+
// Create and populate relationships table
|
|
78
|
+
await this.createRelationshipsTable(store);
|
|
79
|
+
console.log('[DuckDB] All tables registered successfully');
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Create and populate entities table
|
|
83
|
+
*/
|
|
84
|
+
async createEntitiesTable(store) {
|
|
85
|
+
// Create table
|
|
86
|
+
await this.conn.query(`
|
|
87
|
+
CREATE TABLE entities (
|
|
88
|
+
express_id INTEGER PRIMARY KEY,
|
|
89
|
+
global_id VARCHAR,
|
|
90
|
+
name VARCHAR,
|
|
91
|
+
description VARCHAR,
|
|
92
|
+
type VARCHAR,
|
|
93
|
+
object_type VARCHAR,
|
|
94
|
+
has_geometry BOOLEAN,
|
|
95
|
+
is_type BOOLEAN,
|
|
96
|
+
contained_in_storey INTEGER,
|
|
97
|
+
defined_by_type INTEGER
|
|
98
|
+
)
|
|
99
|
+
`);
|
|
100
|
+
const { entities, strings } = store;
|
|
101
|
+
const batchSize = 1000;
|
|
102
|
+
// Insert in batches for performance
|
|
103
|
+
for (let i = 0; i < entities.count; i += batchSize) {
|
|
104
|
+
const end = Math.min(i + batchSize, entities.count);
|
|
105
|
+
const values = [];
|
|
106
|
+
for (let j = i; j < end; j++) {
|
|
107
|
+
const expressId = entities.expressId[j];
|
|
108
|
+
const globalId = escapeSQL(strings.get(entities.globalId[j]));
|
|
109
|
+
const name = escapeSQL(strings.get(entities.name[j]));
|
|
110
|
+
const description = escapeSQL(strings.get(entities.description[j]));
|
|
111
|
+
const type = escapeSQL(IfcTypeEnumToString(entities.typeEnum[j]));
|
|
112
|
+
const objectType = escapeSQL(strings.get(entities.objectType[j]));
|
|
113
|
+
const hasGeometry = (entities.flags[j] & 1) !== 0;
|
|
114
|
+
const isType = (entities.flags[j] & 2) !== 0;
|
|
115
|
+
const containedInStorey = entities.containedInStorey[j] || 'NULL';
|
|
116
|
+
const definedByType = entities.definedByType[j] || 'NULL';
|
|
117
|
+
values.push(`(${expressId}, '${globalId}', '${name}', '${description}', '${type}', '${objectType}', ${hasGeometry}, ${isType}, ${containedInStorey}, ${definedByType})`);
|
|
118
|
+
}
|
|
119
|
+
if (values.length > 0) {
|
|
120
|
+
await this.conn.query(`INSERT INTO entities VALUES ${values.join(', ')}`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
console.log(`[DuckDB] Registered entities table with ${entities.count} rows`);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Create and populate properties table
|
|
127
|
+
*/
|
|
128
|
+
async createPropertiesTable(store) {
|
|
129
|
+
await this.conn.query(`
|
|
130
|
+
CREATE TABLE properties (
|
|
131
|
+
entity_id INTEGER,
|
|
132
|
+
pset_name VARCHAR,
|
|
133
|
+
pset_global_id VARCHAR,
|
|
134
|
+
prop_name VARCHAR,
|
|
135
|
+
prop_type VARCHAR,
|
|
136
|
+
value_string VARCHAR,
|
|
137
|
+
value_real DOUBLE,
|
|
138
|
+
value_int INTEGER,
|
|
139
|
+
value_bool BOOLEAN
|
|
140
|
+
)
|
|
141
|
+
`);
|
|
142
|
+
const { properties, strings } = store;
|
|
143
|
+
const batchSize = 1000;
|
|
144
|
+
const propTypeNames = {
|
|
145
|
+
[PropertyValueType.String]: 'String',
|
|
146
|
+
[PropertyValueType.Real]: 'Real',
|
|
147
|
+
[PropertyValueType.Integer]: 'Integer',
|
|
148
|
+
[PropertyValueType.Boolean]: 'Boolean',
|
|
149
|
+
[PropertyValueType.Logical]: 'Logical',
|
|
150
|
+
[PropertyValueType.Label]: 'Label',
|
|
151
|
+
[PropertyValueType.Identifier]: 'Identifier',
|
|
152
|
+
[PropertyValueType.Text]: 'Text',
|
|
153
|
+
[PropertyValueType.Enum]: 'Enum',
|
|
154
|
+
[PropertyValueType.Reference]: 'Reference',
|
|
155
|
+
[PropertyValueType.List]: 'List',
|
|
156
|
+
};
|
|
157
|
+
for (let i = 0; i < properties.count; i += batchSize) {
|
|
158
|
+
const end = Math.min(i + batchSize, properties.count);
|
|
159
|
+
const values = [];
|
|
160
|
+
for (let j = i; j < end; j++) {
|
|
161
|
+
const entityId = properties.entityId[j];
|
|
162
|
+
const psetName = escapeSQL(strings.get(properties.psetName[j]));
|
|
163
|
+
const psetGlobalId = escapeSQL(strings.get(properties.psetGlobalId[j]));
|
|
164
|
+
const propName = escapeSQL(strings.get(properties.propName[j]));
|
|
165
|
+
const propType = propTypeNames[properties.propType[j]] || 'Unknown';
|
|
166
|
+
const valueStringIdx = properties.valueString[j];
|
|
167
|
+
const valueString = valueStringIdx >= 0 ? escapeSQL(strings.get(valueStringIdx)) : '';
|
|
168
|
+
const valueReal = isNaN(properties.valueReal[j]) ? 'NULL' : properties.valueReal[j];
|
|
169
|
+
const valueInt = properties.valueInt[j];
|
|
170
|
+
const valueBoolRaw = properties.valueBool[j];
|
|
171
|
+
const valueBool = valueBoolRaw === 255 ? 'NULL' : valueBoolRaw === 1 ? 'true' : 'false';
|
|
172
|
+
values.push(`(${entityId}, '${psetName}', '${psetGlobalId}', '${propName}', '${propType}', '${valueString}', ${valueReal}, ${valueInt}, ${valueBool})`);
|
|
173
|
+
}
|
|
174
|
+
if (values.length > 0) {
|
|
175
|
+
await this.conn.query(`INSERT INTO properties VALUES ${values.join(', ')}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
console.log(`[DuckDB] Registered properties table with ${properties.count} rows`);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Create and populate quantities table
|
|
182
|
+
*/
|
|
183
|
+
async createQuantitiesTable(store) {
|
|
184
|
+
await this.conn.query(`
|
|
185
|
+
CREATE TABLE quantities (
|
|
186
|
+
entity_id INTEGER,
|
|
187
|
+
qset_name VARCHAR,
|
|
188
|
+
quantity_name VARCHAR,
|
|
189
|
+
quantity_type VARCHAR,
|
|
190
|
+
value DOUBLE,
|
|
191
|
+
formula VARCHAR
|
|
192
|
+
)
|
|
193
|
+
`);
|
|
194
|
+
const { quantities, strings } = store;
|
|
195
|
+
const batchSize = 1000;
|
|
196
|
+
const quantTypeNames = {
|
|
197
|
+
[QuantityType.Length]: 'Length',
|
|
198
|
+
[QuantityType.Area]: 'Area',
|
|
199
|
+
[QuantityType.Volume]: 'Volume',
|
|
200
|
+
[QuantityType.Count]: 'Count',
|
|
201
|
+
[QuantityType.Weight]: 'Weight',
|
|
202
|
+
[QuantityType.Time]: 'Time',
|
|
203
|
+
};
|
|
204
|
+
for (let i = 0; i < quantities.count; i += batchSize) {
|
|
205
|
+
const end = Math.min(i + batchSize, quantities.count);
|
|
206
|
+
const values = [];
|
|
207
|
+
for (let j = i; j < end; j++) {
|
|
208
|
+
const entityId = quantities.entityId[j];
|
|
209
|
+
const qsetName = escapeSQL(strings.get(quantities.qsetName[j]));
|
|
210
|
+
const quantityName = escapeSQL(strings.get(quantities.quantityName[j]));
|
|
211
|
+
const quantityType = quantTypeNames[quantities.quantityType[j]] || 'Unknown';
|
|
212
|
+
const value = quantities.value[j];
|
|
213
|
+
const formulaIdx = quantities.formula[j];
|
|
214
|
+
const formula = formulaIdx > 0 ? escapeSQL(strings.get(formulaIdx)) : '';
|
|
215
|
+
values.push(`(${entityId}, '${qsetName}', '${quantityName}', '${quantityType}', ${value}, '${formula}')`);
|
|
216
|
+
}
|
|
217
|
+
if (values.length > 0) {
|
|
218
|
+
await this.conn.query(`INSERT INTO quantities VALUES ${values.join(', ')}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
console.log(`[DuckDB] Registered quantities table with ${quantities.count} rows`);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Create and populate relationships table
|
|
225
|
+
*/
|
|
226
|
+
async createRelationshipsTable(store) {
|
|
227
|
+
await this.conn.query(`
|
|
228
|
+
CREATE TABLE relationships (
|
|
229
|
+
source_id INTEGER,
|
|
230
|
+
target_id INTEGER,
|
|
231
|
+
rel_type VARCHAR,
|
|
232
|
+
rel_id INTEGER
|
|
233
|
+
)
|
|
234
|
+
`);
|
|
235
|
+
const { relationships } = store;
|
|
236
|
+
const edges = relationships.forward;
|
|
237
|
+
const batchSize = 1000;
|
|
238
|
+
const relTypeNames = {
|
|
239
|
+
[RelationshipType.ContainsElements]: 'ContainsElements',
|
|
240
|
+
[RelationshipType.Aggregates]: 'Aggregates',
|
|
241
|
+
[RelationshipType.DefinesByProperties]: 'DefinesByProperties',
|
|
242
|
+
[RelationshipType.DefinesByType]: 'DefinesByType',
|
|
243
|
+
[RelationshipType.AssociatesMaterial]: 'AssociatesMaterial',
|
|
244
|
+
[RelationshipType.AssociatesClassification]: 'AssociatesClassification',
|
|
245
|
+
[RelationshipType.VoidsElement]: 'VoidsElement',
|
|
246
|
+
[RelationshipType.FillsElement]: 'FillsElement',
|
|
247
|
+
[RelationshipType.ConnectsPathElements]: 'ConnectsPathElements',
|
|
248
|
+
[RelationshipType.ConnectsElements]: 'ConnectsElements',
|
|
249
|
+
[RelationshipType.SpaceBoundary]: 'SpaceBoundary',
|
|
250
|
+
[RelationshipType.AssignsToGroup]: 'AssignsToGroup',
|
|
251
|
+
[RelationshipType.AssignsToProduct]: 'AssignsToProduct',
|
|
252
|
+
[RelationshipType.ReferencedInSpatialStructure]: 'ReferencedInSpatialStructure',
|
|
253
|
+
};
|
|
254
|
+
// Flatten CSR format to rows
|
|
255
|
+
const rows = [];
|
|
256
|
+
for (const [sourceId, offset] of edges.offsets) {
|
|
257
|
+
const count = edges.counts.get(sourceId) || 0;
|
|
258
|
+
for (let i = offset; i < offset + count; i++) {
|
|
259
|
+
rows.push({
|
|
260
|
+
sourceId,
|
|
261
|
+
targetId: edges.edgeTargets[i],
|
|
262
|
+
relType: relTypeNames[edges.edgeTypes[i]] || 'Unknown',
|
|
263
|
+
relId: edges.edgeRelIds[i],
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// Insert in batches
|
|
268
|
+
for (let i = 0; i < rows.length; i += batchSize) {
|
|
269
|
+
const end = Math.min(i + batchSize, rows.length);
|
|
270
|
+
const values = [];
|
|
271
|
+
for (let j = i; j < end; j++) {
|
|
272
|
+
const row = rows[j];
|
|
273
|
+
values.push(`(${row.sourceId}, ${row.targetId}, '${row.relType}', ${row.relId})`);
|
|
274
|
+
}
|
|
275
|
+
if (values.length > 0) {
|
|
276
|
+
await this.conn.query(`INSERT INTO relationships VALUES ${values.join(', ')}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
console.log(`[DuckDB] Registered relationships table with ${rows.length} rows`);
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Create convenience views
|
|
283
|
+
*/
|
|
284
|
+
async createViews() {
|
|
285
|
+
try {
|
|
286
|
+
await this.conn.query(`
|
|
287
|
+
CREATE VIEW IF NOT EXISTS walls AS
|
|
288
|
+
SELECT * FROM entities WHERE type IN ('IfcWall', 'IfcWallStandardCase')
|
|
289
|
+
`);
|
|
290
|
+
await this.conn.query(`
|
|
291
|
+
CREATE VIEW IF NOT EXISTS doors AS
|
|
292
|
+
SELECT * FROM entities WHERE type = 'IfcDoor'
|
|
293
|
+
`);
|
|
294
|
+
await this.conn.query(`
|
|
295
|
+
CREATE VIEW IF NOT EXISTS windows AS
|
|
296
|
+
SELECT * FROM entities WHERE type = 'IfcWindow'
|
|
297
|
+
`);
|
|
298
|
+
await this.conn.query(`
|
|
299
|
+
CREATE VIEW IF NOT EXISTS slabs AS
|
|
300
|
+
SELECT * FROM entities WHERE type = 'IfcSlab'
|
|
301
|
+
`);
|
|
302
|
+
await this.conn.query(`
|
|
303
|
+
CREATE VIEW IF NOT EXISTS columns AS
|
|
304
|
+
SELECT * FROM entities WHERE type = 'IfcColumn'
|
|
305
|
+
`);
|
|
306
|
+
await this.conn.query(`
|
|
307
|
+
CREATE VIEW IF NOT EXISTS beams AS
|
|
308
|
+
SELECT * FROM entities WHERE type = 'IfcBeam'
|
|
309
|
+
`);
|
|
310
|
+
await this.conn.query(`
|
|
311
|
+
CREATE VIEW IF NOT EXISTS spaces AS
|
|
312
|
+
SELECT * FROM entities WHERE type = 'IfcSpace'
|
|
313
|
+
`);
|
|
314
|
+
// Create a view joining entities with their properties
|
|
315
|
+
await this.conn.query(`
|
|
316
|
+
CREATE VIEW IF NOT EXISTS entity_properties AS
|
|
317
|
+
SELECT
|
|
318
|
+
e.express_id, e.name as entity_name, e.type as entity_type,
|
|
319
|
+
p.pset_name, p.prop_name, p.prop_type,
|
|
320
|
+
p.value_string, p.value_real, p.value_int, p.value_bool
|
|
321
|
+
FROM entities e
|
|
322
|
+
LEFT JOIN properties p ON e.express_id = p.entity_id
|
|
323
|
+
`);
|
|
324
|
+
// Create a view joining entities with their quantities
|
|
325
|
+
await this.conn.query(`
|
|
326
|
+
CREATE VIEW IF NOT EXISTS entity_quantities AS
|
|
327
|
+
SELECT
|
|
328
|
+
e.express_id, e.name as entity_name, e.type as entity_type,
|
|
329
|
+
q.qset_name, q.quantity_name, q.quantity_type, q.value
|
|
330
|
+
FROM entities e
|
|
331
|
+
LEFT JOIN quantities q ON e.express_id = q.entity_id
|
|
332
|
+
`);
|
|
333
|
+
console.log('[DuckDB] Created convenience views');
|
|
334
|
+
}
|
|
335
|
+
catch (error) {
|
|
336
|
+
// Views may fail if tables aren't registered yet - that's OK
|
|
337
|
+
console.warn('[DuckDB] Could not create views:', error);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Check if DuckDB is available
|
|
342
|
+
*/
|
|
343
|
+
static async isAvailable() {
|
|
344
|
+
try {
|
|
345
|
+
// Dynamic import using Function constructor to prevent Vite static analysis
|
|
346
|
+
// @ts-ignore - DuckDB is optional dependency
|
|
347
|
+
await new Function('return import("@duckdb/duckdb-wasm")')();
|
|
348
|
+
return true;
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
return false;
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Dispose of DuckDB resources
|
|
356
|
+
*/
|
|
357
|
+
async dispose() {
|
|
358
|
+
if (this.conn) {
|
|
359
|
+
await this.conn.close();
|
|
360
|
+
this.conn = null;
|
|
361
|
+
}
|
|
362
|
+
if (this.db) {
|
|
363
|
+
await this.db.terminate();
|
|
364
|
+
this.db = null;
|
|
365
|
+
}
|
|
366
|
+
this.initialized = false;
|
|
367
|
+
this.initPromise = null;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Escape a string for SQL (prevent SQL injection)
|
|
372
|
+
*/
|
|
373
|
+
function escapeSQL(value) {
|
|
374
|
+
if (value === null || value === undefined) {
|
|
375
|
+
return '';
|
|
376
|
+
}
|
|
377
|
+
// Replace single quotes with two single quotes (SQL escape)
|
|
378
|
+
return value.replace(/'/g, "''");
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=duckdb-integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-integration.js","sourceRoot":"","sources":["../../../src/duckdb-integration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Entity node for graph traversal
|
|
3
|
+
*/
|
|
4
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
5
|
+
import { RelationshipType } from '@ifc-lite/data';
|
|
6
|
+
export declare class EntityNode {
|
|
7
|
+
private store;
|
|
8
|
+
readonly expressId: number;
|
|
9
|
+
constructor(store: IfcDataStore, expressId: number);
|
|
10
|
+
get globalId(): string;
|
|
11
|
+
get name(): string;
|
|
12
|
+
get type(): string;
|
|
13
|
+
contains(): EntityNode[];
|
|
14
|
+
containedIn(): EntityNode | null;
|
|
15
|
+
decomposes(): EntityNode[];
|
|
16
|
+
decomposedBy(): EntityNode | null;
|
|
17
|
+
definingType(): EntityNode | null;
|
|
18
|
+
instances(): EntityNode[];
|
|
19
|
+
voids(): EntityNode[];
|
|
20
|
+
filledBy(): EntityNode[];
|
|
21
|
+
traverse(relType: RelationshipType, depth: number, direction?: 'forward' | 'inverse'): EntityNode[];
|
|
22
|
+
building(): EntityNode | null;
|
|
23
|
+
storey(): EntityNode | null;
|
|
24
|
+
properties(): ReturnType<typeof this.store.properties.getForEntity>;
|
|
25
|
+
property(psetName: string, propName: string): ReturnType<typeof this.store.properties.getPropertyValue>;
|
|
26
|
+
quantities(): ReturnType<typeof this.store.quantities.getForEntity>;
|
|
27
|
+
quantity(qsetName: string, quantityName: string): number | null;
|
|
28
|
+
private getRelated;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=entity-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-node.d.ts","sourceRoot":"","sources":["../../../src/entity-node.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAe;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM;IAKlD,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,IAAI,IAAI,MAAM,CAEjB;IAGD,QAAQ,IAAI,UAAU,EAAE;IAIxB,WAAW,IAAI,UAAU,GAAG,IAAI;IAMhC,UAAU,IAAI,UAAU,EAAE;IAI1B,YAAY,IAAI,UAAU,GAAG,IAAI;IAMjC,YAAY,IAAI,UAAU,GAAG,IAAI;IAKjC,SAAS,IAAI,UAAU,EAAE;IAKzB,KAAK,IAAI,UAAU,EAAE;IAIrB,QAAQ,IAAI,UAAU,EAAE;IAKxB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,SAAS,GAAG,SAAqB,GAAG,UAAU,EAAE;IAwB9G,QAAQ,IAAI,UAAU,GAAG,IAAI;IAY7B,MAAM,IAAI,UAAU,GAAG,IAAI;IAa3B,UAAU,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC;IAInE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC;IAIvG,UAAU,IAAI,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC;IAInE,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAI/D,OAAO,CAAC,UAAU;CAInB"}
|
|
@@ -0,0 +1,114 @@
|
|
|
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 { RelationshipType } from '@ifc-lite/data';
|
|
5
|
+
export class EntityNode {
|
|
6
|
+
store;
|
|
7
|
+
expressId;
|
|
8
|
+
constructor(store, expressId) {
|
|
9
|
+
this.store = store;
|
|
10
|
+
this.expressId = expressId;
|
|
11
|
+
}
|
|
12
|
+
get globalId() {
|
|
13
|
+
return this.store.entities.getGlobalId(this.expressId);
|
|
14
|
+
}
|
|
15
|
+
get name() {
|
|
16
|
+
return this.store.entities.getName(this.expressId);
|
|
17
|
+
}
|
|
18
|
+
get type() {
|
|
19
|
+
return this.store.entities.getTypeName(this.expressId);
|
|
20
|
+
}
|
|
21
|
+
// Spatial containment
|
|
22
|
+
contains() {
|
|
23
|
+
return this.getRelated(RelationshipType.ContainsElements, 'forward');
|
|
24
|
+
}
|
|
25
|
+
containedIn() {
|
|
26
|
+
const nodes = this.getRelated(RelationshipType.ContainsElements, 'inverse');
|
|
27
|
+
return nodes[0] ?? null;
|
|
28
|
+
}
|
|
29
|
+
// Aggregation
|
|
30
|
+
decomposes() {
|
|
31
|
+
return this.getRelated(RelationshipType.Aggregates, 'forward');
|
|
32
|
+
}
|
|
33
|
+
decomposedBy() {
|
|
34
|
+
const nodes = this.getRelated(RelationshipType.Aggregates, 'inverse');
|
|
35
|
+
return nodes[0] ?? null;
|
|
36
|
+
}
|
|
37
|
+
// Types
|
|
38
|
+
definingType() {
|
|
39
|
+
const nodes = this.getRelated(RelationshipType.DefinesByType, 'forward');
|
|
40
|
+
return nodes[0] ?? null;
|
|
41
|
+
}
|
|
42
|
+
instances() {
|
|
43
|
+
return this.getRelated(RelationshipType.DefinesByType, 'inverse');
|
|
44
|
+
}
|
|
45
|
+
// Openings
|
|
46
|
+
voids() {
|
|
47
|
+
return this.getRelated(RelationshipType.VoidsElement, 'forward');
|
|
48
|
+
}
|
|
49
|
+
filledBy() {
|
|
50
|
+
return this.getRelated(RelationshipType.FillsElement, 'inverse');
|
|
51
|
+
}
|
|
52
|
+
// Multi-hop traversal
|
|
53
|
+
traverse(relType, depth, direction = 'forward') {
|
|
54
|
+
const visited = new Set();
|
|
55
|
+
const result = [];
|
|
56
|
+
const visit = (nodeId, currentDepth) => {
|
|
57
|
+
if (currentDepth > depth || visited.has(nodeId))
|
|
58
|
+
return;
|
|
59
|
+
visited.add(nodeId);
|
|
60
|
+
if (nodeId !== this.expressId) {
|
|
61
|
+
result.push(new EntityNode(this.store, nodeId));
|
|
62
|
+
}
|
|
63
|
+
const edges = direction === 'forward'
|
|
64
|
+
? this.store.relationships.forward.getEdges(nodeId, relType)
|
|
65
|
+
: this.store.relationships.inverse.getEdges(nodeId, relType);
|
|
66
|
+
for (const edge of edges) {
|
|
67
|
+
visit(edge.target, currentDepth + 1);
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
visit(this.expressId, 0);
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
// Spatial shortcuts
|
|
74
|
+
building() {
|
|
75
|
+
let current = this;
|
|
76
|
+
const visited = new Set();
|
|
77
|
+
while (current && !visited.has(current.expressId)) {
|
|
78
|
+
visited.add(current.expressId);
|
|
79
|
+
if (current.type === 'IfcBuilding')
|
|
80
|
+
return current;
|
|
81
|
+
current = current.containedIn() ?? current.decomposedBy();
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
storey() {
|
|
86
|
+
let current = this;
|
|
87
|
+
const visited = new Set();
|
|
88
|
+
while (current && !visited.has(current.expressId)) {
|
|
89
|
+
visited.add(current.expressId);
|
|
90
|
+
if (current.type === 'IfcBuildingStorey')
|
|
91
|
+
return current;
|
|
92
|
+
current = current.containedIn() ?? current.decomposedBy();
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
// Data access
|
|
97
|
+
properties() {
|
|
98
|
+
return this.store.properties.getForEntity(this.expressId);
|
|
99
|
+
}
|
|
100
|
+
property(psetName, propName) {
|
|
101
|
+
return this.store.properties.getPropertyValue(this.expressId, psetName, propName);
|
|
102
|
+
}
|
|
103
|
+
quantities() {
|
|
104
|
+
return this.store.quantities.getForEntity(this.expressId);
|
|
105
|
+
}
|
|
106
|
+
quantity(qsetName, quantityName) {
|
|
107
|
+
return this.store.quantities.getQuantityValue(this.expressId, qsetName, quantityName);
|
|
108
|
+
}
|
|
109
|
+
getRelated(relType, direction) {
|
|
110
|
+
const targets = this.store.relationships.getRelated(this.expressId, relType, direction);
|
|
111
|
+
return targets.map(id => new EntityNode(this.store, id));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=entity-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-node.js","sourceRoot":"","sources":["../../../src/entity-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fluent query builder for entities
|
|
3
|
+
*/
|
|
4
|
+
import type { IfcDataStore } from '@ifc-lite/parser';
|
|
5
|
+
import { IfcTypeEnum } from '@ifc-lite/data';
|
|
6
|
+
import { QueryResultEntity } from './query-result-entity.js';
|
|
7
|
+
export type ComparisonOperator = '=' | '!=' | '>' | '>=' | '<' | '<=' | 'contains' | 'startsWith';
|
|
8
|
+
export declare class EntityQuery {
|
|
9
|
+
private store;
|
|
10
|
+
private typeFilter;
|
|
11
|
+
private idFilter;
|
|
12
|
+
private propertyFilters;
|
|
13
|
+
private limitCount;
|
|
14
|
+
private offsetCount;
|
|
15
|
+
private includeFlags;
|
|
16
|
+
constructor(store: IfcDataStore, types: IfcTypeEnum[] | null, ids?: number[] | null);
|
|
17
|
+
whereProperty(psetName: string, propName: string, operator: ComparisonOperator, value: any): this;
|
|
18
|
+
limit(count: number): this;
|
|
19
|
+
offset(count: number): this;
|
|
20
|
+
includeGeometry(): this;
|
|
21
|
+
includeProperties(): this;
|
|
22
|
+
includeQuantities(): this;
|
|
23
|
+
includeAll(): this;
|
|
24
|
+
execute(): QueryResultEntity[];
|
|
25
|
+
ids(): Promise<number[]>;
|
|
26
|
+
count(): Promise<number>;
|
|
27
|
+
first(): Promise<QueryResultEntity | null>;
|
|
28
|
+
private getCandidateIds;
|
|
29
|
+
private applyPropertyFilters;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=entity-query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-query.d.ts","sourceRoot":"","sources":["../../../src/entity-query.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,UAAU,GAAG,YAAY,CAAC;AAElG,qBAAa,WAAW;IACtB,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,eAAe,CAAiF;IACxG,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,YAAY,CAA0E;gBAElF,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI,EAAE,GAAG,GAAE,MAAM,EAAE,GAAG,IAAW;IAUzF,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAKjG,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAS3B,eAAe,IAAI,IAAI;IAKvB,iBAAiB,IAAI,IAAI;IAKzB,iBAAiB,IAAI,IAAI;IAKzB,UAAU,IAAI,IAAI;IASlB,OAAO,IAAI,iBAAiB,EAAE;IA6BxB,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAQxB,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAMxB,KAAK,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAShD,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,oBAAoB;CAa7B"}
|