Skip to content

Commit d0f05a0

Browse files
committed
cleanups to ExecuteWithTemporaryTableHelper
1 parent fb834e1 commit d0f05a0

File tree

1 file changed

+50
-66
lines changed

1 file changed

+50
-66
lines changed

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

Lines changed: 50 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,26 @@
44
*/
55
package org.hibernate.query.sqm.mutation.internal.temptable;
66

7-
import java.util.UUID;
8-
import java.util.function.Function;
9-
107
import org.hibernate.LockMode;
118
import org.hibernate.LockOptions;
12-
import org.hibernate.boot.TempTableDdlTransactionHandling;
139
import org.hibernate.dialect.Dialect;
1410
import org.hibernate.dialect.temptable.TemporaryTable;
1511
import org.hibernate.dialect.temptable.TemporaryTableColumn;
1612
import org.hibernate.dialect.temptable.TemporaryTableHelper;
13+
import org.hibernate.dialect.temptable.TemporaryTableHelper.TemporaryTableCreationWork;
14+
import org.hibernate.dialect.temptable.TemporaryTableHelper.TemporaryTableDropWork;
1715
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
1816
import org.hibernate.engine.jdbc.spi.JdbcServices;
19-
import org.hibernate.engine.spi.SessionFactoryImplementor;
2017
import org.hibernate.engine.spi.SharedSessionContractImplementor;
21-
import org.hibernate.query.sqm.mutation.spi.AfterUseAction;
22-
import org.hibernate.query.sqm.mutation.spi.BeforeUseAction;
23-
import org.hibernate.resource.transaction.spi.IsolationDelegate;
2418
import org.hibernate.metamodel.mapping.BasicValuedMapping;
2519
import org.hibernate.metamodel.mapping.EntityMappingType;
2620
import org.hibernate.metamodel.mapping.ModelPart;
2721
import org.hibernate.query.sqm.ComparisonOperator;
2822
import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter;
23+
import org.hibernate.query.sqm.mutation.spi.AfterUseAction;
24+
import org.hibernate.query.sqm.mutation.spi.BeforeUseAction;
2925
import org.hibernate.spi.NavigablePath;
3026
import org.hibernate.sql.ast.SqlAstJoinType;
31-
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
3227
import org.hibernate.sql.ast.tree.expression.ColumnReference;
3328
import org.hibernate.sql.ast.tree.expression.QueryLiteral;
3429
import org.hibernate.sql.ast.tree.from.NamedTableReference;
@@ -38,12 +33,18 @@
3833
import org.hibernate.sql.ast.tree.insert.InsertSelectStatement;
3934
import org.hibernate.sql.ast.tree.predicate.ComparisonPredicate;
4035
import org.hibernate.sql.ast.tree.predicate.Predicate;
36+
import org.hibernate.sql.ast.tree.select.QueryPart;
4137
import org.hibernate.sql.ast.tree.select.QuerySpec;
4238
import org.hibernate.sql.exec.spi.ExecutionContext;
43-
import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation;
4439
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
4540
import org.hibernate.sql.results.internal.SqlSelectionImpl;
4641

