UNPKG

@fusioncharts/datatable

Version:

In memory tabular data storage

1 lines 13 kB
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");var _extends=require("@babel/runtime/helpers/extends");exports.__esModule=true;exports.default=void 0;var _datatableUtils=require("../utils/datatable-utils");var _datetimeOps=require("@fusioncharts/utils/src/time-intervals/datetime-ops");var _duration=require("@fusioncharts/utils/src/time-intervals/duration");var _interval=require("@fusioncharts/utils/src/ds-utils/interval");var _index2=_interopRequireDefault(require("../aggregators/index.js"));var _globalConfig=require("../globalConfig");var _typeEnums=require("./type-enums");var _groupBy=_interopRequireWildcard(require("./group-by"));var _comparators=require("../utils/comparators");var _sortedSearch=require("../utils/sorted-search");var _fcTimeSeparator=_interopRequireDefault(require("@fusioncharts/utils/src/string/fc-time-separator"));function _interopRequireWildcard(e,t){if("function"==typeof WeakMap)var r=new WeakMap,n=new WeakMap;return(_interopRequireWildcard=function _interopRequireWildcard(e,t){if(!t&&e&&e.__esModule)return e;var o,i,f=_extends({},null,{default:e});if(null===e||"object"!=typeof e&&"function"!=typeof e)return f;if(o=t?n:r){if(o.has(e))return o.get(e);o.set(e,f)}for(var _t in e)"default"!==_t&&{}.hasOwnProperty.call(e,_t)&&((i=(o=Object.defineProperty)&&Object.getOwnPropertyDescriptor(e,_t))&&(i.get||i.set)?o(f,_t,i):f[_t]=e[_t]);return f})(e,t)}var UNDEF;function pivot(groupConfigArr,pivotColumn,aggrConfigArr){var groupConfigArray=groupConfigArr,pivotCol=pivotColumn,aggrConfigArray=aggrConfigArr;return{ops:"pivot",type:_typeEnums.OperatorTypes.GroupBy,_updateArgs:function _updateArgs(groupConfigurationArr,pivotColumnName,aggrConfigurationArr){groupConfigArray=groupConfigurationArr;pivotCol=pivotColumnName;aggrConfigArray=aggrConfigurationArr},fn:function fn(data,schema,config,generatorFn){if(groupConfigArray.length===0)throw new Error("groupConfigArray cannot be empty");if(aggrConfigArray.length===0)throw new Error("aggrConfigArray cannot be empty");if(!pivotCol)throw new Error("pivotCol cannot be empty");if(!(groupConfigArray instanceof Array)&&groupConfigArray instanceof Object){groupConfigArray=[groupConfigArray]}if(!(aggrConfigArray instanceof Array)&&aggrConfigArray instanceof Object){aggrConfigArray=[aggrConfigArray]}if(groupConfigArray.length===1&&config&&groupConfigArray[0].column===config.indexBy){return _singleSortedPivot(data,schema,config,groupConfigArray[0],aggrConfigArray,pivotCol)}return _genericPivot(data,schema,config,generatorFn,groupConfigArray,aggrConfigArray,pivotCol)}}}function _createAggrSchema(data,schema,_groupConfig,_aggrConfig,pivotColumn){var newSchema=[],comparator,uniquePivotItems,uniquePivotLength,pivotColumns={},groupConfigLength,aggrConfigLength,columnIndex,column,type,aggregatorFn,aggrColName,i,j,count=0,operation,newColumn,groupConfig=_groupConfig,aggrConfig=_aggrConfig;groupConfig=groupConfig instanceof Array?groupConfig:[groupConfig];aggrConfig=aggrConfig instanceof Array?aggrConfig:[aggrConfig];groupConfigLength=groupConfig.length;aggrConfigLength=aggrConfig.length;for(i=0;i<groupConfigLength;i++){columnIndex=(0,_datatableUtils.columnIndexOf)(groupConfig[i].column,schema);column=schema[columnIndex];if(columnIndex===-1)throw new Error("incorrect column name in groupConfigArr - "+groupConfig[i].column);newColumn={name:groupConfig[i].outputAs||groupConfig[i].column,type:column.type==="date"?"interval":column.type};if(column.enableUTC!==UNDEF){newColumn.enableUTC=column.enableUTC}newSchema.push(newColumn)}switch(pivotColumn.type){case"number":case"date":comparator=_comparators.numberComparator;break;default:comparator=_comparators.stringComparator;break}uniquePivotItems=(0,_datatableUtils.columnUnique)(pivotColumn.name,data,schema);uniquePivotItems.sort((function(a,b){return comparator(a,b)}));uniquePivotLength=uniquePivotItems.length;for(i=0;i<aggrConfigLength;i++){operation=aggrConfig[i].operation||"avg";columnIndex=(0,_datatableUtils.columnIndexOf)(aggrConfig[i].column,schema);column=schema[columnIndex];if(columnIndex===-1)throw new Error("incorrect column name in aggrConfigArr - "+aggrConfig[i].column);aggregatorFn=_index2.default.resolve(operation);if(!aggregatorFn)throw new Error(operation+" is not a defined operation");switch(operation){case"first":case"last":type=column.type;break;case"count":type="number";break;default:if(column.type!=="number")throw new Error(operation+" can apply only on numbers");type="number"}for(j=0;j<uniquePivotLength;j++){aggrColName=uniquePivotItems[j]+_fcTimeSeparator.default+(aggrConfig[i].outputAs||aggrConfig[i].column+(operation?_fcTimeSeparator.default+operation:""));pivotColumns[aggrColName]=count++;newSchema.push({name:aggrColName,type:type})}}return{schema:newSchema,pivots:pivotColumns}}function _singleSortedPivot(data,schema,config,groupConfig,aggrConfig,pivotName){var newData=[],newSchema=[],pivotColumns={},schemaResult,dataLength=data.length,groupColumnIndex,groupColumn,pivotColumnIndex,pivotColumn,maxDate,groupConfigCopy,timeDuration,startValFloorVal,startPos=0,lastEntry,cacheColumnIndex=_cacheColumnIndex(),cacheGroupCount=[],newDataLength,enableUTC,i;groupColumnIndex=(0,_datatableUtils.columnIndexOf)(groupConfig.column,schema);if(groupColumnIndex===-1)throw new Error("incorrect column name in groupConfigArr - "+groupConfig);pivotColumnIndex=(0,_datatableUtils.columnIndexOf)(pivotName,schema);if(pivotColumnIndex===-1)throw new Error("incorrect pivot column name");groupColumn=schema[groupColumnIndex];pivotColumn=schema[pivotColumnIndex];groupConfigCopy=Object.assign({},groupConfig);groupConfigCopy.type=groupColumn.type;groupConfigCopy.outputAs=groupConfig.outputAs;schemaResult=_createAggrSchema(data,schema,groupConfigCopy,aggrConfig,pivotColumn);newSchema=schemaResult.schema;pivotColumns=schemaResult.pivots;if(dataLength>0){enableUTC=groupColumn.enableUTC||(0,_globalConfig.getConfig)("enableUTC");if(groupColumn.type==="date"){var peaks,minDate,startValue;timeDuration=(0,_duration.duration)(groupConfig.timeUnit,Math.abs(groupConfig.binSize)||1);if(!data[0]||!data[0][groupColumnIndex]||!data[dataLength-1]||!data[dataLength-1][groupColumnIndex]){peaks=(0,_datatableUtils.columnExtents)(groupConfig.column,data,schema,config.indexBy)}minDate=data[0]&&data[0][groupColumnIndex]||peaks.min;startValue=groupConfig.startValue&&parseInt(groupConfig.startValue,10);if(startValue&&groupConfig.timeUnit.name!=="Week"){if(startValue>=minDate){var comparer=function comparer(a,b){return(0,_comparators.numberComparator)(a[groupColumnIndex],b)};startValFloorVal=(0,_datetimeOps.getDateStart)(startValue,(0,_duration.duration)(groupConfig.timeUnit,1),enableUTC,groupConfig.weekStartFrom);startPos=(0,_sortedSearch.leftMostExactOrGreater)(startValFloorVal,data,comparer,0,data.length)}else{startValFloorVal=(0,_datetimeOps.getDateStart)(minDate,timeDuration,enableUTC,groupConfig.weekStartFrom,startValue)}}else{startValFloorVal=(0,_datetimeOps.getDateStart)(minDate,(0,_duration.duration)(groupConfig.timeUnit,1),enableUTC,groupConfig.weekStartFrom)}maxDate=data[dataLength-1]&&data[dataLength-1][groupColumnIndex]||peaks.max}if(startValFloorVal===UNDEF||startValFloorVal<=maxDate){var intervalConfig={duration:timeDuration,outputFormat:groupConfig.outputFormat,enableUTC:enableUTC,weekStartFrom:groupConfig.weekStartFrom};if(startValFloorVal!==UNDEF){lastEntry=[(0,_interval.interval)(startValFloorVal,intervalConfig)];newData.push(lastEntry)}for(i=startPos;i<dataLength;i++){if(data[i].length>0){if(groupColumn.type==="date"){lastEntry=(0,_groupBy._singleSortedAddRowDate)(newData,lastEntry,data[i][groupColumnIndex],intervalConfig,startValFloorVal)}else if(groupColumn.type==="string"||groupColumn.type==="number"){lastEntry=(0,_groupBy._singleSortedAddRow)(newData,lastEntry,data[i][groupColumnIndex])}newDataLength=newData.length-1;cacheGroupCount[newDataLength]=cacheGroupCount[newDataLength]||{};lastEntry&&_applyAggr(data[i],schema,lastEntry,1,aggrConfig,pivotColumnIndex,pivotColumns,cacheColumnIndex,cacheGroupCount[newDataLength])}}}}return{data:newData,schema:newSchema,config:{indexBy:groupConfig.outputAs||groupConfig.column}}}function _genericPivot(data,schema,config,generatorFn,groupConfigArr,aggrConfigArr,pivotColumn){var groupOps,groupedData,comparator,pivotUnique,pivotUniqueSorted,groupedSchemaWithoutPivot,pivotColIndex,groupedSchemaLen,groupConfigColumns,groupColMap={},hashTable={},_getRowIndex=function _getRowIndex(hashKey){if(hashTable.hasOwnProperty(hashKey)){return hashTable[hashKey]}return-1},_insertNewKey=function _insertNewKey(hashKey,rowIndex){hashTable[hashKey]=rowIndex},_getPivotAggrColName=function _getPivotAggrColName(pivotCol,outputAs,aggrCol,aggrOps){return pivotCol+_fcTimeSeparator.default+(outputAs||aggrCol+(aggrOps?_fcTimeSeparator.default+aggrOps:""))},_buildPivotSchema=function _buildPivotSchema(){var newSchema=[],aggr;var _loop=function _loop(i){if(groupConfigColumns.includes(groupedSchemaWithoutPivot[i].name)){newSchema.push(groupedSchemaWithoutPivot[i]);groupColMap[groupedSchemaWithoutPivot[i].name]=i}else{aggr=aggrConfigArr.filter((function(x){return(x.outputAs||x.column+(x.operation?_fcTimeSeparator.default+x.operation:""))===groupedSchemaWithoutPivot[i].name}))[0];for(var j=0;j<pivotUniqueSorted.length;j++){newSchema.push({name:_getPivotAggrColName(pivotUniqueSorted[j],aggr.outputAs,aggr.column,aggr.operation),type:groupedSchemaWithoutPivot[i].type})}}};for(var i=0;i<groupedSchemaLen;i++){_loop(i)}return newSchema},_buildPivotData=function _buildPivotData(newSchema){var pivotData=[],columnLen=newSchema.length,newSchemaColMap={},i,j,rowIndex,aggr,rowMapIndex,rowMap={},hashKey="";for(i=0;i<columnLen;i++){newSchemaColMap[newSchema[i].name]=i}for(i=0;i<groupedData.data.length;i++){rowMap={};hashKey="";for(j=0;j<groupedData.schema.length;j++){if(groupColMap.hasOwnProperty(groupedData.schema[j].name)){rowMap[newSchemaColMap[groupedData.schema[j].name]]=groupedData.data[i][j];if(groupedData.schema[j].type==="interval"){hashKey+=groupedData.data[i][j].start}else{hashKey+=groupedData.data[i][j]}}else if(groupedData.schema[j].name!==pivotColumn){aggr=aggrConfigArr.filter((function(x){return(x.outputAs||x.column+(x.operation?_fcTimeSeparator.default+x.operation:""))===groupedData.schema[j].name}))[0];rowMapIndex=newSchemaColMap[_getPivotAggrColName(groupedData.data[i][pivotColIndex],aggr.outputAs,aggr.column,aggr.operation)];if(rowMapIndex)rowMap[rowMapIndex]=groupedData.data[i][j]}}rowIndex=_getRowIndex(hashKey);if(rowIndex>-1){var row=pivotData[rowIndex];for(var index in rowMap){row[index]=rowMap[index]}}else{var _row=new Array(columnLen);for(var _index in rowMap){_row[_index]=rowMap[_index]}pivotData.push(_row);_insertNewKey(hashKey,pivotData.length-1)}}return pivotData},pivotSchema=[],pivotData=[];groupOps=(0,_groupBy.default)(groupConfigArr.concat({column:pivotColumn}),aggrConfigArr);groupedData=groupOps.fn(data,schema,config,generatorFn);pivotUnique=(0,_datatableUtils.columnUnique)(pivotColumn,data,schema);pivotColIndex=(0,_datatableUtils.columnIndexOf)(pivotColumn,groupedData.schema);switch(groupedData.schema[pivotColIndex].type){case"number":case"date":comparator=_comparators.numberComparator;break;default:comparator=_comparators.stringComparator;break}pivotUniqueSorted=pivotUnique&&pivotUnique.sort((function(a,b){return comparator(a,b)}))||[];groupedSchemaWithoutPivot=groupedData.schema.filter((function(x){return x.name!==pivotColumn}));groupedSchemaLen=groupedSchemaWithoutPivot.length;groupConfigColumns=groupConfigArr.map((function(x){return x.outputAs||x.column}));pivotSchema=_buildPivotSchema();if(groupedData.data.length>0){pivotData=_buildPivotData(pivotSchema)}return{data:pivotData,schema:pivotSchema,config:{indexBy:groupedData.config.indexBy===pivotColumn?UNDEF:groupedData.config.indexBy}}}function _cacheColumnIndex(){var cache={};return function(columnName,schema){if(!cache[columnName]){cache[columnName]=(0,_datatableUtils.columnIndexOf)(columnName,schema)}return cache[columnName]}}function _applyAggr(dataRow,schema,lastEntry,entryIndex,aggrConfig,pivotColumnIndex,pivotColumns,cacheColumnIndex,cacheGroupCountRow){var aggrConfigLength=aggrConfig.length,columnIndex,operation,count,i,index;for(i=0;i<aggrConfigLength;i++){columnIndex=cacheColumnIndex(aggrConfig[i].column,schema);if(dataRow[columnIndex]!==UNDEF&&dataRow[columnIndex]!==null){operation=aggrConfig[i].operation||"avg";index=pivotColumns[dataRow[pivotColumnIndex]+_fcTimeSeparator.default+(aggrConfig[i].outputAs||aggrConfig[i].column+(operation?_fcTimeSeparator.default+operation:""))];switch(operation){case"sum":case"min":case"max":case"first":case"last":count=null;break;default:count=cacheGroupCountRow[index]=cacheGroupCountRow[index]&&cacheGroupCountRow[index]+1||1;break}lastEntry[entryIndex+index]=operation==="count"?count:_index2.default.resolve(operation)(lastEntry[entryIndex+index]!==UNDEF?lastEntry[entryIndex+index]:null,dataRow[columnIndex],count)}}}var _default=exports.default=pivot;