Skip to content

Commit 7eb5bb6

Browse files
DavideDSanne
authored andcommitted
Add custom initializers for Hibernate Reactive
1 parent 770bc4d commit 7eb5bb6

25 files changed

+2884
-73
lines changed

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

Lines changed: 794 additions & 0 deletions
Large diffs are not rendered by default.

hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveAbstractPersisterDelegate.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.hibernate.loader.ast.spi.MultiIdLoadOptions;
2222
import org.hibernate.mapping.PersistentClass;
2323
import org.hibernate.metamodel.mapping.EntityMappingType;
24+
import org.hibernate.metamodel.mapping.EntityValuedModelPart;
2425
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
2526
import org.hibernate.metamodel.mapping.internal.GeneratedValuesProcessor;
2627
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
@@ -38,6 +39,11 @@
3839
import org.hibernate.reactive.loader.ast.spi.ReactiveSingleUniqueKeyEntityLoader;
3940
import org.hibernate.reactive.logging.impl.Log;
4041
import org.hibernate.reactive.logging.impl.LoggerFactory;
42+
import org.hibernate.reactive.sql.results.internal.ReactiveEntityResultImpl;
43+
import org.hibernate.spi.NavigablePath;
44+
import org.hibernate.sql.ast.tree.from.TableGroup;
45+
import org.hibernate.sql.results.graph.DomainResult;
46+
import org.hibernate.sql.results.graph.DomainResultCreationState;
4147

4248
import static org.hibernate.pretty.MessageHelper.infoString;
4349

@@ -67,6 +73,24 @@ public ReactiveSingleIdEntityLoader<Object> getSingleIdEntityLoader() {
6773
return singleIdEntityLoader;
6874
}
6975

76+
77+
public <T> DomainResult<T> createDomainResult(
78+
EntityValuedModelPart assemblerCreationState,
79+
NavigablePath navigablePath,
80+
TableGroup tableGroup,
81+
String resultVariable,
82+
DomainResultCreationState creationState) {
83+
final ReactiveEntityResultImpl entityResult = new ReactiveEntityResultImpl(
84+
navigablePath,
85+
assemblerCreationState,
86+
tableGroup,
87+
resultVariable
88+
);
89+
entityResult.afterInitialize( entityResult, creationState );
90+
//noinspection unchecked
91+
return entityResult;
92+
}
93+
7094
public <K> CompletionStage<? extends List<?>> multiLoad(K[] ids, EventSource session, MultiIdLoadOptions loadOptions) {
7195
return multiIdEntityLoader.load( ids, loadOptions, session );
7296
}

hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveJoinedSubclassEntityPersister.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@
3434
import org.hibernate.reactive.persister.entity.mutation.ReactiveInsertCoordinator;
3535
import org.hibernate.reactive.persister.entity.mutation.ReactiveUpdateCoordinator;
3636
import org.hibernate.reactive.util.impl.CompletionStages;
37+
import org.hibernate.spi.NavigablePath;
38+
import org.hibernate.sql.ast.tree.from.TableGroup;
39+
import org.hibernate.sql.results.graph.DomainResult;
40+
import org.hibernate.sql.results.graph.DomainResultCreationState;
41+
import org.hibernate.sql.results.graph.entity.internal.EntityResultJoinedSubclassImpl;
3742

3843
import java.sql.PreparedStatement;
3944
import java.util.List;
@@ -89,6 +94,28 @@ public ReactiveSingleIdEntityLoader<?> getReactiveSingleIdEntityLoader() {
8994
return reactiveDelegate.getSingleIdEntityLoader();
9095
}
9196

