@ifc-lite/cli 0.26.0 → 0.27.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.
Files changed (128) hide show
  1. package/dist/commands/ask.d.ts +8 -0
  2. package/dist/commands/ask.d.ts.map +1 -1
  3. package/dist/commands/ask.js +10 -9
  4. package/dist/commands/ask.js.map +1 -1
  5. package/dist/commands/bsdd.d.ts.map +1 -1
  6. package/dist/commands/bsdd.js +49 -13
  7. package/dist/commands/bsdd.js.map +1 -1
  8. package/dist/commands/diff-classification-label.d.ts +12 -0
  9. package/dist/commands/diff-classification-label.d.ts.map +1 -0
  10. package/dist/commands/diff-classification-label.js +20 -0
  11. package/dist/commands/diff-classification-label.js.map +1 -0
  12. package/dist/commands/diff-engine.d.ts.map +1 -1
  13. package/dist/commands/diff-engine.js +33 -11
  14. package/dist/commands/diff-engine.js.map +1 -1
  15. package/dist/commands/diff-test-helpers.d.ts +12 -0
  16. package/dist/commands/diff-test-helpers.d.ts.map +1 -1
  17. package/dist/commands/diff-test-helpers.js +68 -0
  18. package/dist/commands/diff-test-helpers.js.map +1 -1
  19. package/dist/commands/diff-unit-scale-fixtures.d.ts +34 -0
  20. package/dist/commands/diff-unit-scale-fixtures.d.ts.map +1 -0
  21. package/dist/commands/diff-unit-scale-fixtures.js +94 -0
  22. package/dist/commands/diff-unit-scale-fixtures.js.map +1 -0
  23. package/dist/commands/export.d.ts +11 -0
  24. package/dist/commands/export.d.ts.map +1 -1
  25. package/dist/commands/export.js +9 -14
  26. package/dist/commands/export.js.map +1 -1
  27. package/dist/commands/merge.d.ts.map +1 -1
  28. package/dist/commands/merge.js +8 -0
  29. package/dist/commands/merge.js.map +1 -1
  30. package/dist/commands/query-aggregation.d.ts +27 -4
  31. package/dist/commands/query-aggregation.d.ts.map +1 -1
  32. package/dist/commands/query-aggregation.js +67 -6
  33. package/dist/commands/query-aggregation.js.map +1 -1
  34. package/dist/commands/query-output.d.ts +7 -0
  35. package/dist/commands/query-output.d.ts.map +1 -1
  36. package/dist/commands/query-output.js +63 -27
  37. package/dist/commands/query-output.js.map +1 -1
  38. package/dist/commands/query-storey.d.ts +24 -0
  39. package/dist/commands/query-storey.d.ts.map +1 -0
  40. package/dist/commands/query-storey.js +71 -0
  41. package/dist/commands/query-storey.js.map +1 -0
  42. package/dist/commands/query.d.ts +2 -25
  43. package/dist/commands/query.d.ts.map +1 -1
  44. package/dist/commands/query.js +39 -158
  45. package/dist/commands/query.js.map +1 -1
  46. package/dist/commands/schedule-aggregate.d.ts +51 -0
  47. package/dist/commands/schedule-aggregate.d.ts.map +1 -0
  48. package/dist/commands/schedule-aggregate.js +121 -0
  49. package/dist/commands/schedule-aggregate.js.map +1 -0
  50. package/dist/commands/schedule-columns.d.ts +15 -0
  51. package/dist/commands/schedule-columns.d.ts.map +1 -0
  52. package/dist/commands/schedule-columns.js +63 -0
  53. package/dist/commands/schedule-columns.js.map +1 -0
  54. package/dist/commands/schedule-group.d.ts +65 -0
  55. package/dist/commands/schedule-group.d.ts.map +1 -0
  56. package/dist/commands/schedule-group.js +0 -0
  57. package/dist/commands/schedule-group.js.map +1 -0
  58. package/dist/commands/schedule-presets.d.ts +21 -0
  59. package/dist/commands/schedule-presets.d.ts.map +1 -0
  60. package/dist/commands/schedule-presets.js +62 -0
  61. package/dist/commands/schedule-presets.js.map +1 -0
  62. package/dist/commands/schedule-render-html.d.ts +13 -0
  63. package/dist/commands/schedule-render-html.d.ts.map +1 -0
  64. package/dist/commands/schedule-render-html.js +100 -0
  65. package/dist/commands/schedule-render-html.js.map +1 -0
  66. package/dist/commands/schedule-render-md.d.ts +12 -0
  67. package/dist/commands/schedule-render-md.d.ts.map +1 -0
  68. package/dist/commands/schedule-render-md.js +77 -0
  69. package/dist/commands/schedule-render-md.js.map +1 -0
  70. package/dist/commands/schedule-render.d.ts +51 -0
  71. package/dist/commands/schedule-render.d.ts.map +1 -0
  72. package/dist/commands/schedule-render.js +205 -0
  73. package/dist/commands/schedule-render.js.map +1 -0
  74. package/dist/commands/schedule-spec.d.ts +29 -0
  75. package/dist/commands/schedule-spec.d.ts.map +1 -0
  76. package/dist/commands/schedule-spec.js +111 -0
  77. package/dist/commands/schedule-spec.js.map +1 -0
  78. package/dist/commands/schedule.d.ts +23 -0
  79. package/dist/commands/schedule.d.ts.map +1 -0
  80. package/dist/commands/schedule.js +249 -0
  81. package/dist/commands/schedule.js.map +1 -0
  82. package/dist/commands/schema.d.ts.map +1 -1
  83. package/dist/commands/schema.js +192 -17
  84. package/dist/commands/schema.js.map +1 -1
  85. package/dist/commands/stats-aggregation.d.ts +31 -6
  86. package/dist/commands/stats-aggregation.d.ts.map +1 -1
  87. package/dist/commands/stats-aggregation.js +79 -11
  88. package/dist/commands/stats-aggregation.js.map +1 -1
  89. package/dist/commands/stats.d.ts.map +1 -1
  90. package/dist/commands/stats.js +4 -4
  91. package/dist/commands/stats.js.map +1 -1
  92. package/dist/commands/validate.d.ts +7 -4
  93. package/dist/commands/validate.d.ts.map +1 -1
  94. package/dist/commands/validate.js +9 -6
  95. package/dist/commands/validate.js.map +1 -1
  96. package/dist/commands/where-filter.d.ts +42 -0
  97. package/dist/commands/where-filter.d.ts.map +1 -0
  98. package/dist/commands/where-filter.js +88 -0
  99. package/dist/commands/where-filter.js.map +1 -0
  100. package/dist/energy-export.d.ts.map +1 -1
  101. package/dist/energy-export.js +12 -2
  102. package/dist/energy-export.js.map +1 -1
  103. package/dist/geometry-report.d.ts.map +1 -1
  104. package/dist/geometry-report.js +15 -3
  105. package/dist/geometry-report.js.map +1 -1
  106. package/dist/headless-backend.d.ts +20 -5
  107. package/dist/headless-backend.d.ts.map +1 -1
  108. package/dist/headless-backend.js +131 -90
  109. package/dist/headless-backend.js.map +1 -1
  110. package/dist/index.js +22 -0
  111. package/dist/index.js.map +1 -1
  112. package/dist/output.d.ts +13 -0
  113. package/dist/output.d.ts.map +1 -1
  114. package/dist/output.js +21 -0
  115. package/dist/output.js.map +1 -1
  116. package/dist/property-filter-match.d.ts +12 -0
  117. package/dist/property-filter-match.d.ts.map +1 -0
  118. package/dist/property-filter-match.js +17 -0
  119. package/dist/property-filter-match.js.map +1 -0
  120. package/dist/query-overlay-relations.d.ts +29 -0
  121. package/dist/query-overlay-relations.d.ts.map +1 -0
  122. package/dist/query-overlay-relations.js +88 -0
  123. package/dist/query-overlay-relations.js.map +1 -0
  124. package/dist/query-overlay.d.ts +44 -0
  125. package/dist/query-overlay.d.ts.map +1 -0
  126. package/dist/query-overlay.js +100 -0
  127. package/dist/query-overlay.js.map +1 -0
  128. package/package.json +21 -21
