Skip to content

Commit 9545ae6

Browse files
authored
Implement _source parameter on action and doc lines (#4339) (#4426)
Implement _source parameter on action and doc lines. (cherry picked from commit e4c1d35)
1 parent 38e6a4c commit 9545ae6

File tree

11 files changed

+142
-16
lines changed

11 files changed

+142
-16
lines changed

src/Nest/Aggregations/AggregateJsonConverter.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,9 @@ private IAggregate GetTopHitsAggregate(JsonReader reader, JsonSerializer seriali
187187
var hits = o[Parser.Hits].Children().OfType<JObject>();
188188
reader.Read();
189189
//using request/response serializer here because doc is wrapped in NEST's Hit<T>
190-
var s = serializer.GetConnectionSettings().RequestResponseSerializer;
191-
var lazyHits = hits.Select(h => new LazyDocument(h, s)).ToList();
190+
var s = serializer.GetConnectionSettings().SourceSerializer;
191+
var r = serializer.GetConnectionSettings().RequestResponseSerializer;
192+
var lazyHits = hits.Select(h => new LazyDocument(h, s, r)).ToList();
192193
return new TopHitsAggregate(lazyHits)
193194
{
194195
Total = total,
@@ -573,7 +574,8 @@ private IAggregate GetValueAggregate(JsonReader reader, JsonSerializer serialize
573574
if (scriptedMetric != null)
574575
{
575576
var s = serializer.GetConnectionSettings().SourceSerializer;
576-
return new ScriptedMetricAggregate(new LazyDocument(scriptedMetric, s));
577+
var r = serializer.GetConnectionSettings().RequestResponseSerializer;
578+
return new ScriptedMetricAggregate(new LazyDocument(scriptedMetric, s, r));
577579
}
578580
return valueMetric;
579581
}

src/Nest/Aggregations/Metric/TopHits/TopHitsAggregate.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public TopHitsAggregate() { }
1616
public long Total { get; set; }
1717

1818
private IEnumerable<Hit<TDocument>> ConvertHits<TDocument>()
19-
where TDocument : class => _hits.Select(h => h.As<Hit<TDocument>>());
19+
where TDocument : class => _hits.Select(h => h.AsUsingRequestResponseSerializer<Hit<TDocument>>());
2020

2121
public IReadOnlyCollection<Hit<TDocument>> Hits<TDocument>()
2222
where TDocument : class =>

src/Nest/CommonAbstractions/Fields/FieldValuesJsonConverter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist
1515
{
1616
var o = JObject.Load(reader);
1717
var s = serializer.GetConnectionSettings().SourceSerializer;
18-
var fields = o.Properties().ToDictionary(p => p.Name, p => new LazyDocument(p.Value, s));
18+
var r = serializer.GetConnectionSettings().RequestResponseSerializer;
19+
var fields = o.Properties().ToDictionary(p => p.Name, p => new LazyDocument(p.Value, s, r));
1920
var inferrer = serializer.GetConnectionSettings().Inferrer;
2021
var fieldValues = new FieldValues(inferrer, fields);
2122
return fieldValues;

src/Nest/CommonAbstractions/LazyDocument/LazyDocument.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,14 @@ public interface ILazyDocument
2828
/// <inheritdoc />
2929
public class LazyDocument : ILazyDocument
3030
{
31-
private readonly IElasticsearchSerializer _serializer;
31+
private readonly IElasticsearchSerializer _sourceSerializer;
32+
private readonly IElasticsearchSerializer _requestResponseSerializer;
3233

33-
internal LazyDocument(JToken token, IElasticsearchSerializer serializer)
34+
internal LazyDocument(JToken token, IElasticsearchSerializer sourceSerializer, IElasticsearchSerializer requestResponseSerializer)
3435
{
3536
Token = token;
36-
_serializer = serializer;
37+
_sourceSerializer = sourceSerializer;
38+
_requestResponseSerializer = requestResponseSerializer;
3739
}
3840

3941
internal JToken Token { get; }
@@ -43,15 +45,22 @@ public T As<T>()
4345
{
4446
if (Token == null) return default(T);
4547
using (var ms = Token.ToStream())
46-
return _serializer.Deserialize<T>(ms);
48+
return _sourceSerializer.Deserialize<T>(ms);
4749
}
4850

4951
/// <inheritdoc />
5052
public object As(Type objectType)
5153
{
5254
if (Token == null) return null;
5355
using (var ms = Token.ToStream())
54-
return _serializer.Deserialize(objectType, ms);
56+
return _sourceSerializer.Deserialize(objectType, ms);
57+
}
58+
59+
internal T AsUsingRequestResponseSerializer<T>()
60+
{
61+
if (Token == null) return default(T);
62+
using (var ms = Token.ToStream())
63+
return _requestResponseSerializer.Deserialize<T>(ms);
5564
}
5665
}
5766
}

src/Nest/CommonAbstractions/LazyDocument/LazyDocumentJsonConverter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ public override void WriteJson(JsonWriter writer, object value, JsonSerializer s
2020
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
2121
{
2222
var sourceSerializer = serializer.GetConnectionSettings().SourceSerializer;
23+
var requestResponseSerializer = serializer.GetConnectionSettings().RequestResponseSerializer;
2324
var token = reader.ReadTokenWithDateParseHandlingNone();
24-
return new LazyDocument(token, sourceSerializer);
25+
return new LazyDocument(token, sourceSerializer, requestResponseSerializer);
2526
}
2627

2728
public override bool CanConvert(Type objectType) => true;

src/Nest/Document/Multiple/Bulk/BulkOperation/BulkUpdate.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ public interface IBulkUpdateOperation<TDocument, TPartialDocument> : IBulkOperat
4444
long? IfSequenceNumber { get; set; }
4545

4646
long? IfPrimaryTerm { get; set; }
47+
48+
/// <summary>
49+
/// True or false to return the _source field or not, or a list of fields to return.
50+
/// </summary>
51+
Union<bool, ISourceFilter> Source { get; set; }
4752
}
4853

4954
public class BulkUpdateOperation<TDocument, TPartialDocument> : BulkOperationBase, IBulkUpdateOperation<TDocument, TPartialDocument>
@@ -116,6 +121,9 @@ public BulkUpdateOperation(TDocument idFrom, TPartialDocument update, bool useId
116121

117122
public long? IfPrimaryTerm { get; set; }
118123

124+
/// <inheritdoc />
125+
public Union<bool, ISourceFilter> Source { get; set; }
126+
119127
protected override Type ClrType => typeof(TDocument);
120128

121129
protected override string Operation => "update";
@@ -135,7 +143,8 @@ protected override object GetBody() =>
135143
_DocAsUpsert = DocAsUpsert,
136144
_ScriptedUpsert = ScriptedUpsert,
137145
IfPrimaryTerm = IfPrimaryTerm,
138-
IfSequenceNumber = IfSequenceNumber
146+
IfSequenceNumber = IfSequenceNumber,
147+
Source = Source,
139148
};
140149
}
141150

@@ -155,6 +164,7 @@ public class BulkUpdateDescriptor<TDocument, TPartialDocument>
155164
TDocument IBulkUpdateOperation<TDocument, TPartialDocument>.Upsert { get; set; }
156165
long? IBulkUpdateOperation<TDocument, TPartialDocument>.IfSequenceNumber { get; set; }
157166
long? IBulkUpdateOperation<TDocument, TPartialDocument>.IfPrimaryTerm { get; set; }
167+
Union<bool, ISourceFilter> IBulkUpdateOperation<TDocument, TPartialDocument>.Source { get; set; }
158168

159169
protected override object GetBulkOperationBody() =>
160170
new BulkUpdateBody<TDocument, TPartialDocument>
@@ -165,7 +175,8 @@ protected override object GetBulkOperationBody() =>
165175
_DocAsUpsert = Self.DocAsUpsert,
166176
_ScriptedUpsert = Self.ScriptedUpsert,
167177
IfPrimaryTerm = Self.IfPrimaryTerm,
168-
IfSequenceNumber = Self.IfSequenceNumber
178+
IfSequenceNumber = Self.IfSequenceNumber,
179+
Source = Self.Source,
169180
};
170181

171182
protected override Id GetIdForOperation(Inferrer inferrer) =>
@@ -234,5 +245,11 @@ public BulkUpdateDescriptor<TDocument, TPartialDocument> IfSequenceNumber(long?
234245
/// </summary>
235246
public BulkUpdateDescriptor<TDocument, TPartialDocument> IfPrimaryTerm(long? primaryTerm) =>
236247
Assign(primaryTerm, (a, v) => a.IfPrimaryTerm = v);
248+
249+
/// <summary>
250+
/// True or false to return the _source field or not, or a list of fields to return.
251+
/// </summary>
252+
public BulkUpdateDescriptor<TDocument, TPartialDocument> Source(Union<bool, ISourceFilter> source) =>
253+
Assign(source, (a, v) => a.Source = v);
237254
}
238255
}

