Skip to content

Commit c0ca4eb

Browse files
russcamMpdreamz
authored andcommitted
Check the token type of score property when deserializing aggregation (#2135)
The deserialization assumes that a property named "score" is an indicator that an aggregation is a significant terms aggregation, but this may not be the case; "score" could be a user-supplied name for an aggregation
1 parent 937019b commit c0ca4eb

File tree

1 file changed

+25
-16
lines changed

1 file changed

+25
-16
lines changed

src/Nest/Aggregations/AggregateJsonConverter.cs

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,8 @@ private IBucket ReadBucket(JsonReader reader, JsonSerializer serializer)
9393
if (reader.TokenType != JsonToken.PropertyName)
9494
return null;
9595

96-
IBucket item = null;
97-
98-
var property = reader.Value as string;
96+
IBucket item;
97+
var property = (string)reader.Value;
9998

10099
switch (property)
101100
{
@@ -125,7 +124,7 @@ private Dictionary<string, object> GetMetadata(JsonReader reader)
125124
reader.Read();
126125
while (reader.TokenType != JsonToken.EndObject)
127126
{
128-
var key = reader.Value as string;
127+
var key = (string)reader.Value;
129128
reader.Read();
130129
var value = reader.Value;
131130
meta.Add(key, value);
@@ -330,16 +329,17 @@ private IAggregate GetExtendedStatsAggregate(StatsAggregate statsMetric, JsonRea
330329
return extendedStatsMetric;
331330
}
332331

333-
private IDictionary<string, IAggregate> GetSubAggregates(JsonReader reader, JsonSerializer serializer)
332+
private IDictionary<string, IAggregate> GetSubAggregates(JsonReader reader, JsonSerializer serializer, Dictionary<string, IAggregate> aggregates = null)
334333
{
335334
if (reader.TokenType != JsonToken.PropertyName)
336-
return null;
335+
return aggregates;
336+
337+
var nestedAggs = aggregates ?? new Dictionary<string, IAggregate>();
337338

338-
var nestedAggs = new Dictionary<string, IAggregate>();
339339
var currentDepth = reader.Depth;
340340
do
341341
{
342-
var fieldName = reader.Value as string;
342+
var fieldName = (string)reader.Value;
343343
reader.Read();
344344
var agg = this.ReadAggregate(reader, serializer);
345345
nestedAggs.Add(fieldName, agg);
@@ -353,14 +353,14 @@ private IDictionary<string, IAggregate> GetSubAggregates(JsonReader reader, Json
353353
private IAggregate GetMultiBucketAggregate(JsonReader reader, JsonSerializer serializer)
354354
{
355355
var bucket = new BucketAggregate();
356-
var property = reader.Value as string;
356+
var property = (string)reader.Value;
357357
if (property == "doc_count_error_upper_bound")
358358
{
359359
reader.Read();
360360
bucket.DocCountErrorUpperBound = reader.Value as long?;
361361
reader.Read();
362362
}
363-
property = reader.Value as string;
363+
property = (string)reader.Value;
364364
if (property == "sum_other_doc_count")
365365
{
366366
reader.Read();
@@ -537,7 +537,7 @@ private IBucket GetKeyedBucket(JsonReader reader, JsonSerializer serializer)
537537
{
538538
var key = reader.ReadAsString();
539539
reader.Read();
540-
var property = reader.Value as string;
540+
var property = (string)reader.Value;
541541
if (property == "from" || property == "to")
542542
return GetRangeBucket(reader, serializer, key);
543543

@@ -554,21 +554,30 @@ private IBucket GetKeyedBucket(JsonReader reader, JsonSerializer serializer)
554554
keyItem.DocCount = docCount.GetValueOrDefault(0);
555555
reader.Read();
556556

557-
var nextProperty = reader.Value as string;
557+
Dictionary<string, IAggregate> aggregates = null;
558+
var nextProperty = (string)reader.Value;
558559
if (nextProperty == "score")
559560
{
560-
return GetSignificantTermsBucket(reader, serializer, keyItem);
561-
}
561+
reader.Read();
562+
if (reader.TokenType == JsonToken.Float || reader.TokenType == JsonToken.Null)
563+
{
564+
return GetSignificantTermsBucket(reader, serializer, keyItem);
565+
}
562566

567+
// score is the name of an aggregation
568+
aggregates = new Dictionary<string, IAggregate>();
569+
var aggregate = this.ReadAggregate(reader, serializer);
570+
reader.Read();
571+
aggregates.Add(nextProperty, aggregate);
572+
}
563573

564-
keyItem.Aggregations = this.GetSubAggregates(reader, serializer);
574+
keyItem.Aggregations = this.GetSubAggregates(reader, serializer, aggregates);
565575
return keyItem;
566576

567577
}
568578

569579
private IBucket GetSignificantTermsBucket(JsonReader reader, JsonSerializer serializer, KeyedBucket keyItem)
570580
{
571-
reader.Read();
572581
var score = reader.Value as double?;
573582
reader.Read();
574583
reader.Read();

0 commit comments

Comments
 (0)