6
6
package org .hibernate .reactive .query .sqm .iternal ;
7
7
8
8
9
+ import java .util .List ;
10
+ import java .util .Map ;
9
11
import java .util .concurrent .CompletionStage ;
10
12
13
+ import org .hibernate .action .internal .BulkOperationCleanupAction ;
14
+ import org .hibernate .engine .jdbc .spi .JdbcServices ;
15
+ import org .hibernate .engine .spi .SessionFactoryImplementor ;
16
+ import org .hibernate .engine .spi .SharedSessionContractImplementor ;
17
+ import org .hibernate .metamodel .mapping .MappingModelExpressible ;
11
18
import org .hibernate .query .spi .DomainQueryExecutionContext ;
19
+ import org .hibernate .query .spi .QueryEngine ;
20
+ import org .hibernate .query .spi .QueryParameterImplementor ;
12
21
import org .hibernate .query .sqm .internal .DomainParameterXref ;
22
+ import org .hibernate .query .sqm .internal .SqmJdbcExecutionContextAdapter ;
23
+ import org .hibernate .query .sqm .internal .SqmUtil ;
24
+ import org .hibernate .query .sqm .spi .SqmParameterMappingModelResolutionAccess ;
25
+ import org .hibernate .query .sqm .sql .SqmTranslation ;
26
+ import org .hibernate .query .sqm .sql .SqmTranslator ;
27
+ import org .hibernate .query .sqm .sql .SqmTranslatorFactory ;
28
+ import org .hibernate .query .sqm .tree .expression .SqmParameter ;
13
29
import org .hibernate .query .sqm .tree .insert .SqmInsertStatement ;
14
30
import org .hibernate .reactive .query .sql .spi .ReactiveNonSelectQueryPlan ;
31
+ import org .hibernate .reactive .sql .exec .internal .StandardReactiveJdbcMutationExecutor ;
32
+ import org .hibernate .sql .ast .SqlAstTranslator ;
33
+ import org .hibernate .sql .ast .spi .FromClauseAccess ;
34
+ import org .hibernate .sql .ast .tree .expression .JdbcParameter ;
35
+ import org .hibernate .sql .ast .tree .insert .InsertStatement ;
36
+ import org .hibernate .sql .exec .spi .JdbcOperationQueryInsert ;
37
+ import org .hibernate .sql .exec .spi .JdbcParameterBindings ;
15
38
16
39
/**
17
40
* @see org.hibernate.query.sqm.internal.SimpleInsertQueryPlan
@@ -22,6 +45,12 @@ public class ReactiveSimpleInsertQueryPlan implements ReactiveNonSelectQueryPlan
22
45
23
46
private final DomainParameterXref domainParameterXref ;
24
47
48
+ private Map <SqmParameter <?>, MappingModelExpressible <?>> paramTypeResolutions ;
49
+
50
+ private JdbcOperationQueryInsert jdbcInsert ;
51
+ private FromClauseAccess tableGroupAccess ;
52
+ private Map <QueryParameterImplementor <?>, Map <SqmParameter <?>, List <List <JdbcParameter >>>> jdbcParamsXref ;
53
+
25
54
public ReactiveSimpleInsertQueryPlan (
26
55
SqmInsertStatement <?> sqmInsert ,
27
56
DomainParameterXref domainParameterXref ) {
@@ -31,6 +60,83 @@ public ReactiveSimpleInsertQueryPlan(
31
60
32
61
@ Override
33
62
public CompletionStage <Integer > executeReactiveUpdate (DomainQueryExecutionContext executionContext ) {
34
- throw new UnsupportedOperationException ();
63
+ BulkOperationCleanupAction .schedule ( executionContext .getSession (), sqmInsert );
64
+ final SharedSessionContractImplementor session = executionContext .getSession ();
65
+ final SessionFactoryImplementor factory = session .getFactory ();
66
+ final JdbcServices jdbcServices = factory .getJdbcServices ();
67
+ SqlAstTranslator <JdbcOperationQueryInsert > insertTranslator = null ;
68
+ if ( jdbcInsert == null ) {
69
+ insertTranslator = createInsertTranslator ( executionContext );
70
+ }
71
+
72
+ final JdbcParameterBindings jdbcParameterBindings = SqmUtil .createJdbcParameterBindings (
73
+ executionContext .getQueryParameterBindings (),
74
+ domainParameterXref ,
75
+ jdbcParamsXref ,
76
+ factory .getRuntimeMetamodels ().getMappingMetamodel (),
77
+ tableGroupAccess ::findTableGroup ,
78
+ new SqmParameterMappingModelResolutionAccess () {
79
+ @ Override @ SuppressWarnings ("unchecked" )
80
+ public <T > MappingModelExpressible <T > getResolvedMappingModelType (SqmParameter <T > parameter ) {
81
+ return (MappingModelExpressible <T >) paramTypeResolutions .get (parameter );
82
+ }
83
+ },
84
+ session
85
+ );
86
+
87
+ if ( jdbcInsert != null && !jdbcInsert .isCompatibleWith (
88
+ jdbcParameterBindings ,
89
+ executionContext .getQueryOptions ()
90
+ ) ) {
91
+ insertTranslator = createInsertTranslator ( executionContext );
92
+ }
93
+
94
+ if ( insertTranslator != null ) {
95
+ jdbcInsert = insertTranslator .translate ( jdbcParameterBindings , executionContext .getQueryOptions () );
96
+ }
97
+ else {
98
+ jdbcInsert .bindFilterJdbcParameters ( jdbcParameterBindings );
99
+ }
100
+
101
+ return StandardReactiveJdbcMutationExecutor .INSTANCE
102
+ .executeReactive (
103
+ jdbcInsert ,
104
+ jdbcParameterBindings ,
105
+ session .getJdbcCoordinator ().getStatementPreparer ()::prepareStatement ,
106
+ (i , ps ) -> {},
107
+ SqmJdbcExecutionContextAdapter .omittingLockingAndPaging ( executionContext )
108
+ );
109
+ }
110
+
111
+ //TODO: reuse from ORM
112
+ private SqlAstTranslator <JdbcOperationQueryInsert > createInsertTranslator (DomainQueryExecutionContext executionContext ) {
113
+ final SessionFactoryImplementor factory = executionContext .getSession ().getFactory ();
114
+ final QueryEngine queryEngine = factory .getQueryEngine ();
115
+
116
+ final SqmTranslatorFactory translatorFactory = queryEngine .getSqmTranslatorFactory ();
117
+ final SqmTranslator <InsertStatement > translator = translatorFactory .createInsertTranslator (
118
+ sqmInsert ,
119
+ executionContext .getQueryOptions (),
120
+ domainParameterXref ,
121
+ executionContext .getQueryParameterBindings (),
122
+ executionContext .getSession ().getLoadQueryInfluencers (),
123
+ factory
124
+ );
125
+
126
+ final SqmTranslation <InsertStatement > sqmInterpretation = translator .translate ();
127
+
128
+ tableGroupAccess = sqmInterpretation .getFromClauseAccess ();
129
+
130
+ this .jdbcParamsXref = SqmUtil .generateJdbcParamsXref (
131
+ domainParameterXref ,
132
+ sqmInterpretation ::getJdbcParamsBySqmParam
133
+ );
134
+
135
+ this .paramTypeResolutions = sqmInterpretation .getSqmParameterMappingModelTypeResolutions ();
136
+
137
+ return factory .getJdbcServices ()
138
+ .getJdbcEnvironment ()
139
+ .getSqlAstTranslatorFactory ()
140
+ .buildInsertTranslator ( factory , sqmInterpretation .getSqlAst () );
35
141
}
36
142
}
0 commit comments