Skip to content

Commit d3f4329

Browse files
committed
HHH-16900 Optimise implementations of MutationOperationGroup
1 parent 0b47a82 commit d3f4329

30 files changed

+431
-288
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
6+
*/
7+
package org.hibernate.engine.jdbc.mutation.internal;
8+
9+
import org.hibernate.persister.entity.mutation.EntityMutationTarget;
10+
import org.hibernate.sql.model.MutationOperationGroup;
11+
12+
public interface EntityMutationOperationGroup extends MutationOperationGroup {
13+
14+
/**
15+
* The model-part being mutated.
16+
* N.B. it returns a widened type compared to the same method in the super interface.
17+
*/
18+
@Override
19+
EntityMutationTarget getMutationTarget();
20+
21+
@Override
22+
default EntityMutationOperationGroup asEntityMutationOperationGroup() {
23+
return this;
24+
}
25+
26+
}

hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsert.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ public class MutationExecutorPostInsert implements MutationExecutor, JdbcValueBi
6161

6262
protected final JdbcValueBindingsImpl valueBindings;
6363

64-
public MutationExecutorPostInsert(MutationOperationGroup mutationOperationGroup, SharedSessionContractImplementor session) {
65-
this.mutationTarget = (EntityMutationTarget) mutationOperationGroup.getMutationTarget();
64+
public MutationExecutorPostInsert(EntityMutationOperationGroup mutationOperationGroup, SharedSessionContractImplementor session) {
65+
this.mutationTarget = mutationOperationGroup.getMutationTarget();
6666
this.valueBindings = new JdbcValueBindingsImpl(
6767
MutationType.INSERT,
6868
mutationTarget,

hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/MutationExecutorPostInsertSingleTable.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ public class MutationExecutorPostInsertSingleTable implements MutationExecutor,
5252
private final JdbcValueBindingsImpl valueBindings;
5353

5454
public MutationExecutorPostInsertSingleTable(
55-
MutationOperationGroup mutationOperationGroup,
55+
EntityMutationOperationGroup mutationOperationGroup,
5656
SharedSessionContractImplementor session) {
57-
this.mutationTarget = (EntityMutationTarget) mutationOperationGroup.getMutationTarget();
57+
this.mutationTarget = mutationOperationGroup.getMutationTarget();
5858
this.session = session;
5959

6060
assert mutationOperationGroup.getNumberOfOperations() == 1;

hibernate-core/src/main/java/org/hibernate/engine/jdbc/mutation/internal/StandardMutationExecutorService.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package org.hibernate.engine.jdbc.mutation.internal;
88

99
import java.util.Map;
10-
import java.util.function.Supplier;
1110

1211
import org.hibernate.cfg.Environment;
1312
import org.hibernate.engine.jdbc.batch.spi.BatchKey;
@@ -16,11 +15,8 @@
1615
import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService;
1716
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1817
import org.hibernate.internal.util.config.ConfigurationHelper;
19-
import org.hibernate.metamodel.mapping.EntityMappingType;
20-
import org.hibernate.persister.entity.mutation.EntityMutationTarget;
2118
import org.hibernate.sql.model.MutationOperation;
2219
import org.hibernate.sql.model.MutationOperationGroup;
23-
import org.hibernate.sql.model.MutationTarget;
2420
import org.hibernate.sql.model.MutationType;
2521
import org.hibernate.sql.model.PreparableMutationOperation;
2622
import org.hibernate.sql.model.SelfExecutingUpdateOperation;
@@ -58,18 +54,15 @@ public MutationExecutor createExecutor(
5854

5955
final int numberOfOperations = operationGroup.getNumberOfOperations();
6056
final MutationType mutationType = operationGroup.getMutationType();
61-
final MutationTarget<?> mutationTarget = operationGroup.getMutationTarget();
57+
final EntityMutationOperationGroup entityMutationOperationGroup = operationGroup.asEntityMutationOperationGroup();
6258

6359
if ( mutationType == MutationType.INSERT
64-
&& mutationTarget instanceof EntityMutationTarget
65-
&& ( (EntityMutationTarget) mutationTarget ).getIdentityInsertDelegate() != null ) {
66-
assert mutationTarget instanceof EntityMappingType;
67-
60+
&& entityMutationOperationGroup != null
61+
&& entityMutationOperationGroup.getMutationTarget().getIdentityInsertDelegate() != null ) {
6862
if ( numberOfOperations > 1 ) {
69-
return new MutationExecutorPostInsert( operationGroup, session );
63+
return new MutationExecutorPostInsert( entityMutationOperationGroup, session );
7064
}
71-
72-
return new MutationExecutorPostInsertSingleTable( operationGroup, session );
65+
return new MutationExecutorPostInsertSingleTable( entityMutationOperationGroup, session );
7366
}
7467

7568
if ( numberOfOperations == 1 ) {

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/AbstractEntityCollectionPart.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
2828
import org.hibernate.metamodel.model.domain.NavigableRole;
2929
import org.hibernate.persister.collection.CollectionPersister;
30+
import org.hibernate.persister.collection.mutation.CollectionMutationTarget;
3031
import org.hibernate.persister.entity.PropertyMapping;
3132
import org.hibernate.spi.NavigablePath;
3233
import org.hibernate.sql.ast.spi.FromClauseAccess;

hibernate-core/src/main/java/org/hibernate/persister/collection/OneToManyPersister.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.hibernate.engine.jdbc.mutation.JdbcValueBindings;
2121
import org.hibernate.engine.jdbc.mutation.MutationExecutor;
2222
import org.hibernate.engine.jdbc.mutation.ParameterUsage;
23+
import org.hibernate.sql.model.internal.MutationOperationGroupFactory;
2324
import org.hibernate.engine.jdbc.mutation.internal.MutationQueryOptions;
2425
import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService;
2526
import org.hibernate.engine.spi.SharedSessionContractImplementor;
@@ -74,7 +75,6 @@
7475
import org.hibernate.sql.model.ast.RestrictedTableMutation;
7576
import org.hibernate.sql.model.ast.TableUpdate;
7677
import org.hibernate.sql.model.ast.builder.TableUpdateBuilderStandard;
77-
import org.hibernate.sql.model.internal.MutationOperationGroupSingle;
7878
import org.hibernate.sql.model.internal.TableUpdateStandard;
7979
import org.hibernate.sql.model.jdbc.JdbcDeleteMutation;
8080
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;
@@ -229,7 +229,7 @@ && hasIndex()
229229

230230
final MutationExecutor mutationExecutor = mutationExecutorService.createExecutor(
231231
() -> new BasicBatchKey( getNavigableRole() + "#INDEX" ),
232-
new MutationOperationGroupSingle( MutationType.UPDATE, this, updateRowOperation ),
232+
MutationOperationGroupFactory.singleOperation( MutationType.UPDATE, this, updateRowOperation ),
233233
session
234234
);
235235

hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/DeleteRowsCoordinatorStandard.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey;
1313
import org.hibernate.engine.jdbc.mutation.JdbcValueBindings;
1414
import org.hibernate.engine.jdbc.mutation.MutationExecutor;
15+
import org.hibernate.sql.model.internal.MutationOperationGroupFactory;
1516
import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService;
1617
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1718
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
1819
import org.hibernate.persister.collection.CollectionPersister;
1920
import org.hibernate.service.ServiceRegistry;
21+
import org.hibernate.sql.model.MutationOperationGroup;
2022
import org.hibernate.sql.model.MutationType;
21-
import org.hibernate.sql.model.internal.MutationOperationGroupSingle;
2223
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;
2324

2425
import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER;
@@ -35,7 +36,7 @@ public class DeleteRowsCoordinatorStandard implements DeleteRowsCoordinator {
3536
private final BasicBatchKey batchKey;
3637
private final MutationExecutorService mutationExecutorService;
3738

38-
private MutationOperationGroupSingle operationGroup;
39+
private MutationOperationGroup operationGroup;
3940

4041
public DeleteRowsCoordinatorStandard(
4142
CollectionMutationTarget mutationTarget,
@@ -114,11 +115,11 @@ public void deleteRows(PersistentCollection<?> collection, Object key, SharedSes
114115
}
115116
}
116117

117-
private MutationOperationGroupSingle createOperationGroup() {
118+
private MutationOperationGroup createOperationGroup() {
118119
assert mutationTarget.getTargetPart() != null;
119120
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;
120121

121122
final JdbcMutationOperation operation = rowMutationOperations.getDeleteRowOperation();
122-
return new MutationOperationGroupSingle( MutationType.DELETE, mutationTarget, operation );
123+
return MutationOperationGroupFactory.singleOperation( MutationType.DELETE, mutationTarget, operation );
123124
}
124125
}

hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/DeleteRowsCoordinatorTablePerSubclass.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@
77
package org.hibernate.persister.collection.mutation;
88

99
import java.util.Iterator;
10-
import java.util.function.Supplier;
1110

1211
import org.hibernate.collection.spi.PersistentCollection;
1312
import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey;
14-
import org.hibernate.engine.jdbc.batch.spi.BatchKey;
1513
import org.hibernate.engine.jdbc.mutation.MutationExecutor;
14+
import org.hibernate.sql.model.internal.MutationOperationGroupFactory;
1615
import org.hibernate.engine.jdbc.mutation.spi.BatchKeyAccess;
1716
import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService;
1817
import org.hibernate.engine.spi.EntityEntry;
@@ -22,8 +21,8 @@
2221
import org.hibernate.persister.collection.OneToManyPersister;
2322
import org.hibernate.persister.entity.EntityPersister;
2423
import org.hibernate.service.ServiceRegistry;
24+
import org.hibernate.sql.model.MutationOperationGroup;
2525
import org.hibernate.sql.model.MutationType;
26-
import org.hibernate.sql.model.internal.MutationOperationGroupSingle;
2726
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;
2827

2928
import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER;
@@ -136,7 +135,7 @@ private SubclassEntry getSubclassEntry(EntityPersister elementPersister) {
136135
);
137136
}
138137

139-
private MutationOperationGroupSingle createOperationGroup(EntityPersister elementPersister) {
138+
private MutationOperationGroup createOperationGroup(EntityPersister elementPersister) {
140139
assert mutationTarget.getTargetPart() != null;
141140
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;
142141

@@ -154,16 +153,16 @@ private MutationOperationGroupSingle createOperationGroup(EntityPersister elemen
154153
collectionTableMapping.getDeleteRowDetails()
155154
)
156155
);
157-
return new MutationOperationGroupSingle( MutationType.DELETE, mutationTarget, operation );
156+
return MutationOperationGroupFactory.singleOperation( MutationType.DELETE, mutationTarget, operation );
158157
}
159158

160159
private static class SubclassEntry {
161160

162161
private final BatchKeyAccess batchKeySupplier;
163162

164-
private final MutationOperationGroupSingle operationGroup;
163+
private final MutationOperationGroup operationGroup;
165164

166-
public SubclassEntry(BatchKeyAccess batchKeySupplier, MutationOperationGroupSingle operationGroup) {
165+
public SubclassEntry(BatchKeyAccess batchKeySupplier, MutationOperationGroup operationGroup) {
167166
this.batchKeySupplier = batchKeySupplier;
168167
this.operationGroup = operationGroup;
169168
}

hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/InsertRowsCoordinatorStandard.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey;
1313
import org.hibernate.engine.jdbc.mutation.JdbcValueBindings;
1414
import org.hibernate.engine.jdbc.mutation.MutationExecutor;
15+
import org.hibernate.sql.model.internal.MutationOperationGroupFactory;
1516
import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService;
1617
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1718
import org.hibernate.metamodel.mapping.PluralAttributeMapping;
1819
import org.hibernate.persister.collection.CollectionPersister;
1920
import org.hibernate.service.ServiceRegistry;
21+
import org.hibernate.sql.model.MutationOperationGroup;
2022
import org.hibernate.sql.model.MutationType;
21-
import org.hibernate.sql.model.internal.MutationOperationGroupSingle;
2223
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;
2324

2425
import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER;
@@ -34,7 +35,7 @@ public class InsertRowsCoordinatorStandard implements InsertRowsCoordinator {
3435
private final BasicBatchKey batchKey;
3536
private final MutationExecutorService mutationExecutorService;
3637

37-
private MutationOperationGroupSingle operationGroup;
38+
private MutationOperationGroup operationGroup;
3839

3940
public InsertRowsCoordinatorStandard(
4041
CollectionMutationTarget mutationTarget,
@@ -128,11 +129,11 @@ public void insertRows(
128129
}
129130
}
130131

131-
private MutationOperationGroupSingle createOperationGroup() {
132+
private MutationOperationGroup createOperationGroup() {
132133
assert mutationTarget.getTargetPart() != null;
133134
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;
134135

135136
final JdbcMutationOperation operation = rowMutationOperations.getInsertRowOperation();
136-
return new MutationOperationGroupSingle( MutationType.INSERT, mutationTarget, operation );
137+
return MutationOperationGroupFactory.singleOperation( MutationType.INSERT, mutationTarget, operation );
137138
}
138139
}

hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/InsertRowsCoordinatorTablePerSubclass.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.hibernate.collection.spi.PersistentCollection;
1212
import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey;
1313
import org.hibernate.engine.jdbc.mutation.MutationExecutor;
14+
import org.hibernate.sql.model.internal.MutationOperationGroupFactory;
1415
import org.hibernate.engine.jdbc.mutation.spi.BatchKeyAccess;
1516
import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService;
1617
import org.hibernate.engine.spi.EntityEntry;
@@ -20,8 +21,8 @@
2021
import org.hibernate.persister.collection.OneToManyPersister;
2122
import org.hibernate.persister.entity.EntityPersister;
2223
import org.hibernate.service.ServiceRegistry;
24+
import org.hibernate.sql.model.MutationOperationGroup;
2325
import org.hibernate.sql.model.MutationType;
24-
import org.hibernate.sql.model.internal.MutationOperationGroupSingle;
2526
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;
2627

2728
import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER;
@@ -43,7 +44,10 @@ public InsertRowsCoordinatorTablePerSubclass(
4344
ServiceRegistry serviceRegistry) {
4445
this.mutationTarget = mutationTarget;
4546
this.rowMutationOperations = rowMutationOperations;
46-
this.subclassEntries = new SubclassEntry[mutationTarget.getElementPersister().getRootEntityDescriptor().getSubclassEntityNames().size()];
47+
this.subclassEntries = new SubclassEntry[mutationTarget.getElementPersister()
48+
.getRootEntityDescriptor()
49+
.getSubclassEntityNames()
50+
.size()];
4751
this.mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class );
4852
}
4953

@@ -120,7 +124,11 @@ public void insertRows(
120124
entryCount++;
121125
}
122126

123-
MODEL_MUTATION_LOGGER.debugf( "Done inserting `%s` collection rows : %s", entryCount, mutationTarget.getRolePath() );
127+
MODEL_MUTATION_LOGGER.debugf(
128+
"Done inserting `%s` collection rows : %s",
129+
entryCount,
130+
mutationTarget.getRolePath()
131+
);
124132

125133
}
126134
finally {
@@ -145,7 +153,7 @@ private SubclassEntry getSubclassEntry(EntityPersister elementPersister) {
145153
);
146154
}
147155

148-
private MutationOperationGroupSingle createOperationGroup(EntityPersister elementPersister) {
156+
private MutationOperationGroup createOperationGroup(EntityPersister elementPersister) {
149157
assert mutationTarget.getTargetPart() != null;
150158
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;
151159

@@ -163,16 +171,16 @@ private MutationOperationGroupSingle createOperationGroup(EntityPersister elemen
163171
collectionTableMapping.getDeleteRowDetails()
164172
)
165173
);
166-
return new MutationOperationGroupSingle( MutationType.INSERT, mutationTarget, operation );
174+
return MutationOperationGroupFactory.singleOperation( MutationType.INSERT, mutationTarget, operation );
167175
}
168176

169177
private static class SubclassEntry {
170178

171179
private final BatchKeyAccess batchKeySupplier;
172180

173-
private final MutationOperationGroupSingle operationGroup;
181+
private final MutationOperationGroup operationGroup;
174182

175-
public SubclassEntry(BatchKeyAccess batchKeySupplier, MutationOperationGroupSingle operationGroup) {
183+
public SubclassEntry(BatchKeyAccess batchKeySupplier, MutationOperationGroup operationGroup) {
176184
this.batchKeySupplier = batchKeySupplier;
177185
this.operationGroup = operationGroup;
178186
}

hibernate-core/src/main/java/org/hibernate/persister/collection/mutation/RemoveCoordinatorStandard.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,14 @@
99
import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey;
1010
import org.hibernate.engine.jdbc.mutation.JdbcValueBindings;
1111
import org.hibernate.engine.jdbc.mutation.MutationExecutor;
12+
import org.hibernate.sql.model.internal.MutationOperationGroupFactory;
1213
import org.hibernate.engine.jdbc.mutation.spi.MutationExecutorService;
1314
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1415
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
1516
import org.hibernate.service.ServiceRegistry;
17+
import org.hibernate.sql.model.MutationOperationGroup;
1618
import org.hibernate.sql.model.MutationType;
1719
import org.hibernate.sql.model.ast.MutatingTableReference;
18-
import org.hibernate.sql.model.internal.MutationOperationGroupSingle;
1920
import org.hibernate.sql.model.jdbc.JdbcMutationOperation;
2021

2122
import static org.hibernate.sql.model.ModelMutationLogging.MODEL_MUTATION_LOGGER;
@@ -33,7 +34,7 @@ public class RemoveCoordinatorStandard implements RemoveCoordinator {
3334
private final BasicBatchKey batchKey;
3435
private final MutationExecutorService mutationExecutorService;
3536

36-
private MutationOperationGroupSingle operationGroup;
37+
private MutationOperationGroup operationGroup;
3738

3839
/**
3940
* Creates the coordinator.
@@ -69,7 +70,7 @@ public String getSqlString() {
6970
operationGroup = buildOperationGroup();
7071
}
7172

72-
final JdbcMutationOperation operation = operationGroup.getSingleOperation();
73+
final JdbcMutationOperation operation = (JdbcMutationOperation) operationGroup.getSingleOperation();
7374
return operation.getSqlString();
7475
}
7576

@@ -119,7 +120,7 @@ public void deleteAllRows(Object key, SharedSessionContractImplementor session)
119120
}
120121
}
121122

122-
private MutationOperationGroupSingle buildOperationGroup() {
123+
private MutationOperationGroup buildOperationGroup() {
123124
assert mutationTarget.getTargetPart() != null;
124125
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;
125126

@@ -130,7 +131,7 @@ private MutationOperationGroupSingle buildOperationGroup() {
130131
final CollectionTableMapping tableMapping = mutationTarget.getCollectionTableMapping();
131132
final MutatingTableReference tableReference = new MutatingTableReference( tableMapping );
132133

133-
return new MutationOperationGroupSingle(
134+
return MutationOperationGroupFactory.singleOperation(
134135
MutationType.DELETE,
135136
mutationTarget,
136137
operationProducer.createOperation( tableReference )

0 commit comments

Comments
 (0)