Skip to content

Commit 9a980b3

Browse files
mbelladebeikov
authored andcommitted
HHH-15654 Add overloads to ordered-set aggregate functions without filter
1 parent 2f1f687 commit 9a980b3

File tree

4 files changed

+137
-9
lines changed

4 files changed

+137
-9
lines changed

hibernate-core/src/main/java/org/hibernate/query/criteria/HibernateCriteriaBuilder.java

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,6 +1046,19 @@ <T> JpaExpression<T> functionWithinGroup(
10461046
*/
10471047
<T> JpaExpression<T> functionWithinGroup(String name, Class<T> type, JpaOrder order, Expression<?>... args);
10481048

1049+
/**
1050+
* Create a {@code listagg} ordered set-aggregate function expression.
1051+
*
1052+
* @param order order by clause used in within group
1053+
* @param argument values to join
1054+
* @param separator the separator used to join the values
1055+
*
1056+
* @return ordered set-aggregate expression
1057+
*
1058+
* @see #listagg(JpaOrder, JpaPredicate, Expression, Expression) listagg
1059+
*/
1060+
JpaExpression<String> listagg(JpaOrder order, Expression<String> argument, Expression<String> separator);
1061+
10491062
/**
10501063
* Create a {@code listagg} ordered set-aggregate function expression.
10511064
*
@@ -1064,6 +1077,18 @@ JpaExpression<String> listagg(
10641077
Expression<String> argument,
10651078
Expression<String> separator);
10661079

1080+
/**
1081+
* Create a {@code mode} ordered set-aggregate function expression.
1082+
*
1083+
* @param order order by clause used in within group
1084+
* @param argument argument to the function
1085+
*
1086+
* @return ordered set-aggregate expression
1087+
*
1088+
* @see #mode(JpaOrder, JpaPredicate, Expression) mode
1089+
*/
1090+
JpaExpression<?> mode(JpaOrder order, Expression<?> argument);
1091+
10671092
/**
10681093
* Create a {@code mode} ordered set-aggregate function expression.
10691094
*
@@ -1077,6 +1102,18 @@ JpaExpression<String> listagg(
10771102
*/
10781103
JpaExpression<?> mode(JpaOrder order, JpaPredicate filter, Expression<?> argument);
10791104

1105+
/**
1106+
* Create a {@code percentile_cont} ordered set-aggregate function expression.
1107+
*
1108+
* @param order order by clause used in within group
1109+
* @param argument argument to the function
1110+
*
1111+
* @return ordered set-aggregate expression
1112+
*
1113+
* @see #percentileCont(JpaOrder, JpaPredicate, Expression) percentileCont
1114+
*/
1115+
JpaExpression<Integer> percentileCont(JpaOrder order, Expression<? extends Number> argument);
1116+
10801117
/**
10811118
* Create a {@code percentile_cont} ordered set-aggregate function expression.
10821119
*
@@ -1090,6 +1127,18 @@ JpaExpression<String> listagg(
10901127
*/
10911128
JpaExpression<Integer> percentileCont(JpaOrder order, JpaPredicate filter, Expression<? extends Number> argument);
10921129

1130+
/**
1131+
* Create a {@code percentile_disc} ordered set-aggregate function expression.
1132+
*
1133+
* @param order order by clause used in within group
1134+
* @param argument argument to the function
1135+
*
1136+
* @return ordered set-aggregate expression
1137+
*
1138+
* @see #percentileDisc(JpaOrder, JpaPredicate, Expression) percentileDisc
1139+
*/
1140+
JpaExpression<Integer> percentileDisc(JpaOrder order, Expression<? extends Number> argument);
1141+
10931142
/**
10941143
* Create a {@code percentile_disc} ordered set-aggregate function expression.
10951144
*
@@ -1103,6 +1152,18 @@ JpaExpression<String> listagg(
11031152
*/
11041153
JpaExpression<Integer> percentileDisc(JpaOrder order, JpaPredicate filter, Expression<? extends Number> argument);
11051154

1155+
/**
1156+
* Create a {@code rank} ordered set-aggregate function expression.
1157+
*
1158+
* @param order order by clause used in within group
1159+
* @param argument argument to the function
1160+
*
1161+
* @return ordered set-aggregate expression
1162+
*
1163+
* @see #rank(JpaOrder, JpaPredicate, Expression) rank
1164+
*/
1165+
JpaExpression<Long> rank(JpaOrder order, Expression<Integer> argument);
1166+
11061167
/**
11071168
* Create a {@code rank} ordered set-aggregate function expression.
11081169
*
@@ -1116,6 +1177,18 @@ JpaExpression<String> listagg(
11161177
*/
11171178
JpaExpression<Long> rank(JpaOrder order, JpaPredicate filter, Expression<Integer> argument);
11181179

1180+
/**
1181+
* Create a {@code percent_rank} ordered set-aggregate function expression.
1182+
*
1183+
* @param order order by clause used in within group
1184+
* @param argument argument to the function
1185+
*
1186+
* @return ordered set-aggregate expression
1187+
*
1188+
* @see #percentRank(JpaOrder, JpaPredicate, Expression) percentRank
1189+
*/
1190+
JpaExpression<Double> percentRank(JpaOrder order, Expression<Integer> argument);
1191+
11191192
/**
11201193
* Create a {@code percent_rank} ordered set-aggregate function expression.
11211194
*

hibernate-core/src/main/java/org/hibernate/query/criteria/spi/HibernateCriteriaBuilderDelegate.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1321,6 +1321,11 @@ public <T> JpaExpression<T> functionWithinGroup(String name, Class<T> type, JpaO
13211321
return criteriaBuilder.functionWithinGroup( name, type, order, args );
13221322
}
13231323

1324+
@Override
1325+
public JpaExpression<String> listagg(JpaOrder order, Expression<String> argument, Expression<String> separator) {
1326+
return criteriaBuilder.listagg( order, argument, separator );
1327+
}
1328+
13241329
@Override
13251330
public JpaExpression<String> listagg(
13261331
JpaOrder order,
@@ -1330,11 +1335,21 @@ public JpaExpression<String> listagg(
13301335
return criteriaBuilder.listagg( order, filter, argument, separator );
13311336
}
13321337

1338+
@Override
1339+
public JpaExpression<?> mode(JpaOrder order, Expression<?> argument) {
1340+
return criteriaBuilder.mode( order, argument );
1341+
}
1342+
13331343
@Override
13341344
public JpaExpression<?> mode(JpaOrder order, JpaPredicate filter, Expression<?> argument) {
13351345
return criteriaBuilder.mode( order, filter, argument );
13361346
}
13371347

1348+
@Override
1349+
public JpaExpression<Integer> percentileCont(JpaOrder order, Expression<? extends Number> argument) {
1350+
return criteriaBuilder.percentileCont( order, argument );
1351+
}
1352+
13381353
@Override
13391354
public JpaExpression<Integer> percentileCont(
13401355
JpaOrder order,
@@ -1343,6 +1358,11 @@ public JpaExpression<Integer> percentileCont(
13431358
return criteriaBuilder.percentileCont( order, filter, argument );
13441359
}
13451360

1361+
@Override
1362+
public JpaExpression<Integer> percentileDisc(JpaOrder order, Expression<? extends Number> argument) {
1363+
return criteriaBuilder.percentileDisc( order, argument );
1364+
}
1365+
13461366
@Override
13471367
public JpaExpression<Integer> percentileDisc(
13481368
JpaOrder order,
@@ -1351,11 +1371,21 @@ public JpaExpression<Integer> percentileDisc(
13511371
return criteriaBuilder.percentileDisc( order, filter, argument );
13521372
}
13531373

1374+
@Override
1375+
public JpaExpression<Long> rank(JpaOrder order, Expression<Integer> argument) {
1376+
return criteriaBuilder.rank( order, argument );
1377+
}
1378+
13541379
@Override
13551380
public JpaExpression<Long> rank(JpaOrder order, JpaPredicate filter, Expression<Integer> argument) {
13561381
return criteriaBuilder.rank( order, filter, argument );
13571382
}
13581383

1384+
@Override
1385+
public JpaExpression<Double> percentRank(JpaOrder order, Expression<Integer> argument) {
1386+
return criteriaBuilder.percentRank( order, argument );
1387+
}
1388+
13591389
@Override
13601390
public JpaExpression<Double> percentRank(JpaOrder order, JpaPredicate filter, Expression<Integer> argument) {
13611391
return criteriaBuilder.percentRank( order, filter, argument );

hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2669,6 +2669,11 @@ public <T> SqmExpression<T> functionWithinGroup(
26692669
return functionWithinGroup( name, type, order, null, args );
26702670
}
26712671

2672+
@Override
2673+
public JpaExpression<String> listagg(JpaOrder order, Expression<String> argument, Expression<String> separator) {
2674+
return listagg( order, null, argument, separator );
2675+
}
2676+
26722677
@Override
26732678
public SqmExpression<String> listagg(
26742679
JpaOrder order,
@@ -2678,11 +2683,21 @@ public SqmExpression<String> listagg(
26782683
return functionWithinGroup( "listagg", String.class, order, filter, argument, separator );
26792684
}
26802685

2686+
@Override
2687+
public JpaExpression<?> mode(JpaOrder order, Expression<?> argument) {
2688+
return mode( order, null, argument );
2689+
}
2690+
26812691
@Override
26822692
public SqmExpression<?> mode(JpaOrder order, JpaPredicate filter, Expression<?> argument) {
26832693
return functionWithinGroup( "mode", argument.getJavaType(), order, filter, argument );
26842694
}
26852695

2696+
@Override
2697+
public JpaExpression<Integer> percentileCont(JpaOrder order, Expression<? extends Number> argument) {
2698+
return percentileCont( order, null, argument );
2699+
}
2700+
26862701
@Override
26872702
public SqmExpression<Integer> percentileCont(
26882703
JpaOrder order,
@@ -2691,6 +2706,11 @@ public SqmExpression<Integer> percentileCont(
26912706
return functionWithinGroup( "percentile_cont", Integer.class, order, filter, argument );
26922707
}
26932708

2709+
@Override
2710+
public JpaExpression<Integer> percentileDisc(JpaOrder order, Expression<? extends Number> argument) {
2711+
return percentileDisc( order, null, argument );
2712+
}
2713+
26942714
@Override
26952715
public SqmExpression<Integer> percentileDisc(
26962716
JpaOrder order,
@@ -2699,11 +2719,21 @@ public SqmExpression<Integer> percentileDisc(
26992719
return functionWithinGroup( "percentile_disc", Integer.class, order, filter, argument );
27002720
}
27012721

2722+
@Override
2723+
public JpaExpression<Long> rank(JpaOrder order, Expression<Integer> argument) {
2724+
return rank( order, null, argument );
2725+
}
2726+
27022727
@Override
27032728
public SqmExpression<Long> rank(JpaOrder order, JpaPredicate filter, Expression<Integer> argument) {
27042729
return functionWithinGroup( "rank", Long.class, order, filter, argument );
27052730
}
27062731

2732+
@Override
2733+
public JpaExpression<Double> percentRank(JpaOrder order, Expression<Integer> argument) {
2734+
return percentRank( order, null, argument );
2735+
}
2736+
27072737
@Override
27082738
public SqmExpression<Double> percentRank(JpaOrder order, JpaPredicate filter, Expression<Integer> argument) {
27092739
return functionWithinGroup( "percent_rank", Double.class, order, filter, argument );

hibernate-core/src/test/java/org/hibernate/orm/test/query/criteria/CriteriaOrderedSetAggregateTest.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,7 @@
2626
import org.junit.jupiter.api.Test;
2727

2828
import jakarta.persistence.Tuple;
29-
import jakarta.persistence.TypedQuery;
3029
import jakarta.persistence.criteria.CriteriaQuery;
31-
import jakarta.persistence.criteria.Join;
3230
import jakarta.persistence.criteria.Root;
3331

3432
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -109,7 +107,7 @@ public void testListaggWithoutOrder(SessionFactoryScope scope) {
109107
CriteriaQuery<String> cr = cb.createQuery( String.class );
110108
Root<EntityOfBasics> root = cr.from( EntityOfBasics.class );
111109

112-
JpaExpression<String> function = cb.listagg( null, null, root.get( "theString" ), cb.literal( "," ) );
110+
JpaExpression<String> function = cb.listagg( null, root.get( "theString" ), cb.literal( "," ) );
113111

114112
cr.select( function );
115113
List<String> elements = Arrays.asList( session.createQuery( cr ).getSingleResult().split( "," ) );
@@ -130,7 +128,6 @@ public void testListagg(SessionFactoryScope scope) {
130128

131129
JpaExpression<String> function = cb.listagg(
132130
cb.desc( root.get( "id" ) ),
133-
null,
134131
root.get( "theString" ),
135132
cb.literal( "," )
136133
);
@@ -172,7 +169,6 @@ public void testListaggWithNullsClause(SessionFactoryScope scope) {
172169

173170
JpaExpression<String> function = cb.listagg(
174171
cb.desc( root.get( "id" ), true ),
175-
null,
176172
root.get( "theString" ),
177173
cb.literal( "," )
178174
);
@@ -193,7 +189,6 @@ public void testInverseDistribution(SessionFactoryScope scope) {
193189

194190
JpaExpression<Integer> function = cb.percentileDisc(
195191
cb.asc( root.get( "theInt" ) ),
196-
null,
197192
cb.literal( 0.5 )
198193
);
199194

@@ -211,7 +206,7 @@ public void testHypotheticalSetPercentRank(SessionFactoryScope scope) {
211206
CriteriaQuery<Double> cr = cb.createQuery( Double.class );
212207
Root<EntityOfBasics> root = cr.from( EntityOfBasics.class );
213208

214-
JpaExpression<Double> function = cb.percentRank( cb.asc( root.get( "theInt" ) ), null, cb.literal( 5 ) );
209+
JpaExpression<Double> function = cb.percentRank( cb.asc( root.get( "theInt" ) ), cb.literal( 5 ) );
215210

216211
cr.select( function );
217212
Double result = session.createQuery( cr ).getSingleResult();
@@ -227,7 +222,7 @@ public void testHypotheticalSetRank(SessionFactoryScope scope) {
227222
CriteriaQuery<Long> cr = cb.createQuery( Long.class );
228223
Root<EntityOfBasics> root = cr.from( EntityOfBasics.class );
229224

230-
JpaExpression<Long> function = cb.rank( cb.asc( root.get( "theInt" ) ), null, cb.literal( 5 ) );
225+
JpaExpression<Long> function = cb.rank( cb.asc( root.get( "theInt" ) ), cb.literal( 5 ) );
231226

232227
cr.select( function );
233228
Long result = session.createQuery( cr ).getSingleResult();
@@ -244,7 +239,7 @@ public void testHypotheticalSetRankWithGroupByHavingOrderByLimit(SessionFactoryS
244239
Root<EntityOfBasics> root1 = cr.from( EntityOfBasics.class );
245240
Root<EntityOfBasics> root2 = cr.from( EntityOfBasics.class );
246241

247-
JpaExpression<Long> function = cb.rank( cb.asc( root1.get( "theInt" ) ), null, cb.literal( 5 ) );
242+
JpaExpression<Long> function = cb.rank( cb.asc( root1.get( "theInt" ) ), cb.literal( 5 ) );
248243

249244
cr.multiselect( root2.get( "id" ), function )
250245
.groupBy( root2.get( "id" ) ).having( cb.gt( root2.get( "id" ), cb.literal( 1 ) ) )

0 commit comments

Comments
 (0)