@@ -68,6 +68,13 @@ internal class AggregateFormatter : IJsonFormatter<IAggregate>
68
68
{ Parser . Hits , 2 } ,
69
69
} ;
70
70
71
+ private static readonly AutomataDictionary ExtendedStatsFields = new AutomataDictionary
72
+ {
73
+ { "variance" , 0 } ,
74
+ { "std_deviation" , 1 } ,
75
+ { "std_deviation_bounds" , 2 }
76
+ } ;
77
+
71
78
private static readonly byte [ ] ValueAsStringField = JsonWriter . GetEncodedPropertyNameWithoutQuotation ( Parser . ValueAsString ) ;
72
79
73
80
static AggregateFormatter ( )
@@ -547,10 +554,10 @@ private IAggregate GetStatsAggregate(ref JsonReader reader, IJsonFormatterResolv
547
554
if ( reader . GetCurrentJsonToken ( ) == JsonToken . EndObject )
548
555
return statsMetric ;
549
556
550
- return GetExtendedStatsAggregate ( ref reader , statsMetric , meta ) ;
557
+ return GetExtendedStatsAggregate ( ref reader , formatterResolver , statsMetric , meta ) ;
551
558
}
552
559
553
- private IAggregate GetExtendedStatsAggregate ( ref JsonReader reader , StatsAggregate statsMetric , IReadOnlyDictionary < string , object > meta )
560
+ private IAggregate GetExtendedStatsAggregate ( ref JsonReader reader , IJsonFormatterResolver formatterResolver , StatsAggregate statsMetric , IReadOnlyDictionary < string , object > meta )
554
561
{
555
562
var extendedStatsMetric = new ExtendedStatsAggregate
556
563
{
@@ -564,35 +571,31 @@ private IAggregate GetExtendedStatsAggregate(ref JsonReader reader, StatsAggrega
564
571
565
572
extendedStatsMetric . SumOfSquares = reader . ReadNullableDouble ( ) ;
566
573
reader . ReadNext ( ) ; // ,
567
- reader . ReadNext ( ) ; // "variance"
568
- reader . ReadNext ( ) ; // :
569
- extendedStatsMetric . Variance = reader . ReadNullableDouble ( ) ;
570
- reader . ReadNext ( ) ; // ,
571
- reader . ReadNext ( ) ; // "std_deviation"
572
- reader . ReadNext ( ) ; // :
573
- extendedStatsMetric . StdDeviation = reader . ReadNullableDouble ( ) ;
574
574
575
- if ( reader . GetCurrentJsonToken ( ) != JsonToken . EndObject )
575
+ while ( reader . GetCurrentJsonToken ( ) != JsonToken . EndObject )
576
576
{
577
- var bounds = new StandardDeviationBounds ( ) ;
578
- reader . ReadNext ( ) ; // ,
579
- reader . ReadNext ( ) ; // "std_deviation_bounds"
580
- reader . ReadNext ( ) ; // :
581
- reader . ReadNext ( ) ; // {
582
- reader . ReadNext ( ) ; // "upper"
583
- reader . ReadNext ( ) ; // :
584
- bounds . Upper = reader . ReadNullableDouble ( ) ;
585
- reader . ReadNext ( ) ; // ,
586
- reader . ReadNext ( ) ; // "lower"
587
- reader . ReadNext ( ) ; // :
588
- bounds . Lower = reader . ReadNullableDouble ( ) ;
589
- reader . ReadNext ( ) ; // }
590
- extendedStatsMetric . StdDeviationBounds = bounds ;
591
- }
577
+ var propertyName = reader . ReadPropertyNameSegmentRaw ( ) ;
578
+ if ( ExtendedStatsFields . TryGetValue ( propertyName , out var value ) )
579
+ {
580
+ switch ( value )
581
+ {
582
+ case 0 :
583
+ extendedStatsMetric . Variance = reader . ReadNullableDouble ( ) ;
584
+ break ;
585
+ case 1 :
586
+ extendedStatsMetric . StdDeviation = reader . ReadNullableDouble ( ) ;
587
+ break ;
588
+ case 2 :
589
+ extendedStatsMetric . StdDeviationBounds =
590
+ formatterResolver . GetFormatter < StandardDeviationBounds > ( ) . Deserialize ( ref reader , formatterResolver ) ;
591
+ break ;
592
+ }
593
+ }
594
+ else
595
+ reader . ReadNextBlock ( ) ;
592
596
593
- // read any remaining _as_string fields
594
- while ( reader . GetCurrentJsonToken ( ) != JsonToken . EndObject )
595
- reader . ReadNextBlock ( ) ;
597
+ reader . ReadIsValueSeparator ( ) ;
598
+ }
596
599
597
600
return extendedStatsMetric ;
598
601
}
0 commit comments