Skip to content

Commit 11d6f0f

Browse files
committed
HHH-16900 Optimise implementations of MutationOperationGroup
1 parent 9f8999e commit 11d6f0f

30 files changed

+426
-287
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
@@ -60,8 +60,8 @@ public class MutationExecutorPostInsert implements MutationExecutor, JdbcValueBi
6060

6161
protected final JdbcValueBindingsImpl valueBindings;
6262

63-
public MutationExecutorPostInsert(MutationOperationGroup mutationOperationGroup, SharedSessionContractImplementor session) {
64-
this.mutationTarget = (EntityMutationTarget) mutationOperationGroup.getMutationTarget();
63+
public MutationExecutorPostInsert(EntityMutationOperationGroup mutationOperationGroup, SharedSessionContractImplementor session) {
64+
this.mutationTarget = mutationOperationGroup.getMutationTarget();
6565
this.valueBindings = new JdbcValueBindingsImpl(
6666
MutationType.INSERT,
6767
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
@@ -51,9 +51,9 @@ public class MutationExecutorPostInsertSingleTable implements MutationExecutor,
5151
private final JdbcValueBindingsImpl valueBindings;
5252

5353
public MutationExecutorPostInsertSingleTable(
54-
MutationOperationGroup mutationOperationGroup,
54+
EntityMutationOperationGroup mutationOperationGroup,
5555
SharedSessionContractImplementor session) {
56-
this.mutationTarget = (EntityMutationTarget) mutationOperationGroup.getMutationTarget();
56+
this.mutationTarget = mutationOperationGroup.getMutationTarget();
5757
this.session = session;
5858

5959
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;
@@ -228,7 +228,7 @@ && hasIndex()
228228

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

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;
@@ -34,7 +35,7 @@ public class DeleteRowsCoordinatorStandard implements DeleteRowsCoordinator {
3435
private final BasicBatchKey batchKey;
3536
private final MutationExecutorService mutationExecutorService;
3637

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

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

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

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

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;
@@ -135,7 +134,7 @@ private SubclassEntry getSubclassEntry(EntityPersister elementPersister) {
135134
);
136135
}
137136

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

@@ -153,16 +152,16 @@ private MutationOperationGroupSingle createOperationGroup(EntityPersister elemen
153152
collectionTableMapping.getDeleteRowDetails()
154153
)
155154
);
156-
return new MutationOperationGroupSingle( MutationType.DELETE, mutationTarget, operation );
155+
return MutationOperationGroupFactory.singleOperation( MutationType.DELETE, mutationTarget, operation );
157156
}
158157

159158
private static class SubclassEntry {
160159

161160
private final BatchKeyAccess batchKeySupplier;
162161

163-
private final MutationOperationGroupSingle operationGroup;
162+
private final MutationOperationGroup operationGroup;
164163

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

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;
@@ -33,7 +34,7 @@ public class InsertRowsCoordinatorStandard implements InsertRowsCoordinator {
3334
private final BasicBatchKey batchKey;
3435
private final MutationExecutorService mutationExecutorService;
3536

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

3839
public InsertRowsCoordinatorStandard(
3940
CollectionMutationTarget mutationTarget,
@@ -127,11 +128,11 @@ public void insertRows(
127128
}
128129
}
129130

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

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

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

Lines changed: 10 additions & 6 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;
@@ -42,7 +43,10 @@ public InsertRowsCoordinatorTablePerSubclass(
4243
ServiceRegistry serviceRegistry) {
4344
this.mutationTarget = mutationTarget;
4445
this.rowMutationOperations = rowMutationOperations;
45-
this.subclassEntries = new SubclassEntry[mutationTarget.getElementPersister().getRootEntityDescriptor().getSubclassEntityNames().size()];
46+
this.subclassEntries = new SubclassEntry[mutationTarget.getElementPersister()
47+
.getRootEntityDescriptor()
48+
.getSubclassEntityNames()
49+
.size()];
4650
this.mutationExecutorService = serviceRegistry.getService( MutationExecutorService.class );
4751
}
4852

@@ -153,7 +157,7 @@ private SubclassEntry getSubclassEntry(EntityPersister elementPersister) {
153157
);
154158
}
155159

156-
private MutationOperationGroupSingle createOperationGroup(EntityPersister elementPersister) {
160+
private MutationOperationGroup createOperationGroup(EntityPersister elementPersister) {
157161
assert mutationTarget.getTargetPart() != null;
158162
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;
159163

@@ -171,16 +175,16 @@ private MutationOperationGroupSingle createOperationGroup(EntityPersister elemen
171175
collectionTableMapping.getDeleteRowDetails()
172176
)
173177
);
174-
return new MutationOperationGroupSingle( MutationType.INSERT, mutationTarget, operation );
178+
return MutationOperationGroupFactory.singleOperation( MutationType.INSERT, mutationTarget, operation );
175179
}
176180

177181
private static class SubclassEntry {
178182

179183
private final BatchKeyAccess batchKeySupplier;
180184

181-
private final MutationOperationGroupSingle operationGroup;
185+
private final MutationOperationGroup operationGroup;
182186

183-
public SubclassEntry(BatchKeyAccess batchKeySupplier, MutationOperationGroupSingle operationGroup) {
187+
public SubclassEntry(BatchKeyAccess batchKeySupplier, MutationOperationGroup operationGroup) {
184188
this.batchKeySupplier = batchKeySupplier;
185189
this.operationGroup = operationGroup;
186190
}

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;
@@ -31,7 +32,7 @@ public class RemoveCoordinatorStandard implements RemoveCoordinator {
3132
private final BasicBatchKey batchKey;
3233
private final MutationExecutorService mutationExecutorService;
3334

34-
private MutationOperationGroupSingle operationGroup;
35+
private MutationOperationGroup operationGroup;
3536

3637
/**
3738
* Creates the coordinator.
@@ -67,7 +68,7 @@ public String getSqlString() {
6768
operationGroup = buildOperationGroup();
6869
}
6970

70-
final JdbcMutationOperation operation = operationGroup.getSingleOperation();
71+
final JdbcMutationOperation operation = (JdbcMutationOperation) operationGroup.getSingleOperation();
7172
return operation.getSqlString();
7273
}
7374

@@ -117,7 +118,7 @@ public void deleteAllRows(Object key, SharedSessionContractImplementor session)
117118
}
118119
}
119120

120-
private MutationOperationGroupSingle buildOperationGroup() {
121+
private MutationOperationGroup buildOperationGroup() {
121122
assert mutationTarget.getTargetPart() != null;
122123
assert mutationTarget.getTargetPart().getKeyDescriptor() != null;
123124

@@ -128,7 +129,7 @@ private MutationOperationGroupSingle buildOperationGroup() {
128129
final CollectionTableMapping tableMapping = mutationTarget.getCollectionTableMapping();
129130
final MutatingTableReference tableReference = new MutatingTableReference( tableMapping );
130131

131-
return new MutationOperationGroupSingle(
132+
return MutationOperationGroupFactory.singleOperation(
132133
MutationType.DELETE,
133134
mutationTarget,
134135
operationProducer.createOperation( tableReference )

0 commit comments

Comments
 (0)