@@ -12,37 +12,36 @@ namespace DevExtreme.AspNet.Data.Aggregation {
1212 class AggregateCalculator < T > {
1313 IEnumerable _data ;
1414 IAccessor < T > _accessor ;
15+ SumFix _sumFix ;
16+ IList < SummaryInfo > _totalSummary ;
17+ IList < SummaryInfo > _groupSummary ;
1518
1619 Aggregator < T > [ ] _totalAggregators ;
17- string [ ] _totalSelectors ;
18-
19- string [ ] _groupSummaryTypes ;
20- string [ ] _groupSelectors ;
2120 Stack < Aggregator < T > [ ] > _groupAggregatorsStack ;
2221
2322
24- public AggregateCalculator ( IEnumerable data , IAccessor < T > accessor , IEnumerable < SummaryInfo > totalSummary , IEnumerable < SummaryInfo > groupSummary ) {
23+ public AggregateCalculator ( IEnumerable data , IAccessor < T > accessor , IList < SummaryInfo > totalSummary , IList < SummaryInfo > groupSummary , SumFix sumFix = null ) {
2524 _data = data ;
2625 _accessor = accessor ;
26+ _totalSummary = totalSummary ;
27+ _groupSummary = groupSummary ;
28+ _sumFix = sumFix ?? new SumFix ( typeof ( T ) , totalSummary , groupSummary ) ;
2729
28- if ( totalSummary != null ) {
29- _totalAggregators = totalSummary . Select ( i => CreateAggregator ( i . SummaryType ) ) . ToArray ( ) ;
30- _totalSelectors = totalSummary . Select ( i => i . Selector ) . ToArray ( ) ;
31- }
30+ _totalAggregators = _totalSummary ? . Select ( CreateAggregator ) . ToArray ( ) ;
3231
33- if ( groupSummary != null ) {
34- _groupSummaryTypes = groupSummary . Select ( i => i . SummaryType ) . ToArray ( ) ;
35- _groupSelectors = groupSummary . Select ( i => i . Selector ) . ToArray ( ) ;
32+ if ( groupSummary != null )
3633 _groupAggregatorsStack = new Stack < Aggregator < T > [ ] > ( ) ;
37- }
3834 }
3935
4036 public object [ ] Run ( ) {
4137 foreach ( var item in _data )
4238 ProcessItem ( item ) ;
4339
44- if ( _totalAggregators != null )
45- return Finish ( _totalAggregators ) ;
40+ if ( _totalAggregators != null ) {
41+ var values = Finish ( _totalAggregators ) ;
42+ _sumFix . ApplyToTotal ( values ) ;
43+ return values ;
44+ }
4645
4746 return null ;
4847 }
@@ -53,37 +52,41 @@ void ProcessItem(object item) {
5352 } else {
5453 if ( _groupAggregatorsStack != null ) {
5554 foreach ( var groupAggregators in _groupAggregatorsStack )
56- Step ( item , groupAggregators , _groupSelectors ) ;
55+ Step ( item , groupAggregators , _groupSummary ) ;
5756 }
5857
5958 if ( _totalAggregators != null )
60- Step ( item , _totalAggregators , _totalSelectors ) ;
59+ Step ( item , _totalAggregators , _totalSummary ) ;
6160 }
6261 }
6362
6463 void ProcessGroup ( Group group ) {
6564 if ( _groupAggregatorsStack != null )
66- _groupAggregatorsStack . Push ( _groupSummaryTypes . Select ( CreateAggregator ) . ToArray ( ) ) ;
65+ _groupAggregatorsStack . Push ( _groupSummary . Select ( CreateAggregator ) . ToArray ( ) ) ;
6766
6867 foreach ( var i in group . items )
6968 ProcessItem ( i ) ;
7069
71- if ( _groupAggregatorsStack != null )
70+ if ( _groupAggregatorsStack != null ) {
7271 group . summary = Finish ( _groupAggregatorsStack . Pop ( ) ) ;
72+ _sumFix . ApplyToGroup ( group . summary ) ;
73+ }
7374 }
7475
75- void Step ( object obj , Aggregator < T > [ ] aggregators , string [ ] selectors ) {
76+ void Step ( object obj , Aggregator < T > [ ] aggregators , IList < SummaryInfo > summary ) {
7677 var typed = ( T ) obj ;
7778 for ( var i = 0 ; i < aggregators . Length ; i ++ )
78- aggregators [ i ] . Step ( typed , selectors [ i ] ) ;
79+ aggregators [ i ] . Step ( typed , summary [ i ] . Selector ) ;
7980 }
8081
8182 object [ ] Finish ( Aggregator < T > [ ] aggregators ) {
8283 return aggregators . Select ( a => a . Finish ( ) ) . ToArray ( ) ;
8384 }
8485
8586
86- Aggregator < T > CreateAggregator ( string summaryType ) {
87+ Aggregator < T > CreateAggregator ( SummaryInfo summaryInfo ) {
88+ var summaryType = summaryInfo . SummaryType ;
89+
8790 switch ( summaryType ) {
8891 case AggregateName . SUM :
8992 return new SumAggregator < T > ( _accessor ) ;
0 commit comments