UNPKG

12.4 kBJavaScriptView Raw
1import { __read, __spread } from "tslib";
2import { typeAll, isInterval } from '@antv/dw-analyzer';
3import { AGGREGATION } from './parse';
4import { aggregate } from './aggregate';
5/**
6 * @public
7 */
8export var rankExtractor = function (siblingGroup) {
9 var measures = siblingGroup.datasetInfo.measureTitles;
10 var data = siblingGroup.dataset;
11 var results = [];
12 measures.forEach(function (measure) {
13 var measureName = measure;
14 var measureColumn = data.map(function (row) { return row[measureName]; });
15 var sorted = measureColumn.slice().sort(function (a, b) { return b - a; });
16 var ranks = measureColumn.map(function (v) { return sorted.indexOf(v) + 1; });
17 results.push(ranks);
18 });
19 return results;
20};
21/**
22 * @public
23 */
24export var percentExtractor = function (siblingGroup) {
25 var measures = siblingGroup.datasetInfo.measureTitles;
26 var data = siblingGroup.dataset;
27 var results = [];
28 measures.forEach(function (measure) {
29 var measureName = measure;
30 var measureColumn = data.map(function (row) { return row[measureName]; });
31 var sum = measureColumn.reduce(function (a, b) { return a + b; }, 0);
32 var percents = measureColumn.map(function (v) { return v / sum; });
33 results.push(percents);
34 });
35 return results;
36};
37var tuple = function () {
38 var args = [];
39 for (var _i = 0; _i < arguments.length; _i++) {
40 args[_i] = arguments[_i];
41 }
42 return args;
43};
44/**
45 * @public
46 */
47export var EXTRACTORS = tuple('rank', 'percent');
48/**
49 * @public
50 */
51export var extractors = {
52 rank: rankExtractor,
53 percent: percentExtractor,
54};
55/**
56 * @public
57 */
58var Dataset = /** @class */ (function () {
59 function Dataset(dataset) {
60 this._dataset = dataset;
61 this._dimensions = [];
62 this._measures = [];
63 this._dimensionTitles = [];
64 this._measureTitles = [];
65 this._calculateDimensionsAndMeasures();
66 }
67 Object.defineProperty(Dataset.prototype, "dataset", {
68 get: function () {
69 return this._dataset;
70 },
71 set: function (dataset) {
72 this._dataset = dataset;
73 },
74 enumerable: false,
75 configurable: true
76 });
77 Object.defineProperty(Dataset.prototype, "dimensions", {
78 get: function () {
79 return this._dimensions;
80 },
81 enumerable: false,
82 configurable: true
83 });
84 Object.defineProperty(Dataset.prototype, "measures", {
85 get: function () {
86 return this._measures;
87 },
88 enumerable: false,
89 configurable: true
90 });
91 Object.defineProperty(Dataset.prototype, "dimensionTitles", {
92 get: function () {
93 return this._dimensionTitles;
94 },
95 enumerable: false,
96 configurable: true
97 });
98 Object.defineProperty(Dataset.prototype, "measureTitles", {
99 get: function () {
100 return this._measureTitles;
101 },
102 enumerable: false,
103 configurable: true
104 });
105 Dataset.prototype._calculateDimensionsAndMeasures = function () {
106 var _this = this;
107 var fieldInfos = typeAll(this.dataset);
108 fieldInfos.forEach(function (fieldInfo) {
109 var fieldColumnInfo = {
110 name: fieldInfo.name,
111 data: fieldInfo.samples,
112 domain: __spread(new Set(fieldInfo.samples)),
113 };
114 if (isInterval(fieldInfo)) {
115 _this._measures.push(fieldColumnInfo);
116 _this._measureTitles.push(fieldInfo.name);
117 }
118 else {
119 _this._dimensions.push(fieldColumnInfo);
120 _this._dimensionTitles.push(fieldInfo.name);
121 }
122 });
123 };
124 Dataset.prototype.subspace = function (defineArray) {
125 var _this = this;
126 if (defineArray === void 0) { defineArray = this._dimensions.map(function (_) { return '*'; }); }
127 if (defineArray.length !== this._dimensions.length) {
128 throw new Error('Subspace define array must contain all dimensions.');
129 }
130 for (var i = 0; i < defineArray.length; i++) {
131 if (defineArray[i] !== '*' && !this._dimensions[i].domain.includes(defineArray[i])) {
132 console.error(defineArray[i]);
133 console.log(this._dimensions[i].domain);
134 throw new Error('Subspace define array must mapping to dimension array with * or elements in dimension domain.');
135 }
136 }
137 var subdataset = [];
138 this._dataset.forEach(function (row) {
139 var isValidRow = true;
140 defineArray.forEach(function (defD, index) {
141 var titleD = _this._dimensionTitles[index];
142 if (defD !== '*' && row[titleD] !== defD) {
143 isValidRow = false;
144 }
145 });
146 if (isValidRow) {
147 subdataset.push(row);
148 }
149 });
150 var defineObj = {};
151 this._dimensionTitles.forEach(function (d, i) {
152 defineObj[d] = defineArray[i];
153 });
154 return {
155 define: defineObj,
156 dataset: subdataset,
157 };
158 };
159 Dataset.prototype.siblingGroup = function (subspace, dimension) {
160 var _this = this;
161 if (!this._dimensionTitles.includes(dimension)) {
162 console.log(JSON.stringify(subspace));
163 throw new Error("No such dimension: " + dimension + ".");
164 }
165 var defineSubspace = subspace;
166 var defineDimension = dimension;
167 var domainD = [];
168 var indexD = -1;
169 this._dimensions.forEach(function (d, i) {
170 if (d.name === defineDimension) {
171 domainD = d.domain;
172 indexD = i;
173 }
174 });
175 var subspaceList = [];
176 domainD.forEach(function (e) {
177 var newSubspaceDefineArray = _this._dimensionTitles.map(function (d) { return defineSubspace.define[d]; });
178 newSubspaceDefineArray[indexD] = e;
179 var newSupspace = _this.subspace(newSubspaceDefineArray);
180 subspaceList.push(newSupspace);
181 });
182 var siblingGroupDataset = [];
183 siblingGroupDataset = siblingGroupDataset.concat.apply(siblingGroupDataset, __spread(subspaceList.map(function (subspace) { return subspace.dataset; })));
184 return {
185 datasetInfo: {
186 dimensionTitles: this._dimensionTitles,
187 measureTitles: this._measureTitles,
188 },
189 define: {
190 subspace: defineSubspace,
191 dimension: defineDimension,
192 },
193 subspaceList: subspaceList,
194 dataset: siblingGroupDataset,
195 };
196 };
197 Dataset.prototype.allSubspaceDataset = function (options) {
198 var _this = this;
199 var MAX_DEPTH = 3;
200 var dimensions = (options && options.dimensions) || this._dimensionTitles;
201 var measures = (options && options.measures) || this._measureTitles;
202 var aggregations = (options && options.aggregations) || AGGREGATION;
203 var extractors = (options && options.extractors) || EXTRACTORS;
204 var depth = options && options.depth && options.depth < MAX_DEPTH ? options.depth : MAX_DEPTH;
205 // traverse siblingGroups - by combinations of (subspaces & dimensions)
206 var defineArray = dimensions.map(function (_) { return '*'; });
207 var allSiblingGroups = dimensions.map(function (d) { return _this.siblingGroup(_this.subspace(defineArray), d); });
208 // traverse subspaceDatasets - by combinations of (siblingGroups & aggs & measures & extractors & depth)
209 var allSubspaceDatasets = [];
210 allSiblingGroups.forEach(function (sg) {
211 measures.forEach(function (measure) {
212 aggregations.forEach(function (agg) {
213 var possibleExtractorPairs = [];
214 extractors.forEach(function (extractor) {
215 dimensions.forEach(function (dimension) {
216 possibleExtractorPairs.push({ extractor: extractor, dimension: dimension });
217 });
218 });
219 var extractorPairs = [];
220 for (var x = 0; x < possibleExtractorPairs.length; x++) {
221 for (var y = 0; y < possibleExtractorPairs.length; y++) {
222 extractorPairs = [possibleExtractorPairs[x], possibleExtractorPairs[y]];
223 }
224 }
225 // remove duplicates
226 var resultsDiffDepth = [];
227 for (var i = 0; i < depth; i++) {
228 var subDataset = compositeExtractor(sg, { agg: agg, measure: measure }, extractorPairs, i);
229 var hasDuplication = false;
230 for (var j = 0; j < resultsDiffDepth.length; j++) {
231 if (Object.keys(resultsDiffDepth[j][0])
232 .sort()
233 .join(',') ===
234 Object.keys(subDataset[0])
235 .sort()
236 .join(',')) {
237 hasDuplication = true;
238 break;
239 }
240 }
241 if (!hasDuplication) {
242 resultsDiffDepth.push(subDataset);
243 }
244 }
245 allSubspaceDatasets = allSubspaceDatasets.concat(resultsDiffDepth);
246 });
247 });
248 });
249 return allSubspaceDatasets;
250 };
251 return Dataset;
252}());
253export { Dataset };
254/**
255 * @public
256 */
257export function compositeExtractor(siblingGroup, aggPair, extractorPairs, depth) {
258 if (extractorPairs === void 0) { extractorPairs = []; }
259 if (depth === void 0) { depth = extractorPairs.length + 1; }
260 var result = [];
261 var define = siblingGroup.define, datasetInfo = siblingGroup.datasetInfo;
262 var defineDimension = define.dimension, defineSubspace = define.subspace;
263 var dimensionTitles = datasetInfo.dimensionTitles;
264 // first extractor is aggregation
265 var agg = aggPair.agg, measure = aggPair.measure;
266 var aggedDataset = siblingGroup.dataset.map(function (row) {
267 var newRow = [];
268 dimensionTitles.forEach(function (d) {
269 if (defineSubspace.define[d] !== '*' || d === defineDimension) {
270 newRow[d] = row[d];
271 }
272 });
273 newRow[measure] = row[measure];
274 return newRow;
275 });
276 var data1 = aggregate(aggedDataset, {
277 groupBy: defineDimension,
278 fields: [measure],
279 as: [measure],
280 op: [agg],
281 });
282 // rename
283 result = data1.map(function (row) {
284 var newRow = {};
285 Object.keys(row)
286 .filter(function (k) { return k !== measure; })
287 .forEach(function (k) {
288 newRow[k] = row[k];
289 });
290 newRow[measure + "_" + agg] = row[measure];
291 return newRow;
292 });
293 // then, t-1 round of extracting
294 var t = depth < 1 ? 1 : depth;
295 t = t > 1 + extractorPairs.length ? 1 + extractorPairs.length : t;
296 var _loop_1 = function (i) {
297 // each round of extracting
298 var tempDataset = new Dataset(result);
299 var _a = extractorPairs[i], extractorType = _a.extractor, extractByDimension = _a.dimension;
300 if (tempDataset.dimensionTitles.includes(extractByDimension)) {
301 var extractor = extractors[extractorType];
302 var rColumn_1 = extractor(tempDataset.siblingGroup(tempDataset.subspace(), extractByDimension))[0];
303 var extractedResult_1 = [];
304 var newMeasureName_1 = tempDataset.measureTitles[0] + "_" + extractorType;
305 result.forEach(function (row, index) {
306 var newRow = {};
307 tempDataset.dimensionTitles.forEach(function (d) {
308 newRow[d] = row[d];
309 });
310 newRow[newMeasureName_1] = rColumn_1[index];
311 extractedResult_1.push(newRow);
312 });
313 result = extractedResult_1;
314 }
315 };
316 for (var i = 0; i < t - 1; i++) {
317 _loop_1(i);
318 }
319 return result;
320}