From 5769d83aa11346c4c7d0f930a216b716af7bbde8 Mon Sep 17 00:00:00 2001 From: Frank van Dijk Date: Tue, 30 Jan 2018 22:50:18 +0100 Subject: [PATCH 1/2] CSHARP-1378 enumerate bulkwrite request list once --- src/MongoDB.Driver/MongoCollectionImpl.cs | 22 ++++++++----- .../MongoCollectionImplTests.cs | 33 +++++++++++++++++++ 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/MongoDB.Driver/MongoCollectionImpl.cs b/src/MongoDB.Driver/MongoCollectionImpl.cs index 975dc77ea7a..c56c82c2403 100644 --- a/src/MongoDB.Driver/MongoCollectionImpl.cs +++ b/src/MongoDB.Driver/MongoCollectionImpl.cs @@ -169,21 +169,24 @@ public override MongoCollectionSettings Settings { Ensure.IsNotNull(session, nameof(session)); Ensure.IsNotNull(requests, nameof(requests)); - if (!requests.Any()) + + var requestList = requests.ToList(); + + if (requestList.Count==0) { throw new ArgumentException("Must contain at least 1 request.", "requests"); } options = options ?? new BulkWriteOptions(); - var operation = CreateBulkWriteOperation(requests, options); + var operation = CreateBulkWriteOperation(requestList, options); try { var result = ExecuteWriteOperation(session, operation, cancellationToken); - return BulkWriteResult.FromCore(result, requests); + return BulkWriteResult.FromCore(result, requestList); } catch (MongoBulkWriteOperationException ex) { - throw MongoBulkWriteException.FromCore(ex, requests.ToList()); + throw MongoBulkWriteException.FromCore(ex, requestList); } } @@ -196,21 +199,24 @@ public override MongoCollectionSettings Settings { Ensure.IsNotNull(session, nameof(session)); Ensure.IsNotNull(requests, nameof(requests)); - if (!requests.Any()) + + var requestList = requests.ToList(); + + if (requestList.Count==0) { throw new ArgumentException("Must contain at least 1 request.", "requests"); } options = options ?? new BulkWriteOptions(); - var operation = CreateBulkWriteOperation(requests, options); + var operation = CreateBulkWriteOperation(requestList, options); try { var result = await ExecuteWriteOperationAsync(session, operation, cancellationToken).ConfigureAwait(false); - return BulkWriteResult.FromCore(result, requests); + return BulkWriteResult.FromCore(result, requestList); } catch (MongoBulkWriteOperationException ex) { - throw MongoBulkWriteException.FromCore(ex, requests.ToList()); + throw MongoBulkWriteException.FromCore(ex, requestList); } } diff --git a/tests/MongoDB.Driver.Tests/MongoCollectionImplTests.cs b/tests/MongoDB.Driver.Tests/MongoCollectionImplTests.cs index aa377985ba7..3782f3c9aa7 100644 --- a/tests/MongoDB.Driver.Tests/MongoCollectionImplTests.cs +++ b/tests/MongoDB.Driver.Tests/MongoCollectionImplTests.cs @@ -398,6 +398,39 @@ public void BulkWrite_should_execute_a_BulkMixedWriteOperation( } } + [Theory] + [ParameterAttributeData] + public void BulkWrite_should_enum_once( + [Values(false, true)] bool async) + { + var subject = CreateSubject(); + var options = new BulkWriteOptions + { + BypassDocumentValidation = false, + IsOrdered = false + }; + var cancellationToken = new CancellationTokenSource().Token; + var operationResult = new BulkWriteOperationResult.Unacknowledged(9, new[] { new InsertRequest(new BsonDocument("b", 1)) }); + _operationExecutor.EnqueueResult(operationResult); + var count = 0; + var requests = Enumerable.Range(0,4).Select(n => { + ++count; + return new ReplaceOneModel(new BsonDocument("_id",n),new BsonDocument("_id",n)); + }); + BulkWriteResult result; + if (async) + { + result = subject.BulkWriteAsync(requests, options, cancellationToken).GetAwaiter().GetResult(); + } + else + { + result = subject.BulkWrite(requests, options, cancellationToken); + } + var call = _operationExecutor.GetWriteCall(); + VerifySessionAndCancellationToken(call, null, cancellationToken); + count.Should().Be(4); + } + [Theory] [ParameterAttributeData] public void Count_should_execute_a_CountOperation( From bcf85816f9d02cb84c8b1c89064617d913945af7 Mon Sep 17 00:00:00 2001 From: Frank van Dijk Date: Tue, 30 Jan 2018 22:53:31 +0100 Subject: [PATCH 2/2] CSHARP-1378 remove extra list copy --- src/MongoDB.Driver/BulkWriteResult.cs | 30 +++++++++++++++++-- src/MongoDB.Driver/MongoBulkWriteException.cs | 3 +- .../BulkWriteResultTests.cs | 4 +-- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/MongoDB.Driver/BulkWriteResult.cs b/src/MongoDB.Driver/BulkWriteResult.cs index 9d38bafd5ea..db799e17d0f 100644 --- a/src/MongoDB.Driver/BulkWriteResult.cs +++ b/src/MongoDB.Driver/BulkWriteResult.cs @@ -113,10 +113,10 @@ public abstract class BulkWriteResult : BulkWriteResult /// The processed requests. protected BulkWriteResult( int requestCount, - IEnumerable> processedRequests) + List> processedRequests) : base(requestCount) { - _processedRequests = processedRequests.ToList(); + _processedRequests = processedRequests; } // public properties @@ -148,7 +148,7 @@ internal static BulkWriteResult FromCore(Core.Operations.BulkWriteOpe result.ProcessedRequests.Select(r => WriteModel.FromCore(r))); } - internal static BulkWriteResult FromCore(Core.Operations.BulkWriteOperationResult result, IEnumerable> requests) + internal static BulkWriteResult FromCore(Core.Operations.BulkWriteOperationResult result, List> requests) { if (result.IsAcknowledged) { @@ -202,6 +202,23 @@ public Acknowledged( long? modifiedCount, IEnumerable> processedRequests, IEnumerable upserts) + : base(requestCount, processedRequests.ToList()) + { + _matchedCount = matchedCount; + _deletedCount = deletedCount; + _insertedCount = insertedCount; + _modifiedCount = modifiedCount; + _upserts = upserts.ToList(); + } + + internal Acknowledged( + int requestCount, + long matchedCount, + long deletedCount, + long insertedCount, + long? modifiedCount, + List> processedRequests, + IEnumerable upserts) : base(requestCount, processedRequests) { _matchedCount = matchedCount; @@ -279,6 +296,13 @@ public class Unacknowledged : BulkWriteResult public Unacknowledged( int requestCount, IEnumerable> processedRequests) + : base(requestCount, processedRequests.ToList()) + { + } + + internal Unacknowledged( + int requestCount, + List> processedRequests) : base(requestCount, processedRequests) { } diff --git a/src/MongoDB.Driver/MongoBulkWriteException.cs b/src/MongoDB.Driver/MongoBulkWriteException.cs index 26648d62c56..b491ddb2ddc 100644 --- a/src/MongoDB.Driver/MongoBulkWriteException.cs +++ b/src/MongoDB.Driver/MongoBulkWriteException.cs @@ -223,7 +223,8 @@ internal static MongoBulkWriteException FromCore(MongoBulkWriteOperat var processedRequests = ex.Result.ProcessedRequests .Select(r => new { CorrelationId = r.CorrelationId.Value, Request = requests[r.CorrelationId.Value] }) .OrderBy(x => x.CorrelationId) - .Select(x => x.Request); + .Select(x => x.Request) + .ToList(); var unprocessedRequests = ex.UnprocessedRequests .Select(r => new { CorrelationId = r.CorrelationId.Value, Request = requests[r.CorrelationId.Value] }) diff --git a/tests/MongoDB.Driver.Tests/BulkWriteResultTests.cs b/tests/MongoDB.Driver.Tests/BulkWriteResultTests.cs index 2d7839c1439..863bbc51329 100644 --- a/tests/MongoDB.Driver.Tests/BulkWriteResultTests.cs +++ b/tests/MongoDB.Driver.Tests/BulkWriteResultTests.cs @@ -42,7 +42,7 @@ public void Should_convert_from_core_acknowledged_result_when_original_models_ex processedRequests: new[] { new InsertRequest(new BsonDocument("b", 1)) }, upserts: new List()); - var models = new[] + var models = new List> { new InsertOneModel(new BsonDocument("a", 1)) }; @@ -70,7 +70,7 @@ public void Should_convert_from_core_unacknowledged_result_when_original_models_ requestCount: 1, processedRequests: new[] { new InsertRequest(new BsonDocument("b", 1)) }); - var models = new[] + var models = new List> { new InsertOneModel(new BsonDocument("a", 1)) };