@@ -437,6 +437,78 @@ public void shouldReplaceParametersInInQuotedExpressionOfNestedQueryOperator() t
437
437
assertThat (query .getQueryObject (), is ((DBObject ) new BasicDBObject ("lastname" , Pattern .compile ("^(calamity)" ))));
438
438
}
439
439
440
+ @ Test // DATAMONGO-1603
441
+ public void shouldAllowReuseOfPlaceholderWithinQuery () throws Exception {
442
+
443
+ StringBasedMongoQuery mongoQuery = createQueryForMethod ("findByReusingPlaceholdersMultipleTimes" , String .class ,
444
+ String .class );
445
+ ConvertingParameterAccessor accessor = StubParameterAccessor .getAccessor (converter , "calamity" , "regalia" );
446
+
447
+ org .springframework .data .mongodb .core .query .Query query = mongoQuery .createQuery (accessor );
448
+ assertThat (query .getQueryObject (), is ((DBObject ) new BasicDBObject ().append ("arg0" , "calamity" )
449
+ .append ("arg1" , "regalia" ).append ("arg2" , "calamity" )));
450
+ }
451
+
452
+ @ Test // DATAMONGO-1603
453
+ public void shouldAllowReuseOfQuotedPlaceholderWithinQuery () throws Exception {
454
+
455
+ StringBasedMongoQuery mongoQuery = createQueryForMethod ("findByReusingPlaceholdersMultipleTimesWhenQuoted" ,
456
+ String .class , String .class );
457
+ ConvertingParameterAccessor accessor = StubParameterAccessor .getAccessor (converter , "calamity" , "regalia" );
458
+
459
+ org .springframework .data .mongodb .core .query .Query query = mongoQuery .createQuery (accessor );
460
+ assertThat (query .getQueryObject (), is ((DBObject ) new BasicDBObject ().append ("arg0" , "calamity" )
461
+ .append ("arg1" , "regalia" ).append ("arg2" , "calamity" )));
462
+ }
463
+
464
+ @ Test // DATAMONGO-1603
465
+ public void shouldAllowReuseOfQuotedPlaceholderWithinQueryAndIncludeSuffixCorrectly () throws Exception {
466
+
467
+ StringBasedMongoQuery mongoQuery = createQueryForMethod (
468
+ "findByReusingPlaceholdersMultipleTimesWhenQuotedAndSomeStuffAppended" , String .class , String .class );
469
+ ConvertingParameterAccessor accessor = StubParameterAccessor .getAccessor (converter , "calamity" , "regalia" );
470
+
471
+ org .springframework .data .mongodb .core .query .Query query = mongoQuery .createQuery (accessor );
472
+ assertThat (query .getQueryObject (), is ((DBObject ) new BasicDBObject ().append ("arg0" , "calamity" )
473
+ .append ("arg1" , "regalia" ).append ("arg2" , "calamitys" )));
474
+ }
475
+
476
+ @ Test // DATAMONGO-1603
477
+ public void shouldAllowQuotedParameterWithSuffixAppended () throws Exception {
478
+
479
+ StringBasedMongoQuery mongoQuery = createQueryForMethod ("findByWhenQuotedAndSomeStuffAppended" , String .class ,
480
+ String .class );
481
+ ConvertingParameterAccessor accessor = StubParameterAccessor .getAccessor (converter , "calamity" , "regalia" );
482
+
483
+ org .springframework .data .mongodb .core .query .Query query = mongoQuery .createQuery (accessor );
484
+ assertThat (query .getQueryObject (),
485
+ is ((DBObject ) new BasicDBObject ().append ("arg0" , "calamity" ).append ("arg1" , "regalias" )));
486
+ }
487
+
488
+ @ Test // DATAMONGO-1603
489
+ public void shouldCaptureReplacementWithComplexSuffixCorrectly () throws Exception {
490
+
491
+ StringBasedMongoQuery mongoQuery = createQueryForMethod ("findByMultiRegex" , String .class );
492
+ ConvertingParameterAccessor accessor = StubParameterAccessor .getAccessor (converter , "calamity" );
493
+
494
+ org .springframework .data .mongodb .core .query .Query query = mongoQuery .createQuery (accessor );
495
+
496
+ assertThat (query .getQueryObject (), is ((DBObject ) JSON .parse (
497
+ "{ \" $or\" : [ { \" firstname\" : { \" $regex\" : \" .*calamity.*\" , \" $options\" : \" i\" }} , { \" lastname\" : { \" $regex\" : \" .*calamityxyz.*\" , \" $options\" : \" i\" }}]}" )));
498
+ }
499
+
500
+ @ Test // DATAMONGO-1603
501
+ public void shouldAllowPlaceholderReuseInQuotedValue () throws Exception {
502
+
503
+ StringBasedMongoQuery mongoQuery = createQueryForMethod ("findByLastnameRegex" , String .class , String .class );
504
+ ConvertingParameterAccessor accessor = StubParameterAccessor .getAccessor (converter , "calamity" , "regalia" );
505
+
506
+ org .springframework .data .mongodb .core .query .Query query = mongoQuery .createQuery (accessor );
507
+
508
+ assertThat (query .getQueryObject (),
509
+ is ((DBObject ) JSON .parse ("{ 'lastname' : { '$regex' : '^(calamity|John regalia|regalia)'} }" )));
510
+ }
511
+
440
512
private StringBasedMongoQuery createQueryForMethod (String name , Class <?>... parameters ) throws Exception {
441
513
442
514
Method method = SampleRepository .class .getMethod (name , parameters );
@@ -460,6 +532,9 @@ private interface SampleRepository extends Repository<Person, Long> {
460
532
@ Query ("{ 'lastname' : { '$regex' : '^(?0)'} }" )
461
533
Person findByLastnameRegex (String lastname );
462
534
535
+ @ Query ("{'$or' : [{'firstname': {'$regex': '.*?0.*', '$options': 'i'}}, {'lastname' : {'$regex': '.*?0xyz.*', '$options': 'i'}} ]}" )
536
+ Person findByMultiRegex (String arg0 );
537
+
463
538
@ Query ("{ 'address' : ?0 }" )
464
539
Person findByAddress (Address address );
465
540
@@ -510,5 +585,20 @@ private interface SampleRepository extends Repository<Person, Long> {
510
585
511
586
@ Query ("{ 'arg0' : ?0 }" )
512
587
List <Person > findByWithBsonArgument (DBObject arg0 );
588
+
589
+ @ Query ("{ 'arg0' : ?0, 'arg1' : ?1, 'arg2' : ?0 }" )
590
+ List <Person > findByReusingPlaceholdersMultipleTimes (String arg0 , String arg1 );
591
+
592
+ @ Query ("{ 'arg0' : ?0, 'arg1' : ?1, 'arg2' : '?0' }" )
593
+ List <Person > findByReusingPlaceholdersMultipleTimesWhenQuoted (String arg0 , String arg1 );
594
+
595
+ @ Query ("{ 'arg0' : '?0', 'arg1' : ?1, 'arg2' : '?0s' }" )
596
+ List <Person > findByReusingPlaceholdersMultipleTimesWhenQuotedAndSomeStuffAppended (String arg0 , String arg1 );
597
+
598
+ @ Query ("{ 'arg0' : '?0', 'arg1' : '?1s' }" )
599
+ List <Person > findByWhenQuotedAndSomeStuffAppended (String arg0 , String arg1 );
600
+
601
+ @ Query ("{ 'lastname' : { '$regex' : '^(?0|John ?1|?1)'} }" ) // use spel or some regex string this is fucking bad
602
+ Person findByLastnameRegex (String lastname , String alternative );
513
603
}
514
604
}
0 commit comments