1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.dsl.BooleanOperations;
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 implements BooleanOperations<WhenDSL>, ThenDSL<SearchedCaseDSL> {
83 protected final SqlCriterion initialCriterion;
84 protected final List<AndOrCriteriaGroup> subCriteria = new ArrayList<>();
85
86 private WhenDSL(SqlCriterion sqlCriterion) {
87 initialCriterion = sqlCriterion;
88 }
89
90 @Override
91 public SearchedCaseDSL then(BasicColumn column) {
92 whenConditions.add(new SearchedCaseWhenCondition.Builder()
93 .withInitialCriterion(initialCriterion)
94 .withSubCriteria(subCriteria)
95 .withThenValue(column)
96 .build());
97 return SearchedCaseDSL.this;
98 }
99
100 @Override
101 public WhenDSL addSubCriterion(AndOrCriteriaGroup subCriterion) {
102 subCriteria.add(subCriterion);
103 return this;
104 }
105 }
106
107 public class SearchedCaseEnder {
108 public SearchedCaseModel end() {
109 return SearchedCaseDSL.this.end();
110 }
111 }
112
113 public static SearchedCaseDSL searchedCase() {
114 return new SearchedCaseDSL();
115 }
116 }