private FilterContainer _GeoDistance(PropertyPathMarker field, Action <GeoDistanceFilterDescriptor> filterDescriptor)
        {
            var filter = new GeoDistanceFilterDescriptor();

            if (filterDescriptor != null)
            {
                filterDescriptor(filter);
            }

            IGeoDistanceFilter ff = filter;

            ff.Field = field;
            return(this.New(filter, f => f.GeoDistance = filter));
        }
		public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
		{
			var j = JObject.Load(reader);
			if (j == null || !j.HasValues)
				return null;
			IGeoDistanceFilter filter = new GeoDistanceFilterDescriptor();
			foreach (var jv in j)
			{
				switch (jv.Key)
				{
					case "distance":
						filter.Distance = jv.Value.Value<string>();
						break;
					case "distance_type":
						filter.DistanceType = jv.Value.Value<string>().ToEnum<GeoDistance>();
						break;
					case "optimize_bbox":
						filter.OptimizeBoundingBox = jv.Value.Value<string>().ToEnum<GeoOptimizeBBox>();
						break;
					case "unit":
						filter.Unit = jv.Value.Value<string>().ToEnum<GeoUnit>();
						break;
					case "_cache":
						filter.Cache = jv.Value.Value<bool>();
						break;
					case "_cache_key":
						filter.CacheKey = jv.Value.Value<string>();
						break;
					case "_name":
						filter.FilterName = jv.Value.Value<string>();
						break;
					default:
						filter.Field = jv.Key;
						filter.Location = jv.Value.Value<string>();
						break;
				}
			}



			return filter;

		}