|  | (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 |