UNPKG

5.43 kBJavaScriptView Raw
1import { __assign, __read, __spread } from "tslib";
2import { assert } from './util/helper';
3import { aggregate } from './aggregate';
4import { partition } from './util/partition';
5import { oneMoreValue } from './smartMock';
6var tuple = function () {
7 var args = [];
8 for (var _i = 0; _i < arguments.length; _i++) {
9 args[_i] = arguments[_i];
10 }
11 return args;
12};
13/**
14 * @beta
15 */
16export var AGGREGATION = tuple('sum', 'max', 'min', 'average', 'avg', 'median', 'count', 'distinct', 'countd');
17/**
18 * @beta
19 */
20export var CONVERSION = tuple('toString', 'toFloat', 'toInt');
21/**
22 * @beta
23 */
24export var FILL = tuple('fillNull', 'removeNull');
25export function isFillNullOptionsBySmart(options) {
26 return options.type === 'bySmart';
27}
28export function isFillNullOptionsByAgg(options) {
29 return options.type === 'byAgg';
30}
31export function isFillNullOptionsByValue(options) {
32 return options.type === 'byValue';
33}
34var ACTION_TYPES = { AGGREGATION: AGGREGATION, CONVERSION: CONVERSION, FILL: FILL };
35function converse(value, type) {
36 if (type === 'toString') {
37 return String(value);
38 }
39 if (type === 'toFloat') {
40 return parseFloat(value);
41 }
42 if (type === 'toInt') {
43 return parseInt(value);
44 }
45 return value; // fail, return origin
46}
47function fillNull(data, field, fillNullOptions) {
48 var result = null;
49 if (isFillNullOptionsByValue(fillNullOptions)) {
50 result = [];
51 data.forEach(function (row) {
52 var newRow = __assign({}, row);
53 if (!newRow[field]) {
54 newRow[field] = fillNullOptions.cfg.value;
55 }
56 result.push(newRow);
57 });
58 }
59 if (isFillNullOptionsByAgg(fillNullOptions)) {
60 result = [];
61 var tempAgg_1 = aggregate(data.filter(function (row) { return !!row[field]; }), { as: [field], fields: [field], op: [fillNullOptions.cfg.agg] });
62 data.forEach(function (row) {
63 var newRow = __assign({}, row);
64 if (!newRow[field]) {
65 newRow[field] = tempAgg_1[0][field];
66 }
67 result.push(newRow);
68 });
69 }
70 if (isFillNullOptionsBySmart(fillNullOptions)) {
71 result = [];
72 var cleanField_1 = data.map(function (row) { return row[field]; }).filter(function (e) { return !!e; });
73 data.forEach(function (row) {
74 var newRow = __assign({}, row);
75 if (!newRow[field]) {
76 newRow[field] = oneMoreValue(cleanField_1);
77 }
78 result.push(newRow);
79 });
80 }
81 return result;
82}
83function parseSingleSchema(data, schema) {
84 var groupBy = schema.groupBy, actions = schema.actions;
85 var result = data;
86 if (groupBy) {
87 var group = partition(data, __spread(groupBy));
88 result = Object.values(group).map(function (groupArray) {
89 assert(Array.isArray(groupArray) && groupArray.length > 0, "Invalid groupby!");
90 var newRow = {};
91 groupBy.forEach(function (g) {
92 newRow[g] = groupArray[0][g];
93 });
94 return newRow;
95 });
96 }
97 actions.forEach(function (action) {
98 var type = action.type, field = action.field, as = action.as, options = action.options;
99 var actionCategory = Object.keys(ACTION_TYPES).find(function (cate) { return ACTION_TYPES[cate].some(function (t) { return t === type; }); });
100 var requiredAs = 'new_field';
101 if (as) {
102 requiredAs = as;
103 }
104 else if (field) {
105 requiredAs = field;
106 }
107 if (actionCategory === 'AGGREGATION') {
108 var aggregateParams = {
109 as: [requiredAs],
110 op: [type],
111 };
112 if (field) {
113 aggregateParams.fields = [field];
114 }
115 if (groupBy) {
116 aggregateParams.groupBy = groupBy;
117 }
118 var tempAgg_2 = aggregate(data, aggregateParams);
119 result.forEach(function (row, index) {
120 row[requiredAs] = tempAgg_2[index][requiredAs];
121 });
122 }
123 if (actionCategory === 'CONVERSION') {
124 if (field) {
125 var tempCon_1 = data.map(function (row) {
126 var newRow = __assign({}, row);
127 newRow[requiredAs] = converse(row[field], type);
128 return newRow;
129 });
130 result.forEach(function (row, index) {
131 row[requiredAs] = tempCon_1[index][requiredAs];
132 });
133 }
134 }
135 if (actionCategory === 'FILL') {
136 if (type === 'removeNull') {
137 if (field) {
138 result = result.filter(function (row) { return row[field]; });
139 }
140 }
141 if (type === 'fillNull') {
142 if (field && options) {
143 var attempt = fillNull(result, field, options);
144 if (attempt) {
145 result = attempt;
146 }
147 }
148 }
149 }
150 });
151 return result;
152}
153/**
154 * @beta
155 */
156export function parse(data, schemas) {
157 var result = data;
158 var schemaArray = Array.isArray(schemas) ? schemas : [schemas];
159 for (var i = 0; i < schemaArray.length; i++) {
160 result = parseSingleSchema(result, schemaArray[i]);
161 }
162 return result;
163}