Skip to content

Commit e5826bc

Browse files
committed
More lenient extended_stats deserialization
This commit updates the deserialization of ExtendedStatsAggregate to make it more lenient to the introduction of new fields. Closes #4773
1 parent 77df2b9 commit e5826bc

File tree

2 files changed

+38
-29
lines changed

2 files changed

+38
-29
lines changed

src/Nest/Aggregations/AggregateFormatter.cs

Lines changed: 31 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

src/Nest/Aggregations/Metric/ExtendedStats/ExtendedStatsAggregate.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
33
// See the LICENSE file in the project root for more information
44

5-
namespace Nest
5+
using System.Runtime.Serialization;
6+
7+
namespace Nest
68
{
79
public class ExtendedStatsAggregate : StatsAggregate
810
{
@@ -12,9 +14,13 @@ public class ExtendedStatsAggregate : StatsAggregate
1214
public double? Variance { get; set; }
1315
}
1416

17+
[DataContract]
1518
public class StandardDeviationBounds
1619
{
20+
[DataMember(Name = "lower")]
1721
public double? Lower { get; set; }
22+
23+
[DataMember(Name = "upper")]
1824
public double? Upper { get; set; }
1925
}
2026
}

0 commit comments

Comments
 (0)