1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.dynamic.sql.select.render;
17
18 import java.util.Objects;
19 import java.util.Optional;
20 import java.util.stream.Collectors;
21 import java.util.stream.Stream;
22
23 import org.mybatis.dynamic.sql.BasicColumn;
24 import org.mybatis.dynamic.sql.render.RenderingContext;
25 import org.mybatis.dynamic.sql.select.caseexpression.SimpleCaseModel;
26 import org.mybatis.dynamic.sql.select.caseexpression.SimpleCaseWhenCondition;
27 import org.mybatis.dynamic.sql.util.FragmentAndParameters;
28 import org.mybatis.dynamic.sql.util.FragmentCollector;
29
30 public class SimpleCaseRenderer<T> {
31 private final SimpleCaseModel<T> simpleCaseModel;
32 private final RenderingContext renderingContext;
33 private final SimpleCaseWhenConditionRenderer<T> whenConditionRenderer;
34
35 public SimpleCaseRenderer(SimpleCaseModel<T> simpleCaseModel, RenderingContext renderingContext) {
36 this.simpleCaseModel = Objects.requireNonNull(simpleCaseModel);
37 this.renderingContext = Objects.requireNonNull(renderingContext);
38 whenConditionRenderer = new SimpleCaseWhenConditionRenderer<>(renderingContext, simpleCaseModel.column());
39 }
40
41 public FragmentAndParameters render() {
42 FragmentCollector fc = new FragmentCollector();
43 fc.add(renderCase());
44 fc.add(renderWhenConditions());
45 renderElse().ifPresent(fc::add);
46 fc.add(renderEnd());
47 return fc.toFragmentAndParameters(Collectors.joining(" "));
48 }
49
50 private FragmentAndParameters renderCase() {
51 return simpleCaseModel.column().alias()
52 .map(FragmentAndParameters::fromFragment)
53 .orElseGet(() -> simpleCaseModel.column().render(renderingContext))
54 .mapFragment(f -> "case " + f);
55 }
56
57 private FragmentAndParameters renderWhenConditions() {
58 return simpleCaseModel.whenConditions().map(this::renderWhenCondition)
59 .collect(FragmentCollector.collect())
60 .toFragmentAndParameters(Collectors.joining(" "));
61 }
62
63 private FragmentAndParameters renderWhenCondition(SimpleCaseWhenCondition<T> whenCondition) {
64 return Stream.of(
65 renderWhen(),
66 renderConditions(whenCondition),
67 renderThen(whenCondition)
68 ).collect(FragmentCollector.collect())
69 .toFragmentAndParameters(Collectors.joining(" "));
70 }
71
72 private FragmentAndParameters renderWhen() {
73 return FragmentAndParameters.fromFragment("when");
74 }
75
76 private FragmentAndParameters renderConditions(SimpleCaseWhenCondition<T> whenCondition) {
77 return whenCondition.accept(whenConditionRenderer);
78 }
79
80 private FragmentAndParameters renderThen(SimpleCaseWhenCondition<T> whenCondition) {
81 return whenCondition.thenValue().render(renderingContext)
82 .mapFragment(f -> "then " + f);
83 }
84
85 private Optional<FragmentAndParameters> renderElse() {
86 return simpleCaseModel.elseValue().map(this::renderElse);
87 }
88
89 private FragmentAndParameters renderElse(BasicColumn elseValue) {
90 return elseValue.render(renderingContext).mapFragment(f -> "else " + f);
91 }
92
93 private FragmentAndParameters renderEnd() {
94 return FragmentAndParameters.fromFragment("end");
95 }
96 }