src/Nest/Document/Multiple/Bulk/BulkOperation/BulkUpdateBody.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,8 @@ internal class BulkUpdateBody<TDocument, TPartialUpdate>
2828

2929
[JsonProperty("if_primary_term")]
3030
internal long? IfPrimaryTerm { get; set; }
31+
32+
[JsonProperty("_source")]
33+
internal Union<bool, ISourceFilter> Source { get; set; }
3134
}
3235
}

src/Nest/Document/Multiple/Bulk/BulkResponseItem/BulkResponseItemBase.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,18 @@ public interface IBulkResponseItem
7272
/// </summary>
7373
[JsonProperty("_version")]
7474
long Version { get; }
75+
76+
/// <summary>
77+
/// The <see cref="Nest.GetResponse{TDocument}"/> when <see cref="BulkUpdateOperation{TDocument,TPartialDocument}.Source"/>
78+
/// is <c>true</c> or specifies fields with <see cref="ISourceFilter.Includes"/>
79+
/// </summary>
80+
[JsonProperty("get")]
81+
LazyDocument Get { get; }
82+
83+
/// <summary>
84+
/// Deserialize the <see cref="Get"/> property as a GetResponse<TDocument> type, where TDocument is the document type.
85+
/// </summary>
86+
GetResponse<TDocument> GetResponse<TDocument>() where TDocument : class;
7587
}
7688

