| (function (global, factory) { | |
| typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : | |
| typeof define === 'function' && define.amd ? define(['exports'], factory) : | |
| (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ecSimpleTransform = {})); | |
| }(this, (function (exports) { 'use strict'; | |
| var transform = { | |
| type: 'ecSimpleTransform:id', | |
| transform: function (params) { | |
| var upstream = params.upstream; | |
| var config = params.config; | |
| var dimensionIndex = config.dimensionIndex; | |
| var dimensionName = config.dimensionName; | |
| var dimsDef = upstream.cloneAllDimensionInfo(); | |
| dimsDef[dimensionIndex] = dimensionName; | |
| var data = upstream.cloneRawData(); | |
| for (var i = 0, len = data.length; i < len; i++) { | |
| var line = data[i]; | |
| line[dimensionIndex] = i; | |
| } | |
| return { | |
| dimensions: dimsDef, | |
| data: data | |
| }; | |
| } | |
| }; | |
| function assert(condition, message) { | |
| if (!condition) { | |
| throw new Error(message); | |
| } | |
| } | |
| function hasOwn(own, prop) { | |
| return own.hasOwnProperty(prop); | |
| } | |
| function quantile(ascArr, p) { | |
| var H = (ascArr.length - 1) * p + 1; | |
| var h = Math.floor(H); | |
| var v = +ascArr[h - 1]; | |
| var e = H - h; | |
| return e ? v + e * (ascArr[h] - v) : v; | |
| } | |
| var METHOD_INTERNAL = { | |
| 'SUM': true, | |
| 'COUNT': true, | |
| 'FIRST': true, | |
| 'AVERAGE': true, | |
| 'Q1': true, | |
| 'Q2': true, | |
| 'Q3': true, | |
| 'MIN': true, | |
| 'MAX': true | |
| }; | |
| var METHOD_NEEDS_COLLECT = { | |
| AVERAGE: ['COUNT'] | |
| }; | |
| var METHOD_NEEDS_GATHER_VALUES = { | |
| Q1: true, | |
| Q2: true, | |
| Q3: true | |
| }; | |
| var METHOD_ALIAS = { | |
| MEDIAN: 'Q2' | |
| }; | |
| var ResultDimInfoInternal = (function () { | |
| function ResultDimInfoInternal(index, indexInUpstream, method, name, needGatherValues) { | |
| this.collectionInfoList = []; | |
| this.gatheredValuesByGroup = {}; | |
| this.gatheredValuesNoGroup = []; | |
| this.needGatherValues = false; | |
| this._collectionInfoMap = {}; | |
| this.method = method; | |
| this.name = name; | |
| this.index = index; | |
| this.indexInUpstream = indexInUpstream; | |
| this.needGatherValues = needGatherValues; | |
| } | |
| ResultDimInfoInternal.prototype.addCollectionInfo = function (item) { | |
| this._collectionInfoMap[item.method] = this.collectionInfoList.length; | |
| this.collectionInfoList.push(item); | |
| }; | |
| ResultDimInfoInternal.prototype.getCollectionInfo = function (method) { | |
| return this.collectionInfoList[this._collectionInfoMap[method]]; | |
| }; | |
| ResultDimInfoInternal.prototype.gatherValue = function (groupByDimInfo, groupVal, value) { | |
| value = +value; | |
| if (groupByDimInfo) { | |
| if (groupVal != null) { | |
| var groupValStr = groupVal + ''; | |
| var values = this.gatheredValuesByGroup[groupValStr] | |
| || (this.gatheredValuesByGroup[groupValStr] = []); | |
| values.push(value); | |
| } | |
| } | |
| else { | |
| this.gatheredValuesNoGroup.push(value); | |
| } | |
| }; | |
| return ResultDimInfoInternal; | |
| }()); | |
| var transform$1 = { | |
| type: 'ecSimpleTransform:aggregate', | |
| transform: function (params) { | |
| var upstream = params.upstream; | |
| var config = params.config; | |
| var groupByDimInfo = prepareGroupByDimInfo(config, upstream); | |
| var _a = prepareDimensions(config, upstream, groupByDimInfo), finalResultDimInfoList = _a.finalResultDimInfoList, collectionDimInfoList = _a.collectionDimInfoList; | |
| var collectionResult; | |
| if (collectionDimInfoList.length) { | |
| collectionResult = travel(groupByDimInfo, upstream, collectionDimInfoList, createCollectionResultLine, updateCollectionResultLine); | |
| } | |
| for (var i = 0; i < collectionDimInfoList.length; i++) { | |
| var dimInfo = collectionDimInfoList[i]; | |
| dimInfo.__collectionResult = collectionResult; | |
| asc(dimInfo.gatheredValuesNoGroup); | |
| var gatheredValuesByGroup = dimInfo.gatheredValuesByGroup; | |
| for (var key in gatheredValuesByGroup) { | |
| if (hasOwn(gatheredValuesByGroup, key)) { | |
| asc(gatheredValuesByGroup[key]); | |
| } | |
| } | |
| } | |
| var finalResult = travel(groupByDimInfo, upstream, finalResultDimInfoList, createFinalResultLine, updateFinalResultLine); | |
| var dimensions = []; | |
| for (var i = 0; i < finalResultDimInfoList.length; i++) { | |
| dimensions.push(finalResultDimInfoList[i].name); | |
| } | |
| return { | |
| dimensions: dimensions, | |
| data: finalResult.outList | |
| }; | |
| } | |
| }; | |
| function prepareDimensions(config, upstream, groupByDimInfo) { | |
| var resultDimensionsConfig = config.resultDimensions; | |
| var finalResultDimInfoList = []; | |
| var collectionDimInfoList = []; | |
| var gIndexInLine = 0; | |
| for (var i = 0; i < resultDimensionsConfig.length; i++) { | |
| var resultDimInfoConfig = resultDimensionsConfig[i]; | |
| var dimInfoInUpstream = upstream.getDimensionInfo(resultDimInfoConfig.from); | |
| assert(dimInfoInUpstream, 'Can not find dimension by `from`: ' + resultDimInfoConfig.from); | |
| var rawMethod = resultDimInfoConfig.method; | |
| assert(groupByDimInfo.index !== dimInfoInUpstream.index || rawMethod == null, "Dimension " + dimInfoInUpstream.name + " is the \"groupBy\" dimension, must not have any \"method\"."); | |
| var method = normalizeMethod(rawMethod); | |
| assert(method, 'method is required'); | |
| var name_1 = resultDimInfoConfig.name != null ? resultDimInfoConfig.name : dimInfoInUpstream.name; | |
| var finalResultDimInfo = new ResultDimInfoInternal(finalResultDimInfoList.length, dimInfoInUpstream.index, method, name_1, hasOwn(METHOD_NEEDS_GATHER_VALUES, method)); | |
| finalResultDimInfoList.push(finalResultDimInfo); | |
| var needCollect = false; | |
| if (hasOwn(METHOD_NEEDS_COLLECT, method)) { | |
| needCollect = true; | |
| var collectionTargetMethods = METHOD_NEEDS_COLLECT[method]; | |
| for (var j = 0; j < collectionTargetMethods.length; j++) { | |
| finalResultDimInfo.addCollectionInfo({ | |
| method: collectionTargetMethods[j], | |
| indexInLine: gIndexInLine++ | |
| }); | |
| } | |
| } | |
| if (hasOwn(METHOD_NEEDS_GATHER_VALUES, method)) { | |
| needCollect = true; | |
| } | |
| if (needCollect) { | |
| collectionDimInfoList.push(finalResultDimInfo); | |
| } | |
| } | |
| return { collectionDimInfoList: collectionDimInfoList, finalResultDimInfoList: finalResultDimInfoList }; | |
| } | |
| function prepareGroupByDimInfo(config, upstream) { | |
| var groupByConfig = config.groupBy; | |
| var groupByDimInfo; | |
| if (groupByConfig != null) { | |
| groupByDimInfo = upstream.getDimensionInfo(groupByConfig); | |
| assert(groupByDimInfo, 'Can not find dimension by `groupBy`: ' + groupByConfig); | |
| } | |
| return groupByDimInfo; | |
| } | |
| function travel(groupByDimInfo, upstream, resultDimInfoList, doCreate, doUpdate) { | |
| var outList = []; | |
| var mapByGroup; | |
| if (groupByDimInfo) { | |
| mapByGroup = {}; | |
| for (var dataIndex = 0, len = upstream.count(); dataIndex < len; dataIndex++) { | |
| var groupByVal = upstream.retrieveValue(dataIndex, groupByDimInfo.index); | |
| if (groupByVal == null) { | |
| continue; | |
| } | |
| var groupByValStr = groupByVal + ''; | |
| if (!hasOwn(mapByGroup, groupByValStr)) { | |
| var newLine = doCreate(upstream, dataIndex, resultDimInfoList, groupByDimInfo, groupByVal); | |
| outList.push(newLine); | |
| mapByGroup[groupByValStr] = newLine; | |
| } | |
| else { | |
| var targetLine = mapByGroup[groupByValStr]; | |
| doUpdate(upstream, dataIndex, targetLine, resultDimInfoList, groupByDimInfo, groupByVal); | |
| } | |
| } | |
| } | |
| else { | |
| var targetLine = doCreate(upstream, 0, resultDimInfoList); | |
| outList.push(targetLine); | |
| for (var dataIndex = 1, len = upstream.count(); dataIndex < len; dataIndex++) { | |
| doUpdate(upstream, dataIndex, targetLine, resultDimInfoList); | |
| } | |
| } | |
| return { mapByGroup: mapByGroup, outList: outList }; | |
| } | |
| function normalizeMethod(method) { | |
| if (method == null) { | |
| return 'FIRST'; | |
| } | |
| var methodInternal = method.toUpperCase(); | |
| methodInternal = hasOwn(METHOD_ALIAS, methodInternal) | |
| ? METHOD_ALIAS[methodInternal] | |
| : methodInternal; | |
| assert(hasOwn(METHOD_INTERNAL, methodInternal), "Illegal method " + method + "."); | |
| return methodInternal; | |
| } | |
| var createCollectionResultLine = function (upstream, dataIndex, collectionDimInfoList, groupByDimInfo, groupByVal) { | |
| var newLine = []; | |
| for (var i = 0; i < collectionDimInfoList.length; i++) { | |
| var dimInfo = collectionDimInfoList[i]; | |
| var collectionInfoList = dimInfo.collectionInfoList; | |
| for (var j = 0; j < collectionInfoList.length; j++) { | |
| var collectionInfo = collectionInfoList[j]; | |
| newLine[collectionInfo.indexInLine] = +lineCreator[collectionInfo.method](upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal); | |
| } | |
| if (dimInfo.needGatherValues) { | |
| var val = upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream); | |
| dimInfo.gatherValue(groupByDimInfo, groupByVal, val); | |
| } | |
| } | |
| return newLine; | |
| }; | |
| var updateCollectionResultLine = function (upstream, dataIndex, targetLine, collectionDimInfoList, groupByDimInfo, groupByVal) { | |
| for (var i = 0; i < collectionDimInfoList.length; i++) { | |
| var dimInfo = collectionDimInfoList[i]; | |
| var collectionInfoList = dimInfo.collectionInfoList; | |
| for (var j = 0; j < collectionInfoList.length; j++) { | |
| var collectionInfo = collectionInfoList[j]; | |
| var indexInLine = collectionInfo.indexInLine; | |
| targetLine[indexInLine] = +lineUpdater[collectionInfo.method](targetLine[indexInLine], upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal); | |
| } | |
| if (dimInfo.needGatherValues) { | |
| var val = upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream); | |
| dimInfo.gatherValue(groupByDimInfo, groupByVal, val); | |
| } | |
| } | |
| }; | |
| var createFinalResultLine = function (upstream, dataIndex, finalResultDimInfoList, groupByDimInfo, groupByVal) { | |
| var newLine = []; | |
| for (var i = 0; i < finalResultDimInfoList.length; i++) { | |
| var dimInfo = finalResultDimInfoList[i]; | |
| var method = dimInfo.method; | |
| newLine[i] = isGroupByDimension(groupByDimInfo, dimInfo) | |
| ? groupByVal | |
| : lineCreator[method](upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal); | |
| } | |
| return newLine; | |
| }; | |
| var updateFinalResultLine = function (upstream, dataIndex, targetLine, finalResultDimInfoList, groupByDimInfo, groupByVal) { | |
| for (var i = 0; i < finalResultDimInfoList.length; i++) { | |
| var dimInfo = finalResultDimInfoList[i]; | |
| if (isGroupByDimension(groupByDimInfo, dimInfo)) { | |
| continue; | |
| } | |
| var method = dimInfo.method; | |
| targetLine[i] = lineUpdater[method](targetLine[i], upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal); | |
| } | |
| }; | |
| function isGroupByDimension(groupByDimInfo, targetDimInfo) { | |
| return groupByDimInfo && targetDimInfo.indexInUpstream === groupByDimInfo.index; | |
| } | |
| function asc(list) { | |
| list.sort(function (a, b) { | |
| return a - b; | |
| }); | |
| } | |
| var lineCreator = { | |
| 'SUM': function () { | |
| return 0; | |
| }, | |
| 'COUNT': function () { | |
| return 1; | |
| }, | |
| 'FIRST': function (upstream, dataIndex, dimInfo) { | |
| return upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream); | |
| }, | |
| 'MIN': function (upstream, dataIndex, dimInfo) { | |
| return upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream); | |
| }, | |
| 'MAX': function (upstream, dataIndex, dimInfo) { | |
| return upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream); | |
| }, | |
| 'AVERAGE': function (upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal) { | |
| var collectLine = groupByDimInfo | |
| ? dimInfo.__collectionResult.mapByGroup[groupByVal + ''] | |
| : dimInfo.__collectionResult.outList[0]; | |
| return upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream) | |
| / collectLine[dimInfo.getCollectionInfo('COUNT').indexInLine]; | |
| }, | |
| 'Q1': function (upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal) { | |
| return lineCreatorForQ(0.25, dimInfo, groupByDimInfo, groupByVal); | |
| }, | |
| 'Q2': function (upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal) { | |
| return lineCreatorForQ(0.5, dimInfo, groupByDimInfo, groupByVal); | |
| }, | |
| 'Q3': function (upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal) { | |
| return lineCreatorForQ(0.75, dimInfo, groupByDimInfo, groupByVal); | |
| } | |
| }; | |
| var lineUpdater = { | |
| 'SUM': function (val, upstream, dataIndex, dimInfo) { | |
| return val + upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream); | |
| }, | |
| 'COUNT': function (val) { | |
| return val + 1; | |
| }, | |
| 'FIRST': function (val) { | |
| return val; | |
| }, | |
| 'MIN': function (val, upstream, dataIndex, dimInfo) { | |
| return Math.min(val, upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream)); | |
| }, | |
| 'MAX': function (val, upstream, dataIndex, dimInfo) { | |
| return Math.max(val, upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream)); | |
| }, | |
| 'AVERAGE': function (val, upstream, dataIndex, dimInfo, groupByDimInfo, groupByVal) { | |
| var collectLine = groupByDimInfo | |
| ? dimInfo.__collectionResult.mapByGroup[groupByVal + ''] | |
| : dimInfo.__collectionResult.outList[0]; | |
| return val | |
| + upstream.retrieveValue(dataIndex, dimInfo.indexInUpstream) | |
| / collectLine[dimInfo.getCollectionInfo('COUNT').indexInLine]; | |
| }, | |
| 'Q1': function (val, upstream, dataIndex, dimInfo) { | |
| return val; | |
| }, | |
| 'Q2': function (val, upstream, dataIndex, dimInfo) { | |
| return val; | |
| }, | |
| 'Q3': function (val, upstream, dataIndex, dimInfo) { | |
| return val; | |
| } | |
| }; | |
| function lineCreatorForQ(percent, dimInfo, groupByDimInfo, groupByVal) { | |
| var gatheredValues = groupByDimInfo | |
| ? dimInfo.gatheredValuesByGroup[groupByVal + ''] | |
| : dimInfo.gatheredValuesNoGroup; | |
| return quantile(gatheredValues, percent); | |
| } | |
| exports.aggregate = transform$1; | |
| exports.id = transform; | |
| Object.defineProperty(exports, '__esModule', { value: true }); | |
| }))); | |
| //# sourceMappingURL=index.js.map |