diff --git a/criteria/mongo/src/org/immutables/criteria/mongo/MongoSession.java b/criteria/mongo/src/org/immutables/criteria/mongo/MongoSession.java index ae475ba8c..a74a3baf3 100644 --- a/criteria/mongo/src/org/immutables/criteria/mongo/MongoSession.java +++ b/criteria/mongo/src/org/immutables/criteria/mongo/MongoSession.java @@ -237,7 +237,7 @@ private Publisher update(StandardOperations.Update operation) { Publisher publisher = ((MongoCollection) collection).bulkWrite(docs); return Flowable.fromPublisher(publisher).map(x -> WriteResult.empty() .withUpdatedCount(x.getModifiedCount()) - .withInsertedCount(x.getInsertedCount()) + .withInsertedCount(operation.upsert() ? x.getUpserts().size() : x.getInsertedCount()) .withDeletedCount(x.getDeletedCount())); } diff --git a/criteria/mongo/test/org/immutables/criteria/mongo/MongoWriteResultTest.java b/criteria/mongo/test/org/immutables/criteria/mongo/MongoWriteResultTest.java index 43c03880b..fc61e448f 100644 --- a/criteria/mongo/test/org/immutables/criteria/mongo/MongoWriteResultTest.java +++ b/criteria/mongo/test/org/immutables/criteria/mongo/MongoWriteResultTest.java @@ -88,4 +88,24 @@ void update() { check(result2.insertedCount().getAsLong()).is(0L); check(result2.deletedCount().getAsLong()).is(0L); } + + @Test + void upsert() { + ImmutablePerson person1 = generator.next(); + WriteResult result = repository.upsert(person1); + check(result.insertedCount().getAsLong()).is(1L); + check(result.deletedCount().getAsLong()).is(0L); + check(result.updatedCount().getAsLong()).is(0L); + + result = repository.upsert(person1.withFullName("name1")); + check(result.insertedCount().getAsLong()).is(0L); + check(result.deletedCount().getAsLong()).is(0L); + check(result.updatedCount().getAsLong()).is(1L); + + WriteResult result2 = repository.upsertAll(ImmutableList.of(person1.withFullName("name2"), generator.next())); + check(result2.insertedCount().getAsLong()).is(1L); + check(result2.deletedCount().getAsLong()).is(0L); + check(result2.updatedCount().getAsLong()).is(1L); + } + }