示例#1
0
 /// <inheritdoc />
 public Task <IMultiSearchResponse> MultiSearchAsync(IMultiSearchRequest request)
 {
     return(this.Dispatcher.DispatchAsync <IMultiSearchRequest, MultiSearchRequestParameters, MultiSearchResponse, IMultiSearchResponse>(
                request,
                (p, d) =>
     {
         var converter = CreateMultiSearchDeserializer(p);
         var serializer = new NestSerializer(this.ConnectionSettings, converter);
         var json = serializer.SerializeToBytes(p).Utf8String();
         var creator = new MultiSearchCreator((r, s) => serializer.Deserialize <MultiSearchResponse>(s));
         request.RequestParameters.DeserializationOverride(creator);
         return this.LowLevelDispatch.MsearchDispatchAsync <MultiSearchResponse>(p, json);
     }
                ));
 }
示例#2
0
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (this._settings == null)
            {
                var realConverter = serializer.GetStatefulConverter <MultiSearchResponseJsonConverter>();
                var mr            = realConverter.ReadJson(reader, objectType, existingValue, serializer) as MultiSearchResponse;
                return(mr);
            }

            var response   = new MultiSearchResponse();
            var jsonObject = JObject.Load(reader);

            var docsJarray = (JArray)jsonObject["responses"];

            if (docsJarray == null)
            {
                return(response);
            }
            var multiSearchDescriptor = this._request;

            if (this._request == null)
            {
                return(multiSearchDescriptor);
            }

            var withMeta = docsJarray.Zip(this._request.Operations, (doc, desc) => new MultiHitTuple {
                Hit = doc, Descriptor = desc
            });
            var originalResolver = serializer.ContractResolver;

            foreach (var m in withMeta)
            {
                var descriptor           = m.Descriptor.Value;
                var concreteTypeSelector = descriptor.TypeSelector;
                var baseType             = m.Descriptor.Value.ClrType ?? typeof(object);

                var generic = MakeDelegateMethodInfo.MakeGenericMethod(baseType);

                if (concreteTypeSelector != null)
                {
                    var elasticSerializer = new NestSerializer(this._settings);
                    var state             = typeof(ConcreteTypeConverter <>).CreateGenericInstance(baseType, concreteTypeSelector) as JsonConverter;
                    if (state != null)
                    {
                        var settings = elasticSerializer.CreateSettings(SerializationFormatting.None, piggyBackJsonConverter: state);

                        var jsonSerializer = new JsonSerializer()
                        {
                            NullValueHandling    = settings.NullValueHandling,
                            DefaultValueHandling = settings.DefaultValueHandling,
                            ContractResolver     = settings.ContractResolver,
                        };
                        foreach (var converter in settings.Converters.EmptyIfNull())
                        {
                            jsonSerializer.Converters.Add(converter);
                        }
                        generic.Invoke(null, new object[] { m, jsonSerializer, response.Responses, this._settings });
                        continue;
                    }
                }
                generic.Invoke(null, new object[] { m, serializer, response.Responses, this._settings });
            }

            return(response);
        }