@@ -246,20 +246,24 @@ CodeBlock build() {
246
246
builder .add ("\n " );
247
247
248
248
String updateReference = updateVariableName ;
249
- builder . addStatement ( "$T<$T> updater = $L.update($T.class)" , ExecutableUpdate . class ,
250
- context . getRepositoryInformation (). getDomainType (), mongoOpsRef ,
251
- context .getRepositoryInformation (). getDomainType () );
249
+ Class <?> domainType = context . getRepositoryInformation (). getDomainType ();
250
+ builder . addStatement ( "$T<$T> $L = $L.update($T.class)" , ExecutableUpdate . class , domainType ,
251
+ context .localVariable ( "updater" ), mongoOpsRef , domainType );
252
252
253
253
Class <?> returnType = ClassUtils .resolvePrimitiveIfNecessary (queryMethod .getReturnedObjectType ());
254
254
if (ReflectionUtils .isVoid (returnType )) {
255
- builder .addStatement ("updater.matching($L).apply($L).all()" , queryVariableName , updateReference );
255
+ builder .addStatement ("$L.matching($L).apply($L).all()" , context .localVariable ("updater" ), queryVariableName ,
256
+ updateReference );
256
257
} else if (ClassUtils .isAssignable (Long .class , returnType )) {
257
- builder .addStatement ("return updater.matching($L).apply($L).all().getModifiedCount()" , queryVariableName ,
258
+ builder .addStatement ("return $L.matching($L).apply($L).all().getModifiedCount()" ,
259
+ context .localVariable ("updater" ), queryVariableName ,
258
260
updateReference );
259
261
} else {
260
- builder .addStatement ("$T modifiedCount = updater.matching($L).apply($L).all().getModifiedCount()" , Long .class ,
262
+ builder .addStatement ("$T $L = $L.matching($L).apply($L).all().getModifiedCount()" , Long .class ,
263
+ context .localVariable ("modifiedCount" ), context .localVariable ("updater" ),
261
264
queryVariableName , updateReference );
262
- builder .addStatement ("return $T.convertNumberToTargetClass(modifiedCount, $T.class)" , NumberUtils .class ,
265
+ builder .addStatement ("return $T.convertNumberToTargetClass($L, $T.class)" , NumberUtils .class ,
266
+ context .localVariable ("modifiedCount" ),
263
267
returnType );
264
268
}
265
269
@@ -314,24 +318,29 @@ CodeBlock build() {
314
318
315
319
Class <?> returnType = ClassUtils .resolvePrimitiveIfNecessary (queryMethod .getReturnedObjectType ());
316
320
317
- builder .addStatement ("$T results = $L.aggregate($L, $T.class)" , AggregationResults .class , mongoOpsRef ,
321
+ builder .addStatement ("$T $L = $L.aggregate($L, $T.class)" , AggregationResults .class ,
322
+ context .localVariable ("results" ), mongoOpsRef ,
318
323
aggregationVariableName , outputType );
319
324
if (!queryMethod .isCollectionQuery ()) {
320
325
builder .addStatement (
321
- "return $T.<$T>firstElement(convertSimpleRawResults($T.class, results .getMappedResults()))" ,
322
- CollectionUtils .class , returnType , returnType );
326
+ "return $T.<$T>firstElement(convertSimpleRawResults($T.class, $L .getMappedResults()))" ,
327
+ CollectionUtils .class , returnType , returnType , context . localVariable ( "results" ) );
323
328
} else {
324
- builder .addStatement ("return convertSimpleRawResults($T.class, results.getMappedResults())" , returnType );
329
+ builder .addStatement ("return convertSimpleRawResults($T.class, $L.getMappedResults())" , returnType ,
330
+ context .localVariable ("results" ));
325
331
}
326
332
} else {
327
333
if (queryMethod .isSliceQuery ()) {
328
- builder .addStatement ("$T results = $L.aggregate($L, $T.class)" , AggregationResults .class , mongoOpsRef ,
334
+ builder .addStatement ("$T $L = $L.aggregate($L, $T.class)" , AggregationResults .class ,
335
+ context .localVariable ("results" ), mongoOpsRef ,
329
336
aggregationVariableName , outputType );
330
- builder .addStatement ("boolean hasNext = results .getMappedResults().size() > $L.getPageSize()" ,
331
- context .getPageableParameterName ());
337
+ builder .addStatement ("boolean $L = $L .getMappedResults().size() > $L.getPageSize()" ,
338
+ context .localVariable ( "hasNext" ), context . localVariable ( "results" ), context . getPageableParameterName ());
332
339
builder .addStatement (
333
- "return new $T<>(hasNext ? results.getMappedResults().subList(0, $L.getPageSize()) : results.getMappedResults(), $L, hasNext)" ,
334
- SliceImpl .class , context .getPageableParameterName (), context .getPageableParameterName ());
340
+ "return new $T<>($L ? $L.getMappedResults().subList(0, $L.getPageSize()) : $L.getMappedResults(), $L, $L)" ,
341
+ SliceImpl .class , context .localVariable ("hasNext" ), context .localVariable ("results" ),
342
+ context .getPageableParameterName (), context .localVariable ("results" ), context .getPageableParameterName (),
343
+ context .localVariable ("hasNext" ));
335
344
} else {
336
345
builder .addStatement ("return $L.aggregate($L, $T.class).getMappedResults()" , mongoOpsRef ,
337
346
aggregationVariableName , outputType );
@@ -368,18 +377,19 @@ CodeBlock build() {
368
377
Builder builder = CodeBlock .builder ();
369
378
370
379
boolean isProjecting = context .getReturnedType ().isProjecting ();
380
+ Class <?> domainType = context .getRepositoryInformation ().getDomainType ();
371
381
Object actualReturnType = isProjecting ? context .getActualReturnType ().getType ()
372
- : context . getRepositoryInformation (). getDomainType () ;
382
+ : domainType ;
373
383
374
384
builder .add ("\n " );
375
385
376
386
if (isProjecting ) {
377
- builder .addStatement ("$T<$T> finder = $L.query($T.class).as($T.class)" , FindWithQuery .class , actualReturnType ,
378
- mongoOpsRef , context .getRepositoryInformation (). getDomainType () , actualReturnType );
387
+ builder .addStatement ("$T<$T> $L = $L.query($T.class).as($T.class)" , FindWithQuery .class , actualReturnType ,
388
+ context .localVariable ( "finder" ), mongoOpsRef , domainType , actualReturnType );
379
389
} else {
380
390
381
- builder .addStatement ("$T<$T> finder = $L.query($T.class)" , FindWithQuery .class , actualReturnType , mongoOpsRef ,
382
- context .getRepositoryInformation (). getDomainType () );
391
+ builder .addStatement ("$T<$T> $L = $L.query($T.class)" , FindWithQuery .class , actualReturnType ,
392
+ context .localVariable ( "finder" ), mongoOpsRef , domainType );
383
393
}
384
394
385
395
String terminatingMethod ;
@@ -395,13 +405,14 @@ CodeBlock build() {
395
405
}
396
406
397
407
if (queryMethod .isPageQuery ()) {
398
- builder .addStatement ("return new $T(finder , $L).execute($L)" , PagedExecution .class ,
408
+ builder .addStatement ("return new $T($L , $L).execute($L)" , PagedExecution .class , context . localVariable ( "finder" ) ,
399
409
context .getPageableParameterName (), query .name ());
400
410
} else if (queryMethod .isSliceQuery ()) {
401
- builder .addStatement ("return new $T(finder , $L).execute($L)" , SlicedExecution .class ,
402
- context .getPageableParameterName (), query .name ());
411
+ builder .addStatement ("return new $T($L , $L).execute($L)" , SlicedExecution .class ,
412
+ context .localVariable ( "finder" ), context . getPageableParameterName (), query .name ());
403
413
} else {
404
- builder .addStatement ("return finder.matching($L).$L" , query .name (), terminatingMethod );
414
+ builder .addStatement ("return $L.matching($L).$L" , context .localVariable ("finder" ), query .name (),
415
+ terminatingMethod );
405
416
}
406
417
407
418
return builder .build ();
@@ -415,7 +426,7 @@ static class AggregationCodeBlockBuilder {
415
426
private final MongoQueryMethod queryMethod ;
416
427
417
428
private AggregationInteraction source ;
418
- private List <String > arguments ;
429
+ private final List <String > arguments ;
419
430
private String aggregationVariableName ;
420
431
private boolean pipelineOnly ;
421
432
@@ -449,7 +460,7 @@ CodeBlock build() {
449
460
CodeBlock .Builder builder = CodeBlock .builder ();
450
461
builder .add ("\n " );
451
462
452
- String pipelineName = aggregationVariableName + (pipelineOnly ? "" : "Pipeline" );
463
+ String pipelineName = context . localVariable ( aggregationVariableName + (pipelineOnly ? "" : "Pipeline" ) );
453
464
builder .add (pipeline (pipelineName ));
454
465
455
466
if (!pipelineOnly ) {
@@ -486,8 +497,7 @@ private CodeBlock pipeline(String pipelineVariableName) {
486
497
}
487
498
488
499
Builder builder = CodeBlock .builder ();
489
- String stagesVariableName = "stages" ;
490
- builder .add (aggregationStages (stagesVariableName , source .stages (), stageCount , arguments ));
500
+ builder .add (aggregationStages (context .localVariable ("stages" ), source .stages (), stageCount , arguments ));
491
501
492
502
if (mightBeSorted ) {
493
503
builder .add (sortingStage (sortParameter ));
@@ -502,7 +512,7 @@ private CodeBlock pipeline(String pipelineVariableName) {
502
512
}
503
513
504
514
builder .addStatement ("$T $L = createPipeline($L)" , AggregationPipeline .class , pipelineVariableName ,
505
- stagesVariableName );
515
+ context . localVariable ( "stages" ) );
506
516
return builder .build ();
507
517
}
508
518
@@ -533,7 +543,8 @@ private CodeBlock aggregationOptions(String aggregationVariableName) {
533
543
if (!options .isEmpty ()) {
534
544
535
545
Builder optionsBuilder = CodeBlock .builder ();
536
- optionsBuilder .add ("$T aggregationOptions = $T.builder()\n " , AggregationOptions .class ,
546
+ optionsBuilder .add ("$T $L = $T.builder()\n " , AggregationOptions .class ,
547
+ context .localVariable ("aggregationOptions" ),
537
548
AggregationOptions .class );
538
549
optionsBuilder .indent ();
539
550
for (CodeBlock optionBlock : options ) {
@@ -544,67 +555,81 @@ private CodeBlock aggregationOptions(String aggregationVariableName) {
544
555
optionsBuilder .unindent ();
545
556
builder .add (optionsBuilder .build ());
546
557
547
- builder .addStatement ("$L = $L.withOptions(aggregationOptions)" , aggregationVariableName ,
548
- aggregationVariableName );
558
+ builder .addStatement ("$L = $L.withOptions($L)" , aggregationVariableName , aggregationVariableName ,
559
+ context . localVariable ( "aggregationOptions" ) );
549
560
}
550
561
return builder .build ();
551
562
}
552
563
553
- private static CodeBlock aggregationStages (String stageListVariableName , Iterable <String > stages , int stageCount ,
564
+ private CodeBlock aggregationStages (String stageListVariableName , Iterable <String > stages , int stageCount ,
554
565
List <String > arguments ) {
555
566
556
567
Builder builder = CodeBlock .builder ();
557
568
builder .addStatement ("$T<$T> $L = new $T($L)" , List .class , Object .class , stageListVariableName , ArrayList .class ,
558
569
stageCount );
559
570
int stageCounter = 0 ;
571
+
560
572
for (String stage : stages ) {
561
- String stageName = "stage_%s" .formatted (stageCounter ++);
573
+ String stageName = context . localVariable ( "stage_%s" .formatted (stageCounter ++) );
562
574
builder .add (renderExpressionToDocument (stage , stageName , arguments ));
563
- builder .addStatement ("stages .add($L)" , stageName );
575
+ builder .addStatement ("$L .add($L)" , context . localVariable ( "stages" ) , stageName );
564
576
}
577
+
565
578
return builder .build ();
566
579
}
567
580
568
- private static CodeBlock sortingStage (String sortProvider ) {
581
+ private CodeBlock sortingStage (String sortProvider ) {
569
582
570
583
Builder builder = CodeBlock .builder ();
571
- builder .beginControlFlow ("if($L.isSorted())" , sortProvider );
572
- builder .addStatement ("$T sortDocument = new $T()" , Document .class , Document .class );
573
- builder .beginControlFlow ("for ($T order : $L)" , Order .class , sortProvider );
574
- builder .addStatement ("sortDocument.append(order.getProperty(), order.isAscending() ? 1 : -1);" );
584
+
585
+ builder .beginControlFlow ("if ($L.isSorted())" , sortProvider );
586
+ builder .addStatement ("$T $L = new $T()" , Document .class , context .localVariable ("sortDocument" ), Document .class );
587
+ builder .beginControlFlow ("for ($T $L : $L)" , Order .class , context .localVariable ("order" ), sortProvider );
588
+ builder .addStatement ("$L.append($L.getProperty(), $L.isAscending() ? 1 : -1);" ,
589
+ context .localVariable ("sortDocument" ), context .localVariable ("order" ), context .localVariable ("order" ));
575
590
builder .endControlFlow ();
576
- builder .addStatement ("stages.add(new $T($S, sortDocument))" , Document .class , "$sort" );
591
+ builder .addStatement ("stages.add(new $T($S, $L))" , Document .class , "$sort" ,
592
+ context .localVariable ("sortDocument" ));
577
593
builder .endControlFlow ();
594
+
578
595
return builder .build ();
579
596
}
580
597
581
- private static CodeBlock pagingStage (String pageableProvider , boolean slice ) {
598
+ private CodeBlock pagingStage (String pageableProvider , boolean slice ) {
582
599
583
600
Builder builder = CodeBlock .builder ();
601
+
584
602
builder .add (sortingStage (pageableProvider + ".getSort()" ));
585
603
586
- builder .beginControlFlow ("if($L.isPaged())" , pageableProvider );
587
- builder .beginControlFlow ("if($L.getOffset() > 0)" , pageableProvider );
588
- builder .addStatement ("stages.add($T.skip($L.getOffset()))" , Aggregation .class , pageableProvider );
604
+ builder .beginControlFlow ("if ($L.isPaged())" , pageableProvider );
605
+ builder .beginControlFlow ("if ($L.getOffset() > 0)" , pageableProvider );
606
+ builder .addStatement ("$L.add($T.skip($L.getOffset()))" , context .localVariable ("stages" ), Aggregation .class ,
607
+ pageableProvider );
589
608
builder .endControlFlow ();
590
609
if (slice ) {
591
- builder .addStatement ("stages.add($T.limit($L.getPageSize() + 1))" , Aggregation .class , pageableProvider );
610
+ builder .addStatement ("$L.add($T.limit($L.getPageSize() + 1))" , context .localVariable ("stages" ),
611
+ Aggregation .class , pageableProvider );
592
612
} else {
593
- builder .addStatement ("stages.add($T.limit($L.getPageSize()))" , Aggregation .class , pageableProvider );
613
+ builder .addStatement ("$L.add($T.limit($L.getPageSize()))" , context .localVariable ("stages" ), Aggregation .class ,
614
+ pageableProvider );
594
615
}
595
616
builder .endControlFlow ();
596
617
597
618
return builder .build ();
598
619
}
599
620
600
- private static CodeBlock limitingStage (String limitProvider ) {
621
+ private CodeBlock limitingStage (String limitProvider ) {
601
622
602
623
Builder builder = CodeBlock .builder ();
603
- builder .beginControlFlow ("if($L.isLimited())" , limitProvider );
604
- builder .addStatement ("stages.add($T.limit($L.max()))" , Aggregation .class , limitProvider );
624
+
625
+ builder .beginControlFlow ("if ($L.isLimited())" , limitProvider );
626
+ builder .addStatement ("$L.add($T.limit($L.max()))" , context .localVariable ("stages" ), Aggregation .class ,
627
+ limitProvider );
605
628
builder .endControlFlow ();
629
+
606
630
return builder .build ();
607
631
}
632
+
608
633
}
609
634
610
635
@ NullUnmarked
@@ -614,7 +639,7 @@ static class QueryCodeBlockBuilder {
614
639
private final MongoQueryMethod queryMethod ;
615
640
616
641
private QueryInteraction source ;
617
- private List <String > arguments ;
642
+ private final List <String > arguments ;
618
643
private String queryVariableName ;
619
644
620
645
QueryCodeBlockBuilder (AotQueryMethodGenerationContext context , MongoQueryMethod queryMethod ) {
@@ -697,17 +722,10 @@ private CodeBlock renderExpressionToQuery(@Nullable String source, String variab
697
722
builder .addStatement ("$T $L = new $T(new $T())" , BasicQuery .class , variableName , BasicQuery .class ,
698
723
Document .class );
699
724
} else if (!containsPlaceholder (source )) {
700
-
701
- String tmpVarName = "%sString" .formatted (variableName );
702
- builder .addStatement ("String $L = $S" , tmpVarName , source );
703
-
704
- builder .addStatement ("$T $L = new $T($T.parse($L))" , BasicQuery .class , variableName , BasicQuery .class ,
705
- Document .class , tmpVarName );
725
+ builder .addStatement ("$T $L = new $T($T.parse($S))" , BasicQuery .class , variableName , BasicQuery .class ,
726
+ Document .class , source );
706
727
} else {
707
-
708
- String tmpVarName = "%sString" .formatted (variableName );
709
- builder .addStatement ("String $L = $S" , tmpVarName , source );
710
- builder .addStatement ("$T $L = createQuery($L, new $T[]{ $L })" , BasicQuery .class , variableName , tmpVarName ,
728
+ builder .addStatement ("$T $L = createQuery($S, new $T[]{ $L })" , BasicQuery .class , variableName , source ,
711
729
Object .class , StringUtils .collectionToDelimitedString (arguments , ", " ));
712
730
}
713
731
@@ -757,15 +775,9 @@ private static CodeBlock renderExpressionToDocument(@Nullable String source, Str
757
775
if (!StringUtils .hasText (source )) {
758
776
builder .addStatement ("$T $L = new $T()" , Document .class , variableName , Document .class );
759
777
} else if (!containsPlaceholder (source )) {
760
-
761
- String tmpVarName = "%sString" .formatted (variableName );
762
- builder .addStatement ("String $L = $S" , tmpVarName , source );
763
- builder .addStatement ("$T $L = $T.parse($L)" , Document .class , variableName , Document .class , tmpVarName );
778
+ builder .addStatement ("$T $L = $T.parse($S)" , Document .class , variableName , Document .class , source );
764
779
} else {
765
-
766
- String tmpVarName = "%sString" .formatted (variableName );
767
- builder .addStatement ("String $L = $S" , tmpVarName , source );
768
- builder .addStatement ("$T $L = bindParameters($L, new $T[]{ $L })" , Document .class , variableName , tmpVarName ,
780
+ builder .addStatement ("$T $L = bindParameters($S, new $T[]{ $L })" , Document .class , variableName , source ,
769
781
Object .class , StringUtils .collectionToDelimitedString (arguments , ", " ));
770
782
}
771
783
return builder .build ();
0 commit comments