@@ -2,31 +2,49 @@ import { groupBy, sumBy, minBy, maxBy, meanBy, sortBy, flatten, uniq } from 'lod
22
33import type { Aggregator , Datum , Measure , MeasureMethod } from '../types' ;
44
5+ /**
6+ * Aggregate the sum of measure field.
7+ */
58const sum = ( data : Datum [ ] , measure : string ) => {
69 return sumBy ( data , measure ) ;
710} ;
811
12+ /**
13+ * Aggregate the count of measure field.
14+ */
915const count = ( data : Datum [ ] , measure : string ) => {
1016 return data . filter ( ( item ) => measure in item ) . length ;
1117} ;
1218
19+ /**
20+ * Aggregate the distinct count of measure field.
21+ */
1322const countDistinct = ( data : Datum [ ] , measure : string ) => {
1423 return uniq ( data . filter ( ( item ) => measure in item ) . map ( ( item ) => item [ measure ] ) ) . length ;
1524} ;
1625
26+ /**
27+ * Aggregate the max of measure field.
28+ */
1729const max = ( data : Datum [ ] , measure : string ) => {
1830 return maxBy ( data , measure ) ?. [ measure ] as number ;
1931} ;
2032
33+ /**
34+ * Aggregate the min of measure field.
35+ */
2136const min = ( data : Datum [ ] , measure : string ) => {
2237 return minBy ( data , measure ) ?. [ measure ] as number ;
2338} ;
2439
40+ /**
41+ * Aggregate the mean of measure field.
42+ */
2543const mean = ( data : Datum [ ] , measure : string ) => {
2644 return meanBy ( data , measure ) ;
2745} ;
2846
29- export const AggregatorMap : Record < MeasureMethod , Aggregator > = {
47+ export const AGGREGATOR_MAP : Record < MeasureMethod , Aggregator > = {
3048 SUM : sum ,
3149 COUNT : count ,
3250 MAX : max ,
@@ -35,14 +53,17 @@ export const AggregatorMap: Record<MeasureMethod, Aggregator> = {
3553 COUNT_DISTINCT : countDistinct ,
3654} ;
3755
56+ /**
57+ * Aggregate data by groupByField and measures.
58+ */
3859export function aggregate ( data : Datum [ ] , groupByField : string , measures : Measure [ ] , sort ?: boolean ) {
3960 const grouped = groupBy ( data , groupByField ) ;
4061 const entries = sort ? sortBy ( Object . entries ( grouped ) , '0' ) : Object . entries ( grouped ) ;
4162 return entries . map ( ( [ value , dataGroup ] ) => {
4263 const datum : Datum = { [ groupByField ] : value } ;
4364 measures . forEach ( ( measure ) => {
4465 const { fieldName : measureField , method } = measure ;
45- const aggregator = AggregatorMap [ method ] ;
66+ const aggregator = AGGREGATOR_MAP [ method ] ;
4667 datum [ measureField ] = aggregator ( dataGroup , measureField ) ;
4768 } ) ;
4869 return datum ;
@@ -56,7 +77,7 @@ export function aggregateWithMeasures(data: Datum[], groupByField: string, measu
5677 measures . forEach ( ( measure ) => {
5778 const { fieldName : measureField , method } = measure ;
5879 if ( measureField in dataGroup [ 0 ] ) {
59- const aggregator = AggregatorMap [ method ] ;
80+ const aggregator = AGGREGATOR_MAP [ method ] ;
6081 const measureValue = aggregator ( dataGroup , measureField ) ;
6182 result . push ( {
6283 [ groupByField ] : value ,
@@ -72,7 +93,7 @@ export function aggregateWithMeasures(data: Datum[], groupByField: string, measu
7293export function aggregateWithSeries ( data : Datum [ ] , groupByField : string , measure : Measure , expandingField : string ) {
7394 const grouped = groupBy ( data , groupByField ) ;
7495 const { fieldName : measureField , method } = measure ;
75- const aggregator = AggregatorMap [ method ] ;
96+ const aggregator = AGGREGATOR_MAP [ method ] ;
7697 return flatten (
7798 Object . entries ( grouped ) . map ( ( [ value , dataGroup ] ) => {
7899 const childGrouped = groupBy ( dataGroup , expandingField ) ;
0 commit comments