private bool WriteDecay(JsonWriter writer, IDecayFunction decay, JsonSerializer serializer)
		{
			if (decay == null) return false;

			writer.WritePropertyName(decay.DecayType);
			writer.WriteStartObject();
			{
				writer.WritePropertyName(serializer.GetConnectionSettings().Inferrer.Field(decay.Field));
				writer.WriteStartObject();
				{
					var write = WriteNumericDecay(writer, decay as IDecayFunction<double?, double?>, serializer)
								|| WriteDateDecay(writer, decay as IDecayFunction<DateMath, Time>, serializer)
								|| WriteGeoDecay(writer, decay as IDecayFunction<GeoLocation, Distance>, serializer);
					if (!write) throw new Exception($"Can not write decay function json for {decay.GetType().Name}");

					if (decay.Decay.HasValue)
					{
						writer.WritePropertyName("decay");
						serializer.Serialize(writer, decay.Decay.Value);
					}
				}
				writer.WriteEndObject();
				if (decay.MultiValueMode.HasValue)
				{
					writer.WritePropertyName("multi_value_mode");
					serializer.Serialize(writer, decay.MultiValueMode.Value);
				}
			}
			writer.WriteEndObject();
			return true;

		}
 private bool WriteNumericDecay(JsonWriter writer, IDecayFunction <double?, double?> value, JsonSerializer serializer)
 {
     if (value == null)
     {
         return(false);
     }
     writer.WritePropertyName("origin");
     serializer.Serialize(writer, value.Origin);
     writer.WritePropertyName("scale");
     serializer.Serialize(writer, value.Scale);
     if (value.Offset != null)
     {
         writer.WritePropertyName("offset");
         serializer.Serialize(writer, value.Offset);
     }
     return(true);
 }
示例#3
0
 private bool WriteGeoDecay(JsonWriter writer, IDecayFunction <GeoLocation, Distance> value, JsonSerializer serializer)
 {
     if (value == null || value.Field.IsConditionless())
     {
         return(false);
     }
     writer.WritePropertyName("origin");
     serializer.Serialize(writer, value.Origin);
     writer.WritePropertyName("scale");
     serializer.Serialize(writer, value.Scale);
     if (value.Offset != null)
     {
         writer.WritePropertyName("offset");
         serializer.Serialize(writer, value.Offset);
     }
     return(true);
 }
 private bool WriteDateDecay(JsonWriter writer, IDecayFunction <DateMath, TimeUnitExpression> value, JsonSerializer serializer)
 {
     if (value == null || value.Field.IsConditionless())
     {
         return(false);
     }
     writer.WritePropertyName("origin");
     serializer.Serialize(writer, value.Origin);
     writer.WritePropertyName("scale");
     serializer.Serialize(writer, value.Scale);
     if (value.Offset != null)
     {
         writer.WritePropertyName("offset");
         serializer.Serialize(writer, value.Offset);
     }
     return(true);
 }
        private static void WriteDateDecay(ref JsonWriter writer, ref bool written, IDecayFunction <DateMath, Time> value,
                                           IJsonFormatterResolver formatterResolver
                                           )
        {
            if (value == null || value.Field.IsConditionless())
            {
                return;
            }

            if (value.Origin != null)
            {
                writer.WritePropertyName("origin");
                var dateMathFormatter = formatterResolver.GetFormatter <DateMath>();
                dateMathFormatter.Serialize(ref writer, value.Origin, formatterResolver);

                written = true;
            }

            if (written)
            {
                writer.WriteValueSeparator();
            }

            writer.WritePropertyName("scale");
            var timeFormatter = formatterResolver.GetFormatter <Time>();

            timeFormatter.Serialize(ref writer, value.Scale, formatterResolver);

            written = true;

            if (value.Offset != null)
            {
                writer.WriteValueSeparator();

                writer.WritePropertyName("offset");
                timeFormatter.Serialize(ref writer, value.Offset, formatterResolver);
            }
        }
