17
17
18
18
import io .r2dbc .spi .Connection ;
19
19
import io .r2dbc .spi .Statement ;
20
- import kotlin .internal .LowPriorityInOverloadResolution ;
21
20
import lombok .Getter ;
22
21
import lombok .RequiredArgsConstructor ;
23
22
32
31
import java .util .function .Consumer ;
33
32
import java .util .function .Function ;
34
33
34
+ import org .jetbrains .annotations .NotNull ;
35
35
import org .springframework .dao .InvalidDataAccessApiUsageException ;
36
36
import org .springframework .data .r2dbc .dialect .BindMarker ;
37
37
import org .springframework .data .r2dbc .dialect .BindMarkers ;
38
38
import org .springframework .data .r2dbc .dialect .Dialect ;
39
+ import org .springframework .data .r2dbc .dialect .IndexedBindMarker ;
39
40
import org .springframework .data .r2dbc .domain .SettableValue ;
40
- import org .springframework .data .relational .core .sql .AssignValue ;
41
- import org .springframework .data .relational .core .sql .Assignment ;
42
- import org .springframework .data .relational .core .sql .Column ;
43
- import org .springframework .data .relational .core .sql .Condition ;
44
- import org .springframework .data .relational .core .sql .Delete ;
45
- import org .springframework .data .relational .core .sql .DeleteBuilder ;
46
- import org .springframework .data .relational .core .sql .Expression ;
47
- import org .springframework .data .relational .core .sql .Insert ;
48
- import org .springframework .data .relational .core .sql .SQL ;
49
- import org .springframework .data .relational .core .sql .Select ;
50
- import org .springframework .data .relational .core .sql .SelectBuilder ;
51
- import org .springframework .data .relational .core .sql .StatementBuilder ;
52
- import org .springframework .data .relational .core .sql .Table ;
53
- import org .springframework .data .relational .core .sql .Update ;
54
- import org .springframework .data .relational .core .sql .UpdateBuilder ;
41
+ import org .springframework .data .relational .core .sql .*;
55
42
import org .springframework .data .relational .core .sql .render .RenderContext ;
56
43
import org .springframework .data .relational .core .sql .render .SqlRenderer ;
57
44
import org .springframework .lang .Nullable ;
@@ -104,10 +91,44 @@ public void bind(String identifier, SettableValue settable) {
104
91
select = selectBuilder .build ();
105
92
}
106
93
107
- return new DefaultPreparedOperation <>(select , renderContext , binding );
94
+ return new DefaultPreparedOperation <>( //
95
+ select , //
96
+ renderContext , //
97
+ createBindings (binding ) //
98
+ );
108
99
});
109
100
}
110
101
102
+ @ NotNull
103
+ private static Bindings createBindings (Binding binding ) {
104
+
105
+ List <Bindings .SingleBinding > singleBindings = new ArrayList <>();
106
+
107
+ binding .getNulls ().forEach ( //
108
+ (bindMarker , settableValue ) -> {
109
+
110
+ if (bindMarker instanceof IndexedBindMarker ) {
111
+ singleBindings //
112
+ .add (new Bindings .IndexedSingleBinding ( //
113
+ ((IndexedBindMarker ) bindMarker ).getIndex (), //
114
+ settableValue ) //
115
+ );
116
+ }
117
+ });
118
+
119
+ binding .getValues ().forEach ( //
120
+ (bindMarker , value ) -> {
121
+ singleBindings //
122
+ .add (new Bindings .NamedSingleBinding <>( //
123
+ bindMarker .getPlaceholder (), //
124
+ value instanceof SettableValue ? (SettableValue ) value
125
+ : SettableValue .from (value )) //
126
+ );
127
+ });
128
+
129
+ return new Bindings (singleBindings );
130
+ }
131
+
111
132
/*
112
133
* (non-Javadoc)
113
134
* @see org.springframework.data.r2dbc.function.StatementFactory#insert(java.lang.String, java.util.Collection, java.util.function.Consumer)
@@ -152,7 +173,7 @@ public void filterBy(String identifier, SettableValue settable) {
152
173
Insert insert = StatementBuilder .insert ().into (table ).columns (table .columns (binderBuilder .bindings .keySet ()))
153
174
.values (expressions ).build ();
154
175
155
- return new DefaultPreparedOperation <Insert >(insert , renderContext , binding ) {
176
+ return new DefaultPreparedOperation <Insert >(insert , renderContext , createBindings ( binding ) ) {
156
177
@ Override
157
178
public Statement bind (Statement to ) {
158
179
return super .bind (to ).returnGeneratedValues (generatedKeysNames .toArray (new String [0 ]));
@@ -206,7 +227,7 @@ public PreparedOperation<Update> update(String tableName, Consumer<StatementBind
206
227
update = updateBuilder .build ();
207
228
}
208
229
209
- return new DefaultPreparedOperation <>(update , renderContext , binding );
230
+ return new DefaultPreparedOperation <>(update , renderContext , createBindings ( binding ) );
210
231
});
211
232
}
212
233
@@ -244,7 +265,7 @@ public void bind(String identifier, SettableValue settable) {
244
265
delete = deleteBuilder .build ();
245
266
}
246
267
247
- return new DefaultPreparedOperation <>(delete , renderContext , binding );
268
+ return new DefaultPreparedOperation <>(delete , renderContext , createBindings ( binding ) );
248
269
});
249
270
}
250
271
@@ -364,7 +385,6 @@ private static Condition toCondition(BindMarkers bindMarkers, Column column, Set
364
385
}
365
386
}
366
387
367
-
368
388
/**
369
389
* Value object holding value and {@code NULL} bindings.
370
390
*
@@ -415,16 +435,14 @@ void apply(Statement to) {
415
435
}
416
436
}
417
437
418
-
419
438
static abstract class PreparedOperationSupport <T > implements PreparedOperation <T > {
420
439
421
440
private Function <String , String > sqlFilter = s -> s ;
422
- private Function <Binding , Binding > bindingFilter = b -> b ;
423
-
441
+ private Function <Bindings , Bindings > bindingFilter = b -> b ;
424
442
425
443
abstract protected String createBaseSql ();
426
444
427
- protected abstract Binding getBaseBinding ();
445
+ protected abstract Bindings getBaseBinding ();
428
446
429
447
/*
430
448
* (non-Javadoc)
@@ -435,6 +453,7 @@ public String toQuery() {
435
453
436
454
return sqlFilter .apply (createBaseSql ());
437
455
}
456
+
438
457
/*
439
458
* (non-Javadoc)
440
459
* @see org.springframework.data.r2dbc.function.PreparedOperation#bind(io.r2dbc.spi.Statement)
@@ -445,14 +464,13 @@ protected Statement bind(Statement to) {
445
464
return to ;
446
465
}
447
466
448
-
449
467
@ Override
450
468
public Statement createBoundStatement (Connection connection ) {
451
469
452
470
// TODO add back logging
453
- // if (logger.isDebugEnabled()) {
454
- // logger.debug("Executing SQL statement [" + sql + "]");
455
- // }
471
+ // if (logger.isDebugEnabled()) {
472
+ // logger.debug("Executing SQL statement [" + sql + "]");
473
+ // }
456
474
457
475
return bind (connection .createStatement (toQuery ()));
458
476
}
@@ -467,7 +485,7 @@ public void addSqlFilter(Function<String, String> filter) {
467
485
}
468
486
469
487
@ Override
470
- public void addBindingFilter (Function <Binding , Binding > filter ) {
488
+ public void addBindingFilter (Function <Bindings , Bindings > filter ) {
471
489
472
490
Assert .notNull (filter , "Filter must not be null." );
473
491
@@ -476,7 +494,6 @@ public void addBindingFilter(Function<Binding, Binding> filter) {
476
494
477
495
}
478
496
479
-
480
497
/**
481
498
* Default implementation of {@link PreparedOperation}.
482
499
*
@@ -487,7 +504,7 @@ static class DefaultPreparedOperation<T> extends PreparedOperationSupport<T> {
487
504
488
505
private final T source ;
489
506
private final RenderContext renderContext ;
490
- private final Binding binding ;
507
+ private final Bindings bindings ;
491
508
492
509
/*
493
510
* (non-Javadoc)
@@ -522,8 +539,8 @@ protected String createBaseSql() {
522
539
}
523
540
524
541
@ Override
525
- protected Binding getBaseBinding () {
526
- return binding ;
542
+ protected Bindings getBaseBinding () {
543
+ return bindings ;
527
544
}
528
545
}
529
546
}
0 commit comments