Skip to content

Commit 2979292

Browse files
committed
Implement value when present mapping in general insert
1 parent 95a2c12 commit 2979292

File tree

9 files changed

+68
-32
lines changed

9 files changed

+68
-32
lines changed

src/main/java/org/mybatis/dynamic/sql/insert/GeneralInsertDSL.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.mybatis.dynamic.sql.util.NullMapping;
2828
import org.mybatis.dynamic.sql.util.StringConstantMapping;
2929
import org.mybatis.dynamic.sql.util.ValueMapping;
30+
import org.mybatis.dynamic.sql.util.ValueWhenPresentMapping;
3031

3132
public class GeneralInsertDSL {
3233
private List<AbstractColumnMapping> insertMappings = new ArrayList<>();
@@ -88,9 +89,7 @@ public GeneralInsertDSL toValueWhenPresent(T value) {
8889
}
8990

9091
public GeneralInsertDSL toValueWhenPresent(Supplier<T> valueSupplier) {
91-
if (valueSupplier.get() != null) {
92-
insertMappings.add(ValueMapping.of(column, valueSupplier));
93-
}
92+
insertMappings.add(ValueWhenPresentMapping.of(column, valueSupplier));
9493
return GeneralInsertDSL.this;
9594
}
9695
}

src/main/java/org/mybatis/dynamic/sql/insert/render/FieldAndValueAndParameters.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.HashMap;
1919
import java.util.Map;
2020
import java.util.Objects;
21+
import java.util.Optional;
2122

2223
public class FieldAndValueAndParameters {
2324
private String fieldName;
@@ -69,5 +70,9 @@ public Builder withParameter(String key, Object value) {
6970
public FieldAndValueAndParameters build() {
7071
return new FieldAndValueAndParameters(this);
7172
}
73+
74+
public Optional<FieldAndValueAndParameters> buildOptional() {
75+
return Optional.of(build());
76+
}
7277
}
7378
}

src/main/java/org/mybatis/dynamic/sql/insert/render/FieldAndValueAndParametersCollector.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,19 @@
1919
import java.util.HashMap;
2020
import java.util.List;
2121
import java.util.Map;
22+
import java.util.Optional;
2223
import java.util.stream.Collector;
2324
import java.util.stream.Collectors;
2425