97+
@Override
98+
public <T> DomainResult<T> createDomainResult(
99+
NavigablePath navigablePath,
100+
TableGroup tableGroup,
101+
String resultVariable,
102+
DomainResultCreationState creationState) {
103+
if ( hasSubclasses() ) {
104+
final EntityResultJoinedSubclassImpl entityResultJoinedSubclass = new EntityResultJoinedSubclassImpl(
105+
navigablePath,
106+
this,
107+
tableGroup,
108+
resultVariable
109+
);
110+
entityResultJoinedSubclass.afterInitialize( entityResultJoinedSubclass, creationState );
111+
//noinspection unchecked
112+
return entityResultJoinedSubclass;
113+
}
114+
else {
115+
return reactiveDelegate.createDomainResult( this, navigablePath, tableGroup, resultVariable, creationState );
116+
}
117+
}
118+
92119
@Override
93120
public SingleIdArrayLoadPlan getSQLLazySelectLoadPlan(String fetchGroup) {
94121
return null;

hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveSingleTableEntityPersister.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@
2626
import org.hibernate.metamodel.mapping.NaturalIdMapping;
2727
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
2828
import org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess;
29+
import org.hibernate.mapping.Property;
30+
import org.hibernate.metamodel.mapping.AttributeMapping;
31+
import org.hibernate.metamodel.mapping.SingularAttributeMapping;
32+
import org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess;
33+
import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping;
2934
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
3035
import org.hibernate.persister.entity.AbstractEntityPersister;
3136
import org.hibernate.persister.entity.SingleTableEntityPersister;
@@ -34,10 +39,16 @@
3439
import org.hibernate.persister.entity.mutation.UpdateCoordinator;
3540
import org.hibernate.reactive.loader.ast.spi.ReactiveSingleIdEntityLoader;
3641
import org.hibernate.reactive.loader.ast.spi.ReactiveSingleUniqueKeyEntityLoader;
42+
import org.hibernate.reactive.metamodel.mapping.internal.ReactiveToOneAttributeMapping;
3743
import org.hibernate.reactive.persister.entity.mutation.ReactiveDeleteCoordinator;
3844
import org.hibernate.reactive.persister.entity.mutation.ReactiveInsertCoordinator;
3945
import org.hibernate.reactive.persister.entity.mutation.ReactiveUpdateCoordinator;
4046
import org.hibernate.reactive.util.impl.CompletionStages;
47+
import org.hibernate.spi.NavigablePath;
48+
import org.hibernate.sql.ast.tree.from.TableGroup;
49+
import org.hibernate.sql.results.graph.DomainResult;
50+
import org.hibernate.sql.results.graph.DomainResultCreationState;
51+
import org.hibernate.tuple.NonIdentifierAttribute;
4152

4253
/**
4354
* A {@link ReactiveEntityPersister} backed by {@link SingleTableEntityPersister}
@@ -82,6 +93,35 @@ public Generator getGenerator() throws HibernateException {
8293
return reactiveDelegate.reactive( super.getGenerator() );
8394
}
8495

96+
@Override
97+
public <T> DomainResult<T> createDomainResult(
98+
NavigablePath navigablePath,
99+
TableGroup tableGroup,
100+
String resultVariable,
101+
DomainResultCreationState creationState) {
102+
return reactiveDelegate.createDomainResult( this, navigablePath, tableGroup, resultVariable, creationState );
103+
}
104+
105+
@Override
106+
protected AttributeMapping generateNonIdAttributeMapping(
107+
NonIdentifierAttribute tupleAttrDefinition,
108+
Property bootProperty,
109+
int stateArrayPosition,
110+
int fetchableIndex,
111+
MappingModelCreationProcess creationProcess) {
112+
AttributeMapping attributeMapping = super.generateNonIdAttributeMapping(
113+
tupleAttrDefinition,
114+
bootProperty,
115+
stateArrayPosition,
116+
fetchableIndex,
117+
creationProcess
118+
);
119+
if ( attributeMapping instanceof ToOneAttributeMapping ) {
120+
return new ReactiveToOneAttributeMapping( (ToOneAttributeMapping) attributeMapping );
121+
}
122+
return attributeMapping;
123+
}
124+
85125
@Override
86126
public boolean check(int rows, Object id, int tableNumber, Expectation expectation, PreparedStatement statement, String sql) throws HibernateException {
87127
return super.check( rows, id, tableNumber, expectation,statement, sql );

hibernate-reactive-core/src/main/java/org/hibernate/reactive/persister/entity/impl/ReactiveUnionSubclassEntityPersister.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@
3838
import org.hibernate.reactive.persister.entity.mutation.ReactiveInsertCoordinator;
3939
import org.hibernate.reactive.persister.entity.mutation.ReactiveUpdateCoordinator;
4040
import org.hibernate.reactive.util.impl.CompletionStages;
41+
import org.hibernate.spi.NavigablePath;
42+
import org.hibernate.sql.ast.tree.from.TableGroup;
43+
import org.hibernate.sql.results.graph.DomainResult;
44+
import org.hibernate.sql.results.graph.DomainResultCreationState;
4145

4246
import java.lang.invoke.MethodHandles;
4347
import java.sql.PreparedStatement;
@@ -96,6 +100,15 @@ protected DeleteCoordinator buildDeleteCoordinator() {
96100
return ReactiveCoordinatorFactory.buildDeleteCoordinator( this, getFactory() );
97101
}
98102

103+
@Override
104+
public <T> DomainResult<T> createDomainResult(
105+
NavigablePath navigablePath,
106+
TableGroup tableGroup,
107+
String resultVariable,
108+
DomainResultCreationState creationState) {
109+
return reactiveDelegate.createDomainResult( this, navigablePath, tableGroup, resultVariable, creationState );
110+
}
111+
99112
@Override
100113
public Generator getGenerator() throws HibernateException {
101114
return reactiveDelegate.reactive( super.getGenerator() );

hibernate-reactive-core/src/main/java/org/hibernate/reactive/sql/exec/internal/StandardReactiveSelectExecutor.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,23 @@
3232
import org.hibernate.reactive.sql.exec.spi.ReactiveValuesResultSet;
3333
import org.hibernate.reactive.sql.results.internal.ReactiveDeferredResultSetAccess;
3434
import org.hibernate.reactive.sql.results.internal.ReactiveResultSetAccess;
35+
import org.hibernate.reactive.sql.results.internal.ReactiveResultsHelper;
3536
import org.hibernate.reactive.sql.results.spi.ReactiveListResultsConsumer;
3637
import org.hibernate.reactive.sql.results.spi.ReactiveResultsConsumer;
38+
import org.hibernate.reactive.sql.results.spi.ReactiveRowReader;
3739
import org.hibernate.reactive.sql.results.spi.ReactiveValuesMappingProducer;
3840
import org.hibernate.sql.exec.SqlExecLogger;
3941
import org.hibernate.sql.exec.internal.JdbcExecHelper;
4042
import org.hibernate.sql.exec.spi.ExecutionContext;
4143
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
4244
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
4345
import org.hibernate.sql.results.graph.DomainResult;
44-
import org.hibernate.sql.results.internal.ResultsHelper;
4546
import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
4647
import org.hibernate.sql.results.internal.RowTransformerTupleTransformerAdapter;
4748
import org.hibernate.sql.results.jdbc.internal.JdbcValuesSourceProcessingStateStandardImpl;
4849
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMapping;
4950
import org.hibernate.sql.results.jdbc.spi.JdbcValuesMetadata;
5051
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingOptions;
51-
import org.hibernate.sql.results.spi.RowReader;
5252
import org.hibernate.sql.results.spi.RowTransformer;
5353
import org.hibernate.stat.spi.StatisticsImplementor;
5454
import org.hibernate.type.BasicType;
@@ -180,7 +180,8 @@ public boolean shouldReturnProxies() {
180180
executionContext::registerLoadingEntityEntry
181181
);
182182

183-
final RowReader<R> rowReader = ResultsHelper.createRowReader(
183+
184+
final ReactiveRowReader<R> rowReader = ReactiveResultsHelper.createRowReader(
184185
executionContext,
185186
// If follow-on locking is used, we must omit the lock options here,
186187
// because these lock options are only for Initializers.

hibernate-reactive-core/src/main/java/org/hibernate/reactive/sql/exec/spi/ReactiveRowProcessingState.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
import org.hibernate.query.spi.QueryOptions;
1212
import org.hibernate.reactive.logging.impl.Log;
1313
import org.hibernate.reactive.logging.impl.LoggerFactory;
14+
import org.hibernate.reactive.sql.results.internal.ReactiveInitializersList;
15+
import org.hibernate.reactive.sql.results.spi.ReactiveRowReader;
1416
import org.hibernate.spi.NavigablePath;
1517
import org.hibernate.sql.exec.internal.BaseExecutionContext;
1618
import org.hibernate.sql.exec.spi.ExecutionContext;
1719
import org.hibernate.sql.results.graph.Initializer;
1820
import org.hibernate.sql.results.graph.entity.EntityFetch;
19-
import org.hibernate.sql.results.internal.InitializersList;
2021
import org.hibernate.sql.results.jdbc.internal.JdbcValuesSourceProcessingStateStandardImpl;
2122
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingState;
2223
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
@@ -32,22 +33,22 @@ public class ReactiveRowProcessingState extends BaseExecutionContext implements
3233

3334
private final JdbcValuesSourceProcessingStateStandardImpl resultSetProcessingState;
3435

35-
private final InitializersList initializers;
36+
private final ReactiveInitializersList initializers;
3637

37-
private final RowReader<?> rowReader;
38+
private final ReactiveRowReader<?> rowReader;
3839
private final ReactiveValuesResultSet jdbcValues;
3940
private final ExecutionContext executionContext;
4041

4142
public ReactiveRowProcessingState(
4243
JdbcValuesSourceProcessingStateStandardImpl resultSetProcessingState,
4344
ExecutionContext executionContext,
44-
RowReader<?> rowReader,
45+
ReactiveRowReader<?> rowReader,
4546
ReactiveValuesResultSet jdbcValues) {
4647
super( resultSetProcessingState.getSession() );
4748
this.resultSetProcessingState = resultSetProcessingState;
4849
this.executionContext = executionContext;
4950
this.rowReader = rowReader;
50-
this.initializers = rowReader.getInitializersList();
51+
this.initializers = rowReader.getReactiveInitializersList();
5152
this.jdbcValues = jdbcValues;
5253
}
5354

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/* Hibernate, Relational Persistence for Idiomatic Java
2+
*
3+
* SPDX-License-Identifier: Apache-2.0
4+
* Copyright: Red Hat Inc. and Hibernate Authors
5+
*/
6+
package org.hibernate.reactive.sql.results.graph;
7+
8+
import java.lang.invoke.MethodHandles;
9+
import java.util.concurrent.CompletionStage;
10+
11+
import org.hibernate.Incubating;
12+
import org.hibernate.reactive.logging.impl.Log;
13+
import org.hibernate.reactive.logging.impl.LoggerFactory;
14+
import org.hibernate.reactive.sql.exec.spi.ReactiveRowProcessingState;
15+
import org.hibernate.sql.results.graph.DomainResultAssembler;
16+
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingOptions;
17+
import org.hibernate.sql.results.jdbc.spi.RowProcessingState;
18+
19+
@Incubating
20+
public interface ReactiveDomainResultsAssembler<J> extends DomainResultAssembler<J> {
21+
22+
Log LOG = LoggerFactory.make( Log.class, MethodHandles.lookup() );
23+
24+
@Override
25+
default J assemble(RowProcessingState rowProcessingState) {
26+
throw LOG.nonReactiveMethodCall( "reactiveAssemble" );
27+
}
28+
29+
@Override
30+
default J assemble(RowProcessingState rowProcessingState, JdbcValuesSourceProcessingOptions options) {
31+
throw LOG.nonReactiveMethodCall( "reactiveAssemble" );
32+
}
33+
34+
CompletionStage<J> reactiveAssemble(
35+
ReactiveRowProcessingState rowProcessingState,
36+
JdbcValuesSourceProcessingOptions options);
37+
38+
/**
39+
* Convenience form of {@link #assemble(RowProcessingState, JdbcValuesSourceProcessingOptions)}
40+
*/
41+
default CompletionStage<J> reactiveAssemble(ReactiveRowProcessingState rowProcessingState) {
42+
return reactiveAssemble(
43+
rowProcessingState,
44+
rowProcessingState.getJdbcValuesSourceProcessingState().getProcessingOptions()
45+
);
46+
}
47+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/* Hibernate, Relational Persistence for Idiomatic Java
2+
*
3+
* SPDX-License-Identifier: Apache-2.0
4+
* Copyright: Red Hat Inc. and Hibernate Authors
5+
*/
6+
package org.hibernate.reactive.sql.results.graph;
7+
8+
import java.util.concurrent.CompletionStage;
9+
10+
import org.hibernate.Incubating;
11+
import org.hibernate.reactive.sql.exec.spi.ReactiveRowProcessingState;
12+
13+
/**
14+
* @see org.hibernate.sql.results.graph.Initializer
15+
*/
16+
@Incubating
17+
public interface ReactiveInitializer {
18+
19+
CompletionStage<Void> reactiveResolveInstance(ReactiveRowProcessingState rowProcessingState);
20+
21+
CompletionStage<Void> reactiveInitializeInstance(ReactiveRowProcessingState rowProcessingState);
22+
23+
}

0 commit comments

Comments
 (0)