(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