@ifc-lite/cli 0.28.1 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/analyze.d.ts.map +1 -1
- package/dist/commands/analyze.js +9 -2
- package/dist/commands/analyze.js.map +1 -1
- package/dist/commands/clash-csv.d.ts +4 -0
- package/dist/commands/clash-csv.d.ts.map +1 -0
- package/dist/commands/clash-csv.js +26 -0
- package/dist/commands/clash-csv.js.map +1 -0
- package/dist/commands/clash.d.ts.map +1 -1
- package/dist/commands/clash.js +18 -3
- package/dist/commands/clash.js.map +1 -1
- package/dist/commands/diff-test-helpers.d.ts +7 -4
- package/dist/commands/diff-test-helpers.d.ts.map +1 -1
- package/dist/commands/diff-test-helpers.js +7 -4
- package/dist/commands/diff-test-helpers.js.map +1 -1
- package/dist/commands/export-rust-formats.d.ts.map +1 -1
- package/dist/commands/export-rust-formats.js +27 -3
- package/dist/commands/export-rust-formats.js.map +1 -1
- package/dist/commands/export.d.ts +9 -0
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +5 -3
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/extract-entities.d.ts +17 -5
- package/dist/commands/extract-entities.d.ts.map +1 -1
- package/dist/commands/extract-entities.js +68 -126
- package/dist/commands/extract-entities.js.map +1 -1
- package/dist/commands/info.d.ts.map +1 -1
- package/dist/commands/info.js +56 -0
- package/dist/commands/info.js.map +1 -1
- package/dist/commands/mutate-step-record.d.ts +33 -0
- package/dist/commands/mutate-step-record.d.ts.map +1 -0
- package/dist/commands/mutate-step-record.js +267 -0
- package/dist/commands/mutate-step-record.js.map +1 -0
- package/dist/commands/mutate.d.ts +2 -25
- package/dist/commands/mutate.d.ts.map +1 -1
- package/dist/commands/mutate.js +4 -97
- package/dist/commands/mutate.js.map +1 -1
- package/dist/commands/query-output.d.ts.map +1 -1
- package/dist/commands/query-output.js +33 -6
- package/dist/commands/query-output.js.map +1 -1
- package/dist/commands/spatial-ancestors.d.ts +26 -0
- package/dist/commands/spatial-ancestors.d.ts.map +1 -0
- package/dist/commands/spatial-ancestors.js +102 -0
- package/dist/commands/spatial-ancestors.js.map +1 -0
- package/dist/commands/step-args.d.ts +33 -7
- package/dist/commands/step-args.d.ts.map +1 -1
- package/dist/commands/step-args.js +71 -26
- package/dist/commands/step-args.js.map +1 -1
- package/dist/commands/storey-selection.d.ts +6 -0
- package/dist/commands/storey-selection.d.ts.map +1 -0
- package/dist/commands/storey-selection.js +90 -0
- package/dist/commands/storey-selection.js.map +1 -0
- package/dist/commands/subset-relations.d.ts +88 -11
- package/dist/commands/subset-relations.d.ts.map +1 -1
- package/dist/commands/subset-relations.js +66 -62
- package/dist/commands/subset-relations.js.map +1 -1
- package/dist/commands/where-filter.d.ts +1 -0
- package/dist/commands/where-filter.d.ts.map +1 -1
- package/dist/commands/where-filter.js +7 -3
- package/dist/commands/where-filter.js.map +1 -1
- package/package.json +18 -18
|
@@ -0,0 +1,267 @@
|
|
|
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
|
+
* `mutate.ts`'s STEP-text rewrite path: finding an entity record's exact
|
|
6
|
+
* bytes in the exported output and splicing a new attribute value into it.
|
|
7
|
+
*
|
|
8
|
+
* Split out of `mutate.ts` (a sibling, not a growth of that file) to stay
|
|
9
|
+
* under the repo's module-size budget.
|
|
10
|
+
*
|
|
11
|
+
* Record LOCATION on main is a per-line regex plus `indexOf('(')` /
|
|
12
|
+
* `lastIndexOf(')')`. That silently drops a mutation -- reporting success
|
|
13
|
+
* with an unwritten edit -- on a record wrapped across several lines, or on
|
|
14
|
+
* one with a comment between its class keyword and `(`
|
|
15
|
+
* (LTplus-AG/ifc-lite#4163): the regex simply does not match, the line is
|
|
16
|
+
* `continue`d past, and nothing marks the mutation as failed.
|
|
17
|
+
*
|
|
18
|
+
* This module locates the record with `StepTokenizer.scanEntities()`
|
|
19
|
+
* (`@ifc-lite/parser`) -- the same balanced-parenthesis, string- and
|
|
20
|
+
* comment-aware scan the parser itself indexes entities with -- to get each
|
|
21
|
+
* target record's exact byte span, wherever it falls relative to line
|
|
22
|
+
* breaks. A record the scan cannot find is now a NAMED failure instead of a
|
|
23
|
+
* silent no-op.
|
|
24
|
+
*
|
|
25
|
+
* The argument list inside that span is split with `splitTopLevelStepArgs`
|
|
26
|
+
* from `./step-args.js` -- the SAME validating splitter `mutate.ts` uses on
|
|
27
|
+
* main: every part must be exactly one STEP token, checked at every depth,
|
|
28
|
+
* or the split is refused (LTplus-AG/ifc-lite#4125 / #2470 -- an undoubled
|
|
29
|
+
* apostrophe inside a string swallows top-level commas, and a by-index
|
|
30
|
+
* write on a mis-scanned split lands on the wrong attribute while reporting
|
|
31
|
+
* success). An earlier version of this module carried its own
|
|
32
|
+
* non-validating splitter and reintroduced exactly that corruption; it is
|
|
33
|
+
* gone.
|
|
34
|
+
*
|
|
35
|
+
* `scanEntities()`'s own balanced-paren scan can itself be fooled: a stray,
|
|
36
|
+
* unmatched `)` inside a malformed record's argument list brings the depth
|
|
37
|
+
* back to 0 early, so the scan reports a record that ends there -- silently
|
|
38
|
+
* TRUNCATED, well short of the record's real (malformed) extent, with the
|
|
39
|
+
* rest of the same record's bytes left looking like orphaned text after it.
|
|
40
|
+
* The truncated span is internally well-formed (it is exactly as long as it
|
|
41
|
+
* is balanced), so a validating splitter given only that span cannot see
|
|
42
|
+
* the truncation either. The guard is structural, not lexical: a located
|
|
43
|
+
* record's closing `)` must be followed (modulo STEP trivia) by `;`, the
|
|
44
|
+
* record terminator. A genuine record always has one there; a truncated one
|
|
45
|
+
* does not, because the bytes that would carry it are still unconsumed
|
|
46
|
+
* argument text.
|
|
47
|
+
*/
|
|
48
|
+
import { StepTokenizer } from '@ifc-lite/parser';
|
|
49
|
+
import { splitTopLevelStepArgs } from './step-args.js';
|
|
50
|
+
/**
|
|
51
|
+
* IFC entity attribute indices (0-based positions in STEP argument list).
|
|
52
|
+
* Standard for all IfcRoot subtypes: GlobalId(0), OwnerHistory(1), Name(2), Description(3).
|
|
53
|
+
* IfcObject subtypes add ObjectType(4). Tag varies by entity type.
|
|
54
|
+
*/
|
|
55
|
+
export const ATTRIBUTE_INDEX = {
|
|
56
|
+
name: 2,
|
|
57
|
+
description: 3,
|
|
58
|
+
objecttype: 4,
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* ISO 10303-21 trivia: whitespace or a `/* ... *\/` comment, either one
|
|
62
|
+
* repeated any number of times. A comment is legal wherever whitespace is,
|
|
63
|
+
* including between a record's class keyword and its `(` -- the gap the
|
|
64
|
+
* line regex on main cannot see past (#4163) -- and between a record's
|
|
65
|
+
* closing `)` and its terminating `;`, which is what the truncation guard
|
|
66
|
+
* below has to skip past.
|
|
67
|
+
*/
|
|
68
|
+
const TRIVIA_RE = /^(?:[ \t\r\n\f\v]|\/\*[\s\S]*?\*\/)*/;
|
|
69
|
+
function skipTrivia(text, i) {
|
|
70
|
+
const m = TRIVIA_RE.exec(text.slice(i));
|
|
71
|
+
return i + (m ? m[0].length : 0);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Walk `recordText` (exactly `#<id><trivia>=<trivia><TYPE><trivia>(...)`, the
|
|
75
|
+
* span `StepTokenizer.scanEntities()` yields) to find where the argument
|
|
76
|
+
* list opens.
|
|
77
|
+
*
|
|
78
|
+
* Composed from the same trivia rule the byte-level scan uses rather than a
|
|
79
|
+
* single `indexOf('(')`, so a comment between the id, the `=` and the class
|
|
80
|
+
* keyword cannot be mistaken for the record's own text -- and a `(` written
|
|
81
|
+
* INSIDE such a comment cannot be mistaken for the argument list's open
|
|
82
|
+
* paren (#4163's first symptom).
|
|
83
|
+
*
|
|
84
|
+
* Returns the index of the record's own `(`, or -1 if `recordText` is not
|
|
85
|
+
* shaped the way the scan promises.
|
|
86
|
+
*/
|
|
87
|
+
function findArgsOpen(recordText) {
|
|
88
|
+
if (recordText[0] !== '#')
|
|
89
|
+
return -1;
|
|
90
|
+
let i = 1;
|
|
91
|
+
const idStart = i;
|
|
92
|
+
while (i < recordText.length && recordText[i] >= '0' && recordText[i] <= '9')
|
|
93
|
+
i++;
|
|
94
|
+
if (i === idStart)
|
|
95
|
+
return -1;
|
|
96
|
+
i = skipTrivia(recordText, i);
|
|
97
|
+
if (recordText[i] !== '=')
|
|
98
|
+
return -1;
|
|
99
|
+
i++;
|
|
100
|
+
i = skipTrivia(recordText, i);
|
|
101
|
+
const typeStart = i;
|
|
102
|
+
while (i < recordText.length && /[A-Za-z0-9_]/.test(recordText[i]))
|
|
103
|
+
i++;
|
|
104
|
+
if (i === typeStart)
|
|
105
|
+
return -1;
|
|
106
|
+
i = skipTrivia(recordText, i);
|
|
107
|
+
return recordText[i] === '(' ? i : -1;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Apply attribute mutations to STEP content via text replacement.
|
|
111
|
+
*
|
|
112
|
+
* For each target entity, locates the record's exact bytes with
|
|
113
|
+
* `StepTokenizer.scanEntities()` (multi-line records, and records with a
|
|
114
|
+
* comment before their `(`, included) and rewrites the attribute at its
|
|
115
|
+
* known slot index using the validating splitter (`splitTopLevelStepArgs`,
|
|
116
|
+
* `./step-args.js`) -- the same one `mutate.ts` uses on main, so a
|
|
117
|
+
* mis-scanned argument list is refused here exactly as it would be there
|
|
118
|
+
* (#4125).
|
|
119
|
+
*
|
|
120
|
+
* Every record this call was asked to mutate is read and validated FIRST;
|
|
121
|
+
* only if every one of them is readable does any rewriting happen, and the
|
|
122
|
+
* function returns the fully rewritten content. If ANY of them cannot be
|
|
123
|
+
* located, its span isn't followed by the STEP record terminator `;`
|
|
124
|
+
* (the truncation guard -- see the module header), or its argument list
|
|
125
|
+
* cannot be split unambiguously, nothing is rewritten and one error names
|
|
126
|
+
* every record that failed. The alternative -- writing the records that
|
|
127
|
+
* were fine and skipping the rest -- is a run that reports success over a
|
|
128
|
+
* file that carries only part of the requested edit.
|
|
129
|
+
*/
|
|
130
|
+
export function applyAttributeMutations(content, mutations, objectTypeEntities) {
|
|
131
|
+
const mutationsByEntity = new Map();
|
|
132
|
+
for (const m of mutations) {
|
|
133
|
+
const id = m.entity.ref.expressId;
|
|
134
|
+
const list = mutationsByEntity.get(id) ?? [];
|
|
135
|
+
list.push({ propName: m.propName, value: m.value });
|
|
136
|
+
mutationsByEntity.set(id, list);
|
|
137
|
+
}
|
|
138
|
+
if (mutationsByEntity.size === 0)
|
|
139
|
+
return content;
|
|
140
|
+
const encoder = new TextEncoder();
|
|
141
|
+
const decoder = new TextDecoder();
|
|
142
|
+
const bytes = encoder.encode(content);
|
|
143
|
+
const located = new Map();
|
|
144
|
+
for (const rec of new StepTokenizer(bytes).scanEntities()) {
|
|
145
|
+
if (mutationsByEntity.has(rec.expressId) && !located.has(rec.expressId)) {
|
|
146
|
+
located.set(rec.expressId, { offset: rec.offset, length: rec.length, type: rec.type.toUpperCase() });
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Every entity is located, guarded and split in ORIGINAL request order, so
|
|
150
|
+
// a run naming several unreadable records lists them in the order they
|
|
151
|
+
// were asked for, not the order the failure happened to be detected in.
|
|
152
|
+
const unreadable = [];
|
|
153
|
+
const readable = [];
|
|
154
|
+
for (const [expressId] of mutationsByEntity) {
|
|
155
|
+
const rec = located.get(expressId);
|
|
156
|
+
if (!rec) {
|
|
157
|
+
unreadable.push(`#${expressId}`);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
// Truncation guard: a genuine record's closing ')' is followed (modulo
|
|
161
|
+
// trivia) by ';'. If it is not, `scanEntities()`'s balanced-paren scan
|
|
162
|
+
// closed this span early -- typically a stray, unmatched ')' inside a
|
|
163
|
+
// malformed argument list -- and the span is shorter than the record
|
|
164
|
+
// actually is.
|
|
165
|
+
//
|
|
166
|
+
// The lookahead window starts at 256 bytes but doubles (capped at 1 MiB)
|
|
167
|
+
// whenever `skipTrivia` stops at a block comment opener (`/*`) that has
|
|
168
|
+
// no closer within the window fetched so far -- that is the signature of
|
|
169
|
+
// a legal comment still open at the window's edge, not of a genuine
|
|
170
|
+
// truncation (`TRIVIA_RE`'s non-greedy `*\/` cannot match past the slice
|
|
171
|
+
// it is given, so the repetition stops BEFORE consuming that comment at
|
|
172
|
+
// all rather than consuming up to the window's end). Refusing on a
|
|
173
|
+
// too-small window would false-refuse a record whose trailing comment
|
|
174
|
+
// merely runs long.
|
|
175
|
+
const tailStart = rec.offset + rec.length;
|
|
176
|
+
let windowSize = 256;
|
|
177
|
+
let tail;
|
|
178
|
+
let afterTrivia;
|
|
179
|
+
for (;;) {
|
|
180
|
+
tail = decoder.decode(bytes.subarray(tailStart, Math.min(tailStart + windowSize, bytes.length)));
|
|
181
|
+
afterTrivia = skipTrivia(tail, 0);
|
|
182
|
+
const openCommentAtWindowEdge = tail[afterTrivia] === '/' &&
|
|
183
|
+
tail[afterTrivia + 1] === '*' &&
|
|
184
|
+
!tail.slice(afterTrivia + 2).includes('*/');
|
|
185
|
+
const moreBytesAvailable = tailStart + windowSize < bytes.length;
|
|
186
|
+
if (!(openCommentAtWindowEdge && moreBytesAvailable) || windowSize >= 1 << 20)
|
|
187
|
+
break;
|
|
188
|
+
windowSize *= 2;
|
|
189
|
+
}
|
|
190
|
+
if (tail[afterTrivia] !== ';') {
|
|
191
|
+
unreadable.push(`#${expressId}=${rec.type}`);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const recordText = decoder.decode(bytes.subarray(rec.offset, rec.offset + rec.length));
|
|
195
|
+
const argsOpen = findArgsOpen(recordText);
|
|
196
|
+
if (argsOpen === -1 || recordText[recordText.length - 1] !== ')') {
|
|
197
|
+
unreadable.push(`#${expressId}=${rec.type}`);
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
const argsText = recordText.slice(argsOpen + 1, recordText.length - 1);
|
|
201
|
+
const args = splitTopLevelStepArgs(argsText);
|
|
202
|
+
if (args === null) {
|
|
203
|
+
unreadable.push(`#${expressId}=${rec.type}`);
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
readable.push({
|
|
207
|
+
expressId,
|
|
208
|
+
type: rec.type,
|
|
209
|
+
argsStart: argsOpen + 1,
|
|
210
|
+
recordText,
|
|
211
|
+
offset: rec.offset,
|
|
212
|
+
length: rec.length,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
const rewrites = new Map();
|
|
216
|
+
for (const rec of readable) {
|
|
217
|
+
const argsText = rec.recordText.slice(rec.argsStart, rec.recordText.length - 1);
|
|
218
|
+
// Re-split rather than threading the result through: cheap (records are
|
|
219
|
+
// short), and keeps this loop free of anything that can itself fail --
|
|
220
|
+
// every possible failure was already surfaced, in order, above.
|
|
221
|
+
const args = splitTopLevelStepArgs(argsText);
|
|
222
|
+
const entityMuts = mutationsByEntity.get(rec.expressId);
|
|
223
|
+
for (const mut of entityMuts) {
|
|
224
|
+
const attrIdx = ATTRIBUTE_INDEX[mut.propName.toLowerCase()];
|
|
225
|
+
if (attrIdx !== undefined && attrIdx < args.length) {
|
|
226
|
+
if (mut.propName.toLowerCase() === 'objecttype' && !objectTypeEntities.has(rec.type)) {
|
|
227
|
+
process.stderr.write(`Warning: attribute "ObjectType" not applicable to ${rec.type} #${rec.expressId}, skipping\n`);
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const escaped = mut.value.replace(/\\/g, '\\\\').replace(/'/g, "''");
|
|
231
|
+
args[attrIdx] = `'${escaped}'`;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
process.stderr.write(`Warning: attribute "${mut.propName}" not recognized for entity #${rec.expressId}\n`);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
const prefix = rec.recordText.slice(0, rec.argsStart);
|
|
238
|
+
rewrites.set(rec.expressId, prefix + args.join(',') + ')');
|
|
239
|
+
}
|
|
240
|
+
if (unreadable.length > 0) {
|
|
241
|
+
throw new Error(`refusing to rewrite ${unreadable.length} record(s) whose STEP text could not be read as a ` +
|
|
242
|
+
`complete argument list: ${unreadable.join(', ')}. Attributes are written by index, so a ` +
|
|
243
|
+
`mis-scanned list would put the value on the wrong attribute and drop the ones it swallowed ` +
|
|
244
|
+
`(LTplus-AG/ifc-lite#4125). Usual causes: an undoubled apostrophe inside a quoted string, an ` +
|
|
245
|
+
`unbalanced parenthesis, a comment inside the argument list, or a record this scan could not ` +
|
|
246
|
+
`locate at all. No output file was written.`);
|
|
247
|
+
}
|
|
248
|
+
// Rewrite from the highest byte offset down, so a length change from an
|
|
249
|
+
// earlier (in file order) edit cannot invalidate an offset recorded for a
|
|
250
|
+
// record not yet processed.
|
|
251
|
+
let outBytes = bytes;
|
|
252
|
+
const ordered = readable
|
|
253
|
+
.filter((r) => rewrites.has(r.expressId) && rewrites.get(r.expressId) !== r.recordText)
|
|
254
|
+
.sort((a, b) => b.offset - a.offset);
|
|
255
|
+
for (const rec of ordered) {
|
|
256
|
+
const rewritten = rewrites.get(rec.expressId);
|
|
257
|
+
const rewrittenBytes = encoder.encode(rewritten);
|
|
258
|
+
const tailStart = rec.offset + rec.length;
|
|
259
|
+
const merged = new Uint8Array(rec.offset + rewrittenBytes.length + (outBytes.length - tailStart));
|
|
260
|
+
merged.set(outBytes.subarray(0, rec.offset), 0);
|
|
261
|
+
merged.set(rewrittenBytes, rec.offset);
|
|
262
|
+
merged.set(outBytes.subarray(tailStart), rec.offset + rewrittenBytes.length);
|
|
263
|
+
outBytes = merged;
|
|
264
|
+
}
|
|
265
|
+
return decoder.decode(outBytes);
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=mutate-step-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutate-step-record.js","sourceRoot":"","sources":["../../src/commands/mutate-step-record.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { PropertyValueType } from '@ifc-lite/data';
|
|
2
|
+
import { ATTRIBUTE_INDEX, applyAttributeMutations } from './mutate-step-record.js';
|
|
3
|
+
export { ATTRIBUTE_INDEX, applyAttributeMutations };
|
|
2
4
|
/**
|
|
3
5
|
* Parse a --where filter string.
|
|
4
6
|
*/
|
|
@@ -44,29 +46,4 @@ export declare function mutateCommand(args: string[]): Promise<void>;
|
|
|
44
46
|
* ObjectType on the same entities.
|
|
45
47
|
*/
|
|
46
48
|
export declare function entitiesWithObjectType(schema: string): Promise<ReadonlySet<string>>;
|
|
47
|
-
/**
|
|
48
|
-
* Apply attribute mutations to STEP content via text replacement.
|
|
49
|
-
* For each target entity, finds its STEP line and replaces the attribute at the known index.
|
|
50
|
-
*
|
|
51
|
-
* THROWS rather than rewriting a record whose text this pass cannot read. The
|
|
52
|
-
* write below is BY INDEX, so it is only correct if `args[2]` really is the
|
|
53
|
-
* record's third attribute; when the scan lost its place `args` still has parts
|
|
54
|
-
* and the write still lands somewhere, silently (#4125, #2470). What a mis-scan
|
|
55
|
-
* looks like, and why `splitTopLevelStepArgs` refuses one, is in
|
|
56
|
-
* `step-args.ts`'s header.
|
|
57
|
-
*
|
|
58
|
-
* Throwing, not skipping-and-reporting, because this command's whole output is
|
|
59
|
-
* a FILE: a skip writes one that looks like what was asked for and is missing
|
|
60
|
-
* the edit, under a `Mutated 1 entities` line. The throw reaches `main().catch`
|
|
61
|
-
* in `index.ts`, which prints `Error [mutate]: ...` and exits 1 with no output
|
|
62
|
-
* file, so exit code and filesystem agree. The `Warning: ... skipping` paths
|
|
63
|
-
* below stay warnings, and they are not both about the request: one names an attribute
|
|
64
|
-
* the SCHEMA does not give that entity, the other ALSO fires when the record has fewer
|
|
65
|
-
* arguments than the attribute index. Both stay warnings because the record was read.
|
|
66
|
-
*/
|
|
67
|
-
export declare function applyAttributeMutations(content: string, mutations: {
|
|
68
|
-
entity: any;
|
|
69
|
-
propName: string;
|
|
70
|
-
value: string;
|
|
71
|
-
}[], objectTypeEntities: ReadonlySet<string>): string;
|
|
72
49
|
//# sourceMappingURL=mutate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutate.d.ts","sourceRoot":"","sources":["../../src/commands/mutate.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,iBAAiB,EAAwC,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"mutate.d.ts","sourceRoot":"","sources":["../../src/commands/mutate.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,iBAAiB,EAAwC,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAInF,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,CAAC;AAEpD;;GAEG;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,CAiBzH;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAyB9H;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAAC,SAAS,EAAE,iBAAiB,CAAA;CAAE,CAW/G;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAgBvF;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA0JjE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAUzF"}
|
package/dist/commands/mutate.js
CHANGED
|
@@ -14,7 +14,10 @@ import { MutablePropertyView } from '@ifc-lite/mutations';
|
|
|
14
14
|
import { StepExporter } from '@ifc-lite/export';
|
|
15
15
|
import { extractPropertiesOnDemand, extractQuantitiesOnDemand } from '@ifc-lite/parser';
|
|
16
16
|
import { PropertyValueType, findAttribute } from '@ifc-lite/data';
|
|
17
|
-
import {
|
|
17
|
+
import { ATTRIBUTE_INDEX, applyAttributeMutations } from './mutate-step-record.js';
|
|
18
|
+
// Re-exported so `mutate.test.ts` keeps importing these straight from
|
|
19
|
+
// `./mutate.js`; the implementation lives in the sibling module above.
|
|
20
|
+
export { ATTRIBUTE_INDEX, applyAttributeMutations };
|
|
18
21
|
/**
|
|
19
22
|
* Parse a --where filter string.
|
|
20
23
|
*/
|
|
@@ -246,16 +249,6 @@ export async function mutateCommand(args) {
|
|
|
246
249
|
process.stderr.write(`Written to ${outPath} (${result.stats.entityCount} entities, ${result.stats.newEntityCount} new)\n`);
|
|
247
250
|
}
|
|
248
251
|
}
|
|
249
|
-
/**
|
|
250
|
-
* IFC entity attribute indices (0-based positions in STEP argument list).
|
|
251
|
-
* Standard for all IfcRoot subtypes: GlobalId(0), OwnerHistory(1), Name(2), Description(3).
|
|
252
|
-
* IfcObject subtypes add ObjectType(4). Tag varies by entity type.
|
|
253
|
-
*/
|
|
254
|
-
const ATTRIBUTE_INDEX = {
|
|
255
|
-
name: 2,
|
|
256
|
-
description: 3,
|
|
257
|
-
objecttype: 4,
|
|
258
|
-
};
|
|
259
252
|
/**
|
|
260
253
|
* IFC types that define an ObjectType attribute, read from the bundled
|
|
261
254
|
* buildingSMART schema for the file's own version.
|
|
@@ -279,90 +272,4 @@ export async function entitiesWithObjectType(schema) {
|
|
|
279
272
|
// a complex type; both mean the slot exists on that entity.
|
|
280
273
|
return new Set([...(attr?.simpleValueEntities ?? []), ...(attr?.complexEntities ?? [])]);
|
|
281
274
|
}
|
|
282
|
-
/**
|
|
283
|
-
* Apply attribute mutations to STEP content via text replacement.
|
|
284
|
-
* For each target entity, finds its STEP line and replaces the attribute at the known index.
|
|
285
|
-
*
|
|
286
|
-
* THROWS rather than rewriting a record whose text this pass cannot read. The
|
|
287
|
-
* write below is BY INDEX, so it is only correct if `args[2]` really is the
|
|
288
|
-
* record's third attribute; when the scan lost its place `args` still has parts
|
|
289
|
-
* and the write still lands somewhere, silently (#4125, #2470). What a mis-scan
|
|
290
|
-
* looks like, and why `splitTopLevelStepArgs` refuses one, is in
|
|
291
|
-
* `step-args.ts`'s header.
|
|
292
|
-
*
|
|
293
|
-
* Throwing, not skipping-and-reporting, because this command's whole output is
|
|
294
|
-
* a FILE: a skip writes one that looks like what was asked for and is missing
|
|
295
|
-
* the edit, under a `Mutated 1 entities` line. The throw reaches `main().catch`
|
|
296
|
-
* in `index.ts`, which prints `Error [mutate]: ...` and exits 1 with no output
|
|
297
|
-
* file, so exit code and filesystem agree. The `Warning: ... skipping` paths
|
|
298
|
-
* below stay warnings, and they are not both about the request: one names an attribute
|
|
299
|
-
* the SCHEMA does not give that entity, the other ALSO fires when the record has fewer
|
|
300
|
-
* arguments than the attribute index. Both stay warnings because the record was read.
|
|
301
|
-
*/
|
|
302
|
-
export function applyAttributeMutations(content, mutations, objectTypeEntities) {
|
|
303
|
-
// Group mutations by expressId for efficient single-pass replacement
|
|
304
|
-
const mutationsByEntity = new Map();
|
|
305
|
-
for (const m of mutations) {
|
|
306
|
-
const id = m.entity.ref.expressId;
|
|
307
|
-
const list = mutationsByEntity.get(id) ?? [];
|
|
308
|
-
list.push({ propName: m.propName, value: m.value });
|
|
309
|
-
mutationsByEntity.set(id, list);
|
|
310
|
-
}
|
|
311
|
-
// Records this pass was asked to rewrite and could not read. Collected
|
|
312
|
-
// rather than thrown on first sight so one run names every one of them.
|
|
313
|
-
const unreadable = [];
|
|
314
|
-
const lines = content.split('\n');
|
|
315
|
-
for (let i = 0; i < lines.length; i++) {
|
|
316
|
-
const line = lines[i];
|
|
317
|
-
// Match entity lines: #123=IFCTYPE(...);
|
|
318
|
-
const match = line.match(/^#(\d+)\s*=\s*(\w+)\s*\(/);
|
|
319
|
-
if (!match)
|
|
320
|
-
continue;
|
|
321
|
-
const expressId = parseInt(match[1], 10);
|
|
322
|
-
const entityType = match[2].toUpperCase();
|
|
323
|
-
const entityMuts = mutationsByEntity.get(expressId);
|
|
324
|
-
if (!entityMuts)
|
|
325
|
-
continue;
|
|
326
|
-
// Parse the STEP argument list (handle nested parens and quoted strings)
|
|
327
|
-
const argsStart = line.indexOf('(');
|
|
328
|
-
const argsEnd = line.lastIndexOf(')');
|
|
329
|
-
// A record wrapped across lines is caught rather than truncated: `argsEnd`
|
|
330
|
-
// is the LAST ')' on the line and the slice EXCLUDES it, so the nested list
|
|
331
|
-
// that ')' closed is left open and the split refuses. The exporter re-emits
|
|
332
|
-
// source lines verbatim, so a wrapped record from the input reaches here
|
|
333
|
-
// intact, and used to be skipped in silence while the run reported the
|
|
334
|
-
// mutation as done.
|
|
335
|
-
const args = argsEnd > argsStart ? splitTopLevelStepArgs(line.slice(argsStart + 1, argsEnd)) : null;
|
|
336
|
-
if (args === null) {
|
|
337
|
-
unreadable.push(`#${expressId}=${entityType}`);
|
|
338
|
-
continue;
|
|
339
|
-
}
|
|
340
|
-
for (const mut of entityMuts) {
|
|
341
|
-
const attrIdx = ATTRIBUTE_INDEX[mut.propName.toLowerCase()];
|
|
342
|
-
if (attrIdx !== undefined && attrIdx < args.length) {
|
|
343
|
-
// Validate ObjectType is only written to entities that define it
|
|
344
|
-
if (mut.propName.toLowerCase() === 'objecttype' && !objectTypeEntities.has(entityType)) {
|
|
345
|
-
process.stderr.write(`Warning: attribute "ObjectType" not applicable to ${entityType} #${expressId}, skipping\n`);
|
|
346
|
-
continue;
|
|
347
|
-
}
|
|
348
|
-
// Escape for STEP format and wrap in quotes
|
|
349
|
-
const escaped = mut.value.replace(/\\/g, '\\\\').replace(/'/g, "''");
|
|
350
|
-
args[attrIdx] = `'${escaped}'`;
|
|
351
|
-
}
|
|
352
|
-
else {
|
|
353
|
-
process.stderr.write(`Warning: attribute "${mut.propName}" not recognized for entity #${expressId}\n`);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
lines[i] = line.slice(0, argsStart + 1) + args.join(',') + line.slice(argsEnd);
|
|
357
|
-
}
|
|
358
|
-
if (unreadable.length > 0) {
|
|
359
|
-
throw new Error(`refusing to rewrite ${unreadable.length} record(s) whose STEP text could not be read as a ` +
|
|
360
|
-
`complete argument list: ${unreadable.join(', ')}. Attributes are written by index, so a ` +
|
|
361
|
-
`mis-scanned list would put the value on the wrong attribute and drop the ones it swallowed ` +
|
|
362
|
-
`(LTplus-AG/ifc-lite#4125). Usual causes: an undoubled apostrophe inside a quoted string, an ` +
|
|
363
|
-
`unbalanced parenthesis, a comment inside the argument list, or a record spanning several ` +
|
|
364
|
-
`lines. No output file was written.`);
|
|
365
|
-
}
|
|
366
|
-
return lines.join('\n');
|
|
367
|
-
}
|
|
368
275
|
//# sourceMappingURL=mutate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mutate.js","sourceRoot":"","sources":["../../src/commands/mutate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"mutate.js","sourceRoot":"","sources":["../../src/commands/mutate.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAe,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAyB,MAAM,gBAAgB,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEnF,sEAAsE;AACtE,uEAAuE;AACvE,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,CAAC;AAEpD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,KAAK,CAAC,4BAA4B,MAAM,wCAAwC,CAAC,CAAC;IACpF,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,KAAK,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC/B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9C,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC1D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;QACf,KAAK,CAAC,0BAA0B,MAAM,6DAA6D,CAAC,CAAC;IACvG,CAAC;IAED,4EAA4E;IAC5E,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,KAAK,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACtC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAChE,CAAC;IAED,gCAAgC;IAChC,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,0BAA0B,MAAM,sCAAsC,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IACxC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;IACrF,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,CAAC,OAAO,EAAE,CAAC;IACvF,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI;SACtF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,iBAAiB,CAAC,MAAM,EAAE,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAW,EAAE,QAAgB,EAAE,QAAiB;IAC5E,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,MAAM,IAAI,IAAI,CAAC;IACjD,IAAI,MAAM,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC;IACrD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC3D,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC;QACrF,KAAK,IAAI,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC;QACtF,KAAK,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7D,KAAK,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7D,KAAK,IAAI,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,KAAK,IAAI,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/D,KAAK,UAAU,CAAC,CAAC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACtF,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAc;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ;QAAE,KAAK,CAAC,2FAA2F,CAAC,CAAC;IAElH,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,KAAK,CAAC,0FAA0F,CAAC,CAAC;IAC5H,IAAI,CAAC,OAAO;QAAE,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAEpE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAChC,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzD,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,sDAAsD;IACtD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAE7D,uBAAuB;IACvB,IAAI,OAAO,GAAU,EAAE,CAAC;IAExB,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,MAAM;YAAE,KAAK,CAAC,WAAW,SAAS,YAAY,CAAC,CAAC;QACrD,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,8DAA8D;QAC9D,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC9C,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACzB,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC;YACxG,MAAM,QAAQ,GAAG,KAAK,GAAG,OAAO,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,OAAO,QAAQ,QAAQ,KAAK,CAAC,CAAC;YACjF,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC;QAC/C,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC5C,oCAAoC;YACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE;gBAC7C,sBAAsB;gBACtB,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAClC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAC3E,IAAI,IAAI,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC;4BAAE,OAAO,IAAI,CAAC;oBACpF,CAAC;gBACH,CAAC;gBACD,8CAA8C;gBAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBACpC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;wBAClC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;wBAC1E,IAAI,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC;4BAAE,OAAO,IAAI,CAAC;oBAClF,CAAC;gBACH,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YACH,OAAO,GAAG,QAAQ,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,8DAA8D,CAAC,CAAC;IACxE,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACnD,CAAC;IAED,sEAAsE;IACtE,MAAM,YAAY,GAAG,IAAI,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9D,YAAY,CAAC,oBAAoB,CAAC,CAAC,QAAgB,EAAE,EAAE;QACrD,OAAO,yBAAyB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,uEAAuE;IACvE,2DAA2D;IAC3D,8EAA8E;IAC9E,8EAA8E;IAC9E,4EAA4E;IAC5E,6EAA6E;IAC7E,8CAA8C;IAC9C,YAAY,CAAC,oBAAoB,CAAC,CAAC,QAAgB,EAAE,EAAE;QACrD,OAAO,yBAAyB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,+CAA+C;IAC/C,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,kBAAkB,GAAuD,EAAE,CAAC;IAElF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;gBACpB,yDAAyD;gBACzD,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;YAChF,CAAC;iBAAM,CAAC;gBACN,YAAY,CAAC,WAAW,CACtB,MAAM,CAAC,GAAG,CAAC,SAAS,EACpB,GAAG,CAAC,QAAS,EACb,GAAG,CAAC,QAAQ,EACZ,GAAG,CAAC,OAAO,EACX,GAAG,CAAC,SAAS,CACd,CAAC;YACJ,CAAC;QACH,CAAC;QACD,YAAY,EAAE,CAAC;IACjB,CAAC;IAED,iDAAiD;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,aAAa,IAAI,MAAM,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QAC7B,MAAM,EAAE,MAA+C;QACvD,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IAEH,0DAA0D;IAC1D,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,aAAa,GAAG,uBAAuB,CAC3C,WAAW,EACX,kBAAkB,EAClB,MAAM,sBAAsB,CAAC,MAAM,CAAC,CACrC,CAAC;QACF,MAAM,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACtC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,CAC3D,CAAC;IACF,IAAI,UAAU,EAAE,CAAC;QACf,SAAS,CAAC;YACR,OAAO,EAAE,YAAY;YACrB,UAAU,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC1C,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO;aAC5B,CAAC,CAAC;YACH,MAAM,EAAE,OAAO;YACf,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YAChF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,YAAY,cAAc,IAAI,MAAM,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;QACrF,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,OAAO,KAAK,MAAM,CAAC,KAAK,CAAC,WAAW,cAAc,MAAM,CAAC,KAAK,CAAC,cAAc,SAAS,CAAC,CAAC;IAC7H,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAc;IACzD,2EAA2E;IAC3E,4EAA4E;IAC5E,iEAAiE;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAqB,CAAC;IAC1E,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACxD,4EAA4E;IAC5E,4DAA4D;IAC5D,OAAO,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,mBAAmB,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC3F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-output.d.ts","sourceRoot":"","sources":["../../src/commands/query-output.ts"],"names":[],"mappings":"AAaA,mCAAmC;AACnC,eAAO,MAAM,mBAAmB,UAAiC,CAAC;AAElE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAMpE;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAqGpG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAwDzI;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"query-output.d.ts","sourceRoot":"","sources":["../../src/commands/query-output.ts"],"names":[],"mappings":"AAaA,mCAAmC;AACnC,eAAO,MAAM,mBAAmB,UAAiC,CAAC;AAElE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAMpE;AAED,wBAAgB,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAqGpG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAwDzI;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAwHrM;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAoCtG;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAG,IAAI,CAyCnG"}
|
|
@@ -234,6 +234,12 @@ export function outputGroupBy(entities, groupByKey, sumQuantity, bim, jsonOutput
|
|
|
234
234
|
// Compute per-group aggregation if a quantity is specified alongside --group-by
|
|
235
235
|
const mode = aggMode ?? 'sum';
|
|
236
236
|
const groupAgg = new Map();
|
|
237
|
+
// #4252: how many of the group's entities actually carried `sumQuantity`
|
|
238
|
+
// (getQuantityValue returned non-null). A group where this is 0 has NO
|
|
239
|
+
// data for the quantity — its aggregated value below is a fabricated 0,
|
|
240
|
+
// not a real sum/avg/min/max, and must be told apart from a group whose
|
|
241
|
+
// real aggregate genuinely computes to 0.
|
|
242
|
+
const groupMatched = new Map();
|
|
237
243
|
if (sumQuantity) {
|
|
238
244
|
for (const [key, groupEntities] of groups) {
|
|
239
245
|
const vals = [];
|
|
@@ -242,8 +248,10 @@ export function outputGroupBy(entities, groupByKey, sumQuantity, bim, jsonOutput
|
|
|
242
248
|
if (val !== null)
|
|
243
249
|
vals.push(val);
|
|
244
250
|
}
|
|
245
|
-
// Shared finite-guarded reduction; an empty group stays 0 here
|
|
251
|
+
// Shared finite-guarded reduction; an empty group stays 0 here, but
|
|
252
|
+
// groupMatched (below) records that it is a fabricated 0.
|
|
246
253
|
groupAgg.set(key, aggregateFinite(vals, mode) ?? 0);
|
|
254
|
+
groupMatched.set(key, vals.length);
|
|
247
255
|
}
|
|
248
256
|
}
|
|
249
257
|
const modeLabel = mode === 'sum' ? 'sum' : mode;
|
|
@@ -255,8 +263,15 @@ export function outputGroupBy(entities, groupByKey, sumQuantity, bim, jsonOutput
|
|
|
255
263
|
entries = entries.slice(0, groupLimit);
|
|
256
264
|
for (const [key, groupEntities] of entries) {
|
|
257
265
|
const entry = { count: groupEntities.length };
|
|
258
|
-
if (sumQuantity)
|
|
266
|
+
if (sumQuantity) {
|
|
259
267
|
entry[sumQuantity] = groupAgg.get(key) ?? 0;
|
|
268
|
+
// #4252: always present alongside sumQuantity (all four aggregation
|
|
269
|
+
// modes share the same "0 matched" ambiguity, not just avg) so a
|
|
270
|
+
// JSON consumer can tell a real 0 from a group with no quantity
|
|
271
|
+
// data at all: matchedEntities === 0 means the number above is
|
|
272
|
+
// fabricated, not measured.
|
|
273
|
+
entry.matchedEntities = groupMatched.get(key) ?? 0;
|
|
274
|
+
}
|
|
260
275
|
if (sumQuantity && mode !== 'sum')
|
|
261
276
|
entry.aggregation = mode;
|
|
262
277
|
result[key] = entry;
|
|
@@ -272,17 +287,29 @@ export function outputGroupBy(entities, groupByKey, sumQuantity, bim, jsonOutput
|
|
|
272
287
|
for (const [key, groupEntities] of sorted) {
|
|
273
288
|
if (sumQuantity) {
|
|
274
289
|
const agg = groupAgg.get(key) ?? 0;
|
|
275
|
-
|
|
290
|
+
const matchedCount = groupMatched.get(key) ?? 0;
|
|
291
|
+
// #4252: annotate a group whose aggregate is fabricated (no entity
|
|
292
|
+
// in the group carried this quantity at all) so the text rendering
|
|
293
|
+
// agrees with the --json matchedEntities field, instead of printing
|
|
294
|
+
// a bare 0 indistinguishable from a real zero aggregate.
|
|
295
|
+
const noData = matchedCount === 0 ? ' (no data)' : '';
|
|
296
|
+
process.stdout.write(` ${key}: ${groupEntities.length} elements, ${sumQuantity} ${modeLabel}: ${mode === 'avg' ? agg.toFixed(4) : agg}${noData}\n`);
|
|
276
297
|
}
|
|
277
298
|
else {
|
|
278
299
|
process.stdout.write(` ${key}: ${groupEntities.length}\n`);
|
|
279
300
|
}
|
|
280
301
|
}
|
|
281
302
|
if (sumQuantity) {
|
|
282
|
-
const
|
|
303
|
+
const totalMatched = [...groupMatched.values()].reduce((a, b) => a + b, 0);
|
|
283
304
|
process.stdout.write(`\n Total: ${entities.length} entities in ${groups.size} groups\n`);
|
|
284
|
-
|
|
285
|
-
|
|
305
|
+
// #4252: warn only when NO group in the result matched any quantity
|
|
306
|
+
// data — the prior check compared the grand total to 0, which both
|
|
307
|
+
// missed a mix of real-data and no-data groups (the ones with data
|
|
308
|
+
// could sum to nonzero and mask a same-run no-data group) and
|
|
309
|
+
// false-flagged a real aggregate that legitimately cancels to 0
|
|
310
|
+
// (e.g. sum of [-5, 5]).
|
|
311
|
+
if (totalMatched === 0 && entities.length > 0) {
|
|
312
|
+
process.stderr.write(`\n Warning: No ${sumQuantity} quantity data found for any entity. The values above are 0 because none was found, not because the property genuinely measures 0.\n`);
|
|
286
313
|
}
|
|
287
314
|
process.stdout.write('\n');
|
|
288
315
|
}
|