Skip to content

Commit 3d42c1f

Browse files
authored
Convert Bson to BsonDocument for hint (#1335)
Unlike every other instance of Bson in the CRUD API, the hint option for write operations was not converted to a BsonDocument prior to passing it down to the operation layer. This is a problem because the operation layer doesn't have a CodecRegistry available, and so can not properly due the conversion. In this commit, all hint options are converted to BsonDocument in the same place as all the other Bson options, where a CodecRegistry is available to properly do the conversion. JAVA-5357
1 parent 31299ab commit 3d42c1f

File tree

8 files changed

+25
-31
lines changed

8 files changed

+25
-31
lines changed

driver-core/src/main/com/mongodb/internal/bulk/DeleteRequest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.mongodb.client.model.Collation;
2020
import com.mongodb.lang.Nullable;
2121
import org.bson.BsonDocument;
22-
import org.bson.conversions.Bson;
2322

2423
import static com.mongodb.assertions.Assertions.notNull;
2524

@@ -32,7 +31,7 @@ public final class DeleteRequest extends WriteRequest {
3231
private final BsonDocument filter;
3332
private boolean isMulti = true;
3433
private Collation collation;
35-
private Bson hint;
34+
private BsonDocument hint;
3635
private String hintString;
3736

3837
public DeleteRequest(final BsonDocument filter) {
@@ -63,11 +62,11 @@ public DeleteRequest collation(@Nullable final Collation collation) {
6362
}
6463

6564
@Nullable
66-
public Bson getHint() {
65+
public BsonDocument getHint() {
6766
return hint;
6867
}
6968

70-
public DeleteRequest hint(@Nullable final Bson hint) {
69+
public DeleteRequest hint(@Nullable final BsonDocument hint) {
7170
this.hint = hint;
7271
return this;
7372
}

driver-core/src/main/com/mongodb/internal/bulk/UpdateRequest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import com.mongodb.lang.Nullable;
2121
import org.bson.BsonDocument;
2222
import org.bson.BsonValue;
23-
import org.bson.conversions.Bson;
2423

2524
import java.util.List;
2625

@@ -39,7 +38,7 @@ public final class UpdateRequest extends WriteRequest {
3938
private boolean isUpsert = false;
4039
private Collation collation;
4140
private List<BsonDocument> arrayFilters;
42-
@Nullable private Bson hint;
41+
@Nullable private BsonDocument hint;
4342
@Nullable private String hintString;
4443

4544
public UpdateRequest(final BsonDocument filter, @Nullable final BsonValue update, final Type updateType) {
@@ -111,11 +110,11 @@ public List<BsonDocument> getArrayFilters() {
111110
}
112111

113112
@Nullable
114-
public Bson getHint() {
113+
public BsonDocument getHint() {
115114
return hint;
116115
}
117116

118-
public UpdateRequest hint(@Nullable final Bson hint) {
117+
public UpdateRequest hint(@Nullable final BsonDocument hint) {
119118
this.hint = hint;
120119
return this;
121120
}

driver-core/src/main/com/mongodb/internal/connection/SplittablePayload.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,8 @@ public void encode(final BsonWriter writer, final WriteRequestWithIndex writeReq
246246
}
247247
if (update.getHint() != null) {
248248
writer.writeName("hint");
249-
BsonDocument hint = assertNotNull(update.getHint()).toBsonDocument(BsonDocument.class, null);
250-
getCodec(hint).encode(writer, hint, EncoderContext.builder().build());
249+
getCodec(assertNotNull(update.getHint())).encode(writer, assertNotNull(update.getHint()),
250+
EncoderContext.builder().build());
251251
} else if (update.getHintString() != null) {
252252
writer.writeString("hint", update.getHintString());
253253
}
@@ -265,7 +265,7 @@ public void encode(final BsonWriter writer, final WriteRequestWithIndex writeReq
265265
}
266266
if (deleteRequest.getHint() != null) {
267267
writer.writeName("hint");
268-
BsonDocument hint = assertNotNull(deleteRequest.getHint()).toBsonDocument(BsonDocument.class, null);
268+
BsonDocument hint = assertNotNull(deleteRequest.getHint());
269269
getCodec(hint).encode(writer, hint, EncoderContext.builder().build());
270270
} else if (deleteRequest.getHintString() != null) {
271271
writer.writeString("hint", deleteRequest.getHintString());

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import org.bson.BsonValue;
3232
import org.bson.FieldNameValidator;
3333
import org.bson.codecs.Decoder;
34-
import org.bson.conversions.Bson;
3534

3635
import java.util.concurrent.TimeUnit;
3736

@@ -62,7 +61,7 @@ public abstract class BaseFindAndModifyOperation<T> implements AsyncWriteOperati
6261
private BsonDocument sort;
6362
private long maxTimeMS;
6463
private Collation collation;
65-
private Bson hint;
64+
private BsonDocument hint;
6665
private String hintString;
6766
private BsonValue comment;
6867
private BsonDocument variables;
@@ -151,11 +150,11 @@ public Collation getCollation() {
151150
}
152151

153152
@Nullable
154-
public Bson getHint() {
153+
public BsonDocument getHint() {
155154
return hint;
156155
}
157156

158-
public BaseFindAndModifyOperation<T> hint(@Nullable final Bson hint) {
157+
public BaseFindAndModifyOperation<T> hint(@Nullable final BsonDocument hint) {
159158
this.hint = hint;
160159
return this;
161160
}
@@ -216,7 +215,7 @@ private CommandCreator getCommandCreator(final SessionContext sessionContext) {
216215
if (getHint() != null || getHintString() != null) {
217216
validateHintForFindAndModify(connectionDescription, getWriteConcern());
218217
if (getHint() != null) {
219-
commandDocument.put("hint", getHint().toBsonDocument(BsonDocument.class, null));
218+
commandDocument.put("hint", getHint());
220219
} else {
221220
commandDocument.put("hint", new BsonString(getHintString()));
222221
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
import org.bson.BsonValue;
2828
import org.bson.FieldNameValidator;
2929
import org.bson.codecs.Decoder;
30-
import org.bson.conversions.Bson;
3130

3231
import java.util.concurrent.TimeUnit;
3332

@@ -68,7 +67,7 @@ public FindAndDeleteOperation<T> sort(@Nullable final BsonDocument sort) {
6867
}
6968

7069
@Override
71-
public FindAndDeleteOperation<T> hint(@Nullable final Bson hint) {
70+
public FindAndDeleteOperation<T> hint(@Nullable final BsonDocument hint) {
7271
super.hint(hint);
7372
return this;
7473
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.bson.BsonValue;
3030
import org.bson.FieldNameValidator;
3131
import org.bson.codecs.Decoder;
32-
import org.bson.conversions.Bson;
3332

3433
import java.util.HashMap;
3534
import java.util.Map;
@@ -111,7 +110,7 @@ public FindAndReplaceOperation<T> sort(@Nullable final BsonDocument sort) {
111110
}
112111

113112
@Override
114-
public FindAndReplaceOperation<T> hint(@Nullable final Bson hint) {
113+
public FindAndReplaceOperation<T> hint(@Nullable final BsonDocument hint) {
115114
super.hint(hint);
116115
return this;
117116
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.bson.BsonValue;
3131
import org.bson.FieldNameValidator;
3232
import org.bson.codecs.Decoder;
33-
import org.bson.conversions.Bson;
3433

3534
import java.util.HashMap;
3635
import java.util.List;
@@ -139,7 +138,7 @@ public FindAndUpdateOperation<T> sort(@Nullable final BsonDocument sort) {
139138
}
140139

141140
@Override
142-
public FindAndUpdateOperation<T> hint(@Nullable final Bson hint) {
141+
public FindAndUpdateOperation<T> hint(@Nullable final BsonDocument hint) {
143142
super.hint(hint);
144143
return this;
145144
}

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ FindAndDeleteOperation<TDocument> findOneAndDelete(final Bson filter, final Find
322322
.sort(toBsonDocument(options.getSort()))
323323
.maxTime(options.getMaxTime(MILLISECONDS), MILLISECONDS)
324324
.collation(options.getCollation())
325-
.hint(options.getHint())
325+
.hint(toBsonDocument(options.getHint()))
326326
.hintString(options.getHintString())
327327
.comment(options.getComment())
328328
.let(toBsonDocument(options.getLet()));
@@ -340,7 +340,7 @@ FindAndReplaceOperation<TDocument> findOneAndReplace(final Bson filter, final TD
340340
.maxTime(options.getMaxTime(MILLISECONDS), MILLISECONDS)
341341
.bypassDocumentValidation(options.getBypassDocumentValidation())
342342
.collation(options.getCollation())
343-
.hint(options.getHint())
343+
.hint(toBsonDocument(options.getHint()))
344344
.hintString(options.getHintString())
345345
.comment(options.getComment())
346346
.let(toBsonDocument(options.getLet()));
@@ -358,7 +358,7 @@ FindAndUpdateOperation<TDocument> findOneAndUpdate(final Bson filter, final Bson
358358
.bypassDocumentValidation(options.getBypassDocumentValidation())
359359
.collation(options.getCollation())
360360
.arrayFilters(toBsonDocumentList(options.getArrayFilters()))
361-
.hint(options.getHint())
361+
.hint(toBsonDocument(options.getHint()))
362362
.hintString(options.getHintString())
363363
.comment(options.getComment())
364364
.let(toBsonDocument(options.getLet()));
@@ -377,7 +377,7 @@ FindAndUpdateOperation<TDocument> findOneAndUpdate(final Bson filter, final List
377377
.bypassDocumentValidation(options.getBypassDocumentValidation())
378378
.collation(options.getCollation())
379379
.arrayFilters(toBsonDocumentList(options.getArrayFilters()))
380-
.hint(options.getHint())
380+
.hint(toBsonDocument(options.getHint()))
381381
.hintString(options.getHintString())
382382
.comment(options.getComment())
383383
.let(toBsonDocument(options.getLet()));
@@ -470,7 +470,7 @@ MixedBulkWriteOperation bulkWrite(final List<? extends WriteModel<? extends TDoc
470470
WriteRequest.Type.REPLACE)
471471
.upsert(replaceOneModel.getReplaceOptions().isUpsert())
472472
.collation(replaceOneModel.getReplaceOptions().getCollation())
473-
.hint(replaceOneModel.getReplaceOptions().getHint())
473+
.hint(toBsonDocument(replaceOneModel.getReplaceOptions().getHint()))
474474
.hintString(replaceOneModel.getReplaceOptions().getHintString());
475475
} else if (writeModel instanceof UpdateOneModel) {
476476
UpdateOneModel<TDocument> updateOneModel = (UpdateOneModel<TDocument>) writeModel;
@@ -481,7 +481,7 @@ MixedBulkWriteOperation bulkWrite(final List<? extends WriteModel<? extends TDoc
481481
.upsert(updateOneModel.getOptions().isUpsert())
482482
.collation(updateOneModel.getOptions().getCollation())
483483
.arrayFilters(toBsonDocumentList(updateOneModel.getOptions().getArrayFilters()))
484-
.hint(updateOneModel.getOptions().getHint())
484+
.hint(toBsonDocument(updateOneModel.getOptions().getHint()))
485485
.hintString(updateOneModel.getOptions().getHintString());
486486
} else if (writeModel instanceof UpdateManyModel) {
487487
UpdateManyModel<TDocument> updateManyModel = (UpdateManyModel<TDocument>) writeModel;
@@ -492,19 +492,19 @@ MixedBulkWriteOperation bulkWrite(final List<? extends WriteModel<? extends TDoc
492492
.upsert(updateManyModel.getOptions().isUpsert())
493493
.collation(updateManyModel.getOptions().getCollation())
494494
.arrayFilters(toBsonDocumentList(updateManyModel.getOptions().getArrayFilters()))
495-
.hint(updateManyModel.getOptions().getHint())
495+
.hint(toBsonDocument(updateManyModel.getOptions().getHint()))
496496
.hintString(updateManyModel.getOptions().getHintString());
497497
} else if (writeModel instanceof DeleteOneModel) {
498498
DeleteOneModel<TDocument> deleteOneModel = (DeleteOneModel<TDocument>) writeModel;
499499
writeRequest = new DeleteRequest(assertNotNull(toBsonDocument(deleteOneModel.getFilter()))).multi(false)
500500
.collation(deleteOneModel.getOptions().getCollation())
501-
.hint(deleteOneModel.getOptions().getHint())
501+
.hint(toBsonDocument(deleteOneModel.getOptions().getHint()))
502502
.hintString(deleteOneModel.getOptions().getHintString());
503503
} else if (writeModel instanceof DeleteManyModel) {
504504
DeleteManyModel<TDocument> deleteManyModel = (DeleteManyModel<TDocument>) writeModel;
505505
writeRequest = new DeleteRequest(assertNotNull(toBsonDocument(deleteManyModel.getFilter()))).multi(true)
506506
.collation(deleteManyModel.getOptions().getCollation())
507-
.hint(deleteManyModel.getOptions().getHint())
507+
.hint(toBsonDocument(deleteManyModel.getOptions().getHint()))
508508
.hintString(deleteManyModel.getOptions().getHintString());
509509
} else {
510510
throw new UnsupportedOperationException(format("WriteModel of type %s is not supported", writeModel.getClass()));

0 commit comments

Comments
 (0)