quoslibero
Version:
FusionCharts JavaScript charting framework
1 lines • 5.7 kB
JavaScript
import{columnIndexOf,columnExtents}from'../utils/datatable-utils';import{getDateStart}from'../../../fc-utils/src/time-intervals/datetime-ops';import{duration}from'../../../fc-utils/src/time-intervals/duration';import{interval}from'../../../fc-utils/src/ds-utils/interval';import aggregatorStore from'../aggregators/';import'../aggregators/aggregators';import{getConfig}from'../globalConfig';import{OperatorTypes}from'./type-enums';import{leftMostExactOrGreater}from'../utils/sorted-search';import{numberComparator}from'../utils/comparators';function groupBy(a,b){let c=a,d=b;return{ops:'groupBy',type:OperatorTypes.GroupBy,_updateArgs:(a,b)=>{c=a,d=b},fn:(a,b,e,f)=>{if(f&&(a=f.call()),!c||0===c.length)throw new Error('groupConfigArray cannot be empty');if(!d||0===d.length)throw new Error('aggrConfigArray cannot be empty');return!(c instanceof Array)&&c instanceof Object&&(c=[c]),!(d instanceof Array)&&d instanceof Object&&(d=[d]),1===c.length&&e&&c[0].column===e.indexBy?_singleSortedGroupBy(a,b,e,c[0],d):_genericGroupBy(a,b,e,c,d)}}}function _createAggrSchema(a,b,c,d){var e,f,g,h,j,k,l=[],m=b.length,n=c.length;for(b=b instanceof Array?b:[b],c=c instanceof Array?c:[c],h=0;h<m;h++)e=d(b[h].column,a),k={name:b[h].outputAs||b[h].column,type:'date'===e.type?'interval':e.type},void 0!==e.enableUTC&&(k.enableUTC=e.enableUTC),l.push(k);for(h=0;h<n;h++){if(j=c[h].operation||'avg',e=d(c[h].column,a),g=aggregatorStore.resolve(j),!g)throw new Error(`${j} is not a defined operation`);switch(j){case'first':case'last':f=e.type;break;case'count':f='number';break;default:if('number'!==e.type)throw new Error(`${j} can apply only on numbers`);f='number';}l.push({name:c[h].outputAs||c[h].column+(j?' - '+j:''),type:f})}return l}function _singleSortedGroupBy(a,b,c,d,e){var f,g,h,j,k,l,m,n,o=[],p=[],q=a.length,r=0,s=_cacheColumnConfig(),t=[];if(f=s(d.column,b),f.outputAs=d.outputAs,p=_createAggrSchema(b,[f],e,s),0<q){if(m=f.enableUTC||getConfig('enableUTC'),'date'===f.type){let e,i,k;if(h=duration(d.timeUnit,Math.abs(d.binSize)||1),a[0]&&a[0][f.index]&&a[q-1]&&a[q-1][f.index]||(e=columnExtents(d.column,a,b,c.indexBy)),i=a[0]&&a[0][f.index]||e.min,k=d.startValue&&parseInt(d.startValue,10),!k)j=getDateStart(i,duration(d.timeUnit,1),m,d.weekStartFrom);else if(k>=i){let b=(c,a)=>numberComparator(c[f.index],a);j=getDateStart(k,duration(d.timeUnit,1),m,d.weekStartFrom),r=leftMostExactOrGreater(j,a,b,0,a.length)}else j=getDateStart(i,h,m,d.weekStartFrom,k);g=a[q-1]&&a[q-1][f.index]||e.max}if(void 0===j||j<=g){let c={duration:h,outputFormat:d.outputFormat,enableUTC:m,weekStartFrom:d.weekStartFrom};for(void 0!==j&&(k=[interval(j,c)],o.push(k)),n=r;n<q;n++)0<a[n].length&&('date'===f.type?k=_singleSortedAddRowDate(o,k,a[n][f.index],c,j):('string'===f.type||'number'===f.type)&&(k=_singleSortedAddRow(o,k,a[n][f.index])),l=o.length-1,t[l]=t[l]||{},k&&_applyAggr(a[n],b,k,1,e,s,t[l]))}}return{data:o,schema:p,config:{indexBy:d.outputAs||d.column}}}function _singleSortedAddRow(a,b,c){return b&&c===b[0]||(b=[c],a.push(b)),b}function _singleSortedAddRowDate(a,b,c,d,e){if(c>=b[0].end){let f;switch(d.duration.Unit){case'Month':case'Quarter':case'Year':f=getDateStart(c,d.duration,d.enableUTC,d.weekStartFrom,e);break;default:f=c-(c-e)%d.duration.ms;}b=[interval(f,d)],a.push(b)}return b}function _cacheColumnConfig(){let a={};return function(b,c,d){if(!a[b]){let e=columnIndexOf(b,c),f=c[e];if(f===void 0)throw new Error('incorrect column name in config - '+b);a[b]=f,a[b].column=b,a[b].index=e,'date'===f.type&&d&&(a[b].peaks=columnExtents(b,d,c))}return a[b]}}function _genericGroupBy(a,b,c,d,e){var f,g,h,j,k=[],l=[],m=[],n=!0,o=a.length,p=d.length,q={},r=[],s=_cacheColumnConfig(),t={},u=0;for(j=0;j<p;j++)f=s(d[j].column,b,a),f.outputAs=d[j].outputAs,'date'!==f.type||q[j]||(d[j].startValue>=f.peaks.max&&(n=!1),q[j]=Object.assign({},f),q[j].intervalConfig={duration:duration(d[j].timeUnit,Math.abs(d[j].binSize)||1),outputFormat:d[j].outputFormat,enableUTC:f.enableUTC||getConfig('enableUTC'),weekStartFrom:d[j].weekStartFrom},g=parseInt(d[j].startValue,10)||f.peaks.min,q[j].startValFloorVal=g&&getDateStart(g,duration(d[j].timeUnit,1),q[j].intervalConfig.enableUTC,q[j].intervalConfig.weekStartFrom,parseInt(d[j].startValue,10)),q[j].max=f.peaks.max),m[j]=f,h||d[j].column!==c.indexBy||(h=d[j].outputAs||d[j].column);if(l=_createAggrSchema(b,m,e,s),n&&0<o)for(j=0;j<o;j++)u=_genericGroupByProcessRow(a[j],b,d,e,s,q,t,u,k,r);return{data:k,schema:l,config:{indexBy:h}}}function _genericGroupByProcessRow(a,b,c,d,e,f,g,h,i,k){let l,m,n,o,p='',q=[],r=c.length;if(0<a.length){for(l=0;l<r;l++)if(m=e(c[l].column,b),'date'===m.type){if(f[l].startValFloorVal>a[m.index])return h;switch(c[l].timeUnit.name){case'Month':case'Quarter':case'Year':f[l].value=getDateStart(a[m.index],f[l].intervalConfig.duration,f[l].intervalConfig.enableUTC,f[l].intervalConfig.weekStartFrom,f[l].startValFloorVal);break;default:f[l].value=a[m.index]-(a[m.index]-f[l].startValFloorVal)%f[l].intervalConfig.duration.ms;}p+=f[l].value+'-'}else q[l]=a[m.index],p+=a[m.index]+'-';if(p=p.slice(0,-1),0<=g[p])q=i[g[p]],n=g[p];else{for(const a in g[p]=h++,f)o=interval(f[a].value,f[a].intervalConfig),q[a]=o;i.push(q),n=i.length-1}return k[n]=k[n]||{},q&&_applyAggr(a,b,q,r,d,e,k[n]),h}}function _applyAggr(a,b,c,d,e,f,g){let h,j,k,l,m=e.length;for(l=0;l<m;l++)if(h=f(e[l].column,b),void 0!==a[h.index]&&null!==a[h.index]){switch(j=e[l].operation||'avg',j){case'sum':case'min':case'max':case'first':case'last':k=null;break;default:k=g[l]=g[l]&&g[l]+1||1;}c[d+l]='count'===j?k:aggregatorStore.resolve(j)(void 0===c[d+l]?null:c[d+l],a[h.index],k)}}export default groupBy;export{_singleSortedAddRow,_singleSortedAddRowDate};