Skip to content

Give access to optional parameter info in SqlAstTranslator #10028

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -473,7 +473,7 @@ private static CacheableSqmInterpretation buildCacheableSqmInterpretation(

final SqlAstTranslator<JdbcOperationQuerySelect> selectTranslator =
sessionFactory.getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory()
.buildSelectTranslator( sessionFactory, sqmInterpretation.getSqlAst() );
.buildSelectTranslator( sessionFactory, sqmInterpretation.getSqlAst(), sqmInterpretation.getParameterInfo() );

final var jdbcParamsXref =
generateJdbcParamsXref( domainParameterXref, sqmInterpretation::getJdbcParamsBySqmParam );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ public static List<Object> selectMatchingIds(
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
final SqlAstTranslator<JdbcOperationQuerySelect> sqlAstSelectTranslator = jdbcEnvironment
.getSqlAstTranslatorFactory()
.buildSelectTranslator( factory, translation.getSqlAst() );
.buildSelectTranslator( factory, translation.getSqlAst(), translation.getParameterInfo() );

final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings(
executionContext.getQueryParameterBindings(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

import org.hibernate.metamodel.mapping.MappingModelExpressible;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.sql.ast.SqlParameterInfo;
import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
import org.hibernate.sql.ast.tree.Statement;
Expand All @@ -25,4 +26,5 @@ public interface SqmTranslation<T extends Statement> {
FromClauseAccess getFromClauseAccess();
Map<SqmParameter<?>, List<List<JdbcParameter>>> getJdbcParamsBySqmParam();
Map<SqmParameter<?>, MappingModelExpressible<?>> getSqmParameterMappingModelTypeResolutions();
SqlParameterInfo getParameterInfo();
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
*/
package org.hibernate.query.sqm.sql;

import java.util.Collections;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.metamodel.mapping.MappingModelExpressible;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.sql.ast.SqlParameterInfo;
import org.hibernate.sql.ast.internal.SqlParameterInfoImpl;
import org.hibernate.sql.ast.spi.FromClauseAccess;
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
import org.hibernate.sql.ast.tree.Statement;
Expand All @@ -24,6 +28,7 @@ public class StandardSqmTranslation<T extends Statement> implements SqmTranslati
private final Map<SqmParameter<?>, MappingModelExpressible<?>> parameterMappingModelTypeMap;
private final SqlExpressionResolver sqlExpressionResolver;
private final FromClauseAccess fromClauseAccess;
private final SqlParameterInfo parameterInfo;

public StandardSqmTranslation(
T sqlAst,
Expand All @@ -36,6 +41,19 @@ public StandardSqmTranslation(
this.parameterMappingModelTypeMap = parameterMappingModelTypeMap;
this.sqlExpressionResolver = sqlExpressionResolver;
this.fromClauseAccess = fromClauseAccess;
final IdentityHashMap<JdbcParameter, Integer> parameterIdMap = new IdentityHashMap<>();
int parameterId = 0;
for ( Map.Entry<SqmParameter<?>, List<List<JdbcParameter>>> entry : jdbcParamMap.entrySet() ) {
final List<List<JdbcParameter>> parameterUses = entry.getValue();
final int baseId = parameterId;
for ( List<JdbcParameter> jdbcParameters : parameterUses ) {
for ( int i = 0; i < jdbcParameters.size(); i++ ) {
parameterIdMap.put( jdbcParameters.get( i ), baseId + i );
}
}
parameterId += parameterUses.get( 0 ).size();
}
this.parameterInfo = new SqlParameterInfoImpl( Collections.unmodifiableMap( parameterIdMap ) );
}

@Override
Expand All @@ -62,4 +80,9 @@ public SqlExpressionResolver getSqlExpressionResolver() {
public FromClauseAccess getFromClauseAccess() {
return fromClauseAccess;
}

@Override
public SqlParameterInfo getParameterInfo() {
return parameterInfo;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ public interface SqlAstTranslatorFactory {
*/
SqlAstTranslator<JdbcOperationQuerySelect> buildSelectTranslator(SessionFactoryImplementor sessionFactory, SelectStatement statement);

/**
* Builds a single-use select translator
*/
SqlAstTranslator<JdbcOperationQuerySelect> buildSelectTranslator(SessionFactoryImplementor sessionFactory, SelectStatement statement, SqlParameterInfo parameterInfo);

/**
* Builds a single-use mutation translator
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.sql.ast;

import org.hibernate.sql.ast.tree.expression.JdbcParameter;

/**
* @since 7.0
*/
public interface SqlParameterInfo {
int getParameterId(JdbcParameter jdbcParameter);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* SPDX-License-Identifier: Apache-2.0
* Copyright Red Hat Inc. and Hibernate Authors
*/
package org.hibernate.sql.ast.internal;

import org.hibernate.sql.ast.SqlParameterInfo;
import org.hibernate.sql.ast.tree.expression.JdbcParameter;

import java.util.IdentityHashMap;
import java.util.Map;

/**
* @since 7.0
*/
public class SqlParameterInfoImpl implements SqlParameterInfo {

private final Map<JdbcParameter, Integer> parameterIdMap;

public SqlParameterInfoImpl() {
this(new IdentityHashMap<>());
}

public SqlParameterInfoImpl(Map<JdbcParameter, Integer> parameterIdMap) {
this.parameterIdMap = parameterIdMap;
}

@Override
public int getParameterId(JdbcParameter jdbcParameter) {
final Integer id = parameterIdMap.get( jdbcParameter );
if ( id == null ) {
final int newId = parameterIdMap.size();
parameterIdMap.put( jdbcParameter, newId );
return newId;
}
return id;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.util.function.Function;
import java.util.function.Supplier;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.hibernate.AssertionFailure;
import org.hibernate.Internal;
import org.hibernate.LockMode;
Expand Down Expand Up @@ -87,7 +88,9 @@
import org.hibernate.sql.ast.SqlAstJoinType;
import org.hibernate.sql.ast.SqlAstNodeRenderingMode;
import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.SqlParameterInfo;
import org.hibernate.sql.ast.SqlTreeCreationException;
import org.hibernate.sql.ast.internal.SqlParameterInfoImpl;
import org.hibernate.sql.ast.internal.TableGroupHelper;
import org.hibernate.sql.ast.internal.ParameterMarkerStrategyStandard;
import org.hibernate.sql.ast.tree.AbstractUpdateOrDeleteStatement;
Expand Down Expand Up @@ -311,6 +314,7 @@ public abstract class AbstractSqlAstTranslator<T extends JdbcOperation> implemen
private final Stack<Clause> clauseStack = new StandardStack<>();
private final Stack<QueryPart> queryPartStack = new StandardStack<>();
private final Stack<Statement> statementStack = new StandardStack<>();
private @Nullable SqlParameterInfo parameterInfo;

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

protected AbstractSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement) {
this( sessionFactory, statement, null );
}

protected AbstractSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement, @Nullable SqlParameterInfo parameterInfo) {
this.sessionFactory = sessionFactory;
final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
this.dialect = jdbcServices.getDialect();
this.statementStack.push( statement );
this.parameterMarkerStrategy = jdbcServices.getParameterMarkerStrategy();
this.parameterInfo = parameterInfo;
}

private static Clause matchWithClause(Clause clause) {
Expand All @@ -368,6 +377,13 @@ public SessionFactoryImplementor getSessionFactory() {
return sessionFactory;
}

protected SqlParameterInfo getParameterInfo() {
if ( parameterInfo == null ) {
parameterInfo = new SqlParameterInfoImpl();
}
return parameterInfo;
}

protected FunctionRenderer castFunction() {
if ( castFunction == null ) {
castFunction = findSelfRenderingFunction( "cast", 2 );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
*/
package org.hibernate.sql.ast.spi;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.sql.ast.SqlParameterInfo;
import org.hibernate.sql.ast.tree.Statement;
import org.hibernate.sql.exec.spi.JdbcOperation;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
Expand All @@ -21,4 +23,8 @@ public class StandardSqlAstTranslator<T extends JdbcOperation> extends AbstractS
public StandardSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement) {
super( sessionFactory, statement );
}

public StandardSqlAstTranslator(SessionFactoryImplementor sessionFactory, Statement statement, @Nullable SqlParameterInfo parameterInfo) {
super( sessionFactory, statement, parameterInfo );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
*/
package org.hibernate.sql.ast.spi;

import org.checkerframework.checker.nullness.qual.Nullable;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.sql.ast.SqlAstTranslator;
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
import org.hibernate.sql.ast.SqlParameterInfo;
import org.hibernate.sql.ast.tree.MutationStatement;
import org.hibernate.sql.ast.tree.Statement;
import org.hibernate.sql.ast.tree.select.SelectStatement;
Expand All @@ -22,20 +24,24 @@
* @author Steve Ebersole
*/
public class StandardSqlAstTranslatorFactory implements SqlAstTranslatorFactory {

@Override
public SqlAstTranslator<JdbcOperationQuerySelect> buildSelectTranslator(SessionFactoryImplementor sessionFactory, SelectStatement statement) {
return buildTranslator( sessionFactory, statement );
return buildTranslator( sessionFactory, statement, null );
}

@Override
public SqlAstTranslator<JdbcOperationQuerySelect> buildSelectTranslator(SessionFactoryImplementor sessionFactory, SelectStatement statement, SqlParameterInfo parameterInfo) {
return buildTranslator( sessionFactory, statement, parameterInfo );
}

@Override
public SqlAstTranslator<? extends JdbcOperationQueryMutation> buildMutationTranslator(SessionFactoryImplementor sessionFactory, MutationStatement statement) {
return buildTranslator( sessionFactory, statement );
return buildTranslator( sessionFactory, statement, null );
}

@Override
public <O extends JdbcMutationOperation> SqlAstTranslator<O> buildModelMutationTranslator(TableMutation<O> mutation, SessionFactoryImplementor sessionFactory) {
return buildTranslator( sessionFactory, mutation );
return buildTranslator( sessionFactory, mutation, null );
}

/**
Expand All @@ -45,4 +51,11 @@
return new StandardSqlAstTranslator<>( sessionFactory, statement );
}

/**
* Consolidated building of a translator for all Query cases
*/
protected <T extends JdbcOperation> SqlAstTranslator<T> buildTranslator(SessionFactoryImplementor sessionFactory, Statement statement, @Nullable SqlParameterInfo parameterInfo) {

Check notice

Code scanning / CodeQL

Useless parameter Note

The parameter 'parameterInfo' is never used.
return buildTranslator( sessionFactory, statement );
}

}