Skip to content

Commit 2ef2bf9

Browse files
committed
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 aa5f77b commit 2ef2bf9

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
@@ -326,7 +326,7 @@ FindAndDeleteOperation<TDocument> findOneAndDelete(final Bson filter, final Find
326326
.sort(toBsonDocument(options.getSort()))
327327
.maxTime(options.getMaxTime(MILLISECONDS), MILLISECONDS)
328328
.collation(options.getCollation())
329-
.hint(options.getHint())
329+
.hint(toBsonDocument(options.getHint()))
330330
.hintString(options.getHintString())
331331
.comment(options.getComment())
332332
.let(toBsonDocument(options.getLet()));
@@ -344,7 +344,7 @@ FindAndReplaceOperation<TDocument> findOneAndReplace(final Bson filter, final TD
344344
.maxTime(options.getMaxTime(MILLISECONDS), MILLISECONDS)
345345
.bypassDocumentValidation(options.getBypassDocumentValidation())
346346
.collation(options.getCollation())
347-
.hint(options.getHint())
347+
.hint(toBsonDocument(options.getHint()))
348348
.hintString(options.getHintString())
349349
.comment(options.getComment())
350350
.let(toBsonDocument(options.getLet()));
@@ -362,7 +362,7 @@ FindAndUpdateOperation<TDocument> findOneAndUpdate(final Bson filter, final Bson
362362
.bypassDocumentValidation(options.getBypassDocumentValidation())
363363
.collation(options.getCollation())
364364
.arrayFilters(toBsonDocumentList(options.getArrayFilters()))
365-
.hint(options.getHint())
365+
.hint(toBsonDocument(options.getHint()))
366366
.hintString(options.getHintString())
367367
.comment(options.getComment())
368368
.let(toBsonDocument(options.getLet()));
@@ -381,7 +381,7 @@ FindAndUpdateOperation<TDocument> findOneAndUpdate(final Bson filter, final List
381381
.bypassDocumentValidation(options.getBypassDocumentValidation())
382382
.collation(options.getCollation())
383383
.arrayFilters(toBsonDocumentList(options.getArrayFilters()))
384-
.hint(options.getHint())
384+
.hint(toBsonDocument(options.getHint()))
385385
.hintString(options.getHintString())
386386
.comment(options.getComment())
387387
.let(toBsonDocument(options.getLet()));
@@ -474,7 +474,7 @@ MixedBulkWriteOperation bulkWrite(final List<? extends WriteModel<? extends TDoc
474474
WriteRequest.Type.REPLACE)
475475
.upsert(replaceOneModel.getReplaceOptions().isUpsert())
476476
.collation(replaceOneModel.getReplaceOptions().getCollation())
477-
.hint(replaceOneModel.getReplaceOptions().getHint())
477+
.hint(toBsonDocument(replaceOneModel.getReplaceOptions().getHint()))
478478
.hintString(replaceOneModel.getReplaceOptions().getHintString());
479479
} else if (writeModel instanceof UpdateOneModel) {
480480
UpdateOneModel<TDocument> updateOneModel = (UpdateOneModel<TDocument>) writeModel;
@@ -485,7 +485,7 @@ MixedBulkWriteOperation bulkWrite(final List<? extends WriteModel<? extends TDoc
485485
.upsert(updateOneModel.getOptions().isUpsert())
486486
.collation(updateOneModel.getOptions().getCollation())
487487
.arrayFilters(toBsonDocumentList(updateOneModel.getOptions().getArrayFilters()))
488-
.hint(updateOneModel.getOptions().getHint())
488+
.hint(toBsonDocument(updateOneModel.getOptions().getHint()))
489489
.hintString(updateOneModel.getOptions().getHintString());
490490
} else if (writeModel instanceof UpdateManyModel) {
491491
UpdateManyModel<TDocument> updateManyModel = (UpdateManyModel<TDocument>) writeModel;
@@ -496,19 +496,19 @@ MixedBulkWriteOperation bulkWrite(final List<? extends WriteModel<? extends TDoc
496496
.upsert(updateManyModel.getOptions().isUpsert())
497497
.collation(updateManyModel.getOptions().getCollation())
498498
.arrayFilters(toBsonDocumentList(updateManyModel.getOptions().getArrayFilters()))
499-
.hint(updateManyModel.getOptions().getHint())
499+
.hint(toBsonDocument(updateManyModel.getOptions().getHint()))
500500
.hintString(updateManyModel.getOptions().getHintString());
501501
} else if (writeModel instanceof DeleteOneModel) {
502502
DeleteOneModel<TDocument> deleteOneModel = (DeleteOneModel<TDocument>) writeModel;
503503
writeRequest = new DeleteRequest(assertNotNull(toBsonDocument(deleteOneModel.getFilter()))).multi(false)
504504
.collation(deleteOneModel.getOptions().getCollation())
505-
.hint(deleteOneModel.getOptions().getHint())
505+
.hint(toBsonDocument(deleteOneModel.getOptions().getHint()))
506506
.hintString(deleteOneModel.getOptions().getHintString());
507507
} else if (writeModel instanceof DeleteManyModel) {
508508
DeleteManyModel<TDocument> deleteManyModel = (DeleteManyModel<TDocument>) writeModel;
509509
writeRequest = new DeleteRequest(assertNotNull(toBsonDocument(deleteManyModel.getFilter()))).multi(true)
510510
.collation(deleteManyModel.getOptions().getCollation())
511-
.hint(deleteManyModel.getOptions().getHint())
511+
.hint(toBsonDocument(deleteManyModel.getOptions().getHint()))
512512
.hintString(deleteManyModel.getOptions().getHintString());
513513
} else {
514514
throw new UnsupportedOperationException(format("WriteModel of type %s is not supported", writeModel.getClass()));

0 commit comments

Comments
 (0)