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.select.caseexpression;
17  
18  import java.util.ArrayList;
19  import java.util.Arrays;
20  import java.util.List;
21  import java.util.Objects;
22  
23  import org.jspecify.annotations.Nullable;
24  import org.mybatis.dynamic.sql.BasicColumn;
25  import org.mybatis.dynamic.sql.BindableColumn;
26  import org.mybatis.dynamic.sql.RenderableCondition;
27  
28  public class SimpleCaseDSL<T> implements ElseDSL<SimpleCaseDSL<T>.SimpleCaseEnder> {
29      private final BindableColumn<T> column;
30      private final List<SimpleCaseWhenCondition<T>> whenConditions = new ArrayList<>();
31      private @Nullable BasicColumn elseValue;
32  
33      private SimpleCaseDSL(BindableColumn<T> column) {
34          this.column = Objects.requireNonNull(column);
35      }
36  
37      @SafeVarargs
38      public final ConditionBasedWhenFinisher when(RenderableCondition<T> condition,
39                                                   RenderableCondition<T>... subsequentConditions) {
40          return when(condition, Arrays.asList(subsequentConditions));
41      }
42  
43      public ConditionBasedWhenFinisher when(RenderableCondition<T> condition,
44                                             List<RenderableCondition<T>> subsequentConditions) {
45          return new ConditionBasedWhenFinisher(condition, subsequentConditions);
46      }
47  
48      @SafeVarargs
49      public final BasicWhenFinisher when(T condition, T... subsequentConditions) {
50          return when(condition, Arrays.asList(subsequentConditions));
51      }
52  
53      public BasicWhenFinisher when(T condition, List<T> subsequentConditions) {
54          return new BasicWhenFinisher(condition, subsequentConditions);
55      }
56  
57      @SuppressWarnings("java:S100")
58      @Override
59      public SimpleCaseEnder else_(BasicColumn column) {
60          elseValue = column;
61          return new SimpleCaseEnder();
62      }
63  
64      public SimpleCaseModel<T> end() {
65          return new SimpleCaseModel.Builder<T>()
66                  .withColumn(column)
67                  .withWhenConditions(whenConditions)
68                  .withElseValue(elseValue)
69                  .build();
70      }
71  
72      public class ConditionBasedWhenFinisher implements ThenDSL<SimpleCaseDSL<T>> {
73          private final List<RenderableCondition<T>> conditions = new ArrayList<>();
74  
75          private ConditionBasedWhenFinisher(RenderableCondition<T> condition,
76                                             List<RenderableCondition<T>> subsequentConditions) {
77              conditions.add(condition);
78              conditions.addAll(subsequentConditions);
79          }
80  
81          @Override
82          public SimpleCaseDSL<T> then(BasicColumn column) {
83              whenConditions.add(new ConditionBasedWhenCondition<>(conditions, column));
84              return SimpleCaseDSL.this;
85          }
86      }
87  
88      public class BasicWhenFinisher implements ThenDSL<SimpleCaseDSL<T>> {
89          private final List<T> values = new ArrayList<>();
90  
91          private BasicWhenFinisher(T value, List<T> subsequentValues) {
92              values.add(value);
93              values.addAll(subsequentValues);
94          }
95  
96          @Override
97          public SimpleCaseDSL<T> then(BasicColumn column) {
98              whenConditions.add(new BasicWhenCondition<>(values, column));
99              return SimpleCaseDSL.this;
100         }
101     }
102 
103     public class SimpleCaseEnder {
104         public SimpleCaseModel<T> end() {
105             return SimpleCaseDSL.this.end();
106         }
107     }
108 
109     public static <T> SimpleCaseDSL<T> simpleCase(BindableColumn<T> column) {
110         return new SimpleCaseDSL<>(column);
111     }
112 }