Skip to content

Commit e82a1fb

Browse files
CSHARP-3212: Add new field truncatedArrays into cursor.nextBatch.updateDescription.
1 parent 1b5894c commit e82a1fb

File tree

4 files changed

+59
-11
lines changed

4 files changed

+59
-11
lines changed

src/MongoDB.Driver.Core/ChangeStreamUpdateDescription.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* limitations under the License.
1414
*/
1515

16+
using System;
1617
using System.Linq;
1718
using MongoDB.Bson;
1819
using MongoDB.Driver.Core.Misc;
@@ -27,6 +28,7 @@ public sealed class ChangeStreamUpdateDescription
2728
{
2829
// private fields
2930
private readonly string[] _removedFields;
31+
private readonly BsonArray _truncatedArrays;
3032
private readonly BsonDocument _updatedFields;
3133

3234
// constructors
@@ -38,9 +40,24 @@ public sealed class ChangeStreamUpdateDescription
3840
public ChangeStreamUpdateDescription(
3941
BsonDocument updatedFields,
4042
string[] removedFields)
43+
: this(updatedFields, removedFields, null)
44+
{
45+
}
46+
47+
/// <summary>
48+
/// Initializes a new instance of the <see cref="ChangeStreamUpdateDescription" /> class.
49+
/// </summary>
50+
/// <param name="updatedFields">The updated fields.</param>
51+
/// <param name="removedFields">The removed fields.</param>
52+
/// <param name="truncatedArrays">The truncated arrays.</param>
53+
public ChangeStreamUpdateDescription(
54+
BsonDocument updatedFields,
55+
string[] removedFields,
56+
BsonArray truncatedArrays)
4157
{
4258
_updatedFields = Ensure.IsNotNull(updatedFields, nameof(updatedFields));
4359
_removedFields = Ensure.IsNotNull(removedFields, nameof(removedFields));
60+
_truncatedArrays = truncatedArrays; // can be null
4461
}
4562

4663
// public properties
@@ -52,6 +69,14 @@ public ChangeStreamUpdateDescription(
5269
/// </value>
5370
public string[] RemovedFields => _removedFields;
5471

72+
/// <summary>
73+
/// Gets the truncated arrays.
74+
/// </summary>
75+
/// <value>
76+
/// The truncated arrays.
77+
/// </value>
78+
public BsonArray TruncatedArrays => _truncatedArrays;
79+
5580
/// <summary>
5681
/// Gets the updated fields.
5782
/// </summary>
@@ -72,7 +97,8 @@ public override bool Equals(object obj)
7297
var other = (ChangeStreamUpdateDescription)obj;
7398
return
7499
_removedFields.SequenceEqual(other._removedFields) &&
75-
_updatedFields.Equals(other._updatedFields);
100+
_updatedFields.Equals(other._updatedFields) &&
101+
object.Equals(_truncatedArrays, other._truncatedArrays);
76102
}
77103

78104
/// <inheritdoc />
@@ -81,6 +107,7 @@ public override int GetHashCode()
81107
return new Hasher()
82108
.HashElements(_removedFields)
83109
.Hash(_updatedFields)
110+
.Hash(_truncatedArrays)
84111
.GetHashCode();
85112
}
86113
}

src/MongoDB.Driver.Core/ChangeStreamUpdateDescriptionSerializer.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ protected override ChangeStreamUpdateDescription DeserializeValue(BsonDeserializ
4949

5050
BsonDocument updatedFields = null;
5151
string[] removedFields = null;
52+
BsonArray truncatedArrays = null;
5253

5354
reader.ReadStartDocument();
5455
while (reader.ReadBsonType() != 0)
@@ -64,13 +65,17 @@ protected override ChangeStreamUpdateDescription DeserializeValue(BsonDeserializ
6465
removedFields = __stringArraySerializer.Deserialize(context);
6566
break;
6667

68+
case "truncatedArrays":
69+
truncatedArrays = BsonArraySerializer.Instance.Deserialize(context);
70+
break;
71+
6772
default:
6873
throw new FormatException($"Invalid field name: \"{fieldName}\".");
6974
}
7075
}
7176
reader.ReadEndDocument();
7277

73-
return new ChangeStreamUpdateDescription(updatedFields, removedFields);
78+
return new ChangeStreamUpdateDescription(updatedFields, removedFields, truncatedArrays);
7479
}
7580

7681
/// <inheritdoc />
@@ -83,6 +88,11 @@ protected override void SerializeValue(BsonSerializationContext context, BsonSer
8388
BsonDocumentSerializer.Instance.Serialize(context, value.UpdatedFields);
8489
writer.WriteName("removedFields");
8590
__stringArraySerializer.Serialize(context, value.RemovedFields);
91+
if (value.TruncatedArrays != null)
92+
{
93+
writer.WriteName("truncatedArrays");
94+
BsonArraySerializer.Instance.Serialize(context, value.TruncatedArrays);
95+
}
8696
writer.WriteEndDocument();
8797
}
8898
}

