@hyperscale0/udl 3.0.2 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,245 @@
1
+ const integer = { kind: "integer" };
2
+ const boolean = { kind: "boolean" };
3
+ const date = { kind: "date" };
4
+ const same = (a, b) => a.kind === b.kind &&
5
+ (a.kind !== "money" || (b.kind === "money" && a.currency === b.currency));
6
+ function requireType(types, name) {
7
+ const value = types.get(name);
8
+ if (!value)
9
+ throw new Error(`Unknown reporting field or expression ${name}`);
10
+ return value;
11
+ }
12
+ function requireRule(condition, message) {
13
+ if (!condition)
14
+ throw new Error(message);
15
+ }
16
+ export function reportExpressionTypes(expressions, initial) {
17
+ const types = new Map(initial);
18
+ for (const expression of expressions) {
19
+ requireRule(!types.has(expression.id), `Duplicate expression ${expression.id}`);
20
+ const read = (name) => requireType(types, name);
21
+ let result;
22
+ switch (expression.op) {
23
+ case "field":
24
+ result = read(expression.path);
25
+ break;
26
+ case "parameter":
27
+ result = date;
28
+ break;
29
+ case "literal": {
30
+ result = expression.type;
31
+ const value = expression.value;
32
+ requireRule(result.kind === "money"
33
+ ? typeof value === "string" && /^(0|[1-9][0-9]{0,17})$/.test(value)
34
+ : result.kind === "integer"
35
+ ? typeof value === "number" && Number.isSafeInteger(value)
36
+ : result.kind === "boolean"
37
+ ? typeof value === "boolean"
38
+ : result.kind === "date"
39
+ ? typeof value === "string" &&
40
+ Number.isFinite(Date.parse(value))
41
+ : typeof value === "string", `Invalid literal ${expression.id}`);
42
+ break;
43
+ }
44
+ case "not":
45
+ requireRule(read(expression.value).kind === "boolean", "not requires boolean");
46
+ result = boolean;
47
+ break;
48
+ case "choose": {
49
+ requireRule(read(expression.condition).kind === "boolean", "choose requires boolean");
50
+ result = read(expression.yes);
51
+ requireRule(same(result, read(expression.no)), "choose branches must have matching types and currencies");
52
+ break;
53
+ }
54
+ case "bucket":
55
+ requireRule(read(expression.value).kind === "date", "bucket requires date");
56
+ result = { kind: "text" };
57
+ break;
58
+ case "ratio": {
59
+ const numerator = read(expression.numerator), denominator = read(expression.denominator);
60
+ requireRule(same(numerator, denominator) &&
61
+ ["money", "integer"].includes(numerator.kind), "ratio needs matching numeric measures");
62
+ result = integer;
63
+ break;
64
+ }
65
+ default: {
66
+ const left = read(expression.left), right = read(expression.right);
67
+ requireRule(same(left, right), `Incompatible types or currencies in ${expression.id}`);
68
+ if (["equal", "less", "atMost"].includes(expression.op))
69
+ result = boolean;
70
+ else if (expression.op === "and" || expression.op === "or") {
71
+ requireRule(left.kind === "boolean", "Boolean operation requires booleans");
72
+ result = boolean;
73
+ }
74
+ else if (expression.op === "daysBetween") {
75
+ requireRule(left.kind === "date", "daysBetween requires dates");
76
+ result = integer;
77
+ }
78
+ else {
79
+ requireRule(["money", "integer"].includes(left.kind), "Arithmetic requires numeric measures");
80
+ result = left;
81
+ }
82
+ }
83
+ }
84
+ types.set(expression.id, result);
85
+ }
86
+ return types;
87
+ }
88
+ function aggregateTypes(aggregates, input, target) {
89
+ for (const aggregate of aggregates) {
90
+ requireRule(!target.has(aggregate.name), `Duplicate aggregate ${aggregate.name}`);
91
+ const type = aggregate.op === "count"
92
+ ? integer
93
+ : requireType(input, aggregate.value ?? "");
94
+ requireRule(!["sum", "average"].includes(aggregate.op) ||
95
+ ["money", "integer"].includes(type.kind), "sum requires numeric values");
96
+ requireRule(aggregate.op !== "count" || aggregate.value === undefined, "count has no value field");
97
+ requireRule(aggregate.op === "average"
98
+ ? aggregate.rounding !== undefined
99
+ : aggregate.rounding === undefined, "Only average requires an explicit rounding policy");
100
+ target.set(aggregate.name, type);
101
+ }
102
+ }
103
+ /** Used by compilation and replay, never a report-name dispatch. */
104
+ export function validateReportDefinition(report, document) {
105
+ requireRule(report.scope.currency === document.currency, "Report currency differs from Product currency");
106
+ const datasets = new Map();
107
+ for (const dataset of report.datasets) {
108
+ requireRule(!datasets.has(dataset.id), `Duplicate dataset ${dataset.id}`);
109
+ const fields = new Map();
110
+ for (const column of dataset.columns) {
111
+ requireRule(!fields.has(column.name), `Duplicate column ${column.name}`);
112
+ if (column.type.kind === "money")
113
+ requireRule(column.type.currency === report.scope.currency, "Incompatible dataset currency");
114
+ if (dataset.source === "instrument") {
115
+ requireRule(report.scope.kind === "product", "Company instrument reports require cross-Build bindings");
116
+ requireRule(dataset.instruments.length > 0, "Instrument source requires declared instruments");
117
+ for (const id of dataset.instruments) {
118
+ const instrument = document.instruments.find((entry) => entry.id === id);
119
+ requireRule(instrument, `Unknown report instrument ${id}`);
120
+ const parts = column.field.split(".");
121
+ const field = instrument.fields.find((entry) => entry.name === parts[0]);
122
+ const sealed = { id: "text", status: "text", createdAt: "date" }[column.field];
123
+ const actual = parts.length === 2 &&
124
+ parts[1] === "balance" &&
125
+ field?.type === "account"
126
+ ? "money"
127
+ : (sealed ??
128
+ (field && ["ref", "account", "enum"].includes(field.type)
129
+ ? "text"
130
+ : field?.type));
131
+ requireRule(actual === column.type.kind, `Unknown or mistyped report field ${id}.${column.field}`);
132
+ }
133
+ }
134
+ else {
135
+ requireRule(dataset.instruments.length === 0, "Only instrument sources bind instruments");
136
+ const sourceFields = {
137
+ account: {
138
+ id: "text",
139
+ ownerParticipantId: "text",
140
+ currency: "text",
141
+ role: "text",
142
+ status: "text",
143
+ createdAt: "date",
144
+ balance: "money",
145
+ },
146
+ identity: {
147
+ id: "text",
148
+ entityId: "text",
149
+ participantId: "text",
150
+ status: "text",
151
+ createdAt: "date",
152
+ },
153
+ operation: {
154
+ id: "text",
155
+ name: "text",
156
+ status: "text",
157
+ createdAt: "date",
158
+ },
159
+ };
160
+ requireRule(sourceFields[dataset.source]?.[column.field] === column.type.kind, `Unknown or mistyped ${dataset.source} field ${column.field}`);
161
+ }
162
+ fields.set(column.name, column.type);
163
+ }
164
+ requireRule(requireType(fields, dataset.rowKey).kind === "text", "Row key must be text");
165
+ const types = reportExpressionTypes(dataset.expressions, fields);
166
+ if (dataset.selection)
167
+ requireRule(requireType(types, dataset.selection).kind === "boolean", "Selection must be boolean");
168
+ if (dataset.selection)
169
+ validateSourceKey(dataset, dataset.selection);
170
+ datasets.set(dataset.id, types);
171
+ }
172
+ const aggregateNames = [
173
+ ...report.calculation.joins.flatMap((join) => join.aggregates),
174
+ ...report.calculation.aggregates,
175
+ ].map((aggregate) => aggregate.name);
176
+ requireRule(new Set(aggregateNames).size === aggregateNames.length, "Aggregate names must be unique across stages for null accounting");
177
+ const primary = datasets.get(report.selection.dataset);
178
+ requireRule(primary, "Unknown primary dataset");
179
+ let types = new Map(primary);
180
+ const joined = new Set();
181
+ for (const join of report.calculation.joins) {
182
+ requireRule(!joined.has(join.dataset), "Duplicate join requires a distinct dataset alias");
183
+ requireRule(join.dataset !== report.selection.dataset, "Self joins require a distinct dataset alias");
184
+ joined.add(join.dataset);
185
+ const foreign = datasets.get(join.dataset);
186
+ requireRule(foreign, `Unknown joined dataset ${join.dataset}`);
187
+ validateSourceKey(report.datasets.find((dataset) => dataset.id === join.dataset), join.foreign);
188
+ requireRule(same(requireType(types, join.local), requireType(foreign, join.foreign)), "Join keys have incompatible types");
189
+ requireRule(join.aggregates.length > 0, "Joins must declare aggregates; implicit row multiplication is forbidden");
190
+ aggregateTypes(join.aggregates, foreign, types);
191
+ }
192
+ types = reportExpressionTypes(report.calculation.expressions, types);
193
+ if (report.selection.predicate)
194
+ requireRule(requireType(types, report.selection.predicate).kind === "boolean", "Selection must be boolean");
195
+ for (const required of report.validation.required)
196
+ requireType(types, required);
197
+ for (const pair of report.validation.rowReconcile)
198
+ requireRule(same(requireType(types, pair.left), requireType(types, pair.right)), "Row reconciliation requires matching measures");
199
+ if (report.calculation.aggregates.length) {
200
+ const grouped = new Map(report.calculation.groupBy.map((key) => [key, requireType(types, key)]));
201
+ aggregateTypes(report.calculation.aggregates, types, grouped);
202
+ types = grouped;
203
+ }
204
+ else
205
+ requireRule(report.calculation.groupBy.length === 0, "Grouping requires aggregates");
206
+ types = reportExpressionTypes(report.calculation.resultExpressions, types);
207
+ for (const pair of report.validation.reconcile)
208
+ requireRule(same(requireType(types, pair.left), requireType(types, pair.right)), "Reconciliation requires matching measures");
209
+ const outputs = new Set();
210
+ for (const column of report.output.columns) {
211
+ requireRule(!outputs.has(column.name), "Duplicate output column");
212
+ outputs.add(column.name);
213
+ requireRule(same(requireType(types, column.name), column.type), `Output type differs for ${column.name}`);
214
+ }
215
+ for (const sort of report.output.sort)
216
+ requireRule(outputs.has(sort), `Sort key ${sort} must be an output column`);
217
+ }
218
+ function validateSourceKey(dataset, key, seen = new Set()) {
219
+ if (seen.has(key))
220
+ return;
221
+ seen.add(key);
222
+ const column = dataset.columns.find((entry) => entry.name === key);
223
+ if (column) {
224
+ requireRule(column.field !== "balance" && !column.field.endsWith(".balance"), "Source selection and join keys cannot depend on ledger balances");
225
+ return;
226
+ }
227
+ const expression = dataset.expressions.find((entry) => entry.id === key);
228
+ requireRule(expression, `Unknown source key ${key}`);
229
+ requireRule(expression.op !== "ratio", "Ratios belong after source selection");
230
+ const read = (name) => validateSourceKey(dataset, name, seen);
231
+ if (expression.op === "field")
232
+ read(expression.path);
233
+ else if (expression.op === "choose") {
234
+ read(expression.condition);
235
+ read(expression.yes);
236
+ read(expression.no);
237
+ }
238
+ else if (expression.op === "not" || expression.op === "bucket")
239
+ read(expression.value);
240
+ else if ("left" in expression) {
241
+ read(expression.left);
242
+ read(expression.right);
243
+ }
244
+ }
245
+ //# sourceMappingURL=reporting-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporting-validation.js","sourceRoot":"","sources":["../src/reporting-validation.ts"],"names":[],"mappings":"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"}