@@ -68,6 +68,13 @@ internal class AggregateFormatter : IJsonFormatter<IAggregate>
6868 { Parser . Hits , 2 } ,
6969 } ;
7070
71+ private static readonly AutomataDictionary ExtendedStatsFields = new AutomataDictionary
72+ {
73+ { "variance" , 0 } ,
74+ { "std_deviation" , 1 } ,
75+ { "std_deviation_bounds" , 2 }
76+ } ;
77+
7178 private static readonly byte [ ] ValueAsStringField = JsonWriter . GetEncodedPropertyNameWithoutQuotation ( Parser . ValueAsString ) ;
7279
7380 static AggregateFormatter ( )
@@ -547,10 +554,10 @@ private IAggregate GetStatsAggregate(ref JsonReader reader, IJsonFormatterResolv
547554 if ( reader . GetCurrentJsonToken ( ) == JsonToken . EndObject )
548555 return statsMetric ;
549556
550- return GetExtendedStatsAggregate ( ref reader , statsMetric , meta ) ;
557+ return GetExtendedStatsAggregate ( ref reader , formatterResolver , statsMetric , meta ) ;
551558 }
552559
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 )
554561 {
555562 var extendedStatsMetric = new ExtendedStatsAggregate
556563 {
@@ -564,35 +571,31 @@ private IAggregate GetExtendedStatsAggregate(ref JsonReader reader, StatsAggrega
564571
565572 extendedStatsMetric . SumOfSquares = reader . ReadNullableDouble ( ) ;
566573 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 ( ) ;
574574
575- if ( reader . GetCurrentJsonToken ( ) != JsonToken . EndObject )
575+ while ( reader . GetCurrentJsonToken ( ) != JsonToken . EndObject )
576576 {
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 ( ) ;
592596
593- // read any remaining _as_string fields
594- while ( reader . GetCurrentJsonToken ( ) != JsonToken . EndObject )
595- reader . ReadNextBlock ( ) ;
597+ reader . ReadIsValueSeparator ( ) ;
598+ }
596599
597600 return extendedStatsMetric ;
598601 }
0 commit comments