Skip to content

Commit 49940f0

Browse files
committed
Merge branch 'scroll-fix'
2 parents 5ef08f6 + cdfdf38 commit 49940f0

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

src/Nest/DSL/ScrollDescriptor.cs

+14-5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ public interface IScrollRequest : IRequest<ScrollRequestParameters>
99
{
1010
string ScrollId { get; set; }
1111
string Scroll { get; set; }
12+
Func<object, Hit<object>, Type> TypeSelector { get; set; }
1213
}
1314

1415
internal static class ScrollPathInfo
@@ -31,8 +32,9 @@ public partial class ScrollRequest : BaseRequest<ScrollRequestParameters>, IScro
3132
{
3233
public string ScrollId { get; set; }
3334
public string Scroll { get; set; }
35+
public Func<object, Hit<object>, Type> TypeSelector { get; set; }
3436

35-
public ScrollRequest(string scrollId, string scrollTimeout)
37+
public ScrollRequest(string scrollId, string scrollTimeout)
3638
{
3739
this.ScrollId = scrollId;
3840
this.Scroll = scrollTimeout;
@@ -57,9 +59,10 @@ protected override void UpdatePathInfo(IConnectionSettingsValues settings, Elast
5759

5860
string IScrollRequest.ScrollId { get; set; }
5961
string IScrollRequest.Scroll { get; set; }
60-
61-
///<summary>Specify how long a consistent view of the index should be maintained for scrolled search</summary>
62-
public ScrollDescriptor<T> Scroll(string scroll)
62+
Func<object, Hit<object>, Type> IScrollRequest.TypeSelector { get; set; }
63+
64+
///<summary>Specify how long a consistent view of the index should be maintained for scrolled search</summary>
65+
public ScrollDescriptor<T> Scroll(string scroll)
6366
{
6467
Self.Scroll = scroll;
6568
return this;
@@ -71,5 +74,11 @@ public ScrollDescriptor<T> ScrollId(string scrollId)
7174
Self.ScrollId = scrollId;
7275
return this;
7376
}
74-
}
77+
78+
public ScrollDescriptor<T> ConcreteTypeSelector(Func<dynamic, Hit<dynamic>, Type> typeSelector)
79+
{
80+
Self.TypeSelector = typeSelector;
81+
return this;
82+
}
83+
}
7584
}

src/Nest/ElasticClient-Scroll.cs

+27-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
2+
using System.IO;
23
using System.Threading.Tasks;
34
using Elasticsearch.Net;
5+
using Newtonsoft.Json;
46

57
namespace Nest
68
{
@@ -56,7 +58,9 @@ public Task<ISearchResponse<T>> ScrollAsync<T>(Func<ScrollDescriptor<T>, ScrollD
5658
{
5759
string scrollId = p.ScrollId;
5860
p.ScrollId = null;
59-
return this.RawDispatch.ScrollDispatchAsync<SearchResponse<T>>(p, scrollId);
61+
p.DeserializationState(CreateScrollDeserializer<T, T>(d));
62+
63+
return this.RawDispatch.ScrollDispatchAsync<SearchResponse<T>>(p, scrollId);
6064
}
6165
);
6266
}
@@ -126,5 +130,26 @@ private static string PatchClearScroll(ElasticsearchPathInfo<ClearScrollRequestP
126130
}
127131
return body;
128132
}
129-
}
133+
134+
private SearchResponse<TResult> FieldsScrollDeserializer<T, TResult>(IElasticsearchResponse response, Stream stream, IScrollRequest d)
135+
where T : class
136+
where TResult : class
137+
{
138+
var converter = d.TypeSelector == null ? null : new ConcreteTypeConverter<TResult>(d.TypeSelector);
139+
var dict = response.Success
140+
? Serializer.DeserializeInternal<SearchResponse<TResult>>(stream, converter)
141+
: null;
142+
return dict;
143+
}
144+
145+
private Func<IElasticsearchResponse, Stream, SearchResponse<TResult>> CreateScrollDeserializer<T, TResult>(IScrollRequest request)
146+
where T : class
147+
where TResult : class
148+
{
149+
150+
Func<IElasticsearchResponse, Stream, SearchResponse<TResult>> responseCreator =
151+
(r, s) => this.FieldsScrollDeserializer<T, TResult>(r, s, request);
152+
return responseCreator;
153+
}
154+
}
130155
}

0 commit comments

Comments
 (0)