コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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)));
            }
        }