Skip to content

Commit ea0633e

Browse files
stIncMalejyemin
andcommitted
Replace lazy command document with non-lazy one
Justification: this is the only operation that uses a lazy document for the command. It was only lazy in the first place because of the lack of splitting in the initial implementation, but now that there is splitting there is no longer a need, and the fact that it's an outlier would make it confusing for future readers. JAVA-5529 Co-authored-by: Jeff Yemin <jeff.yemin@mongodb.com>
1 parent cf175d4 commit ea0633e

File tree

1 file changed

+29
-48
lines changed

1 file changed

+29
-48
lines changed

driver-core/src/main/com/mongodb/internal/operation/ClientBulkWriteOperation.java

Lines changed: 29 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@
3030
import com.mongodb.bulk.WriteConcernError;
3131
import com.mongodb.client.cursor.TimeoutMode;
3232
import com.mongodb.client.model.bulk.ClientBulkWriteOptions;
33-
import com.mongodb.client.model.bulk.ClientNamespacedReplaceOneModel;
34-
import com.mongodb.client.model.bulk.ClientNamespacedUpdateOneModel;
35-
import com.mongodb.client.model.bulk.ClientNamespacedWriteModel;
3633
import com.mongodb.client.model.bulk.ClientBulkWriteResult;
3734
import com.mongodb.client.model.bulk.ClientDeleteResult;
3835
import com.mongodb.client.model.bulk.ClientInsertOneResult;
36+
import com.mongodb.client.model.bulk.ClientNamespacedReplaceOneModel;
37+
import com.mongodb.client.model.bulk.ClientNamespacedUpdateOneModel;
38+
import com.mongodb.client.model.bulk.ClientNamespacedWriteModel;
3939
import com.mongodb.client.model.bulk.ClientUpdateResult;
4040
import com.mongodb.connection.ConnectionDescription;
4141
import com.mongodb.internal.TimeoutContext;
@@ -45,12 +45,16 @@
4545
import com.mongodb.internal.client.model.bulk.AbstractClientDeleteModel;
4646
import com.mongodb.internal.client.model.bulk.AbstractClientNamespacedWriteModel;
4747
import com.mongodb.internal.client.model.bulk.AbstractClientUpdateModel;
48+
import com.mongodb.internal.client.model.bulk.AcknowledgedSummaryClientBulkWriteResult;
49+
import com.mongodb.internal.client.model.bulk.AcknowledgedVerboseClientBulkWriteResult;
4850
import com.mongodb.internal.client.model.bulk.ClientWriteModel;
4951
import com.mongodb.internal.client.model.bulk.ConcreteClientBulkWriteOptions;
5052
import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteManyModel;
5153
import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteOneModel;
5254
import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteOptions;
55+
import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteResult;
5356
import com.mongodb.internal.client.model.bulk.ConcreteClientInsertOneModel;
57+
import com.mongodb.internal.client.model.bulk.ConcreteClientInsertOneResult;
5458
import com.mongodb.internal.client.model.bulk.ConcreteClientNamespacedDeleteManyModel;
5559
import com.mongodb.internal.client.model.bulk.ConcreteClientNamespacedDeleteOneModel;
5660
import com.mongodb.internal.client.model.bulk.ConcreteClientNamespacedInsertOneModel;
@@ -62,10 +66,6 @@
6266
import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateManyModel;
6367
import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOneModel;
6468
import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateOptions;
65-
import com.mongodb.internal.client.model.bulk.AcknowledgedSummaryClientBulkWriteResult;
66-
import com.mongodb.internal.client.model.bulk.AcknowledgedVerboseClientBulkWriteResult;
67-
import com.mongodb.internal.client.model.bulk.ConcreteClientDeleteResult;
68-
import com.mongodb.internal.client.model.bulk.ConcreteClientInsertOneResult;
6969
import com.mongodb.internal.client.model.bulk.ConcreteClientUpdateResult;
7070
import com.mongodb.internal.client.model.bulk.UnacknowledgedClientBulkWriteResult;
7171
import com.mongodb.internal.connection.Connection;
@@ -82,8 +82,9 @@
8282
import com.mongodb.internal.validator.UpdateFieldNameValidator;
8383
import com.mongodb.lang.Nullable;
8484
import org.bson.BsonArray;
85+
import org.bson.BsonBoolean;
8586
import org.bson.BsonDocument;
86-
import org.bson.BsonDocumentWrapper;
87+
import org.bson.BsonInt32;
8788
import org.bson.BsonObjectId;
8889
import org.bson.BsonValue;
8990
import org.bson.BsonWriter;
@@ -111,10 +112,10 @@
111112
import static com.mongodb.internal.operation.BulkWriteBatch.logWriteModelDoesNotSupportRetries;
112113
import static com.mongodb.internal.operation.ClientBulkWriteOperation.ClientBulkWriteCommand.OpsAndNsInfo.WritersProviderAndLimitsChecker.WriteResult.FAIL_LIMIT_EXCEEDED;
113114
import static com.mongodb.internal.operation.ClientBulkWriteOperation.ClientBulkWriteCommand.OpsAndNsInfo.WritersProviderAndLimitsChecker.WriteResult.OK_LIMIT_NOT_REACHED;
115+
import static com.mongodb.internal.operation.CommandOperationHelper.commandWriteConcern;
114116
import static com.mongodb.internal.operation.CommandOperationHelper.initialRetryState;
115117
import static com.mongodb.internal.operation.CommandOperationHelper.shouldAttemptToRetryWriteAndAddRetryableLabel;
116118
import static com.mongodb.internal.operation.CommandOperationHelper.transformWriteException;
117-
import static com.mongodb.internal.operation.CommandOperationHelper.commandWriteConcern;
118119
import static com.mongodb.internal.operation.CommandOperationHelper.validateAndGetEffectiveWriteConcern;
119120
import static com.mongodb.internal.operation.OperationHelper.isRetryableWrite;
120121
import static com.mongodb.internal.operation.SyncOperationHelper.cursorDocumentToBatchCursor;
@@ -256,7 +257,7 @@ private Integer executeBatch(
256257

257258
/**
258259
* @throws MongoWriteConcernWithResponseException This internal exception must be handled to avoid it being observed by an application.
259-
* It {@linkplain MongoWriteConcernWithResponseException#getResponse() bears} the OK response to the {@code lazilyEncodedCommand},
260+
* It {@linkplain MongoWriteConcernWithResponseException#getResponse() bears} the OK response to the {@code bulkWriteCommand},
260261
* which must be
261262
* {@linkplain ResultAccumulator#onBulkWriteCommandOkResponseWithWriteConcernError(int, MongoWriteConcernWithResponseException, BatchEncoder.EncodedBatchInfo) accumulated}
262263
* iff this exception is the failed result of retries.
@@ -271,7 +272,7 @@ private ExhaustiveClientBulkWriteCommandOkResponse executeBulkWriteCommandAndExh
271272
final OperationContext operationContext) throws MongoWriteConcernWithResponseException {
272273
BsonDocument bulkWriteCommandOkResponse = connection.command(
273274
"admin",
274-
bulkWriteCommand.getLazilyEncodedCommandDocument(),
275+
bulkWriteCommand.getCommandDocument(),
275276
NoOpFieldNameValidator.INSTANCE,
276277
null,
277278
CommandResultDocumentCodec.create(codecRegistry.get(BsonDocument.class), CommandBatchCursorHelper.FIRST_BATCH),
@@ -337,39 +338,19 @@ private ClientBulkWriteCommand createBulkWriteCommand(
337338
final List<? extends ClientNamespacedWriteModel> unexecutedModels,
338339
final BatchEncoder batchEncoder,
339340
final Runnable retriesEnabler) {
340-
BsonDocumentWrapper<?> lazilyEncodedCommandDocument = new BsonDocumentWrapper<>(
341-
BULK_WRITE_COMMAND_NAME,
342-
new Encoder<String>() {
343-
@Override
344-
public void encode(final BsonWriter writer, final String commandName, final EncoderContext encoderContext) {
345-
writer.writeStartDocument();
346-
writer.writeInt32(commandName, 1);
347-
writer.writeBoolean("errorsOnly", !options.isVerboseResults());
348-
writer.writeBoolean("ordered", options.isOrdered());
349-
options.isBypassDocumentValidation().ifPresent(value -> writer.writeBoolean("bypassDocumentValidation", value));
350-
options.getComment().ifPresent(value -> {
351-
writer.writeName("comment");
352-
encodeUsingRegistry(writer, value);
353-
});
354-
options.getLet().ifPresent(value -> {
355-
writer.writeName("let");
356-
encodeUsingRegistry(writer, value);
357-
});
358-
commandWriteConcern(effectiveWriteConcern, sessionContext).ifPresent(value -> {
359-
writer.writeName("writeConcern");
360-
encodeUsingRegistry(writer, value.asDocument());
361-
});
362-
writer.writeEndDocument();
363-
}
364-
365-
@Override
366-
public Class<String> getEncoderClass() {
367-
throw fail();
368-
}
369-
}
370-
);
341+
BsonDocument commandDocument = new BsonDocument(BULK_WRITE_COMMAND_NAME, new BsonInt32(1))
342+
.append("errorsOnly", BsonBoolean.valueOf(!options.isVerboseResults()))
343+
.append("ordered", BsonBoolean.valueOf(options.isOrdered()));
344+
options.isBypassDocumentValidation().ifPresent(value ->
345+
commandDocument.append("bypassDocumentValidation", BsonBoolean.valueOf(value)));
346+
options.getComment().ifPresent(value ->
347+
commandDocument.append("comment", value));
348+
options.getLet().ifPresent(let ->
349+
commandDocument.append("let", let.toBsonDocument(BsonDocument.class, codecRegistry)));
350+
commandWriteConcern(effectiveWriteConcern, sessionContext).ifPresent(value->
351+
commandDocument.append("writeConcern", value.asDocument()));
371352
return new ClientBulkWriteCommand(
372-
lazilyEncodedCommandDocument,
353+
commandDocument,
373354
new ClientBulkWriteCommand.OpsAndNsInfo(
374355
effectiveRetryWrites, unexecutedModels, batchEncoder, options,
375356
() -> {
@@ -666,18 +647,18 @@ void onBulkWriteCommandErrorWithoutResponse(final MongoException exception) {
666647
}
667648

668649
public static final class ClientBulkWriteCommand {
669-
private final BsonDocumentWrapper<?> lazilyEncodedCommandDocument;
650+
private final BsonDocument commandDocument;
670651
private final OpsAndNsInfo opsAndNsInfo;
671652

672653
ClientBulkWriteCommand(
673-
final BsonDocumentWrapper<?> lazilyEncodedCommandDocument,
654+
final BsonDocument commandDocument,
674655
final OpsAndNsInfo opsAndNsInfo) {
675-
this.lazilyEncodedCommandDocument = lazilyEncodedCommandDocument;
656+
this.commandDocument = commandDocument;
676657
this.opsAndNsInfo = opsAndNsInfo;
677658
}
678659

679-
BsonDocumentWrapper<?> getLazilyEncodedCommandDocument() {
680-
return lazilyEncodedCommandDocument;
660+
BsonDocument getCommandDocument() {
661+
return commandDocument;
681662
}
682663

683664
OpsAndNsInfo getOpsAndNsInfo() {

0 commit comments

Comments
 (0)