1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.dynamic.sql.insert.render;
17
18 import java.util.Objects;
19 import java.util.Optional;
20
21 import org.jspecify.annotations.Nullable;
22 import org.mybatis.dynamic.sql.render.RenderedParameterInfo;
23 import org.mybatis.dynamic.sql.render.RenderingContext;
24 import org.mybatis.dynamic.sql.util.AbstractColumnMapping;
25 import org.mybatis.dynamic.sql.util.ConstantMapping;
26 import org.mybatis.dynamic.sql.util.GeneralInsertMappingVisitor;
27 import org.mybatis.dynamic.sql.util.NullMapping;
28 import org.mybatis.dynamic.sql.util.StringConstantMapping;
29 import org.mybatis.dynamic.sql.util.StringUtilities;
30 import org.mybatis.dynamic.sql.util.ValueMapping;
31 import org.mybatis.dynamic.sql.util.ValueOrNullMapping;
32 import org.mybatis.dynamic.sql.util.ValueWhenPresentMapping;
33
34 public class GeneralInsertValuePhraseVisitor extends GeneralInsertMappingVisitor<Optional<FieldAndValueAndParameters>> {
35
36 private final RenderingContext renderingContext;
37
38 public GeneralInsertValuePhraseVisitor(RenderingContext renderingContext) {
39 this.renderingContext = Objects.requireNonNull(renderingContext);
40 }
41
42 @Override
43 public Optional<FieldAndValueAndParameters> visit(NullMapping mapping) {
44 return buildNullFragment(mapping);
45 }
46
47 @Override
48 public Optional<FieldAndValueAndParameters> visit(ConstantMapping mapping) {
49 return FieldAndValueAndParameters.withFieldName(mapping.columnName())
50 .withValuePhrase(mapping.constant())
51 .buildOptional();
52 }
53
54 @Override
55 public Optional<FieldAndValueAndParameters> visit(StringConstantMapping mapping) {
56 return FieldAndValueAndParameters.withFieldName(mapping.columnName())
57 .withValuePhrase(StringUtilities.formatConstantForSQL(mapping.constant()))
58 .buildOptional();
59 }
60
61 @Override
62 public <T> Optional<FieldAndValueAndParameters> visit(ValueMapping<T> mapping) {
63 return buildValueFragment(mapping, mapping.value());
64 }
65
66 @Override
67 public <T> Optional<FieldAndValueAndParameters> visit(ValueOrNullMapping<T> mapping) {
68 return mapping.value().map(v -> buildValueFragment(mapping, v))
69 .orElseGet(() -> buildNullFragment(mapping));
70 }
71
72 @Override
73 public <T> Optional<FieldAndValueAndParameters> visit(ValueWhenPresentMapping<T> mapping) {
74 return mapping.value().flatMap(v -> buildValueFragment(mapping, v));
75 }
76
77 private Optional<FieldAndValueAndParameters> buildValueFragment(AbstractColumnMapping mapping,
78 @Nullable Object value) {
79 return buildFragment(mapping, value);
80 }
81
82 private Optional<FieldAndValueAndParameters> buildNullFragment(AbstractColumnMapping mapping) {
83 return FieldAndValueAndParameters.withFieldName(mapping.columnName())
84 .withValuePhrase("null")
85 .buildOptional();
86 }
87
88 private Optional<FieldAndValueAndParameters> buildFragment(AbstractColumnMapping mapping, @Nullable Object value) {
89 RenderedParameterInfo parameterInfo = renderingContext.calculateParameterInfo(mapping.column());
90
91 return FieldAndValueAndParameters.withFieldName(mapping.columnName())
92 .withValuePhrase(parameterInfo.renderedPlaceHolder())
93 .withParameter(parameterInfo.parameterMapKey(), value)
94 .buildOptional();
95 }
96 }