View Javadoc
1   /*
2    *    Copyright 2016-2025 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
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") //$NON-NLS-1$
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  }