1 | import { __assign, __values } from "tslib";
|
2 | import * as statistics from './util/statistics';
|
3 | import { partition } from './util/partition';
|
4 | import { assert } from './util/helper';
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 | export function aggregate(rows, options) {
|
13 | var e_1, _a;
|
14 | var fields = options.fields, op = options.op;
|
15 | fields && assert(Array.isArray(fields), "Invalid fields: it must be an array with one or more strings!");
|
16 | !fields &&
|
17 | assert(op.every(function (item) { return item === 'count'; }), "operations must all be 'count' when fields is empty");
|
18 | assert(op.length === options.as.length, "Invalid as: it's length must be the same as operations!");
|
19 | var groups = partition(rows, options.groupBy);
|
20 | var results = [];
|
21 | var _loop_1 = function (group) {
|
22 | var result = __assign({}, group[0]);
|
23 | op.forEach(function (operation, i) {
|
24 | var outputName = options.as[i];
|
25 | var field = fields ? fields[i] : undefined;
|
26 | result[outputName] = statistics[operation](field ? group.map(function (item) { return item[field]; }) : group);
|
27 | });
|
28 | results.push(result);
|
29 | };
|
30 | try {
|
31 | for (var _b = __values(Object.values(groups)), _c = _b.next(); !_c.done; _c = _b.next()) {
|
32 | var group = _c.value;
|
33 | _loop_1(group);
|
34 | }
|
35 | }
|
36 | catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
37 | finally {
|
38 | try {
|
39 | if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
40 | }
|
41 | finally { if (e_1) throw e_1.error; }
|
42 | }
|
43 | return results;
|
44 | }
|