UNPKG

5.37 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 literal = require('@typen/literal');
9var nullish = require('@typen/nullish');
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
40/**
41 * @typedef {string|number} str
42 */
43
44/**
45 *
46 * @param {str|str[]|Object<str,Function>|[string,Function][]} field
47 * @param {number} level
48 * @returns {{key:str,to:number}|{key:str,to:number}[]}
49 */
50
51function parseKey(field, level = 0) {
52 const {
53 key: defaultKey = '',
54 to: defaultTo = null
55 } = this !== null && this !== void 0 ? this : {};
56 const fieldSets = [];
57 if (nullish.nullish(field)) fieldSets.push({
58 key: defaultKey,
59 to: defaultTo
60 });else if (literal.isNumStr(field)) fieldSets.push({
61 key: field,
62 to: defaultTo
63 });else if (Array.isArray(field)) {
64 if (level > 0) fieldSets.push({
65 key: field[0],
66 to: field[1]
67 });else for (let f of field) fieldSets.push(...parseField.call(this, f, level + 1));
68 } else if (typeof field === enumDataTypes.OBJ) {
69 for (let [key, to] of Object.entries(field)) fieldSets.push({
70 key,
71 to
72 });
73 }
74 return fieldSets;
75}
76/**
77 * @param key
78 * @return {[*,*]}
79 */
80
81const parseKeyOnce = key => {
82 if (nullish.nullish(key)) return [key];
83 let t = typeof key;
84 if (t === enumDataTypes.STR || t === enumDataTypes.NUM) return [key];
85 if (t === enumDataTypes.OBJ) return Array.isArray(key) ? key : getEntryOnce(key);
86 return [key];
87};
88/**
89 *
90 * @param {Object} o
91 * @return {*}
92 */
93
94const getEntryOnce = o => {
95 for (let k in o) return [k, o[k]];
96};
97
98/**
99 * @typedef {string|number} str
100 */
101
102/**
103 *
104 * @param {str|str[]|Object<str,Function>|[string,Function][]} field
105 * @param {number} level
106 * @returns {{key:str,to:number}|{key:str,to:number}[]}
107 */
108
109function parseField$1(field, level = 0) {
110 const {
111 key: defaultKey = '',
112 to: defaultTo = null
113 } = this !== null && this !== void 0 ? this : {};
114 const fieldSets = [];
115 if (nullish.nullish(field)) fieldSets.push({
116 key: defaultKey,
117 to: defaultTo
118 });else if (literal.isNumStr(field)) fieldSets.push({
119 key: field,
120 to: defaultTo
121 });else if (Array.isArray(field)) {
122 if (level > 0) fieldSets.push({
123 key: field[0],
124 to: field[1]
125 });else for (let f of field) fieldSets.push(...parseField$1.call(this, f, level + 1));
126 } else if (typeof field === enumDataTypes.OBJ) {
127 for (let [key, to] of Object.entries(field)) fieldSets.push({
128 key,
129 to
130 });
131 }
132 return fieldSets;
133}
134
135function _defineProperty(obj, key, value) {
136 if (key in obj) {
137 Object.defineProperty(obj, key, {
138 value: value,
139 enumerable: true,
140 configurable: true,
141 writable: true
142 });
143 } else {
144 obj[key] = value;
145 }
146
147 return obj;
148}
149
150class TableSpec {
151 /** @type {TableObject} */
152
153 /** @type {str} */
154
155 /** @type {str} */
156
157 /** @type {CubeCell[]|CubeCell} */
158
159 /** @type {Filter[]|Filter} */
160
161 /** @type {function():number} */
162
163 /**
164 * @param {str} side
165 * @param {str} banner
166 * @param {CubeCell[]|CubeCell} [cell]
167 * @param {Filter[]|Filter} [filter]
168 * @param {function():number} formula - formula is valid only when cell is CubeCell array.
169 */
170 constructor(side, banner, cell, filter, formula) {
171 _defineProperty(this, "table", void 0);
172
173 _defineProperty(this, "side", void 0);
174
175 _defineProperty(this, "banner", void 0);
176
177 _defineProperty(this, "cell", void 0);
178
179 _defineProperty(this, "filter", void 0);
180
181 _defineProperty(this, "formula", void 0);
182
183 Object.assign(this, {
184 side,
185 banner,
186 cell,
187 filter,
188 formula
189 });
190 }
191 /**
192 * @param {str} side
193 * @param {str} banner
194 * @param {CubeCell[]|CubeCell} [cell]
195 * @param {Filter[]|Filter} [filter]
196 * @param {function():number} formula - formula is valid only when cell is CubeCell array.
197 */
198
199
200 static build({
201 side,
202 banner,
203 cell,
204 filter,
205 formula
206 }) {
207 return new TableSpec(side, banner, cell, filter, formula);
208 }
209
210 toObject() {
211 const {
212 side,
213 banner,
214 cell,
215 filter,
216 formula
217 } = this;
218 return {
219 side,
220 banner,
221 cell,
222 filter,
223 formula
224 };
225 }
226
227}
228
229exports.TableSpec = TableSpec;
230exports.parseCell = parseCell;
231exports.parseField = parseField$1;
232exports.parseKey = parseKey;
233exports.parseKeyOnce = parseKeyOnce;