2526
public class FieldAndValueAndParametersCollector {
2627

27-
private List<FieldAndValueAndParameters> fieldsAndValue = new ArrayList<>();
28+
private List<Optional<FieldAndValueAndParameters>> fieldsAndValue = new ArrayList<>();
2829

2930
public FieldAndValueAndParametersCollector() {
3031
super();
3132
}
3233

33-
public void add(FieldAndValueAndParameters fieldAndValue) {
34+
public void add(Optional<FieldAndValueAndParameters> fieldAndValue) {
3435
fieldsAndValue.add(fieldAndValue);
3536
}
3637

@@ -41,23 +42,29 @@ public FieldAndValueAndParametersCollector merge(FieldAndValueAndParametersColle
4142

4243
public String columnsPhrase() {
4344
return fieldsAndValue.stream()
45+
.filter(Optional::isPresent)
46+
.map(Optional::get)
4447
.map(FieldAndValueAndParameters::fieldName)
4548
.collect(Collectors.joining(", ", "(", ")")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
4649
}
4750

4851
public String valuesPhrase() {
4952
return fieldsAndValue.stream()
53+
.filter(Optional::isPresent)
54+
.map(Optional::get)
5055
.map(FieldAndValueAndParameters::valuePhrase)
5156
.collect(Collectors.joining(", ", "values (", ")")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
5257
}
5358

5459
public Map<String, Object> parameters() {
5560
return fieldsAndValue.stream()
61+
.filter(Optional::isPresent)
62+
.map(Optional::get)
5663
.map(FieldAndValueAndParameters::parameters)
5764
.collect(HashMap::new, HashMap::putAll, HashMap::putAll);
5865
}
5966

60-
public static Collector<FieldAndValueAndParameters, FieldAndValueAndParametersCollector,
67+
public static Collector<Optional<FieldAndValueAndParameters>, FieldAndValueAndParametersCollector,
6168
FieldAndValueAndParametersCollector> collect() {
6269
return Collector.of(FieldAndValueAndParametersCollector::new,
6370
FieldAndValueAndParametersCollector::add,

src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertRenderer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.mybatis.dynamic.sql.util.StringUtilities.spaceBefore;
1919

2020
import java.util.Objects;
21+
import java.util.Optional;
2122
import java.util.function.Function;
2223

2324
import org.mybatis.dynamic.sql.insert.GeneralInsertModel;
@@ -51,12 +52,12 @@ private String calculateInsertStatement(FieldAndValueAndParametersCollector coll
5152
+ spaceBefore(collector.valuesPhrase());
5253
}
5354

54-
private Function<AbstractColumnMapping, FieldAndValueAndParameters> toFieldAndValue(
55+
private Function<AbstractColumnMapping, Optional<FieldAndValueAndParameters>> toFieldAndValue(
5556
GeneralInsertValuePhraseVisitor visitor) {
5657
return insertMapping -> toFieldAndValue(visitor, insertMapping);
5758
}
5859

59-
private FieldAndValueAndParameters toFieldAndValue(GeneralInsertValuePhraseVisitor visitor,
60+
private Optional<FieldAndValueAndParameters> toFieldAndValue(GeneralInsertValuePhraseVisitor visitor,
6061
AbstractColumnMapping insertMapping) {
6162
return insertMapping.accept(visitor);
6263
}

src/main/java/org/mybatis/dynamic/sql/insert/render/GeneralInsertValuePhraseVisitor.java

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.mybatis.dynamic.sql.insert.render;
1717

18+
import java.util.Optional;
1819
import java.util.concurrent.atomic.AtomicInteger;
1920
import java.util.function.Function;
2021

@@ -25,47 +26,62 @@
2526
import org.mybatis.dynamic.sql.util.NullMapping;
2627
import org.mybatis.dynamic.sql.util.StringConstantMapping;
2728
import org.mybatis.dynamic.sql.util.ValueMapping;
29+
import org.mybatis.dynamic.sql.util.ValueWhenPresentMapping;
2830

29-
public class GeneralInsertValuePhraseVisitor extends GeneralInsertMappingVisitor<FieldAndValueAndParameters> {
31+
public class GeneralInsertValuePhraseVisitor extends GeneralInsertMappingVisitor<Optional<FieldAndValueAndParameters>> {
3032

31-
protected RenderingStrategy renderingStrategy;
33+
private RenderingStrategy renderingStrategy;
3234
private AtomicInteger sequence = new AtomicInteger(1);
3335

3436
public GeneralInsertValuePhraseVisitor(RenderingStrategy renderingStrategy) {
3537
this.renderingStrategy = renderingStrategy;
3638
}
3739

3840
@Override
39-
public FieldAndValueAndParameters visit(NullMapping mapping) {
41+
public Optional<FieldAndValueAndParameters> visit(NullMapping mapping) {
4042
return FieldAndValueAndParameters.withFieldName(mapping.mapColumn(SqlColumn::name))
4143
.withValuePhrase("null") //$NON-NLS-1$
42-
.build();
44+
.buildOptional();
4345
}
4446

4547
@Override
46-
public FieldAndValueAndParameters visit(ConstantMapping mapping) {
48+
public Optional<FieldAndValueAndParameters> visit(ConstantMapping mapping) {
4749
return FieldAndValueAndParameters.withFieldName(mapping.mapColumn(SqlColumn::name))
4850
.withValuePhrase(mapping.constant())
49-
.build();
51+
.buildOptional();
5052
}
5153

5254
@Override
53-
public FieldAndValueAndParameters visit(StringConstantMapping mapping) {
55+
public Optional<FieldAndValueAndParameters> visit(StringConstantMapping mapping) {
5456
return FieldAndValueAndParameters.withFieldName(mapping.mapColumn(SqlColumn::name))
5557
.withValuePhrase("'" + mapping.constant() + "'") //$NON-NLS-1$ //$NON-NLS-2$
56-
.build();
58+
.buildOptional();
5759
}
5860

5961
@Override
60-
public <R> FieldAndValueAndParameters visit(ValueMapping<R> mapping) {
62+
public <R> Optional<FieldAndValueAndParameters> visit(ValueMapping<R> mapping) {
6163
String mapKey = RenderingStrategy.formatParameterMapKey(sequence);
6264

6365
String jdbcPlaceholder = mapping.mapColumn(toJdbcPlaceholder(mapKey));
6466

6567
return FieldAndValueAndParameters.withFieldName(mapping.mapColumn(SqlColumn::name))
6668
.withValuePhrase(jdbcPlaceholder)
6769
.withParameter(mapKey, mapping.value())
68-
.build();
70+
.buildOptional();
71+
}
72+
73+
@Override
74+
public <R> Optional<FieldAndValueAndParameters> visit(ValueWhenPresentMapping<R> mapping) {
75+
return mapping.value().flatMap(v -> {
76+
String mapKey = RenderingStrategy.formatParameterMapKey(sequence);
77+
78+
String jdbcPlaceholder = mapping.mapColumn(toJdbcPlaceholder(mapKey));
79+
80+
return FieldAndValueAndParameters.withFieldName(mapping.mapColumn(SqlColumn::name))
81+
.withValuePhrase(jdbcPlaceholder)
82+
.withParameter(mapKey, v)
83+
.buildOptional();
84+
});
6985
}
7086

7187
private Function<SqlColumn<?>, String> toJdbcPlaceholder(String parameterName) {

src/main/java/org/mybatis/dynamic/sql/util/GeneralInsertMappingVisitor.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,4 @@ public final T visit(PropertyMapping mapping) {
3030
public final T visit(ColumnToColumnMapping columnMapping) {
3131
throw new UnsupportedOperationException();
3232
}
33-
34-
@Override
35-
public <R> T visit(ValueWhenPresentMapping<R> mapping) {
36-
// TODO - remove this method
37-
return null;
38-
}
3933
}

src/main/java/org/mybatis/dynamic/sql/util/InsertMappingVisitor.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,17 @@ public final <R> T visit(ValueMapping<R> mapping) {
2222
}
2323

2424
@Override
25-
public final T visit(SelectMapping mapping) {
25+
public <R> T visit(ValueWhenPresentMapping<R> mapping) {
2626
throw new UnsupportedOperationException();
2727
}
2828

2929
@Override
30-
public final T visit(ColumnToColumnMapping columnMapping) {
30+
public final T visit(SelectMapping mapping) {
3131
throw new UnsupportedOperationException();
3232
}
3333

3434
@Override
35-
public <R> T visit(ValueWhenPresentMapping<R> mapping) {
36-
// TODO - remove this method
37-
return null;
35+
public final T visit(ColumnToColumnMapping columnMapping) {
36+
throw new UnsupportedOperationException();
3837
}
3938
}

src/test/java/org/mybatis/dynamic/sql/insert/InsertStatementTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.sql.JDBCType;
2323
import java.util.ArrayList;
2424
import java.util.List;
25+
import java.util.Optional;
2526
import java.util.stream.Collector;
2627

2728
import org.junit.jupiter.api.Test;
@@ -157,7 +158,7 @@ private FieldAndValue newFieldAndValue(String fieldName, String valuePhrase) {
157158
@Test
158159
void testParallelStreamWithParameters() {
159160

160-
List<FieldAndValueAndParameters> mappings = new ArrayList<>();
161+
List<Optional<FieldAndValueAndParameters>> mappings = new ArrayList<>();
161162

162163
mappings.add(newFieldAndValueAndParameter(id.name(), "{p1}", "p1", 1));
163164
mappings.add(newFieldAndValueAndParameter(firstName.name(), "{p2}", "p2", "Fred"));
@@ -180,12 +181,12 @@ void testParallelStreamWithParameters() {
180181
);
181182
}
182183

183-
private FieldAndValueAndParameters newFieldAndValueAndParameter(String fieldName, String valuePhrase, String parameterName,
184+
private Optional<FieldAndValueAndParameters> newFieldAndValueAndParameter(String fieldName, String valuePhrase, String parameterName,
184185
Object parameterValue) {
185186
return FieldAndValueAndParameters.withFieldName(fieldName)
186187
.withValuePhrase(valuePhrase)
187188
.withParameter(parameterName, parameterValue)
188-
.build();
189+
.buildOptional();
189190
}
190191

191192
@Test

src/test/java/org/mybatis/dynamic/sql/util/ColumnMappingVisitorTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,15 @@ void testThatInsertVisitorErrorsForValueMapping() {
7878
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> tv.visit(mapping));
7979
}
8080

81+
@Test
82+
void testThatInsertVisitorErrorsForValueWhenPresentMapping() {
83+
TestTable table = new TestTable();
84+
InsertVisitor tv = new InsertVisitor();
85+
ValueWhenPresentMapping<Integer> mapping = ValueWhenPresentMapping.of(table.id, () -> 3);
86+
87+
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(() -> tv.visit(mapping));
88+
}
89+
8190
@Test
8291
void testThatMultiRowInsertVisitorErrorsForColumnToColumnMapping() {
8392
TestTable table = new TestTable();
@@ -155,6 +164,11 @@ public String visit(StringConstantMapping mapping) {
155164
public <R> String visit(ValueMapping<R> mapping) {
156165
return "Value Mapping";
157166
}
167+
168+
@Override
169+
public <R> String visit(ValueWhenPresentMapping<R> mapping) {
170+
return "Value When Present Mapping";
171+
}
158172
}
159173

160174
private static class InsertVisitor extends InsertMappingVisitor<String> {

0 commit comments

Comments
 (0)