17
17
18
18
import static org .assertj .core .api .Assertions .*;
19
19
20
- import java .util .regex .Pattern ;
21
20
import java .util .stream .Stream ;
22
21
23
22
import org .assertj .core .api .SoftAssertions ;
34
33
* Verify that HQL queries are properly transformed through the {@link JpaQueryEnhancer} and the {@link HqlQueryParser}.
35
34
*
36
35
* @author Greg Turnquist
37
- * @since 3.1
38
36
*/
39
37
class HqlQueryTransformerTests {
40
38
41
39
private static final String QUERY = "select u from User u" ;
42
- private static final String FQ_QUERY = "select u from org.acme.domain.User$Foo_Bar u" ;
43
40
private static final String SIMPLE_QUERY = "from User u" ;
44
41
private static final String COUNT_QUERY = "select count(u) from User u" ;
45
-
46
42
private static final String QUERY_WITH_AS = "select u from User as u where u.username = ?1" ;
47
- private static final Pattern MULTI_WHITESPACE = Pattern .compile ("\\ s+" );
48
43
49
44
@ Test
50
45
void applyingSortShouldIntroduceOrderByCriteriaWhereNoneExists () {
@@ -211,17 +206,29 @@ void applySortingAccountsForNewlinesInSubselect() {
211
206
212
207
Sort sort = Sort .by (Sort .Order .desc ("age" ));
213
208
214
- assertThat (newParser ("select u\n " + //
215
- "from user u\n " + //
216
- "where exists (select u2\n " + //
217
- "from user u2\n " + //
218
- ")\n " + //
219
- "" ).applySorting (sort )).isEqualToIgnoringWhitespace ("select u\n " + //
220
- "from user u\n " + //
221
- "where exists (select u2\n " + //
222
- "from user u2\n " + //
223
- ")\n " + //
224
- " order by u.age desc" );
209
+ //
210
+ //
211
+ //
212
+ //
213
+ //
214
+ //
215
+ //
216
+ //
217
+ //
218
+ //
219
+ assertThat (newParser ("""
220
+ select u
221
+ from user u
222
+ where exists (select u2
223
+ from user u2
224
+ )
225
+ """ ).applySorting (sort )).isEqualToIgnoringWhitespace ("""
226
+ select u
227
+ from user u
228
+ where exists (select u2
229
+ from user u2
230
+ )
231
+ order by u.age desc""" );
225
232
}
226
233
227
234
@ Test // GH-2563
@@ -355,12 +362,14 @@ void detectsConstructorExpressionInDistinctQuery() {
355
362
@ Test // DATAJPA-938
356
363
void detectsComplexConstructorExpression () {
357
364
358
- assertThat (hasConstructorExpression ("select new foo.bar.Foo(ip.id, ip.name, sum(lp.amount)) " //
359
- + "from Bar lp join lp.investmentProduct ip " //
360
- + "where (lp.toDate is null and lp.fromDate <= :now and lp.fromDate is not null) and lp.accountId = :accountId "
361
- //
362
- + "group by ip.id, ip.name, lp.accountId " //
363
- + "order by ip.name ASC" )).isTrue ();
365
+ //
366
+ assertThat (hasConstructorExpression (
367
+ """
368
+ select new foo.bar.Foo(ip.id, ip.name, sum(lp.amount))
369
+ from Bar lp join lp.investmentProduct ip
370
+ where (lp.toDate is null and lp.fromDate <= :now and lp.fromDate is not null) and lp.accountId = :accountId group by ip.id, ip.name, lp.accountId
371
+ order by ip.name ASC""" ))
372
+ .isTrue ();
364
373
}
365
374
366
375
@ Test // DATAJPA-938
@@ -485,21 +494,39 @@ void detectsAliasWithGroupAndOrderBy() {
485
494
@ Test // DATAJPA-1500
486
495
void createCountQuerySupportsWhitespaceCharacters () {
487
496
488
- assertThat (createCountQueryFor ("select user from User user\n " + //
489
- " where user.age = 18\n " + //
490
- " order by user.name\n " )).isEqualToIgnoringWhitespace ("select count(user) from User user\n " + //
491
- " where user.age = 18\n " );
497
+ //
498
+ //
499
+ //
500
+ assertThat (createCountQueryFor ("""
501
+ select user from User user
502
+ where user.age = 18
503
+ order by user.name
504
+ """ )).isEqualToIgnoringWhitespace ("""
505
+ select count(user) from User user
506
+ where user.age = 18
507
+ """ );
492
508
}
493
509
494
510
@ Test
495
511
void createCountQuerySupportsLineBreaksInSelectClause () {
496
512
497
- assertThat (createCountQueryFor ("select user.age,\n " + //
498
- " user.name\n " + //
499
- " from User user\n " + //
500
- " where user.age = 18\n " + //
501
- " order\n by\n user.name\n " )).isEqualToIgnoringWhitespace ("select count(user) from User user\n " + //
502
- " where user.age = 18\n " );
513
+ //
514
+ //
515
+ //
516
+ //
517
+ //
518
+ assertThat (createCountQueryFor ("""
519
+ select user.age,
520
+ user.name
521
+ from User user
522
+ where user.age = 18
523
+ order
524
+ by
525
+ user.name
526
+ """ )).isEqualToIgnoringWhitespace ("""
527
+ select count(user) from User user
528
+ where user.age = 18
529
+ """ );
503
530
}
504
531
505
532
@ Test // DATAJPA-1061
@@ -550,11 +577,24 @@ void appliesSortCorrectlyForSimpleField() {
550
577
@ Test
551
578
void createCountQuerySupportsLineBreakRightAfterDistinct () {
552
579
553
- assertThat (createCountQueryFor ("select\n distinct\n user.age,\n " + //
554
- "user.name\n " + //
555
- "from\n User\n user" )).isEqualTo (createCountQueryFor ("select\n distinct user.age,\n " + //
556
- "user.name\n " + //
557
- "from\n User\n user" ));
580
+ //
581
+ //
582
+ //
583
+ //
584
+ assertThat (createCountQueryFor ("""
585
+ select
586
+ distinct
587
+ user.age,
588
+ user.name
589
+ from
590
+ User
591
+ user""" )).isEqualTo (createCountQueryFor ("""
592
+ select
593
+ distinct user.age,
594
+ user.name
595
+ from
596
+ User
597
+ user""" ));
558
598
}
559
599
560
600
@ Test
@@ -723,69 +763,74 @@ void orderByShouldWorkWithSubSelectStatements() {
723
763
724
764
Sort sort = Sort .by (Sort .Order .desc ("age" ));
725
765
726
- assertThat (createQueryFor ("SELECT\n " //
727
- + " foo_bar\n " //
728
- + "FROM\n " //
729
- + " foo foo\n " //
730
- + "INNER JOIN\n " //
731
- + " foo_bar_dnrmv foo_bar ON\n " //
732
- + " foo_bar.foo_id = foo.foo_id\n " //
733
- + "INNER JOIN\n " //
734
- + " (\n " //
735
- + " SELECT\n " //
736
- + " foo_bar_action\n " //
737
- + " FROM\n " //
738
- + " foo_bar_action\n " //
739
- + " WHERE\n " //
740
- + " foo_bar_action.deleted_ts IS NULL)\n " //
741
- + " foo_bar_action ON\n " //
742
- + " foo_bar.foo_bar_id = foo_bar_action.foo_bar_id\n " //
743
- + " AND ranking = 1\n " //
744
- + "INNER JOIN\n " //
745
- + " bar bar ON\n " //
746
- + " foo_bar.bar_id = bar.bar_id\n " //
747
- + "INNER JOIN\n " //
748
- + " bar_metadata bar_metadata ON\n " //
749
- + " bar.bar_metadata_key = bar_metadata.bar_metadata_key\n " //
750
- + "WHERE\n " //
751
- + " foo.tenant_id =:tenantId" , sort )).endsWith ("order by foo.age desc" );
752
-
753
- assertThat (createQueryFor ("select r " //
754
- + "From DataRecord r " //
755
- + "where " //
756
- + " ( " //
757
- + " r.adusrId = :userId " //
758
- + " or EXISTS( select 1 FROM DataRecordDvsRight dr WHERE dr.adusrId = :userId AND dr.dataRecord = r ) " //
759
- + ")" , sort )).endsWith ("order by r.age desc" );
760
-
761
- assertThat (createQueryFor ("select distinct u " //
762
- + "from FooBar u " //
763
- + "where u.role = 'redacted' " //
764
- + "and (" //
765
- + " not exists (" //
766
- + " from FooBarGroup group " //
767
- + " where group in :excludedGroups " //
768
- + " and group in elements(u.groups)" //
769
- + " )" //
770
- + ")" , sort )).endsWith ("order by u.age desc" );
771
-
772
- assertThat (createQueryFor ("SELECT i " //
773
- + " FROM Item i " //
774
- + " WHERE i.id IN (" //
775
- + " SELECT max(i2.id) FROM Item i2 " //
776
- + " WHERE i2.field.id = :fieldId " //
777
- + " GROUP BY i2.field.id, i2.version)" , sort )).endsWith ("order by i.age desc" );
778
-
779
- assertThat (createQueryFor ("select \n " //
780
- + " f.id,\n " //
781
- + " (\n " //
782
- + " select timestamp from bar\n " //
783
- + " where date(bar.timestamp) > '2022-05-21'\n " //
784
- + " and bar.foo_id = f.id \n " //
785
- + " order by date(bar.timestamp) desc\n " //
786
- + " limit 1\n " //
787
- + ") as timestamp\n " //
788
- + "from foo f" , sort )).endsWith ("order by f.age desc" );
766
+ assertThat (createQueryFor ("""
767
+ SELECT
768
+ foo_bar
769
+ FROM
770
+ foo foo
771
+ INNER JOIN
772
+ foo_bar_dnrmv foo_bar ON
773
+ foo_bar.foo_id = foo.foo_id
774
+ INNER JOIN
775
+ (
776
+ SELECT
777
+ foo_bar_action
778
+ FROM
779
+ foo_bar_action
780
+ WHERE
781
+ foo_bar_action.deleted_ts IS NULL)
782
+ foo_bar_action ON
783
+ foo_bar.foo_bar_id = foo_bar_action.foo_bar_id
784
+ AND ranking = 1
785
+ INNER JOIN
786
+ bar bar ON
787
+ foo_bar.bar_id = bar.bar_id
788
+ INNER JOIN
789
+ bar_metadata bar_metadata ON
790
+ bar.bar_metadata_key = bar_metadata.bar_metadata_key
791
+ WHERE
792
+ foo.tenant_id =:tenantId""" , sort )).endsWith ("order by foo.age desc" );
793
+
794
+ assertThat (createQueryFor ("""
795
+ select r
796
+ From DataRecord r
797
+ where
798
+ (
799
+ r.adusrId = :userId
800
+ or EXISTS( select 1 FROM DataRecordDvsRight dr WHERE dr.adusrId = :userId AND dr.dataRecord = r )
801
+ )""" , sort )).endsWith ("order by r.age desc" );
802
+
803
+ assertThat (createQueryFor ("""
804
+ select distinct u
805
+ from FooBar u
806
+ where u.role = 'redacted'
807
+ and (
808
+ not exists (
809
+ from FooBarGroup group
810
+ where group in :excludedGroups
811
+ and group in elements(u.groups)
812
+ )
813
+ )""" , sort )).endsWith ("order by u.age desc" );
814
+
815
+ assertThat (createQueryFor ("""
816
+ SELECT i
817
+ FROM Item i
818
+ WHERE i.id IN (
819
+ SELECT max(i2.id) FROM Item i2
820
+ WHERE i2.field.id = :fieldId
821
+ GROUP BY i2.field.id, i2.version)""" , sort )).endsWith ("order by i.age desc" );
822
+
823
+ assertThat (createQueryFor ("""
824
+ select
825
+ f.id,
826
+ (
827
+ select timestamp from bar
828
+ where date(bar.timestamp) > '2022-05-21'
829
+ and bar.foo_id = f.id
830
+ order by date(bar.timestamp) desc
831
+ limit 1
832
+ ) as timestamp
833
+ from foo f""" , sort )).endsWith ("order by f.age desc" );
789
834
}
790
835
791
836
@ Test // GH-2862
@@ -836,6 +881,16 @@ where exists (
836
881
""" , relationshipName , joinAlias , joinAlias ));
837
882
}
838
883
884
+ static Stream <Arguments > queriesWithReservedWordsAsIdentifiers () {
885
+
886
+ return Stream .of ( //
887
+ Arguments .of ("right" , "rt" ), //
888
+ Arguments .of ("left" , "lt" ), //
889
+ Arguments .of ("outer" , "ou" ), //
890
+ Arguments .of ("full" , "full" ), //
891
+ Arguments .of ("inner" , "inr" ));
892
+ }
893
+
839
894
@ Test // GH-2508
840
895
void detectAliasWithCastCorrectly () {
841
896
@@ -847,15 +902,6 @@ void detectAliasWithCastCorrectly() {
847
902
.isEqualTo ("u" );
848
903
}
849
904
850
- static Stream <Arguments > queriesWithReservedWordsAsIdentifiers () {
851
-
852
- return Stream .of ( //
853
- Arguments .of ("right" , "rt" ), //
854
- Arguments .of ("left" , "lt" ), //
855
- Arguments .of ("outer" , "ou" ), //
856
- Arguments .of ("full" , "full" ), //
857
- Arguments .of ("inner" , "inr" ));
858
- }
859
905
860
906
private void assertCountQuery (String originalQuery , String countQuery ) {
861
907
assertThat (createCountQueryFor (originalQuery )).isEqualTo (countQuery );
0 commit comments