Skip to content

Commit 0cfa384

Browse files
CSHARP-2639: Update ChangeStreamDocument by a new field from rename event. Add rename changeStreamOperationType.
1 parent f8d8aad commit 0cfa384

8 files changed

+51
-3
lines changed

src/MongoDB.Driver.Core/ChangeStreamDocument.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,14 @@ public ChangeStreamDocument(
8585
/// </value>
8686
public ChangeStreamOperationType OperationType => GetValue<ChangeStreamOperationType>(nameof(OperationType), (ChangeStreamOperationType)(-1));
8787

88+
/// <summary>
89+
/// Gets the new namespace for the ns collection. This field is omitted for all operation types except "rename".
90+
/// </summary>
91+
/// <value>
92+
/// The new namespace of the ns collection.
93+
/// </value>
94+
public CollectionNamespace RenameTo => GetValue<CollectionNamespace>(nameof(RenameTo), null);
95+
8896
/// <summary>
8997
/// Gets the resume token.
9098
/// </summary>

src/MongoDB.Driver.Core/ChangeStreamDocumentSerializer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public ChangeStreamDocumentSerializer(
4545
RegisterMember("DocumentKey", "documentKey", BsonDocumentSerializer.Instance);
4646
RegisterMember("FullDocument", "fullDocument", _documentSerializer);
4747
RegisterMember("OperationType", "operationType", ChangeStreamOperationTypeSerializer.Instance);
48+
RegisterMember("RenameTo", "to", ChangeStreamDocumentCollectionNamespaceSerializer.Instance);
4849
RegisterMember("ResumeToken", "_id", BsonDocumentSerializer.Instance);
4950
RegisterMember("UpdateDescription", "updateDescription", ChangeStreamUpdateDescriptionSerializer.Instance);
5051
}

src/MongoDB.Driver.Core/ChangeStreamOperationType.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ public enum ChangeStreamOperationType
3939
/// <summary>
4040
/// An invalidate operation type.
4141
/// </summary>
42-
Invalidate
42+
Invalidate,
43+
/// <summary>
44+
/// A rename operation type.
45+
/// </summary>
46+
Rename
4347
}
4448
}

src/MongoDB.Driver.Core/ChangeStreamOperationTypeSerializer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public override ChangeStreamOperationType Deserialize(BsonDeserializationContext
5151
case "invalidate": return ChangeStreamOperationType.Invalidate;
5252
case "replace": return ChangeStreamOperationType.Replace;
5353
case "update": return ChangeStreamOperationType.Update;
54+
case "rename": return ChangeStreamOperationType.Rename;
5455
default: throw new FormatException($"Invalid ChangeStreamOperationType: \"{stringValue}\".");
5556
}
5657
}
@@ -67,6 +68,7 @@ public override void Serialize(BsonSerializationContext context, BsonSerializati
6768
case ChangeStreamOperationType.Invalidate: writer.WriteString("invalidate"); break;
6869
case ChangeStreamOperationType.Replace: writer.WriteString("replace"); break;
6970
case ChangeStreamOperationType.Update: writer.WriteString("update"); break;
71+
case ChangeStreamOperationType.Rename: writer.WriteString("rename"); break;
7072
default: throw new ArgumentException($"Invalid ChangeStreamOperationType: {value}.", nameof(value));
7173
}
7274
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,13 @@ public void constructor_should_initialize_instance()
3636
var result = new ChangeStreamDocumentSerializer<BsonDocument>(documentSerializer);
3737

3838
result._documentSerializer().Should().BeSameAs(documentSerializer);
39-
result._memberSerializationInfo().Count.Should().Be(7);
39+
result._memberSerializationInfo().Count.Should().Be(8);
4040
AssertRegisteredMember(result, "ClusterTime", "clusterTime", BsonTimestampSerializer.Instance);
4141
AssertRegisteredMember(result, "CollectionNamespace", "ns", ChangeStreamDocumentCollectionNamespaceSerializer.Instance);
4242
AssertRegisteredMember(result, "DocumentKey", "documentKey", BsonDocumentSerializer.Instance);
4343
AssertRegisteredMember(result, "FullDocument", "fullDocument", documentSerializer);
4444
AssertRegisteredMember(result, "OperationType", "operationType", ChangeStreamOperationTypeSerializer.Instance);
45+
AssertRegisteredMember(result, "RenameTo", "to", ChangeStreamDocumentCollectionNamespaceSerializer.Instance);
4546
AssertRegisteredMember(result, "ResumeToken", "_id", BsonDocumentSerializer.Instance);
4647
AssertRegisteredMember(result, "UpdateDescription", "updateDescription", ChangeStreamUpdateDescriptionSerializer.Instance);
4748
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,7 @@ public void FullDocument_should_return_null_when_not_present()
176176
[InlineData("update", ChangeStreamOperationType.Update)]
177177
[InlineData("replace", ChangeStreamOperationType.Replace)]
178178
[InlineData("delete", ChangeStreamOperationType.Delete)]
179+
[InlineData("rename", ChangeStreamOperationType.Rename)]
179180
public void OperationType_should_return_expected_result(string operationTypeName, ChangeStreamOperationType expectedResult)
180181
{
181182
var backingDocument = new BsonDocument { { "other", 1 }, { "operationType", operationTypeName } };
@@ -198,6 +199,31 @@ public void OperationType_should_return_minus_one_when_not_present()
198199
result.Should().Be((ChangeStreamOperationType)(-1));
199200
}
200201

