18
18
19
19
import com .mongodb .MongoNamespace ;
20
20
import com .mongodb .async .SingleResultCallback ;
21
+ import com .mongodb .bulk .BulkWriteResult ;
21
22
import com .mongodb .client .model .Collation ;
22
23
import com .mongodb .client .model .CollationAlternate ;
23
24
import com .mongodb .client .model .CollationCaseFirst ;
28
29
import com .mongodb .client .model .FindOneAndDeleteOptions ;
29
30
import com .mongodb .client .model .FindOneAndReplaceOptions ;
30
31
import com .mongodb .client .model .FindOneAndUpdateOptions ;
32
+ import com .mongodb .client .model .InsertOneModel ;
31
33
import com .mongodb .client .model .ReturnDocument ;
34
+ import com .mongodb .client .model .UpdateManyModel ;
35
+ import com .mongodb .client .model .UpdateOneModel ;
32
36
import com .mongodb .client .model .UpdateOptions ;
37
+ import com .mongodb .client .model .WriteModel ;
33
38
import com .mongodb .client .result .DeleteResult ;
34
39
import com .mongodb .client .result .UpdateResult ;
35
40
import org .bson .BsonArray ;
@@ -98,7 +103,16 @@ public void shouldPassAllOutcomes() {
98
103
BsonDocument outcome = getOperationMongoOperations (definition .getDocument ("operation" ));
99
104
BsonDocument expectedOutcome = definition .getDocument ("outcome" );
100
105
101
- assertEquals (description , expectedOutcome .get ("result" ), outcome .get ("result" ));
106
+ // Hack to workaround the lack of upsertedCount
107
+ BsonValue expectedResult = expectedOutcome .get ("result" );
108
+ BsonValue actualResult = outcome .get ("result" );
109
+ if (actualResult .isDocument ()
110
+ && actualResult .asDocument ().containsKey ("upsertedCount" )
111
+ && actualResult .asDocument ().getNumber ("upsertedCount" ).intValue () == 0
112
+ && !expectedResult .asDocument ().containsKey ("upsertedCount" )) {
113
+ expectedResult .asDocument ().append ("upsertedCount" , actualResult .asDocument ().get ("upsertedCount" ));
114
+ }
115
+ assertEquals (description , expectedResult , actualResult );
102
116
103
117
if (expectedOutcome .containsKey ("collection" )) {
104
118
assertCollectionEquals (expectedOutcome .getDocument ("collection" ));
@@ -170,6 +184,8 @@ private BsonDocument convertMongoOperationToResult(final Object result) {
170
184
return toResult (BsonNull .VALUE );
171
185
} else if (result instanceof MongoOperationBsonDocument ) {
172
186
return toResult ((MongoOperationBsonDocument ) result );
187
+ } else if (result instanceof MongoOperationBulkWriteResult ) {
188
+ return toResult ((MongoOperationBulkWriteResult ) result );
173
189
} else if (result instanceof MongoOperationUpdateResult ) {
174
190
return toResult ((MongoOperationUpdateResult ) result );
175
191
} else if (result instanceof MongoOperationDeleteResult ) {
@@ -226,6 +242,23 @@ private BsonDocument toResult(final MongoOperationUpdateResult operation) {
226
242
return toResult (resultDoc );
227
243
}
228
244
245
+ private BsonDocument toResult (final MongoOperationBulkWriteResult operation ) {
246
+ BulkWriteResult bulkWriteResult = operation .get ();
247
+ BsonDocument resultDoc = new BsonDocument ();
248
+ if (bulkWriteResult .wasAcknowledged ()) {
249
+ resultDoc .append ("deletedCount" , new BsonInt32 (bulkWriteResult .getDeletedCount ()));
250
+ resultDoc .append ("insertedIds" , new BsonDocument ());
251
+ resultDoc .append ("matchedCount" , new BsonInt32 (bulkWriteResult .getMatchedCount ()));
252
+ if (bulkWriteResult .isModifiedCountAvailable ()) {
253
+ resultDoc .append ("modifiedCount" , new BsonInt32 (bulkWriteResult .getModifiedCount ()));
254
+ }
255
+ resultDoc .append ("upsertedCount" , bulkWriteResult .getUpserts () == null
256
+ ? new BsonInt32 (0 ) : new BsonInt32 (bulkWriteResult .getUpserts ().size ()));
257
+ resultDoc .append ("upsertedIds" , new BsonDocument ());
258
+ }
259
+ return toResult (resultDoc );
260
+ }
261
+
229
262
private BsonDocument toResult (final MongoOperationDeleteResult operation ) {
230
263
DeleteResult deleteResult = operation .get ();
231
264
return toResult (new BsonDocument ("deletedCount" , new BsonInt32 ((int ) deleteResult .getDeletedCount ())));
@@ -401,6 +434,9 @@ public void execute() {
401
434
if (arguments .containsKey ("collation" )) {
402
435
options .collation (getCollation (arguments .getDocument ("collation" )));
403
436
}
437
+ if (arguments .containsKey ("arrayFilters" )) {
438
+ options .arrayFilters ((getArrayFilters (arguments .getArray ("arrayFilters" ))));
439
+ }
404
440
collection .findOneAndUpdate (arguments .getDocument ("filter" ), arguments .getDocument ("update" ), options , getCallback ());
405
441
}
406
442
};
@@ -479,6 +515,9 @@ public void execute() {
479
515
if (arguments .containsKey ("collation" )) {
480
516
options .collation (getCollation (arguments .getDocument ("collation" )));
481
517
}
518
+ if (arguments .containsKey ("arrayFilters" )) {
519
+ options .arrayFilters ((getArrayFilters (arguments .getArray ("arrayFilters" ))));
520
+ }
482
521
collection .updateMany (arguments .getDocument ("filter" ), arguments .getDocument ("update" ), options , getCallback ());
483
522
}
484
523
};
@@ -495,11 +534,61 @@ public void execute() {
495
534
if (arguments .containsKey ("collation" )) {
496
535
options .collation (getCollation (arguments .getDocument ("collation" )));
497
536
}
537
+ if (arguments .containsKey ("arrayFilters" )) {
538
+ options .arrayFilters ((getArrayFilters (arguments .getArray ("arrayFilters" ))));
539
+ }
498
540
collection .updateOne (arguments .getDocument ("filter" ), arguments .getDocument ("update" ), options , getCallback ());
499
541
}
500
542
};
501
543
}
502
544
545
+ private MongoOperationBulkWriteResult getBulkWriteMongoOperation (final BsonDocument arguments ) {
546
+ return new MongoOperationBulkWriteResult () {
547
+ @ Override
548
+ public void execute () {
549
+ List <WriteModel <BsonDocument >> writeModels = new ArrayList <WriteModel <BsonDocument >>();
550
+ for (BsonValue bsonValue : arguments .getArray ("requests" )) {
551
+ BsonDocument cur = bsonValue .asDocument ();
552
+ if (cur .containsKey ("name" )) {
553
+ String name = cur .getString ("name" ).getValue ();
554
+ BsonDocument requestArguments = cur .getDocument ("arguments" );
555
+ if (name .equals ("insertOne" )) {
556
+ writeModels .add (new InsertOneModel <BsonDocument >(requestArguments .getDocument ("document" )));
557
+ } else if (name .equals ("updateOne" )) {
558
+ writeModels .add (new UpdateOneModel <BsonDocument >(requestArguments .getDocument ("filter" ),
559
+ requestArguments .getDocument ("update" ),
560
+ getUpdateOptions (requestArguments )));
561
+ } else if (name .equals ("updateMany" )) {
562
+ writeModels .add (new UpdateManyModel <BsonDocument >(requestArguments .getDocument ("filter" ),
563
+ requestArguments .getDocument ("update" ),
564
+ getUpdateOptions (requestArguments )));
565
+ } else {
566
+ throw new UnsupportedOperationException ("Unsupported write request type" );
567
+ }
568
+ } else {
569
+ if (cur .get ("insertOne" ) != null ) {
570
+ BsonDocument insertOneArguments = cur .getDocument ("insertOne" );
571
+ writeModels .add (new InsertOneModel <BsonDocument >(insertOneArguments .getDocument ("document" )));
572
+ } else if (cur .get ("updateOne" ) != null ) {
573
+ BsonDocument updateOneArguments = cur .getDocument ("updateOne" );
574
+ writeModels .add (new UpdateOneModel <BsonDocument >(updateOneArguments .getDocument ("filter" ),
575
+ updateOneArguments .getDocument ("update" ),
576
+ getUpdateOptions (updateOneArguments )));
577
+ } else if (cur .get ("updateMany" ) != null ) {
578
+ BsonDocument updateManyArguments = cur .getDocument ("updateMany" );
579
+ writeModels .add (new UpdateManyModel <BsonDocument >(updateManyArguments .getDocument ("filter" ),
580
+ updateManyArguments .getDocument ("update" ),
581
+ getUpdateOptions (updateManyArguments )));
582
+ } else {
583
+ throw new UnsupportedOperationException ("Unsupported write request type" );
584
+ }
585
+ }
586
+ }
587
+ collection .bulkWrite (writeModels , getCallback ());
588
+ }
589
+ };
590
+ }
591
+
503
592
504
593
Collation getCollation (final BsonDocument bsonCollation ) {
505
594
Collation .Builder builder = Collation .builder ();
@@ -536,6 +625,23 @@ Collation getCollation(final BsonDocument bsonCollation) {
536
625
return builder .build ();
537
626
}
538
627
628
+ private UpdateOptions getUpdateOptions (final BsonDocument requestArguments ) {
629
+ return new UpdateOptions ()
630
+ .arrayFilters (getArrayFilters (requestArguments .getArray ("arrayFilters" , null )));
631
+ }
632
+
633
+
634
+ private List <BsonDocument > getArrayFilters (final BsonArray bsonArray ) {
635
+ if (bsonArray == null ) {
636
+ return null ;
637
+ }
638
+ List <BsonDocument > arrayFilters = new ArrayList <BsonDocument >(bsonArray .size ());
639
+ for (BsonValue cur : bsonArray ) {
640
+ arrayFilters .add (cur .asDocument ());
641
+ }
642
+ return arrayFilters ;
643
+ }
644
+
539
645
abstract class MongoOperationLong extends MongoOperation <Long > {
540
646
}
541
647
@@ -546,6 +652,9 @@ abstract class MongoOperationBsonDocument extends MongoOperation<BsonDocument> {
546
652
abstract class MongoOperationUpdateResult extends MongoOperation <UpdateResult > {
547
653
}
548
654
655
+ abstract class MongoOperationBulkWriteResult extends MongoOperation <BulkWriteResult > {
656
+ }
657
+
549
658
abstract class MongoOperationDeleteResult extends MongoOperation <DeleteResult > {
550
659
}
551
660
0 commit comments