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  
22  import org.jspecify.annotations.Nullable;
23  import org.mybatis.dynamic.sql.AndOrCriteriaGroup;
24  import org.mybatis.dynamic.sql.BasicColumn;
25  import org.mybatis.dynamic.sql.BindableColumn;
26  import org.mybatis.dynamic.sql.ColumnAndConditionCriterion;
27  import org.mybatis.dynamic.sql.CriteriaGroup;
28  import org.mybatis.dynamic.sql.RenderableCondition;
29  import org.mybatis.dynamic.sql.SqlCriterion;
30  import org.mybatis.dynamic.sql.common.AbstractBooleanExpressionDSL;
31  
32  public class SearchedCaseDSL implements ElseDSL<SearchedCaseDSL.SearchedCaseEnder> {
33      private final List<SearchedCaseWhenCondition> whenConditions = new ArrayList<>();
34      private @Nullable BasicColumn elseValue;
35  
36      public <T> WhenDSL when(BindableColumn<T> column, RenderableCondition<T> condition,
37                              AndOrCriteriaGroup... subCriteria) {
38          return when(column, condition, Arrays.asList(subCriteria));
39      }
40  
41      public <T> WhenDSL when(BindableColumn<T> column, RenderableCondition<T> condition,
42                              List<AndOrCriteriaGroup> subCriteria) {
43          SqlCriterion sqlCriterion = ColumnAndConditionCriterion.withColumn(column)
44                  .withCondition(condition)
45                  .withSubCriteria(subCriteria)
46                  .build();
47  
48          return initialize(sqlCriterion);
49      }
50  
51      public WhenDSL when(SqlCriterion initialCriterion, AndOrCriteriaGroup... subCriteria) {
52          return when(initialCriterion, Arrays.asList(subCriteria));
53      }
54  
55      public WhenDSL when(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
56          SqlCriterion sqlCriterion = new CriteriaGroup.Builder()
57                  .withInitialCriterion(initialCriterion)
58                  .withSubCriteria(subCriteria)
59                  .build();
60  
61          return initialize(sqlCriterion);
62      }
63  
64      private WhenDSL initialize(SqlCriterion sqlCriterion) {
65          return new WhenDSL(sqlCriterion);
66      }
67  
68      @SuppressWarnings("java:S100")
69      @Override
70      public SearchedCaseEnder else_(BasicColumn column) {
71          elseValue = column;
72          return new SearchedCaseEnder();
73      }
74  
75      public SearchedCaseModel end() {
76          return new SearchedCaseModel.Builder()
77                  .withElseValue(elseValue)
78                  .withWhenConditions(whenConditions)
79                  .build();
80      }
81  
82      public class WhenDSL extends AbstractBooleanExpressionDSL<WhenDSL> implements ThenDSL<SearchedCaseDSL> {
83          private WhenDSL(SqlCriterion sqlCriterion) {
84              setInitialCriterion(sqlCriterion);
85          }
86  
87          @Override
88          public SearchedCaseDSL then(BasicColumn column) {
89              whenConditions.add(new SearchedCaseWhenCondition.Builder()
90                      .withInitialCriterion(getInitialCriterion())
91                      .withSubCriteria(subCriteria)
92                      .withThenValue(column)
93                      .build());
94              return SearchedCaseDSL.this;
95          }
96  
97          @Override
98          protected WhenDSL getThis() {
99              return this;
100         }
101     }
102 
103     public class SearchedCaseEnder {
104         public SearchedCaseModel end() {
105             return SearchedCaseDSL.this.end();
106         }
107     }
108 
109     public static SearchedCaseDSL searchedCase() {
110         return new SearchedCaseDSL();
111     }
112 }