202+
[Fact]
203+
public void RenameTo_should_return_expected_result()
204+
{
205+
var value = new CollectionNamespace(new DatabaseNamespace("database"), "collection");
206+
var to = new BsonDocument { { "db", value.DatabaseNamespace.DatabaseName }, { "coll", value.CollectionName } };
207+
var backingDocument = new BsonDocument { { "other", 1 }, { "to", to } };
208+
var subject = CreateSubject(backingDocument: backingDocument);
209+
210+
var result = subject.RenameTo;
211+
212+
result.Should().Be(value);
213+
}
214+
215+
[Fact]
216+
public void RenameTo_should_return_null_when_not_present()
217+
{
218+
var value = new BsonDocument("x", 1234);
219+
var backingDocument = new BsonDocument { { "other", 1 } };
220+
var subject = CreateSubject(backingDocument: backingDocument);
221+
222+
var result = subject.RenameTo;
223+
224+
result.Should().BeNull();
225+
}
226+
201227
[Fact]
202228
public void ResumeToken_should_return_expected_result()
203229
{

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public class ChangeStreamOperationTypeSerializerTests
3030
[InlineData("\"invalidate\"", ChangeStreamOperationType.Invalidate)]
3131
[InlineData("\"replace\"", ChangeStreamOperationType.Replace)]
3232
[InlineData("\"update\"", ChangeStreamOperationType.Update)]
33+
[InlineData("\"rename\"", ChangeStreamOperationType.Rename)]
3334
public void Deserialize_should_return_expected_result(string json, ChangeStreamOperationType expectedResult)
3435
{
3536
var subject = CreateSubject();
@@ -67,6 +68,7 @@ public void Deserialize_should_throw_when_input_is_invalid()
6768
[InlineData(ChangeStreamOperationType.Invalidate, "\"invalidate\"")]
6869
[InlineData(ChangeStreamOperationType.Replace, "\"replace\"")]
6970
[InlineData(ChangeStreamOperationType.Update, "\"update\"")]
71+
[InlineData(ChangeStreamOperationType.Rename, "\"rename\"")]
7072
public void Serialize_should_have_expected_result(ChangeStreamOperationType value, string expectedResult)
7173
{
7274
var subject = CreateSubject();
@@ -85,7 +87,7 @@ public void Serialize_should_have_expected_result(ChangeStreamOperationType valu
8587

8688
[Theory]
8789
[InlineData(-1)]
88-
[InlineData(5)]
90+
[InlineData(6)]
8991
public void Serialize_should_throw_when_value_is_invalid(int valueAsInt)
9092
{
9193
var subject = CreateSubject();

tests/MongoDB.Driver.Core.Tests/Core/Operations/ChangeStreamOperationTests.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ public void Execute_should_return_expected_results_for_drop_collection(
412412
change.CollectionNamespace.Should().BeNull();
413413
change.DocumentKey.Should().BeNull();
414414
change.FullDocument.Should().BeNull();
415+
change.RenameTo.Should().BeNull();
415416
change.ResumeToken.Should().NotBeNull();
416417
change.UpdateDescription.Should().BeNull();
417418
}
@@ -442,6 +443,7 @@ public void Execute_should_return_expected_results_for_deletes(
442443
change.CollectionNamespace.Should().Be(_collectionNamespace);
443444
change.DocumentKey.Should().Be("{ _id : 1 }");
444445
change.FullDocument.Should().BeNull();
446+
change.RenameTo.Should().BeNull();
445447
change.ResumeToken.Should().NotBeNull();
446448
change.UpdateDescription.Should().BeNull();
447449
}
@@ -473,6 +475,7 @@ public void Execute_should_return_expected_results_for_inserts(
473475
change.CollectionNamespace.Should().Be(_collectionNamespace);
474476
change.DocumentKey.Should().Be("{ _id : 2 }");
475477
change.FullDocument.Should().Be("{ _id : 2, x : 2 }");
478+
change.RenameTo.Should().BeNull();
476479
change.ResumeToken.Should().NotBeNull();
477480
change.UpdateDescription.Should().BeNull();
478481
}
@@ -550,6 +553,7 @@ public void Execute_should_return_expected_results_for_updates(
550553
change.CollectionNamespace.Should().Be(_collectionNamespace);
551554
change.DocumentKey.Should().Be("{ _id : 1 }");
552555
change.FullDocument.Should().Be(fullDocument == ChangeStreamFullDocumentOption.Default ? null : "{ _id : 1, x : 2 }");
556+
change.RenameTo.Should().BeNull();
553557
change.ResumeToken.Should().NotBeNull();
554558
change.UpdateDescription.RemovedFields.Should().BeEmpty();
555559
change.UpdateDescription.UpdatedFields.Should().Be("{ x : 2 }");

0 commit comments

Comments
 (0)