public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            Dictionary<string, object> wholeDict = serializer.Deserialize<Dictionary<string, object>>(reader);
            Dictionary<string, object> facetDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(wholeDict.First().Value.ToString());
            Dictionary<string, object> histoDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(facetDict.GetString(AggregationTypeEnum.DateHistogram.ToString()));

            DateHistogramAggregate agg = null;

            string aggName = wholeDict.First().Key;
            string field = histoDict.GetStringOrDefault(_FIELD);
            Script script = histoDict.DeserializeObject<Script>();

            DateIntervalEnum intervalType = DateIntervalEnum.Day;
            string intervalValue = histoDict.GetString(_INTERVAL);
            intervalType = DateIntervalEnum.Find(intervalValue);
            if (intervalType != null)
            {
                if (!string.IsNullOrWhiteSpace(field) && script != null)
                    agg = new DateHistogramAggregate(aggName, field, script, intervalType);
                else if (!string.IsNullOrWhiteSpace(field))
                    agg = new DateHistogramAggregate(aggName, field, intervalType);
                else if(script != null)
                    agg = new DateHistogramAggregate(aggName, script, intervalType);
            }
            else
            {
                TimeValue timeValue = new TimeValue(intervalValue);
                if (!string.IsNullOrWhiteSpace(field) && script != null)
                    agg = new DateHistogramAggregate(aggName, field, script, timeValue);
                else if (!string.IsNullOrWhiteSpace(field))
                    agg = new DateHistogramAggregate(aggName, field, timeValue);
                else if(script != null)
                    agg = new DateHistogramAggregate(aggName, script, timeValue);
            }

            if (agg == null)
                throw new RequiredPropertyMissingException(_FIELD + "/" + Script.SCRIPT);

            if (histoDict.ContainsKey(_POST_OFFSET))
                agg.PostOffset = JsonConvert.DeserializeObject<TimeValue>(histoDict.GetString(_POST_OFFSET));
            if (histoDict.ContainsKey(_PRE_OFFSET))
                agg.PreOffset = JsonConvert.DeserializeObject<TimeValue>(histoDict.GetString(_PRE_OFFSET));
            agg.PostZone = histoDict.GetTimeSpan(_POST_ZONE, _TIMESPAN_DEFAULT);
            agg.PreZone = histoDict.GetTimeSpan(_PRE_ZONE, _TIMESPAN_DEFAULT);
            agg.PreZoneAdjustLargeInterval = histoDict.GetBool(_PRE_ZONE_ADJUST_LARGE_INTERVAL, _PRE_ZONE_ADJUST_LARGE_INTERVAL_DEFAULT);
            agg.TimeZone = histoDict.GetTimeSpan(_TIME_ZONE, _TIMESPAN_DEFAULT);
            agg.MinimumDocumentCount = histoDict.GetInt32(_MINIMUM_DOCUMENT_COUNT, _MINIMUM_DOCUMENT_COUNT_DEFAULT);
            if (histoDict.ContainsKey(_ORDER))
            {
                Dictionary<string, object> orderDict = JsonConvert.DeserializeObject<Dictionary<string, object>>(histoDict.GetString(_ORDER));
                if (orderDict.Count != 1)
                    throw new Exception("The order parameter must be a dictionary of one key value pair.");

                agg.SortValue = orderDict.First().Key;
                agg.SortOrder = SortOrderEnum.Find(orderDict.First().Value.ToString());
            }

            return agg;
        }
 public void PASS_Create()
 {
     DateHistogramAggregate agg = new DateHistogramAggregate("name", "field", DateIntervalEnum.Day);
     Assert.IsNotNull(agg);
     Assert.AreEqual("name", agg.Name);
     Assert.AreEqual("field", agg.Field);
     Assert.AreEqual(DateIntervalEnum.Day, agg.ConstantInterval);
 }
        public void PASS_Serialize()
        {
            DateHistogramAggregate agg = new DateHistogramAggregate("name", "field", DateIntervalEnum.Day);

            string json = JsonConvert.SerializeObject(agg);
            Assert.IsNotNull(json);

            string expectedJson = "{\"name\":{\"date_histogram\":{\"field\":\"field\",\"interval\":\"day\"}}}";
            Assert.AreEqual(expectedJson, json);
        }