7789
/// <inheritdoc />
@@ -130,6 +142,13 @@ public bool IsValid
130142
/// <inheritdoc />
131143
public long Version { get; internal set; }
132144

145+
/// <inheritdoc />
146+
public LazyDocument Get { get; internal set; }
147+
148+
/// <inheritdoc />
149+
public GetResponse<TDocument> GetResponse<TDocument>() where TDocument : class =>
150+
Get?.AsUsingRequestResponseSerializer<GetResponse<TDocument>>();
151+
133152
public override string ToString() =>
134153
$"{Operation} returned {Status} _index: {Index} _type: {Type} _id: {Id} _version: {Version} error: {Error}";
135154
}

src/Nest/Document/Multiple/MultiGet/Response/MultiGetHitJsonConverter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@ private static void CreateMultiHit<T>(MultiHitTuple tuple, JsonSerializer serial
2727
var hit = tuple.Hit.ToObject<MultiGetHit<T>>(serializer);
2828
var settings = serializer.GetConnectionSettings();
2929
var s = serializer.GetConnectionSettings().SourceSerializer;
30+
var r = serializer.GetConnectionSettings().RequestResponseSerializer;
3031

3132
if (tuple.Hit["fields"] is JObject fields)
3233
{
33-
var fieldsDictionary = fields.Properties().ToDictionary(p => p.Name, p => new LazyDocument(p.Value, s));
34+
var fieldsDictionary = fields.Properties().ToDictionary(p => p.Name, p => new LazyDocument(p.Value, s, r));
3435
hit.Fields = new FieldValues(settings.Inferrer, fieldsDictionary);
3536
}
3637

src/Nest/XPack/Sql/QuerySql/SqlValue.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,18 @@ namespace Nest
88
[ContractJsonConverter(typeof(SqlValueJsonConverter))]
99
public class SqlValue : LazyDocument
1010
{
11-
internal SqlValue(JToken token, IElasticsearchSerializer serializer) : base(token, serializer) { }
11+
internal SqlValue(JToken token, IElasticsearchSerializer sourceSerializer, IElasticsearchSerializer requestResponseSerializer)
12+
: base(token, sourceSerializer, requestResponseSerializer) { }
1213
}
1314

1415
internal class SqlValueJsonConverter : LazyDocumentJsonConverter
1516
{
1617
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
1718
{
1819
var sourceSerializer = serializer.GetConnectionSettings().SourceSerializer;
20+
var requestResponseSerializer = serializer.GetConnectionSettings().RequestResponseSerializer;
1921
var token = reader.ReadTokenWithDateParseHandlingNone();
20-
return new SqlValue(token, sourceSerializer);
22+
return new SqlValue(token, sourceSerializer, requestResponseSerializer);
2123
}
2224
}
2325
}

0 commit comments

Comments
 (0)