@bilig/formula 0.1.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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +16 -0
  3. package/dist/addressing.d.ts +66 -0
  4. package/dist/addressing.js +179 -0
  5. package/dist/addressing.js.map +1 -0
  6. package/dist/ast.d.ts +74 -0
  7. package/dist/ast.js +2 -0
  8. package/dist/ast.js.map +1 -0
  9. package/dist/binder.d.ts +13 -0
  10. package/dist/binder.js +1700 -0
  11. package/dist/binder.js.map +1 -0
  12. package/dist/builtin-capabilities.d.ts +19 -0
  13. package/dist/builtin-capabilities.js +861 -0
  14. package/dist/builtin-capabilities.js.map +1 -0
  15. package/dist/builtins/complex.d.ts +10 -0
  16. package/dist/builtins/complex.js +407 -0
  17. package/dist/builtins/complex.js.map +1 -0
  18. package/dist/builtins/convert.d.ts +3 -0
  19. package/dist/builtins/convert.js +362 -0
  20. package/dist/builtins/convert.js.map +1 -0
  21. package/dist/builtins/datetime.d.ts +23 -0
  22. package/dist/builtins/datetime.js +1096 -0
  23. package/dist/builtins/datetime.js.map +1 -0
  24. package/dist/builtins/distribution-builtins.d.ts +16 -0
  25. package/dist/builtins/distribution-builtins.js +517 -0
  26. package/dist/builtins/distribution-builtins.js.map +1 -0
  27. package/dist/builtins/distributions.d.ts +34 -0
  28. package/dist/builtins/distributions.js +722 -0
  29. package/dist/builtins/distributions.js.map +1 -0
  30. package/dist/builtins/financial-builtins.d.ts +16 -0
  31. package/dist/builtins/financial-builtins.js +324 -0
  32. package/dist/builtins/financial-builtins.js.map +1 -0
  33. package/dist/builtins/financial.d.ts +11 -0
  34. package/dist/builtins/financial.js +241 -0
  35. package/dist/builtins/financial.js.map +1 -0
  36. package/dist/builtins/fixed-income-builtins.d.ts +14 -0
  37. package/dist/builtins/fixed-income-builtins.js +598 -0
  38. package/dist/builtins/fixed-income-builtins.js.map +1 -0
  39. package/dist/builtins/fixed-income.d.ts +42 -0
  40. package/dist/builtins/fixed-income.js +668 -0
  41. package/dist/builtins/fixed-income.js.map +1 -0
  42. package/dist/builtins/formatting.d.ts +8 -0
  43. package/dist/builtins/formatting.js +53 -0
  44. package/dist/builtins/formatting.js.map +1 -0
  45. package/dist/builtins/logical.d.ts +4 -0
  46. package/dist/builtins/logical.js +258 -0
  47. package/dist/builtins/logical.js.map +1 -0
  48. package/dist/builtins/lookup-array-shape-builtins.d.ts +21 -0
  49. package/dist/builtins/lookup-array-shape-builtins.js +517 -0
  50. package/dist/builtins/lookup-array-shape-builtins.js.map +1 -0
  51. package/dist/builtins/lookup-criteria-builtins.d.ts +16 -0
  52. package/dist/builtins/lookup-criteria-builtins.js +216 -0
  53. package/dist/builtins/lookup-criteria-builtins.js.map +1 -0
  54. package/dist/builtins/lookup-database-builtins.d.ts +17 -0
  55. package/dist/builtins/lookup-database-builtins.js +294 -0
  56. package/dist/builtins/lookup-database-builtins.js.map +1 -0
  57. package/dist/builtins/lookup-financial-builtins.d.ts +11 -0
  58. package/dist/builtins/lookup-financial-builtins.js +291 -0
  59. package/dist/builtins/lookup-financial-builtins.js.map +1 -0
  60. package/dist/builtins/lookup-hypothesis-builtins.d.ts +11 -0
  61. package/dist/builtins/lookup-hypothesis-builtins.js +57 -0
  62. package/dist/builtins/lookup-hypothesis-builtins.js.map +1 -0
  63. package/dist/builtins/lookup-matrix-builtins.d.ts +17 -0
  64. package/dist/builtins/lookup-matrix-builtins.js +218 -0
  65. package/dist/builtins/lookup-matrix-builtins.js.map +1 -0
  66. package/dist/builtins/lookup-order-statistics-builtins.d.ts +18 -0
  67. package/dist/builtins/lookup-order-statistics-builtins.js +575 -0
  68. package/dist/builtins/lookup-order-statistics-builtins.js.map +1 -0
  69. package/dist/builtins/lookup-reference-builtins.d.ts +18 -0
  70. package/dist/builtins/lookup-reference-builtins.js +300 -0
  71. package/dist/builtins/lookup-reference-builtins.js.map +1 -0
  72. package/dist/builtins/lookup-regression-builtins.d.ts +12 -0
  73. package/dist/builtins/lookup-regression-builtins.js +511 -0
  74. package/dist/builtins/lookup-regression-builtins.js.map +1 -0
  75. package/dist/builtins/lookup-sort-filter-builtins.d.ts +20 -0
  76. package/dist/builtins/lookup-sort-filter-builtins.js +382 -0
  77. package/dist/builtins/lookup-sort-filter-builtins.js.map +1 -0
  78. package/dist/builtins/lookup.d.ts +13 -0
  79. package/dist/builtins/lookup.js +867 -0
  80. package/dist/builtins/lookup.js.map +1 -0
  81. package/dist/builtins/math-builtins.d.ts +31 -0
  82. package/dist/builtins/math-builtins.js +420 -0
  83. package/dist/builtins/math-builtins.js.map +1 -0
  84. package/dist/builtins/numeric.d.ts +30 -0
  85. package/dist/builtins/numeric.js +150 -0
  86. package/dist/builtins/numeric.js.map +1 -0
  87. package/dist/builtins/placeholder.d.ts +9 -0
  88. package/dist/builtins/placeholder.js +540 -0
  89. package/dist/builtins/placeholder.js.map +1 -0
  90. package/dist/builtins/radix.d.ts +12 -0
  91. package/dist/builtins/radix.js +220 -0
  92. package/dist/builtins/radix.js.map +1 -0
  93. package/dist/builtins/statistical-builtins.d.ts +13 -0
  94. package/dist/builtins/statistical-builtins.js +240 -0
  95. package/dist/builtins/statistical-builtins.js.map +1 -0
  96. package/dist/builtins/statistics.d.ts +8 -0
  97. package/dist/builtins/statistics.js +74 -0
  98. package/dist/builtins/statistics.js.map +1 -0
  99. package/dist/builtins/text.d.ts +5 -0
  100. package/dist/builtins/text.js +1879 -0
  101. package/dist/builtins/text.js.map +1 -0
  102. package/dist/builtins.d.ts +8 -0
  103. package/dist/builtins.js +695 -0
  104. package/dist/builtins.js.map +1 -0
  105. package/dist/compatibility.d.ts +25 -0
  106. package/dist/compatibility.js +498 -0
  107. package/dist/compatibility.js.map +1 -0
  108. package/dist/compiler.d.ts +29 -0
  109. package/dist/compiler.js +474 -0
  110. package/dist/compiler.js.map +1 -0
  111. package/dist/external-function-adapter.d.ts +32 -0
  112. package/dist/external-function-adapter.js +42 -0
  113. package/dist/external-function-adapter.js.map +1 -0
  114. package/dist/generated/formula-inventory.d.ts +6839 -0
  115. package/dist/generated/formula-inventory.js +7368 -0
  116. package/dist/generated/formula-inventory.js.map +1 -0
  117. package/dist/group-pivot-evaluator.d.ts +28 -0
  118. package/dist/group-pivot-evaluator.js +435 -0
  119. package/dist/group-pivot-evaluator.js.map +1 -0
  120. package/dist/index.d.ts +16 -0
  121. package/dist/index.js +17 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/js-evaluator.d.ts +107 -0
  124. package/dist/js-evaluator.js +1651 -0
  125. package/dist/js-evaluator.js.map +1 -0
  126. package/dist/lexer.d.ts +6 -0
  127. package/dist/lexer.js +115 -0
  128. package/dist/lexer.js.map +1 -0
  129. package/dist/optimizer.d.ts +2 -0
  130. package/dist/optimizer.js +353 -0
  131. package/dist/optimizer.js.map +1 -0
  132. package/dist/parser.d.ts +2 -0
  133. package/dist/parser.js +352 -0
  134. package/dist/parser.js.map +1 -0
  135. package/dist/program-arena.d.ts +22 -0
  136. package/dist/program-arena.js +67 -0
  137. package/dist/program-arena.js.map +1 -0
  138. package/dist/runtime-values.d.ts +17 -0
  139. package/dist/runtime-values.js +11 -0
  140. package/dist/runtime-values.js.map +1 -0
  141. package/dist/special-call-rewrites.d.ts +2 -0
  142. package/dist/special-call-rewrites.js +74 -0
  143. package/dist/special-call-rewrites.js.map +1 -0
  144. package/dist/translation.d.ts +28 -0
  145. package/dist/translation.js +569 -0
  146. package/dist/translation.js.map +1 -0
  147. package/package.json +53 -0