tests/MongoDB.Driver.Core.Tests/ChangeStreamDocumentTests.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -280,18 +280,26 @@ public void ResumeToken_should_return_null_when_not_present()
280280
}
281281

282282
[Theory]
283-
[InlineData("{}", new string[0])]
284-
[InlineData("{ x : 1 }", new[] { "a", "b", "c" })]
285-
public void UpdateDescription_should_return_expected_result(string updatedFieldsJson, string[] removedFields)
283+
[InlineData("{}", new string[0], null)]
284+
[InlineData("{ x : 1 }", new[] { "a", "b", "c" }, null)]
285+
[InlineData("{ x : 1 }", new[] { "a", "b", "c" }, "[ ]")]
286+
[InlineData("{ x : 1 }", new[] { "a", "b", "c" }, "[ { field : 'arrayForSubdiff', newSize : 2 } ]")]
287+
public void UpdateDescription_should_return_expected_result(string updatedFieldsJson, string[] removedFields, string truncatedArrays)
286288
{
287289
var updatedFields = BsonDocument.Parse(updatedFieldsJson);
288-
var updateDescriptionDocument = new BsonDocument { { "updatedFields", updatedFields }, { "removedFields", new BsonArray(removedFields) } };
290+
var truncatedArraysBsonArray = truncatedArrays != null ? BsonSerializer.Deserialize<BsonArray>(truncatedArrays) : null;
291+
var updateDescriptionDocument = new BsonDocument
292+
{
293+
{ "updatedFields", updatedFields },
294+
{ "removedFields", new BsonArray(removedFields) },
295+
{ "truncatedArrays", truncatedArraysBsonArray, truncatedArraysBsonArray != null }
296+
};
289297
var backingDocument = new BsonDocument { { "other", 1 }, { "updateDescription", updateDescriptionDocument } };
290298
var subject = CreateSubject(backingDocument: backingDocument);
291299

292300
var result = subject.UpdateDescription;
293301

294-
var expectedResult = new ChangeStreamUpdateDescription(updatedFields, removedFields);
302+
var expectedResult = new ChangeStreamUpdateDescription(updatedFields, removedFields, truncatedArraysBsonArray);
295303
result.Should().Be(expectedResult);
296304
}
297305

tests/MongoDB.Driver.Core.Tests/ChangeStreamUpdateDescriptionSerializerTests.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class ChangeStreamUpdateDescriptionSerializerTests
2828
{
2929
[Theory]
3030
[InlineData("{ updatedFields : { f : 1 }, removedFields : [\"f\"] }")]
31+
[InlineData("{ updatedFields : { f : 1 }, removedFields : [\"f\"], truncatedArrays : [ { field : \"arrayForSubdiff\", newSize : 2 } ] }")]
3132
public void Deserialize_should_return_expected_result(
3233
string json)
3334
{
@@ -41,7 +42,7 @@ public void Deserialize_should_return_expected_result(
4142
result = subject.Deserialize(context);
4243
}
4344

44-
result.ShouldBeEquivalentTo(expectedResult);
45+
result.Should().Be(expectedResult);
4546
}
4647

4748
[Fact]
@@ -83,8 +84,9 @@ public void Serialize_should_have_expected_result()
8384
var subject = CreateSubject();
8485
var value = new ChangeStreamUpdateDescription(
8586
new BsonDocument("f", 1),
86-
new[] { "f" });
87-
var expectedResult = "{ \"updatedFields\" : { \"f\" : 1 }, \"removedFields\" : [\"f\"] }";
87+
new[] { "f" },
88+
BsonArray.Create(new[] { BsonDocument.Parse("{ field : 'arrayForSubdiff', newSize : 2 }") }));
89+
var expectedResult = "{ \"updatedFields\" : { \"f\" : 1 }, \"removedFields\" : [\"f\"], \"truncatedArrays\" : [{ \"field\" : \"arrayForSubdiff\", \"newSize\" : 2 }] }";
8890

8991
string result;
9092
using (var textWriter = new StringWriter())
@@ -127,8 +129,9 @@ private ChangeStreamUpdateDescription ParseUpdateDescription(string json)
127129
var document = BsonDocument.Parse(json);
128130
var updatedFields = document["updatedFields"].AsBsonDocument;
129131
var removedFields = document["removedFields"].AsBsonArray.Select(f => f.AsString).ToArray();
132+
var truncatedArrays = document.GetValue("truncatedArrays", null)?.AsBsonArray;
130133

131-
return new ChangeStreamUpdateDescription(updatedFields, removedFields);
134+
return new ChangeStreamUpdateDescription(updatedFields, removedFields, truncatedArrays);
132135
}
133136
}
134137
}

0 commit comments

Comments
 (0)