Skip to content

Commit 937d1f1

Browse files
committed
Merge branch 'master' into 2.12.x
2 parents ecaac84 + 5565c46 commit 937d1f1

File tree

4 files changed

+76
-5
lines changed

4 files changed

+76
-5
lines changed

src/main/com/mongodb/DBCollectionImpl.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -745,8 +745,9 @@ BulkWriteResult executeWriteCommandProtocol() {
745745
@Override
746746
WriteResult executeWriteProtocol(final int i) {
747747
ModifyRequest update = updateRequests.get(i);
748-
return update(update.getQuery(), update.getUpdateDocument(), update.isUpsert(), update.isMulti(), writeConcern,
749-
encoder);
748+
WriteResult writeResult = update(update.getQuery(), update.getUpdateDocument(), update.isUpsert(),
749+
update.isMulti(), writeConcern, encoder);
750+
return addMissingUpserted(update, writeResult);
750751
}
751752

752753
@Override
@@ -770,8 +771,9 @@ BulkWriteResult executeWriteCommandProtocol() {
770771
@Override
771772
WriteResult executeWriteProtocol(final int i) {
772773
ModifyRequest update = replaceRequests.get(i);
773-
return update(update.getQuery(), update.getUpdateDocument(), update.isUpsert(), update.isMulti(), writeConcern,
774-
encoder);
774+
WriteResult writeResult = update(update.getQuery(), update.getUpdateDocument(), update.isUpsert(),
775+
update.isMulti(), writeConcern, encoder);
776+
return addMissingUpserted(update, writeResult);
775777
}
776778

777779
@Override
@@ -920,6 +922,26 @@ private DBObject getErrorResponseDetails(final DBObject response) {
920922
}
921923
return details;
922924
}
925+
926+
WriteResult addMissingUpserted(final ModifyRequest update, final WriteResult writeResult) {
927+
// On pre 2.6 servers upserts with custom _id's would be not be reported so we check if _id
928+
// was in the update query or the find query then massage the writeResult.
929+
if (update.isUpsert() && writeConcern.callGetLastError() && !writeResult.isUpdateOfExisting()
930+
&& writeResult.getUpsertedId() == null) {
931+
DBObject updateDocument = update.getUpdateDocument();
932+
DBObject query = update.getQuery();
933+
if (updateDocument.containsField("_id")) {
934+
CommandResult commandResult = writeResult.getLastError();
935+
commandResult.put("upserted", updateDocument.get("_id"));
936+
return new WriteResult(commandResult, writeResult.getLastConcern());
937+
} else if (query.containsField("_id")) {
938+
CommandResult commandResult = writeResult.getLastError();
939+
commandResult.put("upserted", query.get("_id"));
940+
return new WriteResult(commandResult, writeResult.getLastConcern());
941+
}
942+
}
943+
return writeResult;
944+
}
923945
}
924946
}
925947
}

src/main/com/mongodb/util/JSONCallback.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ public Object objectDone() {
114114
int type = (Integer) b.get("$type");
115115
byte[] bytes = (new Base64Codec()).decode((String) b.get("$binary"));
116116
o = new Binary((byte) type, bytes);
117+
} else if (b.containsField("$numberLong")) {
118+
o = Long.valueOf((String) b.get("$numberLong"));
117119
}
118120

119121
if (!isStackEmpty()) {

src/test/com/mongodb/BulkWriteOperationSpecification.groovy

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,47 @@ class BulkWriteOperationSpecification extends FunctionalSpecification {
351351
ordered << [true, false]
352352
}
353353

354+
def 'when a custom _id is upserted it should be in the write result'() {
355+
given:
356+
def operation = initializeBulkOperation(ordered)
357+
operation.find(new BasicDBObject('_id', 0)).upsert()
358+
.updateOne(new BasicDBObject('$set', new BasicDBObject('a', 0)))
359+
operation.find(new BasicDBObject('a', 1)).upsert().replaceOne(new BasicDBObject('_id', 1))
360+
operation.find(new BasicDBObject('_id', 2)).upsert().replaceOne(new BasicDBObject('_id', 2))
361+
362+
when:
363+
def result = operation.execute()
364+
365+
then:
366+
result == new AcknowledgedBulkWriteResult(UPDATE, 0, expectedModifiedCount(0), [new BulkWriteUpsert(0, 0),
367+
new BulkWriteUpsert(1, 1),
368+
new BulkWriteUpsert(2, 2)])
369+
collection.count() == 3
370+
371+
where:
372+
ordered << [true, false]
373+
}
374+
375+
def 'unacknowledged upserts with custom _id should not error'() {
376+
given:
377+
def operation = initializeBulkOperation(ordered)
378+
operation.find(new BasicDBObject('_id', 0)).upsert()
379+
.updateOne(new BasicDBObject('$set', new BasicDBObject('a', 0)))
380+
operation.find(new BasicDBObject('a', 1)).upsert().replaceOne(new BasicDBObject('_id', 1))
381+
operation.find(new BasicDBObject('_id', 2)).upsert().replaceOne(new BasicDBObject('_id', 2))
382+
383+
when:
384+
def result = operation.execute(WriteConcern.UNACKNOWLEDGED)
385+
collection.insert(new BasicDBObject('_id', 4))
386+
387+
then:
388+
result == new UnacknowledgedBulkWriteResult()
389+
collection.count() == 4
390+
391+
where:
392+
ordered << [true, false]
393+
}
394+
354395
def 'when a replacement document is 16MB, the document is still replaced'() {
355396
given:
356397
collection.insert(new BasicDBObject('_id', 1))
@@ -809,4 +850,4 @@ class BulkWriteOperationSpecification extends FunctionalSpecification {
809850
private static Integer expectedModifiedCount(final int expectedCountForServersThatSupportIt) {
810851
(serverIsAtLeastVersion(2.5)) ? expectedCountForServersThatSupportIt : null
811852
}
812-
}
853+
}

src/test/com/mongodb/util/JSONCallbackTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ public void refParsing() {
121121
assertEquals(ref.getId(), new ObjectId("01234567890123456789abcd").toHexString());
122122
}
123123

124+
@Test
125+
public void numberLongParsing() {
126+
Long number = (Long) JSON.parse(("{ \"$numberLong\" : \"123456\" }"));
127+
assertEquals(number, Long.valueOf("123456"));
128+
}
129+
124130
// No such concept in Java
125131
// @Test
126132
// public void undefinedParsing() {

0 commit comments

Comments
 (0)