Skip to content

Commit bcc8cb7

Browse files
committed
HHH-19632 Give access to optional parameter info in SqlAstTranslator
1 parent f3c6c19 commit bcc8cb7

File tree

10 files changed

+123
-6
lines changed

10 files changed

+123
-6
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ private static CacheableSqmInterpretation buildCacheableSqmInterpretation(
493493

494494
final SqlAstTranslator<JdbcOperationQuerySelect> selectTranslator =
495495
sessionFactory.getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory()
496-
.buildSelectTranslator( sessionFactory, sqmInterpretation.getSqlAst() );
496+
.buildSelectTranslator( sessionFactory, sqmInterpretation.getSqlAst(), sqmInterpretation.getParameterInfo() );
497497

498498
final var jdbcParamsXref =
499499
generateJdbcParamsXref( domainParameterXref, sqmInterpretation::getJdbcParamsBySqmParam );

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ public static List<Object> selectMatchingIds(
274274
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
275275
final SqlAstTranslator<JdbcOperationQuerySelect> sqlAstSelectTranslator = jdbcEnvironment
276276
.getSqlAstTranslatorFactory()
277-
.buildSelectTranslator( factory, translation.getSqlAst() );
277+
.buildSelectTranslator( factory, translation.getSqlAst(), translation.getParameterInfo() );
278278

279279
final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings(
280280
executionContext.getQueryParameterBindings(),

hibernate-core/src/main/java/org/hibernate/query/sqm/sql/SqmTranslation.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import org.hibernate.metamodel.mapping.MappingModelExpressible;
1111
import org.hibernate.query.sqm.tree.expression.SqmParameter;
12+
import org.hibernate.sql.ast.SqlParameterInfo;
1213
import org.hibernate.sql.ast.spi.FromClauseAccess;
1314
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
1415
import org.hibernate.sql.ast.tree.Statement;
@@ -25,4 +26,5 @@ public interface SqmTranslation<T extends Statement> {
2526
FromClauseAccess getFromClauseAccess();
2627
Map<SqmParameter<?>, List<List<JdbcParameter>>> getJdbcParamsBySqmParam();
2728
Map<SqmParameter<?>, MappingModelExpressible<?>> getSqmParameterMappingModelTypeResolutions();
29+
SqlParameterInfo getParameterInfo();
2830
}

hibernate-core/src/main/java/org/hibernate/query/sqm/sql/StandardSqmTranslation.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44
*/
55
package org.hibernate.query.sqm.sql;
66

7+
import java.util.Collections;
8+
import java.util.IdentityHashMap;
79
import java.util.List;
810
import java.util.Map;
911

1012
import org.hibernate.metamodel.mapping.MappingModelExpressible;
1113
import org.hibernate.query.sqm.tree.expression.SqmParameter;
14+
import org.hibernate.sql.ast.SqlParameterInfo;
15+
import org.hibernate.sql.ast.internal.SqlParameterInfoImpl;
1216
import org.hibernate.sql.ast.spi.FromClauseAccess;
1317
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
1418
import org.hibernate.sql.ast.tree.Statement;
@@ -24,6 +28,7 @@ public class StandardSqmTranslation<T extends Statement> implements SqmTranslati
2428
private final Map<SqmParameter<?>, MappingModelExpressible<?>> parameterMappingModelTypeMap;
2529
private final SqlExpressionResolver sqlExpressionResolver;
2630
private final FromClauseAccess fromClauseAccess;
31+
private final SqlParameterInfo parameterInfo;
2732

2833
public StandardSqmTranslation(
2934
T sqlAst,
@@ -36,6 +41,19 @@ public StandardSqmTranslation(
3641
this.parameterMappingModelTypeMap = parameterMappingModelTypeMap;
3742
this.sqlExpressionResolver = sqlExpressionResolver;
3843
this.fromClauseAccess = fromClauseAccess;
44+
final IdentityHashMap<JdbcParameter, Integer> parameterIdMap = new IdentityHashMap<>();
45+
int parameterId = 0;
46+
for ( Map.Entry<SqmParameter<?>, List<List<JdbcParameter>>> entry : jdbcParamMap.entrySet() ) {
47+
final List<List<JdbcParameter>> parameterUses = entry.getValue();
48+
final int baseId = parameterId;
49+
for ( List<JdbcParameter> jdbcParameters : parameterUses ) {
50+
for ( int i = 0; i < jdbcParameters.size(); i++ ) {
51+
parameterIdMap.put( jdbcParameters.get( i ), baseId + i );
52+
}
53+
}
54+
parameterId += parameterUses.get( 0 ).size();
55+
}
56+
this.parameterInfo = new SqlParameterInfoImpl( Collections.unmodifiableMap( parameterIdMap ) );
3957
}
4058

4159
@Override
@@ -62,4 +80,9 @@ public SqlExpressionResolver getSqlExpressionResolver() {
6280
public FromClauseAccess getFromClauseAccess() {
6381
return fromClauseAccess;
6482
}
83+
84+
@Override
85+
public SqlParameterInfo getParameterInfo() {
86+
return parameterInfo;
87+
}
6588
}

hibernate-core/src/main/java/org/hibernate/sql/ast/SqlAstTranslatorFactory.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ public interface SqlAstTranslatorFactory {
2323
*/
2424
SqlAstTranslator<JdbcOperationQuerySelect> buildSelectTranslator(SessionFactoryImplementor sessionFactory, SelectStatement statement);
2525

26+
/**
27+
* Builds a single-use select translator
28+
*/
29+
SqlAstTranslator<JdbcOperationQuerySelect> buildSelectTranslator(SessionFactoryImplementor sessionFactory, SelectStatement statement, SqlParameterInfo parameterInfo);
30+
2631
/**
2732
* Builds a single-use mutation translator
2833
*/
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.sql.ast;
6+
7+
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
8+
9+
/**
10+
* @since 7.0
11+
*/
12+
public interface SqlParameterInfo {
13+
int getParameterId(JdbcParameter jdbcParameter);
14+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.sql.ast.internal;
6+
7+
import org.hibernate.sql.ast.SqlParameterInfo;
8+
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
9+
10+
import java.util.IdentityHashMap;
11+
import java.util.Map;
12+
13+
/**
14+
* @since 7.0
15+
*/
16+
public class SqlParameterInfoImpl implements SqlParameterInfo {
17+
18+
private final Map<JdbcParameter, Integer> parameterIdMap;
19+
20+
public SqlParameterInfoImpl() {
21+
this(new IdentityHashMap<>());
22+
}
23+
24+
public SqlParameterInfoImpl(Map<JdbcParameter, Integer> parameterIdMap) {
25+
this.parameterIdMap = parameterIdMap;
26+
}
27+
28+
@Override
29+
public int getParameterId(JdbcParameter jdbcParameter) {
30+
final Integer id = parameterIdMap.get( jdbcParameter );
31+
if ( id == null ) {
32+
final int newId = parameterIdMap.size();
33+
parameterIdMap.put( jdbcParameter, newId );
34+
return newId;
35+
}
36+
return id;
37+
}
38+
}

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.function.Function;
2323
import java.util.function.Supplier;
2424

25+
import org.checkerframework.checker.nullness.qual.Nullable;
2526
import org.hibernate.AssertionFailure;
2627
import org.hibernate.Internal;
2728
import org.hibernate.LockMode;
@@ -87,7 +88,9 @@
8788
import org.hibernate.sql.ast.SqlAstJoinType;
8889
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
8990
import org.hibernate.sql.ast.SqlAstTranslator;
91+
import org.hibernate.sql.ast.SqlParameterInfo;
9092
import org.hibernate.sql.ast.SqlTreeCreationException;
93+
import org.hibernate.sql.ast.internal.SqlParameterInfoImpl;
9194
import org.hibernate.sql.ast.internal.TableGroupHelper;
9295
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
9396
import org.hibernate.sql.ast.tree.AbstractUpdateOrDeleteStatement;
@@ -311,6 +314,7 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
311314
private final Stack<Clause> clauseStack = new StandardStack<>();
312315
private final Stack<QueryPart> queryPartStack = new StandardStack<>();
313316
private final Stack<Statement> statementStack = new StandardStack<>();
317+
private @Nullable SqlParameterInfo parameterInfo;
314318

315319
private final Dialect dialect;
316320
private final Set<String> affectedTableNames = new HashSet<>();
@@ -345,11 +349,16 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
345349
private ForUpdateClause forUpdate;
346350

347351
protected AbstractSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement) {
352+
this( sessionFactory, statement, null );
353+
}
354+
355+
protected AbstractSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement, @Nullable SqlParameterInfo parameterInfo) {
348356
this.sessionFactory = sessionFactory;
349357
final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
350358
this.dialect = jdbcServices.getDialect();
351359
this.statementStack.push( statement );
352360
this.parameterMarkerStrategy = jdbcServices.getParameterMarkerStrategy();
361+
this.parameterInfo = parameterInfo;
353362
}
354363

355364
private static Clause matchWithClause(Clause clause) {
@@ -368,6 +377,13 @@ public SessionFactoryImplementor getSessionFactory() {
368377
return sessionFactory;
369378
}
370379

380+
protected SqlParameterInfo getParameterInfo() {
381+
if ( parameterInfo == null ) {
382+
parameterInfo = new SqlParameterInfoImpl();
383+
}
384+
return parameterInfo;
385+
}
386+
371387
protected FunctionRenderer castFunction() {
372388
if ( castFunction == null ) {
373389
castFunction = findSelfRenderingFunction( "cast", 2 );

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/StandardSqlAstTranslator.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
*/
55
package org.hibernate.sql.ast.spi;
66

7+
import org.checkerframework.checker.nullness.qual.Nullable;
78
import org.hibernate.engine.spi.SessionFactoryImplementor;
9+
import org.hibernate.sql.ast.SqlParameterInfo;
810
import org.hibernate.sql.ast.tree.Statement;
911
import org.hibernate.sql.exec.spi.JdbcOperation;
1012
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
@@ -21,4 +23,8 @@ public class StandardSqlAstTranslator<T extends JdbcOperation> extends AbstractS
2123
public StandardSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement) {
2224
super( sessionFactory, statement );
2325
}
26+
27+
public StandardSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement, @Nullable SqlParameterInfo parameterInfo) {
28+
super( sessionFactory, statement, parameterInfo );
29+
}
2430
}

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/StandardSqlAstTranslatorFactory.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
*/
55
package org.hibernate.sql.ast.spi;
66

7+
import org.checkerframework.checker.nullness.qual.Nullable;
78
import org.hibernate.engine.spi.SessionFactoryImplementor;
89
import org.hibernate.sql.ast.SqlAstTranslator;
910
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
11+
import org.hibernate.sql.ast.SqlParameterInfo;
1012
import org.hibernate.sql.ast.tree.MutationStatement;
1113
import org.hibernate.sql.ast.tree.Statement;
1214
import org.hibernate.sql.ast.tree.select.SelectStatement;
@@ -22,20 +24,24 @@
2224
* @author Steve Ebersole
2325
*/
2426
public class StandardSqlAstTranslatorFactory implements SqlAstTranslatorFactory {
25-
2627
@Override
2728
public SqlAstTranslator<JdbcOperationQuerySelect> buildSelectTranslator(SessionFactoryImplementor sessionFactory, SelectStatement statement) {
28-
return buildTranslator( sessionFactory, statement );
29+
return buildTranslator( sessionFactory, statement, null );
30+
}
31+
32+
@Override
33+
public SqlAstTranslator<JdbcOperationQuerySelect> buildSelectTranslator(SessionFactoryImplementor sessionFactory, SelectStatement statement, SqlParameterInfo parameterInfo) {
34+
return buildTranslator( sessionFactory, statement, parameterInfo );
2935
}
3036

3137
@Override
3238
public SqlAstTranslator<? extends JdbcOperationQueryMutation> buildMutationTranslator(SessionFactoryImplementor sessionFactory, MutationStatement statement) {
33-
return buildTranslator( sessionFactory, statement );
39+
return buildTranslator( sessionFactory, statement, null );
3440
}
3541

3642
@Override
3743
public <O extends JdbcMutationOperation> SqlAstTranslator<O> buildModelMutationTranslator(TableMutation<O> mutation, SessionFactoryImplementor sessionFactory) {
38-
return buildTranslator( sessionFactory, mutation );
44+
return buildTranslator( sessionFactory, mutation, null );
3945
}
4046

4147
/**
@@ -45,4 +51,11 @@ protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(SessionF
4551
return new StandardSqlAstTranslator<>( sessionFactory, statement );
4652
}
4753

54+
/**
55+
* Consolidated building of a translator for all Query cases
56+
*/
57+
protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(SessionFactoryImplementor sessionFactory, Statement statement, @Nullable SqlParameterInfo parameterInfo) {
58+
return buildTranslator( sessionFactory, statement );
59+
}
60+
4861
}

0 commit comments

Comments
 (0)