Skip to content

Commit d00deee

Browse files
geoandDavideD
authored andcommitted
Fix HQLUpdateQueryTest
This is done by following same pattern used in the other *QueryPlan classes: make a reactive copy of the ORM implementations With this change HQLUpdateQueryTest now passes and no new failures occur
1 parent 80f1c12 commit d00deee

File tree

1 file changed

+107
-1
lines changed

1 file changed

+107
-1
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/query/sqm/iternal/ReactiveSimpleInsertQueryPlan.java

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,35 @@
66
package org.hibernate.reactive.query.sqm.iternal;
77

88

9+
import java.util.List;
10+
import java.util.Map;
911
import java.util.concurrent.CompletionStage;
1012

13+
import org.hibernate.action.internal.BulkOperationCleanupAction;
14+
import org.hibernate.engine.jdbc.spi.JdbcServices;
15+
import org.hibernate.engine.spi.SessionFactoryImplementor;
16+
import org.hibernate.engine.spi.SharedSessionContractImplementor;
17+
import org.hibernate.metamodel.mapping.MappingModelExpressible;
1118
import org.hibernate.query.spi.DomainQueryExecutionContext;
19+
import org.hibernate.query.spi.QueryEngine;
20+
import org.hibernate.query.spi.QueryParameterImplementor;
1221
import org.hibernate.query.sqm.internal.DomainParameterXref;
22+
import org.hibernate.query.sqm.internal.SqmJdbcExecutionContextAdapter;
23+
import org.hibernate.query.sqm.internal.SqmUtil;
24+
import org.hibernate.query.sqm.spi.SqmParameterMappingModelResolutionAccess;
25+
import org.hibernate.query.sqm.sql.SqmTranslation;
26+
import org.hibernate.query.sqm.sql.SqmTranslator;
27+
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
28+
import org.hibernate.query.sqm.tree.expression.SqmParameter;
1329
import org.hibernate.query.sqm.tree.insert.SqmInsertStatement;
1430
import org.hibernate.reactive.query.sql.spi.ReactiveNonSelectQueryPlan;
31+
import org.hibernate.reactive.sql.exec.internal.StandardReactiveJdbcMutationExecutor;
32+
import org.hibernate.sql.ast.SqlAstTranslator;
33+
import org.hibernate.sql.ast.spi.FromClauseAccess;
34+
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
35+
import org.hibernate.sql.ast.tree.insert.InsertStatement;
36+
import org.hibernate.sql.exec.spi.JdbcOperationQueryInsert;
37+
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
1538

1639
/**
1740
* @see org.hibernate.query.sqm.internal.SimpleInsertQueryPlan
@@ -22,6 +45,12 @@ public class ReactiveSimpleInsertQueryPlan implements ReactiveNonSelectQueryPlan
2245

2346
private final DomainParameterXref domainParameterXref;
2447

48+
private Map<SqmParameter<?>, MappingModelExpressible<?>> paramTypeResolutions;
49+
50+
private JdbcOperationQueryInsert jdbcInsert;
51+
private FromClauseAccess tableGroupAccess;
52+
private Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref;
53+
2554
public ReactiveSimpleInsertQueryPlan(
2655
SqmInsertStatement<?> sqmInsert,
2756
DomainParameterXref domainParameterXref) {
@@ -31,6 +60,83 @@ public ReactiveSimpleInsertQueryPlan(
3160

3261
@Override
3362
public CompletionStage<Integer> executeReactiveUpdate(DomainQueryExecutionContext executionContext) {
34-
throw new UnsupportedOperationException();
63+
BulkOperationCleanupAction.schedule( executionContext.getSession(), sqmInsert );
64+
final SharedSessionContractImplementor session = executionContext.getSession();
65+
final SessionFactoryImplementor factory = session.getFactory();
66+
final JdbcServices jdbcServices = factory.getJdbcServices();
67+
SqlAstTranslator<JdbcOperationQueryInsert> insertTranslator = null;
68+
if ( jdbcInsert == null ) {
69+
insertTranslator = createInsertTranslator( executionContext );
70+
}
71+
72+
final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings(
73+
executionContext.getQueryParameterBindings(),
74+
domainParameterXref,
75+
jdbcParamsXref,
76+
factory.getRuntimeMetamodels().getMappingMetamodel(),
77+
tableGroupAccess::findTableGroup,
78+
new SqmParameterMappingModelResolutionAccess() {
79+
@Override @SuppressWarnings("unchecked")
80+
public <T> MappingModelExpressible<T> getResolvedMappingModelType(SqmParameter<T> parameter) {
81+
return (MappingModelExpressible<T>) paramTypeResolutions.get(parameter);
82+
}
83+
},
84+
session
85+
);
86+
87+
if ( jdbcInsert != null && !jdbcInsert.isCompatibleWith(
88+
jdbcParameterBindings,
89+
executionContext.getQueryOptions()
90+
) ) {
91+
insertTranslator = createInsertTranslator( executionContext );
92+
}
93+
94+
if ( insertTranslator != null ) {
95+
jdbcInsert = insertTranslator.translate( jdbcParameterBindings, executionContext.getQueryOptions() );
96+
}
97+
else {
98+
jdbcInsert.bindFilterJdbcParameters( jdbcParameterBindings );
99+
}
100+
101+
return StandardReactiveJdbcMutationExecutor.INSTANCE
102+
.executeReactive(
103+
jdbcInsert,
104+
jdbcParameterBindings,
105+
session.getJdbcCoordinator().getStatementPreparer()::prepareStatement,
106+
(i, ps) -> {},
107+
SqmJdbcExecutionContextAdapter.omittingLockingAndPaging( executionContext )
108+
);
109+
}
110+
111+
//TODO: reuse from ORM
112+
private SqlAstTranslator<JdbcOperationQueryInsert> createInsertTranslator(DomainQueryExecutionContext executionContext) {
113+
final SessionFactoryImplementor factory = executionContext.getSession().getFactory();
114+
final QueryEngine queryEngine = factory.getQueryEngine();
115+
116+
final SqmTranslatorFactory translatorFactory = queryEngine.getSqmTranslatorFactory();
117+
final SqmTranslator<InsertStatement> translator = translatorFactory.createInsertTranslator(
118+
sqmInsert,
119+
executionContext.getQueryOptions(),
120+
domainParameterXref,
121+
executionContext.getQueryParameterBindings(),
122+
executionContext.getSession().getLoadQueryInfluencers(),
123+
factory
124+
);
125+
126+
final SqmTranslation<InsertStatement> sqmInterpretation = translator.translate();
127+
128+
tableGroupAccess = sqmInterpretation.getFromClauseAccess();
129+
130+
this.jdbcParamsXref = SqmUtil.generateJdbcParamsXref(
131+
domainParameterXref,
132+
sqmInterpretation::getJdbcParamsBySqmParam
133+
);
134+
135+
this.paramTypeResolutions = sqmInterpretation.getSqmParameterMappingModelTypeResolutions();
136+
137+
return factory.getJdbcServices()
138+
.getJdbcEnvironment()
139+
.getSqlAstTranslatorFactory()
140+
.buildInsertTranslator( factory, sqmInterpretation.getSqlAst() );
35141
}
36142
}

0 commit comments

Comments
 (0)