42+
import java.util.UUID;
43+
import java.util.function.Function;
44+
45+
import static org.hibernate.boot.TempTableDdlTransactionHandling.ISOLATE_AND_TRANSACT;
46+
import static org.hibernate.boot.TempTableDdlTransactionHandling.NONE;
47+
4748
/**
4849
* @author Steve Ebersole
4950
*/
@@ -58,12 +59,8 @@ public static int saveMatchingIdsIntoIdTable(
5859
Function<SharedSessionContractImplementor, String> sessionUidAccess,
5960
JdbcParameterBindings jdbcParameterBindings,
6061
ExecutionContext executionContext) {
61-
final SessionFactoryImplementor factory = executionContext.getSession().getFactory();
62-
6362
final TableGroup mutatingTableGroup = sqmConverter.getMutatingTableGroup();
64-
65-
assert mutatingTableGroup.getModelPart() instanceof EntityMappingType;
66-
final EntityMappingType mutatingEntityDescriptor = (EntityMappingType) mutatingTableGroup.getModelPart();
63+
final var mutatingEntityDescriptor = (EntityMappingType) mutatingTableGroup.getModelPart();
6764

6865
final NamedTableReference idTableReference = new NamedTableReference(
6966
idTable.getTableExpression(),
@@ -92,15 +89,14 @@ public static int saveMatchingIdsIntoIdTable(
9289

9390
mutatingEntityDescriptor.getIdentifierMapping().forEachSelectable(
9491
(selectionIndex, selection) -> {
95-
final TableReference tableReference = mutatingTableGroup.resolveTableReference(
96-
mutatingTableGroup.getNavigablePath(),
97-
selection.getContainingTableExpression()
98-
);
9992
matchingIdSelection.getSelectClause().addSqlSelection(
10093
new SqlSelectionImpl(
10194
selectionIndex,
10295
sqmConverter.getSqlExpressionResolver().resolveSqlExpression(
103-
tableReference,
96+
mutatingTableGroup.resolveTableReference(
97+
mutatingTableGroup.getNavigablePath(),
98+
selection.getContainingTableExpression()
99+
),
104100
selection
105101
)
106102
)
@@ -129,40 +125,41 @@ public static int saveIntoTemporaryTable(
129125
InsertSelectStatement temporaryTableInsert,
130126
JdbcParameterBindings jdbcParameterBindings,
131127
ExecutionContext executionContext) {
132-
final SessionFactoryImplementor factory = executionContext.getSession().getFactory();
128+
final var factory = executionContext.getSession().getFactory();
133129
final JdbcServices jdbcServices = factory.getJdbcServices();
134130
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
135-
final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory();
136131
final LockOptions lockOptions = executionContext.getQueryOptions().getLockOptions();
137132
final LockMode lockMode = lockOptions.getLockMode();
138133
// Acquire a WRITE lock for the rows that are about to be modified
139134
lockOptions.setLockMode( LockMode.WRITE );
140135
// Visit the table joins and reset the lock mode if we encounter OUTER joins that are not supported
141-
if ( temporaryTableInsert.getSourceSelectStatement() != null
136+
final QueryPart sourceSelectStatement = temporaryTableInsert.getSourceSelectStatement();
137+
if ( sourceSelectStatement != null
142138
&& !jdbcEnvironment.getDialect().supportsOuterJoinForUpdate() ) {
143-
temporaryTableInsert.getSourceSelectStatement().visitQuerySpecs(
139+
sourceSelectStatement.visitQuerySpecs(
144140
querySpec -> {
145141
querySpec.getFromClause().visitTableJoins(
146142
tableJoin -> {
147-
if ( tableJoin.isInitialized() && tableJoin.getJoinType() != SqlAstJoinType.INNER ) {
143+
if ( tableJoin.isInitialized()
144+
&& tableJoin.getJoinType() != SqlAstJoinType.INNER ) {
148145
lockOptions.setLockMode( lockMode );
149146
}
150147
}
151148
);
152149
}
153150
);
154151
}
155-
final JdbcOperationQueryMutation jdbcInsert = sqlAstTranslatorFactory.buildMutationTranslator( factory, temporaryTableInsert )
156-
.translate( jdbcParameterBindings, executionContext.getQueryOptions() );
152+
final var jdbcInsert =
153+
jdbcEnvironment.getSqlAstTranslatorFactory()
154+
.buildMutationTranslator( factory, temporaryTableInsert )
155+
.translate( jdbcParameterBindings, executionContext.getQueryOptions() );
157156
lockOptions.setLockMode( lockMode );
158157

159158
return jdbcServices.getJdbcMutationExecutor().execute(
160159
jdbcInsert,
161160
jdbcParameterBindings,
162-
sql -> executionContext.getSession()
163-
.getJdbcCoordinator()
164-
.getStatementPreparer()
165-
.prepareStatement( sql ),
161+
sql -> executionContext.getSession().getJdbcCoordinator()
162+
.getStatementPreparer().prepareStatement( sql ),
166163
(integer, preparedStatement) -> {},
167164
executionContext
168165
);
@@ -201,7 +198,7 @@ public static QuerySpec createIdTableSelectQuerySpec(
201198

202199
querySpec.getFromClause().addRoot( idTableGroup );
203200

204-
applyIdTableSelections( querySpec, idTableReference, idTable, fkModelPart, executionContext );
201+
applyIdTableSelections( querySpec, idTableReference, idTable, fkModelPart );
205202
applyIdTableRestrictions( querySpec, idTableReference, idTable, sessionUidAccess, executionContext );
206203

207204
return querySpec;
@@ -211,12 +208,11 @@ private static void applyIdTableSelections(
211208
QuerySpec querySpec,
212209
TableReference tableReference,
213210
TemporaryTable idTable,
214-
ModelPart fkModelPart,
215-
ExecutionContext executionContext) {
211+
ModelPart fkModelPart) {
216212
if ( fkModelPart == null ) {
217213
final int size = idTable.getEntityDescriptor().getIdentifierMapping().getJdbcTypeCount();
218214
for ( int i = 0; i < size; i++ ) {
219-
final TemporaryTableColumn temporaryTableColumn = idTable.getColumns().get( i );
215+
final var temporaryTableColumn = idTable.getColumns().get( i );
220216
if ( temporaryTableColumn != idTable.getSessionUidColumn() ) {
221217
querySpec.getSelectClause().addSqlSelection(
222218
new SqlSelectionImpl(
@@ -282,25 +278,21 @@ private static void applyIdTableRestrictions(
282278
public static void performBeforeTemporaryTableUseActions(
283279
TemporaryTable temporaryTable,
284280
ExecutionContext executionContext) {
285-
final SessionFactoryImplementor factory = executionContext.getSession().getFactory();
281+
final var factory = executionContext.getSession().getFactory();
286282
final Dialect dialect = factory.getJdbcServices().getDialect();
287283
if ( dialect.getTemporaryTableBeforeUseAction() == BeforeUseAction.CREATE ) {
288-
final TemporaryTableHelper.TemporaryTableCreationWork temporaryTableCreationWork = new TemporaryTableHelper.TemporaryTableCreationWork(
289-
temporaryTable,
290-
factory
291-
);
292-
293-
final TempTableDdlTransactionHandling ddlTransactionHandling = dialect.getTemporaryTableDdlTransactionHandling();
294-
if ( ddlTransactionHandling == TempTableDdlTransactionHandling.NONE ) {
284+
final var temporaryTableCreationWork =
285+
new TemporaryTableCreationWork( temporaryTable, factory );
286+
final var ddlTransactionHandling = dialect.getTemporaryTableDdlTransactionHandling();
287+
if ( ddlTransactionHandling == NONE ) {
295288
executionContext.getSession().doWork( temporaryTableCreationWork );
296289
}
297290
else {
298-
final IsolationDelegate isolationDelegate = executionContext.getSession()
299-
.getJdbcCoordinator()
300-
.getJdbcSessionOwner()
301-
.getTransactionCoordinator()
302-
.createIsolationDelegate();
303-
isolationDelegate.delegateWork( temporaryTableCreationWork, ddlTransactionHandling == TempTableDdlTransactionHandling.ISOLATE_AND_TRANSACT );
291+
final var isolationDelegate =
292+
executionContext.getSession().getJdbcCoordinator().getJdbcSessionOwner()
293+
.getTransactionCoordinator().createIsolationDelegate();
294+
isolationDelegate.delegateWork( temporaryTableCreationWork,
295+
ddlTransactionHandling == ISOLATE_AND_TRANSACT );
304296
}
305297
}
306298
}
@@ -310,7 +302,7 @@ public static void performAfterTemporaryTableUseActions(
310302
Function<SharedSessionContractImplementor, String> sessionUidAccess,
311303
AfterUseAction afterUseAction,
312304
ExecutionContext executionContext) {
313-
final SessionFactoryImplementor factory = executionContext.getSession().getFactory();
305+
final var factory = executionContext.getSession().getFactory();
314306
final Dialect dialect = factory.getJdbcServices().getDialect();
315307
switch ( afterUseAction ) {
316308
case CLEAN:
@@ -322,25 +314,17 @@ public static void performAfterTemporaryTableUseActions(
322314
);
323315
break;
324316
case DROP:
325-
final TemporaryTableHelper.TemporaryTableDropWork temporaryTableDropWork = new TemporaryTableHelper.TemporaryTableDropWork(
326-
temporaryTable,
327-
factory
328-
);
329-
330-
final TempTableDdlTransactionHandling ddlTransactionHandling = dialect.getTemporaryTableDdlTransactionHandling();
331-
if ( ddlTransactionHandling == TempTableDdlTransactionHandling.NONE ) {
317+
final var temporaryTableDropWork = new TemporaryTableDropWork( temporaryTable, factory );
318+
final var ddlTransactionHandling = dialect.getTemporaryTableDdlTransactionHandling();
319+
if ( ddlTransactionHandling == NONE ) {
332320
executionContext.getSession().doWork( temporaryTableDropWork );
333321
}
334322
else {
335-
final IsolationDelegate isolationDelegate = executionContext.getSession()
336-
.getJdbcCoordinator()
337-
.getJdbcSessionOwner()
338-
.getTransactionCoordinator()
339-
.createIsolationDelegate();
340-
isolationDelegate.delegateWork(
341-
temporaryTableDropWork,
342-
ddlTransactionHandling == TempTableDdlTransactionHandling.ISOLATE_AND_TRANSACT
343-
);
323+
final var isolationDelegate =
324+
executionContext.getSession().getJdbcCoordinator().getJdbcSessionOwner()
325+
.getTransactionCoordinator().createIsolationDelegate();
326+
isolationDelegate.delegateWork( temporaryTableDropWork,
327+
ddlTransactionHandling == ISOLATE_AND_TRANSACT );
344328
}
345329
}
346330
}

0 commit comments

Comments
 (0)