@@ -0,0 +1,435 @@
1
+ import { ErrorCode, ValueTag, formatErrorCode } from "@bilig/protocol";
2
+ function emptyValue() {
3
+ return { tag: ValueTag.Empty };
4
+ }
5
+ function numberValue(value) {
6
+ return { tag: ValueTag.Number, value };
7
+ }
8
+ function stringValue(value) {
9
+ return { tag: ValueTag.String, value, stringId: 0 };
10
+ }
11
+ function errorValue(code) {
12
+ return { tag: ValueTag.Error, code };
13
+ }
14
+ function cloneCellValue(value) {
15
+ switch (value.tag) {
16
+ case ValueTag.Empty:
17
+ return emptyValue();
18
+ case ValueTag.Number:
19
+ return numberValue(value.value);
20
+ case ValueTag.Boolean:
21
+ return { tag: ValueTag.Boolean, value: value.value };
22
+ case ValueTag.String:
23
+ return stringValue(value.value);
24
+ case ValueTag.Error:
25
+ return errorValue(value.code);
26
+ }
27
+ }
28
+ function toNumber(value) {
29
+ switch (value.tag) {
30
+ case ValueTag.Number:
31
+ return value.value;
32
+ case ValueTag.Boolean:
33
+ return value.value ? 1 : 0;
34
+ case ValueTag.Empty:
35
+ return 0;
36
+ case ValueTag.String:
37
+ case ValueTag.Error:
38
+ return undefined;
39
+ }
40
+ }
41
+ function toText(value) {
42
+ switch (value.tag) {
43
+ case ValueTag.Empty:
44
+ return "";
45
+ case ValueTag.Number:
46
+ return String(value.value);
47
+ case ValueTag.Boolean:
48
+ return value.value ? "TRUE" : "FALSE";
49
+ case ValueTag.String:
50
+ return value.value;
51
+ case ValueTag.Error:
52
+ return formatErrorCode(value.code);
53
+ }
54
+ }
55
+ function matrixCell(matrix, row, col) {
56
+ return matrix.values[row * matrix.cols + col] ?? emptyValue();
57
+ }
58
+ function autoDetectHeaders(values) {
59
+ if (values.rows < 2 || values.cols < 1) {
60
+ return false;
61
+ }
62
+ const first = matrixCell(values, 0, 0);
63
+ const second = matrixCell(values, 1, 0);
64
+ return first.tag === ValueTag.String && second.tag === ValueTag.Number;
65
+ }
66
+ function normalizeHeaderOptions(fieldHeadersMode, values, alwaysShowHeaders) {
67
+ const mode = fieldHeadersMode;
68
+ if (mode !== undefined && ![-1, 0, 1, 2, 3].includes(Math.trunc(mode))) {
69
+ return undefined;
70
+ }
71
+ const consumeInputHeaders = mode === 1 || mode === 3 || (mode === undefined && autoDetectHeaders(values));
72
+ return {
73
+ consumeInputHeaders,
74
+ showHeaderRow: alwaysShowHeaders || mode === 2 || mode === 3 || mode === undefined,
75
+ showFieldLabels: mode !== 1,
76
+ };
77
+ }
78
+ function headerLabels(matrix, consumeInputHeaders, prefix) {
79
+ return Array.from({ length: matrix.cols }, (_, index) => {
80
+ if (consumeInputHeaders) {
81
+ const text = toText(matrixCell(matrix, 0, index)).trim();
82
+ if (text.length > 0) {
83
+ return text;
84
+ }
85
+ }
86
+ return `${prefix} ${index + 1}`;
87
+ });
88
+ }
89
+ function normalizeFilterMask(filterArray, totalRows, dataStartRow) {
90
+ const dataRows = Math.max(0, totalRows - dataStartRow);
91
+ if (!filterArray) {
92
+ return Array.from({ length: dataRows }, () => true);
93
+ }
94
+ if (!(filterArray.cols === 1 || filterArray.rows === 1)) {
95
+ return undefined;
96
+ }
97
+ const source = filterArray.rows === totalRows
98
+ ? Array.from({ length: dataRows }, (_, index) => truthy(matrixCell(filterArray, dataStartRow + index, 0)))
99
+ : filterArray.rows === dataRows
100
+ ? Array.from({ length: dataRows }, (_, index) => truthy(matrixCell(filterArray, index, 0)))
101
+ : filterArray.cols === totalRows
102
+ ? Array.from({ length: dataRows }, (_, index) => truthy(matrixCell(filterArray, 0, dataStartRow + index)))
103
+ : filterArray.cols === dataRows
104
+ ? Array.from({ length: dataRows }, (_, index) => truthy(matrixCell(filterArray, 0, index)))
105
+ : undefined;
106
+ return source;
107
+ }
108
+ function truthy(value) {
109
+ return (toNumber(value) ?? 0) !== 0;
110
+ }
111
+ function cellKey(value) {
112
+ switch (value.tag) {
113
+ case ValueTag.Empty:
114
+ return "E";
115
+ case ValueTag.Number:
116
+ return `N:${Object.is(value.value, -0) ? "-0" : String(value.value)}`;
117
+ case ValueTag.Boolean:
118
+ return value.value ? "B:1" : "B:0";
119
+ case ValueTag.String:
120
+ return `S:${value.value}`;
121
+ case ValueTag.Error:
122
+ return `R:${value.code}`;
123
+ }
124
+ }
125
+ function compareCellValues(left, right) {
126
+ if (left.tag === ValueTag.String || right.tag === ValueTag.String) {
127
+ const leftText = toText(left).toUpperCase();
128
+ const rightText = toText(right).toUpperCase();
129
+ if (leftText === rightText) {
130
+ return 0;
131
+ }
132
+ return leftText < rightText ? -1 : 1;
133
+ }
134
+ const leftNumber = toNumber(left);
135
+ const rightNumber = toNumber(right);
136
+ if (leftNumber !== undefined && rightNumber !== undefined) {
137
+ if (leftNumber === rightNumber) {
138
+ return 0;
139
+ }
140
+ return leftNumber < rightNumber ? -1 : 1;
141
+ }
142
+ const leftText = toText(left).toUpperCase();
143
+ const rightText = toText(right).toUpperCase();
144
+ if (leftText === rightText) {
145
+ return 0;
146
+ }
147
+ return leftText < rightText ? -1 : 1;
148
+ }
149
+ function normalizeSortOrders(sortOrder) {
150
+ if (!sortOrder || sortOrder.length === 0) {
151
+ return [];
152
+ }
153
+ return sortOrder
154
+ .map((value) => Math.trunc(value))
155
+ .filter((value) => Number.isFinite(value) && value !== 0)
156
+ .map((value) => ({ index: Math.abs(value) - 1, descending: value < 0 }));
157
+ }
158
+ function orderBuckets(buckets, sortOrder) {
159
+ const orders = normalizeSortOrders(sortOrder);
160
+ if (orders.length === 0) {
161
+ return buckets;
162
+ }
163
+ return buckets.toSorted((left, right) => {
164
+ for (const order of orders) {
165
+ const leftValue = order.index < left.keyValues.length
166
+ ? left.keyValues[order.index]
167
+ : (left.aggregates[order.index - left.keyValues.length] ?? emptyValue());
168
+ const rightValue = order.index < right.keyValues.length
169
+ ? right.keyValues[order.index]
170
+ : (right.aggregates[order.index - right.keyValues.length] ?? emptyValue());
171
+ const comparison = compareCellValues(leftValue, rightValue);
172
+ if (comparison !== 0) {
173
+ return order.descending ? -comparison : comparison;
174
+ }
175
+ }
176
+ return 0;
177
+ });
178
+ }
179
+ function totalRowLabel(width) {
180
+ return Array.from({ length: width }, (_, index) => index === 0 ? stringValue("Total") : emptyValue());
181
+ }
182
+ export function evaluateGroupBy(rowFields, values, options) {
183
+ if (rowFields.rows !== values.rows ||
184
+ rowFields.rows === 0 ||
185
+ rowFields.cols === 0 ||
186
+ values.cols === 0) {
187
+ return errorValue(ErrorCode.Value);
188
+ }
189
+ if (options.fieldRelationship !== undefined) {
190
+ const relationship = Math.trunc(options.fieldRelationship);
191
+ if (relationship !== 0 && relationship !== 1) {
192
+ return errorValue(ErrorCode.Value);
193
+ }
194
+ }
195
+ const headers = normalizeHeaderOptions(options.fieldHeadersMode, values, false);
196
+ if (!headers) {
197
+ return errorValue(ErrorCode.Value);
198
+ }
199
+ const dataStartRow = headers.consumeInputHeaders ? 1 : 0;
200
+ const filterMask = normalizeFilterMask(options.filterArray, rowFields.rows, dataStartRow);
201
+ if (!filterMask) {
202
+ return errorValue(ErrorCode.Value);
203
+ }
204
+ const rowLabels = headerLabels(rowFields, headers.consumeInputHeaders, "Row Field");
205
+ const valueLabels = headerLabels(values, headers.consumeInputHeaders, "Value");
206
+ const buckets = new Map();
207
+ const order = [];
208
+ const totalSubsets = Array.from({ length: values.cols }, () => new Array());
209
+ for (let row = dataStartRow; row < rowFields.rows; row += 1) {
210
+ if (!filterMask[row - dataStartRow]) {
211
+ continue;
212
+ }
213
+ const keyValues = Array.from({ length: rowFields.cols }, (_, col) => cloneCellValue(matrixCell(rowFields, row, col)));
214
+ const key = keyValues.map(cellKey).join("\u001f");
215
+ let bucket = buckets.get(key);
216
+ if (!bucket) {
217
+ bucket = {
218
+ keyValues,
219
+ subsets: Array.from({ length: values.cols }, () => new Array()),
220
+ aggregates: [],
221
+ };
222
+ buckets.set(key, bucket);
223
+ order.push(key);
224
+ }
225
+ for (let col = 0; col < values.cols; col += 1) {
226
+ const value = cloneCellValue(matrixCell(values, row, col));
227
+ bucket.subsets[col].push(value);
228
+ totalSubsets[col].push(cloneCellValue(value));
229
+ }
230
+ }
231
+ const rows = order.map((key) => {
232
+ const bucket = buckets.get(key);
233
+ const aggregates = bucket.subsets.map((subset, valueIndex) => cloneCellValue(options.aggregate(subset, totalSubsets[valueIndex])));
234
+ return {
235
+ keyValues: bucket.keyValues,
236
+ subsets: bucket.subsets,
237
+ aggregates,
238
+ };
239
+ });
240
+ const orderedRows = orderBuckets(rows, options.sortOrder);
241
+ const totalDepth = Math.trunc(options.totalDepth ?? 1);
242
+ const includeTotals = totalDepth !== 0;
243
+ const totalsAtTop = totalDepth < 0;
244
+ const totalAggregates = totalSubsets.map((subset) => cloneCellValue(options.aggregate(subset)));
245
+ const outputRows = [];
246
+ if (headers.showHeaderRow) {
247
+ outputRows.push([
248
+ ...(headers.showFieldLabels ? rowLabels.map(stringValue) : totalRowLabel(rowFields.cols)),
249
+ ...valueLabels.map(stringValue),
250
+ ]);
251
+ }
252
+ if (includeTotals && totalsAtTop) {
253
+ outputRows.push([...totalRowLabel(rowFields.cols), ...totalAggregates]);
254
+ }
255
+ orderedRows.forEach((row) => {
256
+ outputRows.push([...row.keyValues.map(cloneCellValue), ...row.aggregates.map(cloneCellValue)]);
257
+ });
258
+ if (includeTotals && !totalsAtTop) {
259
+ outputRows.push([...totalRowLabel(rowFields.cols), ...totalAggregates]);
260
+ }
261
+ if (outputRows.length === 0) {
262
+ return { kind: "array", rows: 1, cols: 1, values: [emptyValue()] };
263
+ }
264
+ return {
265
+ kind: "array",
266
+ rows: outputRows.length,
267
+ cols: rowFields.cols + values.cols,
268
+ values: outputRows.flat(),
269
+ };
270
+ }
271
+ export function evaluatePivotBy(rowFields, colFields, values, options) {
272
+ if (rowFields.rows !== colFields.rows ||
273
+ rowFields.rows !== values.rows ||
274
+ rowFields.rows === 0 ||
275
+ rowFields.cols === 0 ||
276
+ colFields.cols === 0 ||
277
+ values.cols === 0) {
278
+ return errorValue(ErrorCode.Value);
279
+ }
280
+ const headers = normalizeHeaderOptions(options.fieldHeadersMode, values, true);
281
+ if (!headers) {
282
+ return errorValue(ErrorCode.Value);
283
+ }
284
+ const dataStartRow = headers.consumeInputHeaders ? 1 : 0;
285
+ const filterMask = normalizeFilterMask(options.filterArray, rowFields.rows, dataStartRow);
286
+ if (!filterMask) {
287
+ return errorValue(ErrorCode.Value);
288
+ }
289
+ const rowLabels = headerLabels(rowFields, headers.consumeInputHeaders, "Row Field");
290
+ const valueLabels = headerLabels(values, headers.consumeInputHeaders, "Value");
291
+ const rowBuckets = new Map();
292
+ const colBuckets = new Map();
293
+ const cellBuckets = new Map();
294
+ const rowOrder = [];
295
+ const colOrder = [];
296
+ const grandSubsets = Array.from({ length: values.cols }, () => new Array());
297
+ for (let row = dataStartRow; row < rowFields.rows; row += 1) {
298
+ if (!filterMask[row - dataStartRow]) {
299
+ continue;
300
+ }
301
+ const rowKeyValues = Array.from({ length: rowFields.cols }, (_, col) => cloneCellValue(matrixCell(rowFields, row, col)));
302
+ const colKeyValues = Array.from({ length: colFields.cols }, (_, col) => cloneCellValue(matrixCell(colFields, row, col)));
303
+ const rowKey = rowKeyValues.map(cellKey).join("\u001f");
304
+ const colKey = colKeyValues.map(cellKey).join("\u001f");
305
+ if (!rowBuckets.has(rowKey)) {
306
+ rowBuckets.set(rowKey, {
307
+ keyValues: rowKeyValues,
308
+ subsets: Array.from({ length: values.cols }, () => new Array()),
309
+ });
310
+ rowOrder.push(rowKey);
311
+ }
312
+ if (!colBuckets.has(colKey)) {
313
+ colBuckets.set(colKey, {
314
+ keyValues: colKeyValues,
315
+ subsets: Array.from({ length: values.cols }, () => new Array()),
316
+ });
317
+ colOrder.push(colKey);
318
+ }
319
+ const pairKey = `${rowKey}\u0000${colKey}`;
320
+ let pairBucket = cellBuckets.get(pairKey);
321
+ if (!pairBucket) {
322
+ pairBucket = Array.from({ length: values.cols }, () => new Array());
323
+ cellBuckets.set(pairKey, pairBucket);
324
+ }
325
+ const rowBucket = rowBuckets.get(rowKey);
326
+ const colBucket = colBuckets.get(colKey);
327
+ for (let valueIndex = 0; valueIndex < values.cols; valueIndex += 1) {
328
+ const value = cloneCellValue(matrixCell(values, row, valueIndex));
329
+ pairBucket[valueIndex].push(cloneCellValue(value));
330
+ rowBucket.subsets[valueIndex].push(cloneCellValue(value));
331
+ colBucket.subsets[valueIndex].push(cloneCellValue(value));
332
+ grandSubsets[valueIndex].push(cloneCellValue(value));
333
+ }
334
+ }
335
+ const rowResults = rowOrder.map((key) => {
336
+ const bucket = rowBuckets.get(key);
337
+ return {
338
+ keyValues: bucket.keyValues,
339
+ subsets: bucket.subsets,
340
+ aggregates: bucket.subsets.map((subset, index) => cloneCellValue(options.aggregate(subset, grandSubsets[index]))),
341
+ };
342
+ });
343
+ const colResults = colOrder.map((key) => {
344
+ const bucket = colBuckets.get(key);
345
+ return {
346
+ keyValues: bucket.keyValues,
347
+ subsets: bucket.subsets,
348
+ aggregates: bucket.subsets.map((subset, index) => cloneCellValue(options.aggregate(subset, grandSubsets[index]))),
349
+ };
350
+ });
351
+ const orderedRows = orderBuckets(rowResults, options.rowSortOrder);
352
+ const orderedCols = orderBuckets(colResults, options.colSortOrder);
353
+ const colTotalDepth = Math.trunc(options.colTotalDepth ?? 1);
354
+ const rowTotalDepth = Math.trunc(options.rowTotalDepth ?? 1);
355
+ const includeColTotals = colTotalDepth !== 0;
356
+ const includeRowTotals = rowTotalDepth !== 0;
357
+ const colTotalsFirst = colTotalDepth < 0;
358
+ const rowTotalsFirst = rowTotalDepth < 0;
359
+ const pivotColumnLabels = [];
360
+ const materializedColumns = [];
361
+ if (includeColTotals && colTotalsFirst) {
362
+ for (let valueIndex = 0; valueIndex < values.cols; valueIndex += 1) {
363
+ const label = values.cols === 1 ? "Total" : `Total | ${valueLabels[valueIndex]}`;
364
+ pivotColumnLabels.push(label);
365
+ materializedColumns.push({ colKey: null, valueIndex, label });
366
+ }
367
+ }
368
+ orderedCols.forEach((column) => {
369
+ const keyLabel = column.keyValues.map(toText).join(" | ");
370
+ for (let valueIndex = 0; valueIndex < values.cols; valueIndex += 1) {
371
+ const label = values.cols === 1 ? keyLabel : `${keyLabel} | ${valueLabels[valueIndex]}`;
372
+ pivotColumnLabels.push(label);
373
+ materializedColumns.push({
374
+ colKey: column.keyValues.map(cellKey).join("\u001f"),
375
+ valueIndex,
376
+ label,
377
+ });
378
+ }
379
+ });
380
+ if (includeColTotals && !colTotalsFirst) {
381
+ for (let valueIndex = 0; valueIndex < values.cols; valueIndex += 1) {
382
+ const label = values.cols === 1 ? "Total" : `Total | ${valueLabels[valueIndex]}`;
383
+ pivotColumnLabels.push(label);
384
+ materializedColumns.push({ colKey: null, valueIndex, label });
385
+ }
386
+ }
387
+ const headerRow = [
388
+ ...(headers.showFieldLabels
389
+ ? rowLabels.map(stringValue)
390
+ : Array.from({ length: rowFields.cols }, () => emptyValue())),
391
+ ...pivotColumnLabels.map(stringValue),
392
+ ];
393
+ const rows = [headerRow];
394
+ const totalRowPrefix = totalRowLabel(rowFields.cols);
395
+ const buildDataRow = (rowKey, rowValues, rowSubsets) => {
396
+ const output = rowValues.map(cloneCellValue);
397
+ materializedColumns.forEach((column) => {
398
+ if (column.colKey === null) {
399
+ output.push(cloneCellValue(options.aggregate(rowSubsets[column.valueIndex] ?? [], grandSubsets[column.valueIndex] ?? [])));
400
+ return;
401
+ }
402
+ if (rowKey === "__TOTAL__") {
403
+ const columnSubset = colBuckets.get(column.colKey)?.subsets[column.valueIndex] ?? [];
404
+ output.push(cloneCellValue(options.aggregate(columnSubset, grandSubsets[column.valueIndex] ?? [])));
405
+ return;
406
+ }
407
+ const pairSubsets = cellBuckets.get(`${rowKey}\u0000${column.colKey}`);
408
+ const subset = pairSubsets?.[column.valueIndex] ?? [];
409
+ const totalSet = options.relativeTo === 1 || options.relativeTo === 4
410
+ ? (rowSubsets[column.valueIndex] ?? [])
411
+ : options.relativeTo === 2
412
+ ? (grandSubsets[column.valueIndex] ?? [])
413
+ : (colBuckets.get(column.colKey)?.subsets[column.valueIndex] ?? []);
414
+ output.push(cloneCellValue(options.aggregate(subset, totalSet)));
415
+ });
416
+ return output;
417
+ };
418
+ if (includeRowTotals && rowTotalsFirst) {
419
+ rows.push(buildDataRow("__TOTAL__", totalRowPrefix, grandSubsets.map((subset) => subset.slice())));
420
+ }
421
+ orderedRows.forEach((row) => {
422
+ const rowKey = row.keyValues.map(cellKey).join("\u001f");
423
+ rows.push(buildDataRow(rowKey, row.keyValues, row.subsets));
424
+ });
425
+ if (includeRowTotals && !rowTotalsFirst) {
426
+ rows.push(buildDataRow("__TOTAL__", totalRowPrefix, grandSubsets.map((subset) => subset.slice())));
427
+ }
428
+ return {
429
+ kind: "array",
430
+ rows: rows.length,
431
+ cols: rowFields.cols + materializedColumns.length,
432
+ values: rows.flat(),
433
+ };
434
+ }
435
+ //# sourceMappingURL=group-pivot-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-pivot-evaluator.js","sourceRoot":"","sources":["../src/group-pivot-evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export * from "./ast.js";
2
+ export * from "./addressing.js";
3
+ export * from "./lexer.js";
4
+ export * from "./parser.js";
5
+ export * from "./builtins.js";
6
+ export * from "./external-function-adapter.js";
7
+ export * from "./binder.js";
8
+ export * from "./optimizer.js";
9
+ export * from "./compiler.js";
10
+ export * from "./js-evaluator.js";
11
+ export * from "./runtime-values.js";
12
+ export * from "./translation.js";
13
+ export * from "./compatibility.js";
14
+ export * from "./builtin-capabilities.js";
15
+ export * from "./generated/formula-inventory.js";
16
+ export * from "./builtins/datetime.js";
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ export * from "./ast.js";
2
+ export * from "./addressing.js";
3
+ export * from "./lexer.js";
4
+ export * from "./parser.js";
5
+ export * from "./builtins.js";
6
+ export * from "./external-function-adapter.js";
7
+ export * from "./binder.js";
8
+ export * from "./optimizer.js";
9
+ export * from "./compiler.js";
10
+ export * from "./js-evaluator.js";
11
+ export * from "./runtime-values.js";
12
+ export * from "./translation.js";
13
+ export * from "./compatibility.js";
14
+ export * from "./builtin-capabilities.js";
15
+ export * from "./generated/formula-inventory.js";
16
+ export * from "./builtins/datetime.js";
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kCAAkC,CAAC;AACjD,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { ErrorCode, type CellValue } from "@bilig/protocol";
2
+ import type { FormulaNode } from "./ast.js";
3
+ import { type EvaluationResult } from "./runtime-values.js";
4
+ export interface EvaluationContext {
5
+ sheetName: string;
6
+ currentAddress?: string;
7
+ resolveCell: (sheetName: string, address: string) => CellValue;
8
+ resolveRange: (sheetName: string, start: string, end: string, refKind: "cells" | "rows" | "cols") => CellValue[];
9
+ resolveName?: (name: string) => CellValue;
10
+ resolveFormula?: (sheetName: string, address: string) => string | undefined;
11
+ resolvePivotData?: (request: {
12
+ dataField: string;
13
+ sheetName: string;
14
+ address: string;
15
+ filters: ReadonlyArray<{
16
+ field: string;
17
+ item: CellValue;
18
+ }>;
19
+ }) => CellValue | undefined;
20
+ resolveMultipleOperations?: (request: {
21
+ formulaSheetName: string;
22
+ formulaAddress: string;
23
+ rowCellSheetName: string;
24
+ rowCellAddress: string;
25
+ rowReplacementSheetName: string;
26
+ rowReplacementAddress: string;
27
+ columnCellSheetName?: string;
28
+ columnCellAddress?: string;
29
+ columnReplacementSheetName?: string;
30
+ columnReplacementAddress?: string;
31
+ }) => CellValue | undefined;
32
+ listSheetNames?: () => string[];
33
+ resolveBuiltin?: (name: string) => ((...args: CellValue[]) => EvaluationResult) | undefined;
34
+ }
35
+ interface ReferenceOperand {
36
+ kind: "cell" | "range" | "row" | "col";
37
+ sheetName?: string;
38
+ address?: string;
39
+ start?: string;
40
+ end?: string;
41
+ refKind?: "cells" | "rows" | "cols";
42
+ }
43
+ export type JsPlanInstruction = {
44
+ opcode: "push-number";
45
+ value: number;
46
+ } | {
47
+ opcode: "push-boolean";
48
+ value: boolean;
49
+ } | {
50
+ opcode: "push-string";
51
+ value: string;
52
+ } | {
53
+ opcode: "push-error";
54
+ code: ErrorCode;
55
+ } | {
56
+ opcode: "push-name";
57
+ name: string;
58
+ } | {
59
+ opcode: "push-cell";
60
+ sheetName?: string;
61
+ address: string;
62
+ } | {
63
+ opcode: "push-range";
64
+ sheetName?: string;
65
+ start: string;
66
+ end: string;
67
+ refKind: "cells" | "rows" | "cols";
68
+ } | {
69
+ opcode: "push-lambda";
70
+ params: string[];
71
+ body: JsPlanInstruction[];
72
+ } | {
73
+ opcode: "unary";
74
+ operator: "+" | "-";
75
+ } | {
76
+ opcode: "binary";
77
+ operator: "+" | "-" | "*" | "/" | "^" | "&" | "=" | "<>" | ">" | ">=" | "<" | "<=";
78
+ } | {
79
+ opcode: "call";
80
+ callee: string;
81
+ argc: number;
82
+ argRefs?: Array<ReferenceOperand | undefined>;
83
+ } | {
84
+ opcode: "invoke";
85
+ argc: number;
86
+ } | {
87
+ opcode: "begin-scope";
88
+ } | {
89
+ opcode: "bind-name";
90
+ name: string;
91
+ } | {
92
+ opcode: "end-scope";
93
+ } | {
94
+ opcode: "jump-if-false";
95
+ target: number;
96
+ } | {
97
+ opcode: "jump";
98
+ target: number;
99
+ } | {
100
+ opcode: "return";
101
+ };
102
+ export declare function lowerToPlan(node: FormulaNode): JsPlanInstruction[];
103
+ export declare function evaluatePlanResult(plan: readonly JsPlanInstruction[], context: EvaluationContext): EvaluationResult;
104
+ export declare function evaluatePlan(plan: readonly JsPlanInstruction[], context: EvaluationContext): CellValue;
105
+ export declare function evaluateAst(node: FormulaNode, context: EvaluationContext): CellValue;
106
+ export declare function evaluateAstResult(node: FormulaNode, context: EvaluationContext): EvaluationResult;
107
+ export {};