Skip to content

Commit 56094e6

Browse files
committed
optimize AbstractSqmStatement.getParameters() and eliminate copy/paste
1 parent 8a90a4a commit 56094e6

File tree

8 files changed

+45
-62
lines changed

8 files changed

+45
-62
lines changed

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.ArrayList;
99
import java.util.Collection;
1010
import java.util.Date;
11+
import java.util.HashSet;
1112
import java.util.IdentityHashMap;
1213
import java.util.Iterator;
1314
import java.util.LinkedHashSet;
@@ -17,6 +18,7 @@
1718
import java.util.Set;
1819
import java.util.StringTokenizer;
1920

21+
import jakarta.persistence.criteria.ParameterExpression;
2022
import org.hibernate.AssertionFailure;
2123
import org.hibernate.engine.spi.SessionFactoryImplementor;
2224
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@@ -74,6 +76,7 @@
7476
import org.hibernate.query.sqm.tree.expression.SqmJpaCriteriaParameterWrapper;
7577
import org.hibernate.query.sqm.tree.expression.SqmParameter;
7678
import org.hibernate.query.sqm.tree.expression.SqmTuple;
79+
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;
7780
import org.hibernate.query.sqm.tree.from.SqmAttributeJoin;
7881
import org.hibernate.query.sqm.tree.from.SqmFrom;
7982
import org.hibernate.query.sqm.tree.from.SqmJoin;
@@ -112,6 +115,8 @@
112115
import static java.util.Collections.emptyList;
113116
import static java.util.Collections.emptyMap;
114117
import static java.util.Collections.emptySet;
118+
import static java.util.Collections.singleton;
119+
import static java.util.Collections.unmodifiableSet;
115120
import static java.util.stream.Collectors.toList;
116121
import static org.hibernate.internal.util.NullnessUtil.castNonNull;
117122
import static org.hibernate.internal.util.collections.CollectionHelper.arrayList;
@@ -1326,4 +1331,27 @@ private static void throwQueryTypeMismatchException(
13261331
resultClass.getName()
13271332
) );
13281333
}
1334+
1335+
public static Set<ParameterExpression<?>> getParameters(SqmStatement<?> statement) {
1336+
final Set<SqmParameter<?>> parameters = statement.getSqmParameters();
1337+
return switch ( parameters.size() ) {
1338+
case 0 -> emptySet();
1339+
case 1 -> {
1340+
final SqmParameter<?> parameter = parameters.iterator().next();
1341+
yield parameter instanceof ValueBindJpaCriteriaParameter
1342+
? emptySet()
1343+
: singleton( parameter );
1344+
}
1345+
default -> {
1346+
final Set<ParameterExpression<?>> parameterExpressions =
1347+
new HashSet<>( parameters.size() );
1348+
for ( SqmParameter<?> parameter : parameters ) {
1349+
if ( !(parameter instanceof ValueBindJpaCriteriaParameter) ) {
1350+
parameterExpressions.add( parameter );
1351+
}
1352+
}
1353+
yield unmodifiableSet( parameterExpressions );
1354+
}
1355+
};
1356+
}
13291357
}

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/AbstractSqmStatement.java

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,19 @@
44
*/
55
package org.hibernate.query.sqm.tree;
66

7-
import java.util.Collections;
87
import java.util.HashSet;
98
import java.util.Set;
10-
import java.util.stream.Collectors;
119

1210
import org.hibernate.query.sqm.NodeBuilder;
1311
import org.hibernate.query.sqm.SqmQuerySource;
1412
import org.hibernate.query.sqm.internal.ParameterCollector;
1513
import org.hibernate.query.sqm.internal.SqmUtil;
1614
import org.hibernate.query.sqm.tree.expression.SqmParameter;
17-
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;
1815

1916
import jakarta.persistence.criteria.ParameterExpression;
2017

18+
import static java.util.Collections.emptySet;
19+
import static java.util.Collections.unmodifiableSet;
2120
import static org.hibernate.query.sqm.tree.jpa.ParameterCollector.collectParameters;
2221

