public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var item = JObject.Load(reader); var typeToken = item.SelectToken("Data.@type") ?? item.SelectToken("data.@type"); IAggregate value = null; if (typeToken != null) { string type = typeToken.Value <string>(); switch (type) { case "bucket": value = new BucketAggregate(); break; case "exstats": value = new ExtendedStatsAggregate(); break; case "ovalue": value = new ObjectValueAggregate(); break; case "percentiles": value = new PercentilesAggregate(); break; case "sbucket": value = new SingleBucketAggregate(); break; case "stats": value = new StatsAggregate(); break; case "tophits": // TODO: Have to get all the docs as JToken and //value = new TopHitsAggregate(); break; case "value": value = new ValueAggregate(); break; case "dvalue": value = new ValueAggregate <DateTime>(); break; } } if (value == null) { value = new ValueAggregate(); } serializer.Populate(item.CreateReader(), value); return(value); }
/// <summary> /// Takes a value metric and forces a conversion to certain type /// </summary> private static TK ValueAsUndType <TK>(ValueAggregate agg) { var type = typeof(TK); Type targetType; if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>)) { targetType = Nullable.GetUnderlyingType(type); } else { targetType = type; } if (agg.Value.HasValue && targetType != null) { // seems that by default ES stores the datetime value as unix timestamp in miliseconds if (targetType == typeof(DateTime)) { DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0); return((TK)(object)origin.AddMilliseconds(agg.Value.Value)); } return((TK)Convert.ChangeType(agg.Value.Value, targetType)); } return((TK)(object)null); }
/// <summary> /// Takes a value metric and forces a conversion to certain type /// </summary> /// <typeparam name="T"></typeparam> /// <typeparam name="K"></typeparam> /// <param name="agg"></param> /// <returns></returns> private static K ValueAsUndType <K>(ValueAggregate agg) { var type = typeof(K); if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>)) { var undType = Nullable.GetUnderlyingType(type); if (!agg.Value.HasValue) { return((K)(Object)null); } var valueAsUndType = Convert.ChangeType(agg.Value, undType); return((K)(Object)valueAsUndType); } //seems that by default ES stores the datetime value as unix timestamp in miliseconds else if (typeof(K) == typeof(DateTime) && agg.Value.HasValue) { DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0); return((K)(Object)origin.AddMilliseconds(agg.Value.Value)); } else { return((K)Convert.ChangeType(agg.Value, typeof(K))); } }