UNPKG

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