UNPKG

4.97 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var enumDataTypes = require('@typen/enum-data-types');
6var enumPivotMode = require('@analys/enum-pivot-mode');
7var vectorMapper = require('@vect/vector-mapper');
8var nullish = require('@typen/nullish');
9var vectorMerge = require('@vect/vector-merge');
10
11const parseCell = (cell, defaultField) => {
12 var _cell$field, _cell$mode;
13
14 if (cell === void 0 || cell === null) return defaultCell(defaultField);
15
16 switch (typeof cell) {
17 case enumDataTypes.OBJ:
18 if (Array.isArray(cell)) return cell.length ? vectorMapper.mapper(cell, cell => parseCell(cell, defaultField)) : defaultCell(defaultField);
19 cell.field = (_cell$field = cell.field) !== null && _cell$field !== void 0 ? _cell$field : defaultField;
20 cell.mode = (_cell$mode = cell.mode) !== null && _cell$mode !== void 0 ? _cell$mode : enumPivotMode.COUNT;
21 return cell;
22
23 case enumDataTypes.STR:
24 case enumDataTypes.NUM:
25 return {
26 field: cell,
27 mode: enumPivotMode.INCRE
28 };
29
30 default:
31 return defaultCell(defaultField);
32 }
33};
34
35const defaultCell = defaultField => ({
36 field: defaultField,
37 mode: enumPivotMode.COUNT
38});
39
40const parseKey = key => {
41 if (nullish.nullish(key)) return [key];
42 let t = typeof key;
43 if (t === enumDataTypes.STR || t === enumDataTypes.NUM) return [key];
44 if (t === enumDataTypes.OBJ) return Array.isArray(key) ? key : Object.entries(key);
45 return key;
46};
47/**
48 * @param key
49 * @return {[*,*]}
50 */
51
52const parseKeyOnce = key => {
53 if (nullish.nullish(key)) return [key];
54 let t = typeof key;
55 if (t === enumDataTypes.STR || t === enumDataTypes.NUM) return [key];
56 if (t === enumDataTypes.OBJ) return Array.isArray(key) ? key : getEntryOnce(key);
57 return [key];
58};
59/**
60 *
61 * @param {Object} o
62 * @return {*}
63 */
64
65const getEntryOnce = o => {
66 for (let k in o) return [k, o[k]];
67};
68
69/**
70 *
71 * @param {*} field
72 * @param {str} neglect - default field
73 * @returns {[str,number]|[str,number][]}
74 */
75
76const parseField = (field, neglect) => {
77 let t = typeof field,
78 ents;
79 if (nullish.nullish(field)) return [neglect, enumPivotMode.COUNT];
80
81 if (t === enumDataTypes.OBJ) {
82 ents = Array.isArray(field) ? parseFields(field, neglect) : Object.entries(field);
83 if (ents.length === 0) return [neglect, enumPivotMode.COUNT];
84 if (ents.length === 1) return ents[0];
85 return ents;
86 }
87
88 if (t === enumDataTypes.STR || t === enumDataTypes.NUM) return [field, enumPivotMode.INCRE];
89 return [neglect, enumPivotMode.COUNT];
90};
91const parseFields = (fields, neglect) => {
92 let ents = [],
93 t;
94
95 for (let field of fields) if (nullish.nullish(field)) {
96 ents.push([neglect, enumPivotMode.COUNT]);
97 } else if (Array.isArray(field)) {
98 ents.push(field);
99 } else if ((t = typeof field) && (t === enumDataTypes.STR || t === enumDataTypes.NUM)) {
100 ents.push([field, enumPivotMode.INCRE]);
101 } else if (t === enumDataTypes.OBJ) {
102 vectorMerge.acquire(ents, Object.entries(field));
103 } else {
104 ents.push([neglect, enumPivotMode.COUNT]);
105 }
106
107 return ents;
108};
109
110function _defineProperty(obj, key, value) {
111 if (key in obj) {
112 Object.defineProperty(obj, key, {
113 value: value,
114 enumerable: true,
115 configurable: true,
116 writable: true
117 });
118 } else {
119 obj[key] = value;
120 }
121
122 return obj;
123}
124
125class TableSpec {
126 /** @type {TableObject} */
127
128 /** @type {str} */
129
130 /** @type {str} */
131
132 /** @type {CubeCell[]|CubeCell} */
133
134 /** @type {Filter[]|Filter} */
135
136 /** @type {function():number} */
137
138 /**
139 * @param {str} side
140 * @param {str} banner
141 * @param {CubeCell[]|CubeCell} [cell]
142 * @param {Filter[]|Filter} [filter]
143 * @param {function():number} formula - formula is valid only when cell is CubeCell array.
144 */
145 constructor(side, banner, cell, filter, formula) {
146 _defineProperty(this, "table", void 0);
147
148 _defineProperty(this, "side", void 0);
149
150 _defineProperty(this, "banner", void 0);
151
152 _defineProperty(this, "cell", void 0);
153
154 _defineProperty(this, "filter", void 0);
155
156 _defineProperty(this, "formula", void 0);
157
158 Object.assign(this, {
159 side,
160 banner,
161 cell,
162 filter,
163 formula
164 });
165 }
166 /**
167 * @param {str} side
168 * @param {str} banner
169 * @param {CubeCell[]|CubeCell} [cell]
170 * @param {Filter[]|Filter} [filter]
171 * @param {function():number} formula - formula is valid only when cell is CubeCell array.
172 */
173
174
175 static build({
176 side,
177 banner,
178 cell,
179 filter,
180 formula
181 }) {
182 return new TableSpec(side, banner, cell, filter, formula);
183 }
184
185 toObject() {
186 const {
187 side,
188 banner,
189 cell,
190 filter,
191 formula
192 } = this;
193 return {
194 side,
195 banner,
196 cell,
197 filter,
198 formula
199 };
200 }
201
202}
203
204exports.TableSpec = TableSpec;
205exports.parseCell = parseCell;
206exports.parseField = parseField;
207exports.parseKey = parseKey;
208exports.parseKeyOnce = parseKeyOnce;