/// <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); } )); }
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); }