Skip to content

Commit 7e44e23

Browse files
committed
[#1532] Add reactive global temporary tables creation strategies
For Oracle
1 parent 0815b7f commit 7e44e23

8 files changed

+410
-25
lines changed

hibernate-reactive-core/src/main/java/org/hibernate/reactive/provider/service/ReactiveSqmMultiTableMutationStrategyProvider.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
1212
import org.hibernate.query.sqm.mutation.internal.cte.CteInsertStrategy;
1313
import org.hibernate.query.sqm.mutation.internal.cte.CteMutationStrategy;
14+
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableInsertStrategy;
15+
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableMutationStrategy;
16+
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableStrategy;
1417
import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableInsertStrategy;
1518
import org.hibernate.query.sqm.mutation.internal.temptable.LocalTemporaryTableMutationStrategy;
1619
import org.hibernate.query.sqm.mutation.internal.temptable.PersistentTableInsertStrategy;
@@ -20,6 +23,8 @@
2023
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategyProvider;
2124
import org.hibernate.reactive.query.sqm.mutation.internal.cte.ReactiveCteInsertStrategy;
2225
import org.hibernate.reactive.query.sqm.mutation.internal.cte.ReactiveCteMutationStrategy;
26+
import org.hibernate.reactive.query.sqm.mutation.internal.temptable.ReactiveGlobalTemporaryTableInsertStrategy;
27+
import org.hibernate.reactive.query.sqm.mutation.internal.temptable.ReactiveGlobalTemporaryTableMutationStrategy;
2328
import org.hibernate.reactive.query.sqm.mutation.internal.temptable.ReactiveLocalTemporaryTableInsertStrategy;
2429
import org.hibernate.reactive.query.sqm.mutation.internal.temptable.ReactiveLocalTemporaryTableMutationStrategy;
2530
import org.hibernate.reactive.query.sqm.mutation.internal.temptable.ReactivePersistentTableInsertStrategy;
@@ -42,6 +47,9 @@ public SqmMultiTableMutationStrategy createMutationStrategy(
4247
if ( mutationStrategy instanceof PersistentTableMutationStrategy ) {
4348
return new ReactivePersistentTableMutationStrategy( (PersistentTableMutationStrategy) mutationStrategy );
4449
}
50+
if ( mutationStrategy instanceof GlobalTemporaryTableMutationStrategy ) {
51+
return new ReactiveGlobalTemporaryTableMutationStrategy( (GlobalTemporaryTableStrategy) mutationStrategy );
52+
}
4553
return mutationStrategy;
4654
}
4755

@@ -69,6 +77,9 @@ public SqmMultiTableInsertStrategy createInsertStrategy(
6977
if ( insertStrategy instanceof PersistentTableInsertStrategy ) {
7078
return new ReactivePersistentTableInsertStrategy( (PersistentTableInsertStrategy) insertStrategy );
7179
}
80+
if ( insertStrategy instanceof GlobalTemporaryTableInsertStrategy ) {
81+
return new ReactiveGlobalTemporaryTableInsertStrategy( (GlobalTemporaryTableStrategy) insertStrategy );
82+
}
7283
return insertStrategy;
7384
}
7485

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
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.query.sqm.mutation.internal.temptable;
7+
8+
import java.util.concurrent.CompletableFuture;
9+
import java.util.concurrent.CompletionStage;
10+
11+
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
12+
import org.hibernate.engine.spi.SessionFactoryImplementor;
13+
import org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess;
14+
import org.hibernate.query.spi.DomainQueryExecutionContext;
15+
import org.hibernate.query.sqm.internal.DomainParameterXref;
16+
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableStrategy;
17+
import org.hibernate.query.sqm.tree.insert.SqmInsertStatement;
18+
import org.hibernate.reactive.query.sqm.mutation.spi.ReactiveSqmMultiTableInsertStrategy;
19+
20+
/**
21+
* @see org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableInsertStrategy
22+
*/
23+
public class ReactiveGlobalTemporaryTableInsertStrategy extends GlobalTemporaryTableStrategy
24+
implements ReactiveGlobalTemporaryTableStrategy, ReactiveSqmMultiTableInsertStrategy {
25+
26+
private final CompletableFuture<Void> tableCreatedStage = new CompletableFuture();
27+
28+
private final CompletableFuture<Void> tableDroppedStage = new CompletableFuture();
29+
30+
private boolean prepared;
31+
32+
private boolean dropIdTables;
33+
34+
public ReactiveGlobalTemporaryTableInsertStrategy(GlobalTemporaryTableStrategy strategy) {
35+
super( strategy.getTemporaryTable(), strategy.getSessionFactory() );
36+
}
37+
38+
@Override
39+
public void prepare(
40+
MappingModelCreationProcess mappingModelCreationProcess,
41+
JdbcConnectionAccess connectionAccess) {
42+
prepare( mappingModelCreationProcess, connectionAccess, tableCreatedStage );
43+
}
44+
45+
@Override
46+
public void release(SessionFactoryImplementor sessionFactory, JdbcConnectionAccess connectionAccess) {
47+
release( sessionFactory, connectionAccess, tableDroppedStage );
48+
}
49+
50+
@Override
51+
public CompletionStage<Integer> reactiveExecuteInsert(
52+
SqmInsertStatement<?> sqmInsertStatement,
53+
DomainParameterXref domainParameterXref,
54+
DomainQueryExecutionContext context) {
55+
return tableCreatedStage.thenCompose( v -> new ReactiveTableBasedInsertHandler(
56+
sqmInsertStatement,
57+
domainParameterXref,
58+
getTemporaryTable(),
59+
getSessionFactory().getJdbcServices().getDialect().getTemporaryTableAfterUseAction(),
60+
// generally a global temp table should already track a Connection-specific uid,
61+
// but just in case a particular env needs it...
62+
ReactiveGlobalTemporaryTableStrategy::sessionIdentifier,
63+
getSessionFactory()
64+
).reactiveExecute( context ) );
65+
}
66+
67+
68+
@Override
69+
public boolean isPrepared() {
70+
return prepared;
71+
}
72+
73+
@Override
74+
public void setPrepared(boolean prepared) {
75+
this.prepared = prepared;
76+
}
77+
78+
@Override
79+
public boolean isDropIdTables() {
80+
return dropIdTables;
81+
}
82+
83+
@Override
84+
public void setDropIdTables(boolean dropIdTables) {
85+
this.dropIdTables = dropIdTables;
86+
}
87+
88+
@Override
89+
public CompletionStage<Void> getDropTableActionStage() {
90+
return tableDroppedStage;
91+
}
92+
93+
@Override
94+
public CompletionStage<Void> getCreateTableActionStage() {
95+
return tableCreatedStage;
96+
}
97+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
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.query.sqm.mutation.internal.temptable;
7+
8+
import java.util.concurrent.CompletableFuture;
9+
import java.util.concurrent.CompletionStage;
10+
11+
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
12+
import org.hibernate.engine.spi.SessionFactoryImplementor;
13+
import org.hibernate.metamodel.mapping.internal.MappingModelCreationProcess;
14+
import org.hibernate.query.spi.DomainQueryExecutionContext;
15+
import org.hibernate.query.sqm.internal.DomainParameterXref;
16+
import org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableStrategy;
17+
import org.hibernate.query.sqm.tree.delete.SqmDeleteStatement;
18+
import org.hibernate.query.sqm.tree.update.SqmUpdateStatement;
19+
import org.hibernate.reactive.query.sqm.mutation.spi.ReactiveSqmMultiTableMutationStrategy;
20+
21+
/**
22+
* @see org.hibernate.query.sqm.mutation.internal.temptable.GlobalTemporaryTableMutationStrategy
23+
*/
24+
public class ReactiveGlobalTemporaryTableMutationStrategy extends GlobalTemporaryTableStrategy
25+
implements ReactiveGlobalTemporaryTableStrategy, ReactiveSqmMultiTableMutationStrategy {
26+
27+
private final CompletableFuture<Void> tableCreatedStage = new CompletableFuture();
28+
29+
private final CompletableFuture<Void> tableDroppedStage = new CompletableFuture();
30+
31+
private boolean prepared;
32+
33+
private boolean dropIdTables;
34+
35+
public ReactiveGlobalTemporaryTableMutationStrategy(GlobalTemporaryTableStrategy strategy) {
36+
super( strategy.getTemporaryTable(), strategy.getSessionFactory() );
37+
}
38+
39+
40+
@Override
41+
public void prepare(
42+
MappingModelCreationProcess mappingModelCreationProcess,
43+
JdbcConnectionAccess connectionAccess) {
44+
prepare( mappingModelCreationProcess, connectionAccess, tableCreatedStage );
45+
}
46+
47+
@Override
48+
public void release(SessionFactoryImplementor sessionFactory, JdbcConnectionAccess connectionAccess) {
49+
release( sessionFactory, connectionAccess, tableDroppedStage );
50+
}
51+
52+
@Override
53+
public CompletionStage<Integer> reactiveExecuteUpdate(
54+
SqmUpdateStatement<?> sqmUpdateStatement,
55+
DomainParameterXref domainParameterXref,
56+
DomainQueryExecutionContext context) {
57+
return tableCreatedStage
58+
.thenCompose( v -> new ReactiveTableBasedUpdateHandler(
59+
sqmUpdateStatement,
60+
domainParameterXref,
61+
getTemporaryTable(),
62+
getSessionFactory().getJdbcServices().getDialect().getTemporaryTableAfterUseAction(),
63+
ReactivePersistentTableStrategy::sessionIdentifier,
64+
getSessionFactory()
65+
).reactiveExecute( context ) );
66+
}
67+
68+
@Override
69+
public CompletionStage<Integer> reactiveExecuteDelete(
70+
SqmDeleteStatement<?> sqmDeleteStatement,
71+
DomainParameterXref domainParameterXref,
72+
DomainQueryExecutionContext context) {
73+
return tableCreatedStage
74+
.thenCompose( v -> new ReactiveTableBasedDeleteHandler(
75+
sqmDeleteStatement,
76+
domainParameterXref,
77+
getTemporaryTable(),
78+
getSessionFactory().getJdbcServices().getDialect().getTemporaryTableAfterUseAction(),
79+
ReactiveGlobalTemporaryTableStrategy::sessionIdentifier,
80+
getSessionFactory()
81+
).reactiveExecute( context ) );
82+
}
83+
84+
@Override
85+
public CompletionStage<Void> getDropTableActionStage() {
86+
return tableDroppedStage;
87+
}
88+
89+
@Override
90+
public CompletionStage<Void> getCreateTableActionStage() {
91+
return tableCreatedStage;
92+
}
93+
94+
@Override
95+
public boolean isPrepared() {
96+
return prepared;
97+
}
98+
99+
@Override
100+
public void setPrepared(boolean prepared) {
101+
this.prepared = prepared;
102+
}
103+
104+
@Override
105+
public boolean isDropIdTables() {
106+
return dropIdTables;
107+
}
108+
109+
@Override
110+
public void setDropIdTables(boolean dropIdTables) {
111+
this.dropIdTables = dropIdTables;
112+
}
113+
}

0 commit comments

Comments
 (0)