2322
/**
@@ -66,7 +65,6 @@ public void addParameter(SqmParameter<?> parameter) {
6665
if ( parameters == null ) {
6766
parameters = new HashSet<>();
6867
}
69-
7068
parameters.add( parameter );
7169
}
7270

@@ -76,8 +74,9 @@ public Set<SqmParameter<?>> getSqmParameters() {
7674
assert parameters == null : "SqmSelectStatement (as Criteria) should not have collected parameters";
7775
return collectParameters( this );
7876
}
79-
80-
return parameters == null ? Collections.emptySet() : Collections.unmodifiableSet( parameters );
77+
else {
78+
return parameters == null ? emptySet() : unmodifiableSet( parameters );
79+
}
8180
}
8281

8382
@Override
@@ -88,13 +87,9 @@ public ParameterResolutions resolveParameters() {
8887
@Override
8988
public Set<ParameterExpression<?>> getParameters() {
9089
// At this level, the number of parameters may still be growing as
91-
// nodes are added to the Criteria - so we re-calculate this every
92-
// time.
93-
//
94-
// for a "finalized" set of parameters, use `#resolveParameters` instead
95-
assert getQuerySource() == SqmQuerySource.CRITERIA;
96-
return getSqmParameters().stream()
97-
.filter( parameterExpression -> !( parameterExpression instanceof ValueBindJpaCriteriaParameter ) )
98-
.collect( Collectors.toSet() );
90+
// nodes are added to the Criteria, so we recalculate this every time.
91+
// For a finalized set of parameters, use resolveParameters() instead
92+
assert querySource == SqmQuerySource.CRITERIA;
93+
return SqmUtil.getParameters( this );
9994
}
10095
}

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/insert/SqmInsertSelectStatement.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.util.List;
88
import java.util.Map;
99
import java.util.Set;
10-
import java.util.stream.Collectors;
1110

1211
import org.hibernate.Incubating;
1312
import org.hibernate.query.criteria.JpaConflictClause;
@@ -21,7 +20,6 @@
2120
import org.hibernate.query.sqm.tree.cte.SqmCteStatement;
2221
import org.hibernate.query.sqm.tree.domain.SqmPath;
2322
import org.hibernate.query.sqm.tree.expression.SqmParameter;
24-
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;
2523
import org.hibernate.query.sqm.tree.from.SqmRoot;
2624
import org.hibernate.query.sqm.tree.select.SqmQueryPart;
2725
import org.hibernate.query.sqm.tree.select.SqmQuerySpec;
@@ -33,7 +31,6 @@
3331
import jakarta.persistence.criteria.Path;
3432
import org.checkerframework.checker.nullness.qual.Nullable;
3533

36-
import jakarta.persistence.criteria.ParameterExpression;
3734
import jakarta.persistence.criteria.Subquery;
3835
import jakarta.persistence.metamodel.EntityType;
3936

@@ -147,19 +144,6 @@ public JpaPredicate getRestriction() {
147144
return null;
148145
}
149146

150-
@Override
151-
public Set<ParameterExpression<?>> getParameters() {
152-
// At this level, the number of parameters may still be growing as
153-
// nodes are added to the Criteria - so we re-calculate this every
154-
// time.
155-
//
156-
// for a "finalized" set of parameters, use `#resolveParameters` instead
157-
assert getQuerySource() == SqmQuerySource.CRITERIA;
158-
return getSqmParameters().stream()
159-
.filter( parameterExpression -> !( parameterExpression instanceof ValueBindJpaCriteriaParameter ) )
160-
.collect( Collectors.toSet() );
161-
}
162-
163147
@Override
164148
public SqmInsertSelectStatement<T> setInsertionTargetPaths(Path<?>... insertionTargetPaths) {
165149
super.setInsertionTargetPaths( insertionTargetPaths );

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/insert/SqmInsertValuesStatement.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import java.util.List;
1111
import java.util.Map;
1212
import java.util.Set;
13-
import java.util.stream.Collectors;
1413

1514
import org.hibernate.query.criteria.JpaConflictClause;
1615
import org.hibernate.query.criteria.JpaCriteriaInsertValues;
@@ -25,10 +24,8 @@
2524
import org.hibernate.query.sqm.tree.domain.SqmPath;
2625
import org.hibernate.query.sqm.tree.expression.SqmExpression;
2726
import org.hibernate.query.sqm.tree.expression.SqmParameter;
28-
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;
2927
import org.hibernate.query.sqm.tree.from.SqmRoot;
3028

31-
import jakarta.persistence.criteria.ParameterExpression;
3229
import jakarta.persistence.criteria.Subquery;
3330
import jakarta.persistence.metamodel.EntityType;
3431

@@ -154,19 +151,6 @@ public JpaPredicate getRestriction() {
154151
return null;
155152
}
156153

157-
@Override
158-
public Set<ParameterExpression<?>> getParameters() {
159-
// At this level, the number of parameters may still be growing as
160-
// nodes are added to the Criteria - so we re-calculate this every
161-
// time.
162-
//
163-
// for a "finalized" set of parameters, use `#resolveParameters` instead
164-
assert getQuerySource() == SqmQuerySource.CRITERIA;
165-
return getSqmParameters().stream()
166-
.filter( parameterExpression -> !( parameterExpression instanceof ValueBindJpaCriteriaParameter ) )
167-
.collect( Collectors.toSet() );
168-
}
169-
170154
@Override
171155
public SqmInsertValuesStatement<T> setInsertionTargetPaths(Path<?>... insertionTargetPaths) {
172156
super.setInsertionTargetPaths( insertionTargetPaths );

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/AbstractSqmSelectQuery.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,8 +254,7 @@ public <E> JpaRoot<? extends E> getRoot(int position, Class<E> type) {
254254
* @see org.hibernate.query.criteria.JpaCriteriaQuery#getRoot(String, Class)
255255
*/
256256
public <E> JpaRoot<? extends E> getRoot(String alias, Class<E> type) {
257-
final List<SqmRoot<?>> rootList = getQuerySpec().getRootList();
258-
for ( SqmRoot<?> root : rootList ) {
257+
for ( SqmRoot<?> root : getQuerySpec().getRootList() ) {
259258
final String rootAlias = root.getAlias();
260259
if ( rootAlias != null && rootAlias.equals( alias ) ) {
261260
return castRoot( root, type );

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/SqmQuerySpec.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,8 @@ public SqmQuerySpec<T> setSelection(JpaSelection<T> selection) {
295295
// NOTE : this call comes from JPA which inherently supports just a
296296
// single (possibly "compound") selection.
297297
// We have this special case where we return the SqmSelectClause itself if it doesn't have exactly 1 item
298-
if ( selection instanceof SqmSelectClause ) {
298+
if ( selection instanceof SqmSelectClause sqmSelectClause ) {
299299
if ( selection != selectClause ) {
300-
final SqmSelectClause sqmSelectClause = (SqmSelectClause) selection;
301300
final List<SqmSelection<?>> selections = sqmSelectClause.getSelections();
302301
selectClause.setSelection( selections.get( 0 ).getSelectableNode() );
303302
for ( int i = 1; i < selections.size(); i++ ) {

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/SqmSelectStatement.java

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import java.util.Map;
1010
import java.util.Set;
1111
import java.util.function.Function;
12-
import java.util.stream.Collectors;
1312

1413
import org.hibernate.Internal;
1514
import org.hibernate.query.criteria.JpaCriteriaQuery;
@@ -25,7 +24,6 @@
2524
import org.hibernate.query.sqm.tree.SqmCopyContext;
2625
import org.hibernate.query.sqm.tree.SqmStatement;
2726
import org.hibernate.query.sqm.tree.cte.SqmCteStatement;
28-
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;
2927
import org.hibernate.query.sqm.tree.expression.SqmParameter;
3028
import org.hibernate.query.sqm.tree.from.SqmFromClause;
3129
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
@@ -304,14 +302,10 @@ public SqmSelectStatement<T> distinct(boolean distinct) {
304302
@Override
305303
public Set<ParameterExpression<?>> getParameters() {
306304
// At this level, the number of parameters may still be growing as
307-
// nodes are added to the Criteria - so we re-calculate this every
308-
// time.
309-
//
310-
// for a "finalized" set of parameters, use `#resolveParameters` instead
311-
assert querySource == CRITERIA;
312-
return getSqmParameters().stream()
313-
.filter( parameterExpression -> !( parameterExpression instanceof ValueBindJpaCriteriaParameter ) )
314-
.collect( Collectors.toSet() );
305+
// nodes are added to the Criteria, so we recalculate this every time.
306+
// For a finalized set of parameters, use resolveParameters() instead
307+
assert querySource == SqmQuerySource.CRITERIA;
308+
return SqmUtil.getParameters( this );
315309
}
316310

317311
@Override

hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/SqmSubQuery.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import java.math.BigDecimal;
88
import java.math.BigInteger;
99
import java.util.Collection;
10-
import java.util.Collections;
1110
import java.util.HashSet;
1211
import java.util.List;
1312
import java.util.Map;
@@ -76,6 +75,7 @@
7675
import jakarta.persistence.criteria.Subquery;
7776
import jakarta.persistence.metamodel.EntityType;
7877

78+
import static java.util.Collections.emptySet;
7979
import static org.hibernate.query.sqm.spi.SqmCreationHelper.combinePredicates;
8080

8181
/**
@@ -736,7 +736,7 @@ public Subquery<T> having(List<Predicate> restrictions) {
736736

737737
@Override
738738
public Set<ParameterExpression<?>> getParameters() {
739-
return Collections.emptySet();
739+
return emptySet();
740740
}
741741

742742
@Override

0 commit comments

Comments
 (0)