示例#6
0
        private bool WriteDecay(JsonWriter writer, IDecayFunction decay, JsonSerializer serializer)
        {
            if (decay == null)
            {
                return(false);
            }

            writer.WritePropertyName(decay.DecayType);
            writer.WriteStartObject();
            {
                writer.WritePropertyName(serializer.GetConnectionSettings().Inferrer.Field(decay.Field));
                writer.WriteStartObject();
                {
                    var write = WriteNumericDecay(writer, decay as IDecayFunction <double?, double?>, serializer) ||
                                WriteDateDecay(writer, decay as IDecayFunction <DateMath, Time>, serializer) ||
                                WriteGeoDecay(writer, decay as IDecayFunction <GeoLocation, Distance>, serializer);
                    if (!write)
                    {
                        throw new Exception($"Can not write decay function json for {decay.GetType().Name}");
                    }

                    if (decay.Decay.HasValue)
                    {
                        writer.WritePropertyName("decay");
                        serializer.Serialize(writer, decay.Decay.Value);
                    }
                }
                writer.WriteEndObject();
                if (decay.MultiValueMode.HasValue)
                {
                    writer.WritePropertyName("multi_value_mode");
                    serializer.Serialize(writer, decay.MultiValueMode.Value);
                }
            }
            writer.WriteEndObject();
            return(true);
        }
        private static void WriteNumericDecay(ref JsonWriter writer, ref bool written, IDecayFunction <double?, double?> value)
        {
            if (value.Origin.HasValue)
            {
                writer.WritePropertyName("origin");
                writer.WriteDouble(value.Origin.Value);
                written = true;
            }

            if (value.Scale.HasValue)
            {
                if (written)
                {
                    writer.WriteValueSeparator();
                }

                writer.WritePropertyName("scale");
                writer.WriteDouble(value.Scale.Value);
                written = true;
            }

            if (value.Offset != null)
            {
                if (written)
                {
                    writer.WriteValueSeparator();
                }

                writer.WritePropertyName("offset");
                writer.WriteDouble(value.Offset.Value);
            }
        }
        public IScoreFunction Deserialize(ref JsonReader reader, IJsonFormatterResolver formatterResolver)
        {
            QueryContainer filter   = null;
            double?        weight   = null;
            IScoreFunction function = null;

            var count = 0;

            while (reader.ReadIsInObject(ref count))
            {
                var propertyName = reader.ReadPropertyNameSegmentRaw();
                if (AutomataDictionary.TryGetValue(propertyName, out var value))
                {
                    switch (value)
                    {
                    case 0:
                        var formatter = formatterResolver.GetFormatter <QueryContainer>();
                        filter = formatter.Deserialize(ref reader, formatterResolver);
                        break;

                    case 1:
                        weight = reader.ReadDouble();
                        break;

                    case 2:
                        var            innerCount     = 0;
                        MultiValueMode?multiValueMode = null;
                        IDecayFunction decayFunction  = null;
                        while (reader.ReadIsInObject(ref innerCount))
                        {
                            var functionPropertyName = reader.ReadPropertyName();
                            if (functionPropertyName == "multi_value_mode")
                            {
                                multiValueMode = formatterResolver.GetFormatter <MultiValueMode>()
                                                 .Deserialize(ref reader, formatterResolver);
                            }
                            else
                            {
                                var name = propertyName.Utf8String();
                                decayFunction       = ReadDecayFunction(ref reader, name, formatterResolver);
                                decayFunction.Field = functionPropertyName;
                            }
                        }

                        if (decayFunction != null)
                        {
                            decayFunction.MultiValueMode = multiValueMode;
                            function = decayFunction;
                        }
                        break;

                    case 3:
                        var randomScoreFormatter = formatterResolver.GetFormatter <RandomScoreFunction>();
                        function = randomScoreFormatter.Deserialize(ref reader, formatterResolver);
                        break;

                    case 4:
                        var fieldValueFormatter = formatterResolver.GetFormatter <FieldValueFactorFunction>();
                        function = fieldValueFormatter.Deserialize(ref reader, formatterResolver);
                        break;

                    case 5:
                        var scriptFormatter = formatterResolver.GetFormatter <ScriptScoreFunction>();
                        function = scriptFormatter.Deserialize(ref reader, formatterResolver);
                        break;
                    }
                }
            }

            if (function == null)
            {
                if (weight.HasValue)
                {
                    function = new WeightFunction();
                }
                else
                {
                    return(null);
                }
            }

            function.Weight = weight;
            function.Filter = filter;
            return(function);
        }
		private bool WriteGeoDecay(JsonWriter writer, IDecayFunction<GeoLocation, Distance> value, JsonSerializer serializer)
		{
			if (value == null || value.Field.IsConditionless()) return false;
			writer.WritePropertyName("origin");
			serializer.Serialize(writer, value.Origin);
			writer.WritePropertyName("scale");
			serializer.Serialize(writer, value.Scale);
			if (value.Offset != null)
			{
				writer.WritePropertyName("offset");
				serializer.Serialize(writer, value.Offset);
			}
			return true;
		}
		private bool WriteNumericDecay(JsonWriter writer, IDecayFunction<double?, double?> value, JsonSerializer serializer)
		{
			if (value == null) return false;
			writer.WritePropertyName("origin");
			serializer.Serialize(writer, value.Origin);
			writer.WritePropertyName("scale");
			serializer.Serialize(writer, value.Scale);
			if (value.Offset != null)
			{
				writer.WritePropertyName("offset");
				serializer.Serialize(writer, value.Offset);
			}
			return true;
		}