@@ -5,8 +5,9 @@
5
5
  * Output formatting functions for the query command — count, sum,
6
6
  * aggregation, group-by, table rendering, and JSON serialization.
7
7
  */
8
- import { printJson, formatTable, hasFlag, fatal } from '../output.js';
9
- import { getQuantityValue } from './query-aggregation.js';
8
+ import { findPropertyInSets } from '@ifc-lite/query';
9
+ import { printJson, formatTable, hasFlag, fatal, firstNonBlank } from '../output.js';
10
+ import { getQuantityValue, aggregateFinite } from './query-aggregation.js';
10
11
  /** Valid built-in grouping keys */
11
12
  export const VALID_GROUP_BY_KEYS = ['type', 'storey', 'material'];
12
13
  export function outputCount(count, jsonOutput) {
@@ -37,7 +38,12 @@ export function outputSum(entities, quantityName, bim, jsonOutput) {
37
38
  allQuantityNames.set(key, { qsetName: qset.name, count: 1 });
38
39
  }
39
40
  if (q.name === quantityName) {
40
- total += Number(q.value) || 0;
41
+ // Mirrors getQuantityValue in query-aggregation.ts: `Number(x) ||
42
+ // 0` lets a present-but-Infinite value through (Infinity is
43
+ // truthy), which would poison `total` for every other entity in
44
+ // the sum. Number.isFinite catches NaN and both infinities.
45
+ const n = Number(q.value);
46
+ total += Number.isFinite(n) ? n : 0;
41
47
  matched++;
42
48
  matchedQsets.add(qset.name);
43
49
  }
@@ -199,18 +205,19 @@ export function outputGroupBy(entities, groupByKey, sumQuantity, bim, jsonOutput
199
205
  }
200
206
  else if (groupByKey === 'storey') {
201
207
  const storey = bim.storey(e.ref);
202
- groupValue = storey?.name ?? '(no storey)';
208
+ groupValue = firstNonBlank(storey?.name) ?? '(no storey)';
203
209
  }
204
210
  else if (groupByKey === 'material') {
205
211
  const mat = bim.materials(e.ref);
206
- groupValue = mat?.materials?.[0] ?? mat?.name ?? '(no material)';
212
+ const first = mat?.materials?.[0];
213
+ const firstMatName = typeof first === 'string' ? first : first?.name;
214
+ groupValue = firstNonBlank(firstMatName, mat?.name) ?? '(no material)';
207
215
  }
208
216
  else if (groupByKey.includes('.')) {
209
217
  // PsetName.PropName
210
218
  const [psetName, propName] = groupByKey.split('.', 2);
211
219
  const props = bim.properties(e.ref);
212
- const pset = props.find((p) => p.name === psetName);
213
- const prop = pset?.properties?.find((p) => p.name === propName);
220
+ const prop = findPropertyInSets(props, psetName, propName);
214
221
  groupValue = prop?.value != null ? String(prop.value) : `(no ${propName})`;
215
222
  }
216
223
  else {
@@ -229,29 +236,14 @@ export function outputGroupBy(entities, groupByKey, sumQuantity, bim, jsonOutput
229
236
  const groupAgg = new Map();
230
237
  if (sumQuantity) {
231
238
  for (const [key, groupEntities] of groups) {
232
- let sum = 0;
233
- let count = 0;
234
- let minVal = Infinity;
235
- let maxVal = -Infinity;
239
+ const vals = [];
236
240
  for (const e of groupEntities) {
237
241
  const val = getQuantityValue(bim, e.ref, sumQuantity);
238
- if (val !== null) {
239
- sum += val;
240
- count++;
241
- if (val < minVal)
242
- minVal = val;
243
- if (val > maxVal)
244
- maxVal = val;
245
- }
242
+ if (val !== null)
243
+ vals.push(val);
246
244
  }
247
- if (mode === 'avg')
248
- groupAgg.set(key, count > 0 ? sum / count : 0);
249
- else if (mode === 'min')
250
- groupAgg.set(key, count > 0 ? minVal : 0);
251
- else if (mode === 'max')
252
- groupAgg.set(key, count > 0 ? maxVal : 0);
253
- else
254
- groupAgg.set(key, sum);
245
+ // Shared finite-guarded reduction; an empty group stays 0 here.
246
+ groupAgg.set(key, aggregateFinite(vals, mode) ?? 0);
255
247
  }
256
248
  }
257
249
  const modeLabel = mode === 'sum' ? 'sum' : mode;
@@ -299,6 +291,50 @@ export function outputGroupBy(entities, groupByKey, sumQuantity, bim, jsonOutput
299
291
  }
300
292
  }
301
293
  }
294
+ /**
295
+ * B6/F8: `--unique` distinct-value counts for `material`, `storey`, `type`,
296
+ * or a `PsetName.PropName` path. Pulled out of `queryCommand` so the
297
+ * blank/whitespace-name handling (`firstNonBlank`) is unit-testable without
298
+ * a fixture model.
299
+ */
300
+ export function computeUniqueValues(entities, uniqueProp, bim) {
301
+ const valueCounts = new Map();
302
+ if (uniqueProp === 'material') {
303
+ for (const e of entities) {
304
+ const mat = bim.materials(e.ref);
305
+ const first = mat?.materials?.[0];
306
+ const firstName = typeof first === 'string' ? first : first?.name;
307
+ const val = firstNonBlank(firstName, mat?.name) ?? '(no material)';
308
+ valueCounts.set(val, (valueCounts.get(val) ?? 0) + 1);
309
+ }
310
+ }
311
+ else if (uniqueProp === 'storey') {
312
+ for (const e of entities) {
313
+ const storey = bim.storey(e.ref);
314
+ const val = firstNonBlank(storey?.name) ?? '(no storey)';
315
+ valueCounts.set(val, (valueCounts.get(val) ?? 0) + 1);
316
+ }
317
+ }
318
+ else if (uniqueProp === 'type') {
319
+ for (const e of entities) {
320
+ valueCounts.set(e.type, (valueCounts.get(e.type) ?? 0) + 1);
321
+ }
322
+ }
323
+ else {
324
+ const dotIdx = uniqueProp.indexOf('.');
325
+ if (dotIdx <= 0)
326
+ fatal(`Invalid --unique path: "${uniqueProp}". Expected: PsetName.PropName, or one of: material, storey, type`);
327
+ const psetName = uniqueProp.slice(0, dotIdx);
328
+ const propName = uniqueProp.slice(dotIdx + 1);
329
+ for (const e of entities) {
330
+ const psets = bim.properties(e.ref);
331
+ const prop = findPropertyInSets(psets, psetName, propName);
332
+ const val = prop?.value != null ? String(prop.value) : '(no value)';
333
+ valueCounts.set(val, (valueCounts.get(val) ?? 0) + 1);
334
+ }
335
+ }
336
+ return valueCounts;
337
+ }
302
338
  export function outputEntities(entities, args, bim, jsonOutput) {
303
339
  const showProps = hasFlag(args, '--props');
304
340
  const showQuantities = hasFlag(args, '--quantities');
@@ -1 +1 @@
1
- {"version":3,"file":"query-output.js","sourceRoot":"","sources":["../../src/commands/query-output.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-output.js","sourceRoot":"","sources":["../../src/commands/query-output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Resolve `--storey <filter>` to the set of expressIds of every entity
3
+ * directly contained in the matching storey/storeys.
4
+ *
5
+ * Resolution order:
6
+ * 1. An exact expressId match (unambiguous — expressIds are unique) wins
7
+ * outright and resolves to that single storey.
8
+ * 2. Otherwise, every storey with an exact Name match. A shared Name is the
9
+ * ambiguity this union exists for: the storeys are indistinguishable by
10
+ * the very key the user supplied, so all of them are meant.
11
+ * 3. Otherwise, the storeys whose Name contains the filter
12
+ * (case-insensitive) — but only when those matches all share ONE Name.
13
+ * A substring spanning differently named storeys ("Level" against
14
+ * "Level 1" and "Level 2") is a different situation: the names DO
15
+ * distinguish the storeys, the user just did not pick one. Unioning would
16
+ * silently merge storeys never asked for, and first-match would pick one
17
+ * by array order; both are wrong answers with exit 0, so this errors and
18
+ * lists the candidate names instead.
19
+ *
20
+ * Exits via `fatal()` (never returns) if no storey matches at all, or if the
21
+ * substring tier matches storeys with different Names.
22
+ */
23
+ export declare function resolveStoreyIds(bim: any, storeyFilter: string): Set<number>;
24
+ //# sourceMappingURL=query-storey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-storey.d.ts","sourceRoot":"","sources":["../../src/commands/query-storey.ts"],"names":[],"mappings":"AAmBA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CA8B5E"}
@@ -0,0 +1,71 @@
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
+ * `query --storey` resolution — extracted from `query.ts` (module-size
6
+ * ratchet) but otherwise unchanged behavior.
7
+ *
8
+ * IfcBuildingStorey.Name is not unique: two storeys legally share a Name as
9
+ * siblings under different buildings, or a malformed/federated file can
10
+ * duplicate a level name outright. Matching by GlobalId/expressId is
11
+ * unambiguous; matching by Name is not, so every storey with that Name is
12
+ * included rather than picking an arbitrary first match and silently
13
+ * dropping the rest (a same-named-storey element would otherwise vanish
14
+ * from the result depending on array order).
15
+ */
16
+ import { fatal } from '../output.js';
17
+ /**
18
+ * Resolve `--storey <filter>` to the set of expressIds of every entity
19
+ * directly contained in the matching storey/storeys.
20
+ *
21
+ * Resolution order:
22
+ * 1. An exact expressId match (unambiguous — expressIds are unique) wins
23
+ * outright and resolves to that single storey.
24
+ * 2. Otherwise, every storey with an exact Name match. A shared Name is the
25
+ * ambiguity this union exists for: the storeys are indistinguishable by
26
+ * the very key the user supplied, so all of them are meant.
27
+ * 3. Otherwise, the storeys whose Name contains the filter
28
+ * (case-insensitive) — but only when those matches all share ONE Name.
29
+ * A substring spanning differently named storeys ("Level" against
30
+ * "Level 1" and "Level 2") is a different situation: the names DO
31
+ * distinguish the storeys, the user just did not pick one. Unioning would
32
+ * silently merge storeys never asked for, and first-match would pick one
33
+ * by array order; both are wrong answers with exit 0, so this errors and
34
+ * lists the candidate names instead.
35
+ *
36
+ * Exits via `fatal()` (never returns) if no storey matches at all, or if the
37
+ * substring tier matches storeys with different Names.
38
+ */
39
+ export function resolveStoreyIds(bim, storeyFilter) {
40
+ const storeys = bim.storeys();
41
+ const byExpressId = storeys.find((s) => String(s.ref.expressId) === storeyFilter);
42
+ let matchedStoreys;
43
+ if (byExpressId) {
44
+ matchedStoreys = [byExpressId];
45
+ }
46
+ else {
47
+ const exactNameMatches = storeys.filter((s) => s.name === storeyFilter);
48
+ if (exactNameMatches.length > 0) {
49
+ matchedStoreys = exactNameMatches;
50
+ }
51
+ else {
52
+ matchedStoreys = storeys.filter((s) => s.name.toLowerCase().includes(storeyFilter.toLowerCase()));
53
+ const distinctNames = [...new Set(matchedStoreys.map((s) => s.name))];
54
+ if (distinctNames.length > 1) {
55
+ fatal(`Storey "${storeyFilter}" is ambiguous: it matches ${distinctNames.length} differently named storeys ` +
56
+ `(${distinctNames.join(', ')}). Use the exact storey name or an expressId.`);
57
+ }
58
+ }
59
+ }
60
+ if (matchedStoreys.length === 0) {
61
+ const names = storeys.map((s) => s.name).filter(Boolean).join(', ');
62
+ fatal(`Storey "${storeyFilter}" not found. Available: ${names || '(none)'}`);
63
+ }
64
+ const storeyIds = new Set();
65
+ for (const storey of matchedStoreys) {
66
+ for (const e of bim.contains(storey.ref))
67
+ storeyIds.add(e.ref.expressId);
68
+ }
69
+ return storeyIds;
70
+ }
71
+ //# sourceMappingURL=query-storey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-storey.js","sourceRoot":"","sources":["../../src/commands/query-storey.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAQ,EAAE,YAAoB;IAC7D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,YAAY,CAAC,CAAC;IACvF,IAAI,cAAqB,CAAC;IAC1B,IAAI,WAAW,EAAE,CAAC;QAChB,cAAc,GAAG,CAAC,WAAW,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;QAC7E,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,cAAc,GAAG,gBAAgB,CAAC;QACpC,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YACvG,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3E,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,KAAK,CACH,WAAW,YAAY,8BAA8B,aAAa,CAAC,MAAM,6BAA6B;oBACpG,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,+CAA+C,CAC9E,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,KAAK,CAAC,WAAW,YAAY,2BAA2B,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,32 +1,9 @@
1
+ import { applyWhereFilter, parseWhereFilter, compareValues, normalizeBooleanValue } from './where-filter.js';
2
+ export { applyWhereFilter, parseWhereFilter, compareValues, normalizeBooleanValue };
1
3
  /**
2
4
  * B9/F6: Auto-prefix Ifc for --type if user omits it.
3
5
  * Returns the corrected type string, or the original if already prefixed.
4
6
  */
5
7
  export declare function normalizeTypeName(typeStr: string): string;
6
- /**
7
- * Parse a --where filter string into psetName, propName, operator, value.
8
- * Supported formats:
9
- * PsetName.PropName=Value (equals)
10
- * PsetName.PropName!=Value (not equals)
11
- * PsetName.PropName>Value (greater than)
12
- * PsetName.PropName<Value (less than)
13
- * PsetName.PropName>=Value (greater or equal)
14
- * PsetName.PropName<=Value (less or equal)
15
- * PsetName.PropName~Value (contains)
16
- * PsetName.PropName (exists)
17
- */
18
- export declare function parseWhereFilter(filter: string): {
19
- psetName: string;
20
- propName: string;
21
- operator: string;
22
- value?: string;
23
- };
24
- /**
25
- * B3/F1: Apply --where filter to entities, searching both property sets AND quantity sets.
26
- * Falls back to quantity sets when a property set match is not found.
27
- */
28
- export declare function applyWhereFilter(entities: any[], parsed: ReturnType<typeof parseWhereFilter>, bim: any): any[];
29
- export declare function compareValues(actual: any, operator: string, expected: string | undefined): boolean;
30
- export declare function normalizeBooleanValue(value: unknown): unknown;
31
8
  export declare function queryCommand(args: string[]): Promise<void>;
32
9
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWzD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAsBzH;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,CA0B9G;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAclG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI7D;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoehE"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/commands/query.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE7G,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,CAAC;AAEpF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWzD;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA8bhE"}
@@ -11,7 +11,10 @@
11
11
  import { createHeadlessContext } from '../loader.js';
12
12
  import { printJson, getFlag, hasFlag, fatal, validateLimit } from '../output.js';
13
13
  import { STANDARD_QTO_MAP, sortEntities } from './query-aggregation.js';
14
- import { VALID_GROUP_BY_KEYS, outputCount, outputSum, outputAggregation, outputGroupBy, outputEntities } from './query-output.js';
14
+ import { resolveStoreyIds } from './query-storey.js';
15
+ import { VALID_GROUP_BY_KEYS, outputCount, outputSum, outputAggregation, outputGroupBy, outputEntities, computeUniqueValues } from './query-output.js';
16
+ import { applyWhereFilter, parseWhereFilter, compareValues, normalizeBooleanValue } from './where-filter.js';
17
+ export { applyWhereFilter, parseWhereFilter, compareValues, normalizeBooleanValue };
15
18
  /**
16
19
  * B9/F6: Auto-prefix Ifc for --type if user omits it.
17
20
  * Returns the corrected type string, or the original if already prefixed.
@@ -28,108 +31,22 @@ export function normalizeTypeName(typeStr) {
28
31
  return prefixed;
29
32
  }).join(',');
30
33
  }
31
- /**
32
- * Parse a --where filter string into psetName, propName, operator, value.
33
- * Supported formats:
34
- * PsetName.PropName=Value (equals)
35
- * PsetName.PropName!=Value (not equals)
36
- * PsetName.PropName>Value (greater than)
37
- * PsetName.PropName<Value (less than)
38
- * PsetName.PropName>=Value (greater or equal)
39
- * PsetName.PropName<=Value (less or equal)
40
- * PsetName.PropName~Value (contains)
41
- * PsetName.PropName (exists)
42
- */
43
- export function parseWhereFilter(filter) {
44
- const dotIdx = filter.indexOf('.');
45
- if (dotIdx <= 0) {
46
- fatal(`Invalid --where syntax: "${filter}". Expected: PsetName.PropName[=Value]`);
47
- }
48
- const psetName = filter.slice(0, dotIdx);
49
- const rest = filter.slice(dotIdx + 1);
50
- // Try multi-char operators first, then single-char
51
- for (const op of ['!=', '>=', '<=', '>', '<', '=', '~']) {
52
- const opIdx = rest.indexOf(op);
53
- if (opIdx > 0) {
54
- const propName = rest.slice(0, opIdx);
55
- const value = rest.slice(opIdx + op.length);
56
- const mappedOp = op === '~' ? 'contains' : op;
57
- return { psetName, propName, operator: mappedOp, value };
58
- }
59
- }
60
- // No operator found — exists check
61
- return { psetName, propName: rest, operator: 'exists' };
62
- }
63
- /**
64
- * B3/F1: Apply --where filter to entities, searching both property sets AND quantity sets.
65
- * Falls back to quantity sets when a property set match is not found.
66
- */
67
- export function applyWhereFilter(entities, parsed, bim) {
68
- return entities.filter(e => {
69
- // First try property sets
70
- const props = bim.properties(e.ref);
71
- const pset = props.find((p) => p.name === parsed.psetName);
72
- if (pset) {
73
- const prop = pset.properties.find((p) => p.name === parsed.propName);
74
- if (prop) {
75
- if (parsed.operator === 'exists')
76
- return true;
77
- return compareValues(prop.value, parsed.operator, parsed.value);
78
- }
79
- }
80
- // B3: Also search quantity sets
81
- const qsets = bim.quantities(e.ref);
82
- const qset = qsets.find((q) => q.name === parsed.psetName);
83
- if (qset) {
84
- const qty = qset.quantities.find((q) => q.name === parsed.propName);
85
- if (qty) {
86
- if (parsed.operator === 'exists')
87
- return true;
88
- return compareValues(qty.value, parsed.operator, parsed.value);
89
- }
90
- }
91
- return false;
92
- });
93
- }
94
- export function compareValues(actual, operator, expected) {
95
- if (expected === undefined)
96
- return actual != null;
97
- const normActual = normalizeBooleanValue(actual);
98
- const normExpected = normalizeBooleanValue(expected);
99
- switch (operator) {
100
- case '=': return String(normActual) === String(normExpected);
101
- case '!=': return String(normActual) !== String(normExpected);
102
- case '>': return Number(normActual) > Number(normExpected);
103
- case '<': return Number(normActual) < Number(normExpected);
104
- case '>=': return Number(normActual) >= Number(normExpected);
105
- case '<=': return Number(normActual) <= Number(normExpected);
106
- case 'contains': return String(normActual).toLowerCase().includes(String(normExpected).toLowerCase());
107
- default: return false;
108
- }
109
- }
110
- export function normalizeBooleanValue(value) {
111
- if (value === true || value === '.T.' || value === 'true' || value === 'TRUE')
112
- return 'true';
113
- if (value === false || value === '.F.' || value === 'false' || value === 'FALSE')
114
- return 'false';
115
- return value;
116
- }
117
34
  export async function queryCommand(args) {
118
35
  const filePath = args.find(a => !a.startsWith('-'));
119
36
  if (!filePath)
120
37
  fatal('Usage: ifc-lite query <file.ifc> --type IfcWall [--props] [--limit N]');
121
38
  let type = getFlag(args, '--type');
122
39
  const limit = getFlag(args, '--limit');
123
- // Validated once, up front, and reused by every branch below (plain,
124
- // --where, and --group-by). Each branch used to do its own
125
- // `limit ? parseInt(limit, 10) : undefined`, which is truthy for any
126
- // non-empty garbage string; the parsed NaN was then either silently
127
- // ignored (query builder / group-by paths, via a `> 0`-shaped guard
128
- // downstream) or silently emptied the result (`slice(0, NaN)` in the
129
- // --where path) -- either way a typo'd --limit exited 0 with a wrong
130
- // answer instead of being rejected.
40
+ // Both validated once, up front, and reused by every branch below (plain,
41
+ // --where, --storey, --group-by). Each branch used to parse for itself,
42
+ // and `parseInt` is truthy for any non-empty garbage: a typo'd --limit was
43
+ // either ignored (`> 0`-shaped guards downstream) or silently emptied the
44
+ // result (`slice(0, NaN)`), while --offset reached three different wrong
45
+ // answers -- `slice(NaN)` inert, `slice(-2)` returning the LAST two entries
46
+ // instead of skipping two, and NaN reaching the backend guard as an
47
+ // uncaught TypeError. Every one of them exited 0 with a wrong answer.
131
48
  const rowLimit = validateLimit(limit);
132
- const offset = getFlag(args, '--offset');
49
+ const offset = validateLimit(getFlag(args, '--offset'), '--offset');
133
50
  const propFilter = getFlag(args, '--where');
134
51
  const jsonOutput = hasFlag(args, '--json');
135
52
  const countOnly = hasFlag(args, '--count');
@@ -291,43 +208,7 @@ export async function queryCommand(args) {
291
208
  if (!targetType)
292
209
  fatal('--unique requires --type (e.g., --type IfcWall --unique material)');
293
210
  const entities = bim.query().byType(...targetType.split(',')).toArray();
294
- const valueCounts = new Map();
295
- if (uniqueProp === 'material') {
296
- // B6: Support --unique material
297
- for (const e of entities) {
298
- const mat = bim.materials(e.ref);
299
- const first = mat?.materials?.[0];
300
- const firstName = typeof first === 'string' ? first : first?.name;
301
- const val = firstName ?? mat?.name ?? '(no material)';
302
- valueCounts.set(val, (valueCounts.get(val) ?? 0) + 1);
303
- }
304
- }
305
- else if (uniqueProp === 'storey') {
306
- for (const e of entities) {
307
- const storey = bim.storey(e.ref);
308
- const val = storey?.name ?? '(no storey)';
309
- valueCounts.set(val, (valueCounts.get(val) ?? 0) + 1);
310
- }
311
- }
312
- else if (uniqueProp === 'type') {
313
- for (const e of entities) {
314
- valueCounts.set(e.type, (valueCounts.get(e.type) ?? 0) + 1);
315
- }
316
- }
317
- else {
318
- const dotIdx = uniqueProp.indexOf('.');
319
- if (dotIdx <= 0)
320
- fatal(`Invalid --unique path: "${uniqueProp}". Expected: PsetName.PropName, or one of: material, storey, type`);
321
- const psetName = uniqueProp.slice(0, dotIdx);
322
- const propName = uniqueProp.slice(dotIdx + 1);
323
- for (const e of entities) {
324
- const psets = bim.properties(e.ref);
325
- const pset = psets.find((p) => p.name === psetName);
326
- const prop = pset?.properties?.find((p) => p.name === propName);
327
- const val = prop?.value != null ? String(prop.value) : '(no value)';
328
- valueCounts.set(val, (valueCounts.get(val) ?? 0) + 1);
329
- }
330
- }
211
+ const valueCounts = computeUniqueValues(entities, uniqueProp, bim);
331
212
  if (jsonOutput) {
332
213
  const result = {};
333
214
  for (const [val, count] of valueCounts)
@@ -407,18 +288,10 @@ export async function queryCommand(args) {
407
288
  const types = type.split(',');
408
289
  q = q.byType(...types);
409
290
  }
410
- // --storey filter: restrict to entities in a specific storey
291
+ // --storey filter: restrict to entities in a specific storey (or storeys
292
+ // sharing a Name — see resolveStoreyIds).
411
293
  if (storeyFilter) {
412
- const storeys = bim.storeys();
413
- const matchedStorey = storeys.find((s) => s.name === storeyFilter ||
414
- s.name.toLowerCase().includes(storeyFilter.toLowerCase()) ||
415
- String(s.ref.expressId) === storeyFilter);
416
- if (!matchedStorey) {
417
- const names = storeys.map((s) => s.name).filter(Boolean).join(', ');
418
- fatal(`Storey "${storeyFilter}" not found. Available: ${names || '(none)'}`);
419
- }
420
- const contained = bim.contains(matchedStorey.ref);
421
- const storeyIds = new Set(contained.map((e) => e.ref.expressId));
294
+ const storeyIds = resolveStoreyIds(bim, storeyFilter);
422
295
  // Post-filter: only keep entities that are in this storey
423
296
  const baseEntities = q.toArray();
424
297
  let storeyEntities = baseEntities.filter((e) => storeyIds.has(e.ref.expressId));
@@ -453,6 +326,11 @@ export async function queryCommand(args) {
453
326
  outputGroupBy(storeyEntities, groupBy, undefined, bim, jsonOutput, rowLimit);
454
327
  return;
455
328
  }
329
+ // Same slice the --where branch applies; without it both flags were inert here.
330
+ if (offset)
331
+ storeyEntities = storeyEntities.slice(offset);
332
+ if (rowLimit !== undefined)
333
+ storeyEntities = storeyEntities.slice(0, rowLimit);
456
334
  if (countOnly) {
457
335
  outputCount(storeyEntities.length, jsonOutput);
458
336
  return;
@@ -497,11 +375,10 @@ export async function queryCommand(args) {
497
375
  outputAggregation(entities, maxQuantity, 'max', bim, jsonOutput);
498
376
  return;
499
377
  }
500
- // Apply offset/limit only for non-aggregation, non-group paths.
501
- // `rowLimit` is validated once, up front (see above) -- slice(0, NaN)
502
- // used to silently empty the result on a garbage --limit.
378
+ // Non-aggregation, non-group paths only. `rowLimit` is validated up
379
+ // front -- slice(0, NaN) used to silently empty the result.
503
380
  if (offset)
504
- entities = entities.slice(parseInt(offset, 10));
381
+ entities = entities.slice(offset);
505
382
  if (rowLimit !== undefined)
506
383
  entities = entities.slice(0, rowLimit);
507
384
  if (countOnly) {
@@ -514,23 +391,27 @@ export async function queryCommand(args) {
514
391
  outputEntities(entities, args, bim, jsonOutput);
515
392
  return;
516
393
  }
517
- // Validated, not parseInt'd -- the QueryBuilder forwards this to the
518
- // headless backend's descriptor, which only honours it under a `> 0`
519
- // check downstream; a garbage/NaN --limit was silently ignored there,
520
- // returning every match instead of being rejected.
521
- if (rowLimit !== undefined && !groupBy)
394
+ // Detect aggregation quantity and mode up front: --sum/--avg/--min/--max
395
+ // must run over the FULL filtered set, matching the --where and --storey
396
+ // paths' explicit "no offset/limit" rule for aggregations -- a partial sum
397
+ // over a --limit-sliced set is a silently wrong total, not a preview.
398
+ const aggQuantity = sumQuantity ?? avgQuantity ?? minQuantity ?? maxQuantity;
399
+ const aggMode = sumQuantity ? 'sum' : avgQuantity ? 'avg' : minQuantity ? 'min' : maxQuantity ? 'max' : undefined;
400
+ // Validated, not parseInt'd -- the backend descriptor only honours the
401
+ // limit under a `> 0` check, so a NaN --limit returned every match.
402
+ // Both flags need both guards: !groupBy because the --where/--storey
403
+ // siblings never slice before grouping, and !aggQuantity (#3510) because
404
+ // an aggregation must run over the whole filtered set.
405
+ if (rowLimit !== undefined && !groupBy && !aggQuantity)
522
406
  q = q.limit(rowLimit);
523
- if (offset)
524
- q = q.offset(parseInt(offset, 10));
407
+ if (offset && !groupBy && !aggQuantity)
408
+ q = q.offset(offset);
525
409
  // B11: Validate --group-by key
526
410
  if (groupBy) {
527
411
  if (!VALID_GROUP_BY_KEYS.includes(groupBy) && !groupBy.includes('.')) {
528
412
  fatal(`Unknown grouping "${groupBy}". Valid options: ${VALID_GROUP_BY_KEYS.join(', ')}, or PsetName.PropName`);
529
413
  }
530
414
  }
531
- // Detect aggregation quantity and mode for --group-by combos
532
- const aggQuantity = sumQuantity ?? avgQuantity ?? minQuantity ?? maxQuantity;
533
- const aggMode = sumQuantity ? 'sum' : avgQuantity ? 'avg' : minQuantity ? 'min' : maxQuantity ? 'max' : undefined;
534
415
  // --group-by + aggregation combo: aggregate per group
535
416
  if (groupBy && aggQuantity) {
536
417
  const entities = q.toArray();