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 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 }