From e5826bc5baa30aa38c313bfbc051b00f26c32c0f Mon Sep 17 00:00:00 2001 From: Russ Cam Date: Fri, 12 Jun 2020 12:43:46 +1000 Subject: [PATCH] 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 --- src/Nest/Aggregations/AggregateFormatter.cs | 59 ++++++++++--------- .../ExtendedStats/ExtendedStatsAggregate.cs | 8 ++- 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/Nest/Aggregations/AggregateFormatter.cs b/src/Nest/Aggregations/AggregateFormatter.cs index 2b8cf4381da..0b10fc06e50 100644 --- a/src/Nest/Aggregations/AggregateFormatter.cs +++ b/src/Nest/Aggregations/AggregateFormatter.cs @@ -68,6 +68,13 @@ internal class AggregateFormatter : IJsonFormatter { Parser.Hits, 2 }, }; + private static readonly AutomataDictionary ExtendedStatsFields = new AutomataDictionary + { + { "variance", 0 }, + { "std_deviation", 1 }, + { "std_deviation_bounds", 2 } + }; + private static readonly byte[] ValueAsStringField = JsonWriter.GetEncodedPropertyNameWithoutQuotation(Parser.ValueAsString); static AggregateFormatter() @@ -547,10 +554,10 @@ private IAggregate GetStatsAggregate(ref JsonReader reader, IJsonFormatterResolv if (reader.GetCurrentJsonToken() == JsonToken.EndObject) return statsMetric; - return GetExtendedStatsAggregate(ref reader, statsMetric, meta); + return GetExtendedStatsAggregate(ref reader, formatterResolver, statsMetric, meta); } - private IAggregate GetExtendedStatsAggregate(ref JsonReader reader, StatsAggregate statsMetric, IReadOnlyDictionary meta) + private IAggregate GetExtendedStatsAggregate(ref JsonReader reader, IJsonFormatterResolver formatterResolver, StatsAggregate statsMetric, IReadOnlyDictionary meta) { var extendedStatsMetric = new ExtendedStatsAggregate { @@ -564,35 +571,31 @@ private IAggregate GetExtendedStatsAggregate(ref JsonReader reader, StatsAggrega extendedStatsMetric.SumOfSquares = reader.ReadNullableDouble(); reader.ReadNext(); // , - reader.ReadNext(); // "variance" - reader.ReadNext(); // : - extendedStatsMetric.Variance = reader.ReadNullableDouble(); - reader.ReadNext(); // , - reader.ReadNext(); // "std_deviation" - reader.ReadNext(); // : - extendedStatsMetric.StdDeviation = reader.ReadNullableDouble(); - if (reader.GetCurrentJsonToken() != JsonToken.EndObject) + while (reader.GetCurrentJsonToken() != JsonToken.EndObject) { - var bounds = new StandardDeviationBounds(); - reader.ReadNext(); // , - reader.ReadNext(); // "std_deviation_bounds" - reader.ReadNext(); // : - reader.ReadNext(); // { - reader.ReadNext(); // "upper" - reader.ReadNext(); // : - bounds.Upper = reader.ReadNullableDouble(); - reader.ReadNext(); // , - reader.ReadNext(); // "lower" - reader.ReadNext(); // : - bounds.Lower = reader.ReadNullableDouble(); - reader.ReadNext(); // } - extendedStatsMetric.StdDeviationBounds = bounds; - } + var propertyName = reader.ReadPropertyNameSegmentRaw(); + if (ExtendedStatsFields.TryGetValue(propertyName, out var value)) + { + switch (value) + { + case 0: + extendedStatsMetric.Variance = reader.ReadNullableDouble(); + break; + case 1: + extendedStatsMetric.StdDeviation = reader.ReadNullableDouble(); + break; + case 2: + extendedStatsMetric.StdDeviationBounds = + formatterResolver.GetFormatter().Deserialize(ref reader, formatterResolver); + break; + } + } + else + reader.ReadNextBlock(); - // read any remaining _as_string fields - while (reader.GetCurrentJsonToken() != JsonToken.EndObject) - reader.ReadNextBlock(); + reader.ReadIsValueSeparator(); + } return extendedStatsMetric; } diff --git a/src/Nest/Aggregations/Metric/ExtendedStats/ExtendedStatsAggregate.cs b/src/Nest/Aggregations/Metric/ExtendedStats/ExtendedStatsAggregate.cs index 8e60f8951d3..4dc220f8fec 100644 --- a/src/Nest/Aggregations/Metric/ExtendedStats/ExtendedStatsAggregate.cs +++ b/src/Nest/Aggregations/Metric/ExtendedStats/ExtendedStatsAggregate.cs @@ -2,7 +2,9 @@ // Elasticsearch B.V licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information -namespace Nest +using System.Runtime.Serialization; + +namespace Nest { public class ExtendedStatsAggregate : StatsAggregate { @@ -12,9 +14,13 @@ public class ExtendedStatsAggregate : StatsAggregate public double? Variance { get; set; } } + [DataContract] public class StandardDeviationBounds { + [DataMember(Name = "lower")] public double? Lower { get; set; } + + [DataMember(Name = "upper")] public double? Upper { get; set; } } }