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.exception.InvalidSqlException;
25 import org.mybatis.dynamic.sql.render.RenderingContext;
26 import org.mybatis.dynamic.sql.select.caseexpression.SearchedCaseModel;
27 import org.mybatis.dynamic.sql.select.caseexpression.SearchedCaseWhenCondition;
28 import org.mybatis.dynamic.sql.util.FragmentAndParameters;
29 import org.mybatis.dynamic.sql.util.FragmentCollector;
30 import org.mybatis.dynamic.sql.util.Messages;
31
32 public class SearchedCaseRenderer {
33 private final SearchedCaseModel searchedCaseModel;
34 private final RenderingContext renderingContext;
35
36 public SearchedCaseRenderer(SearchedCaseModel searchedCaseModel, RenderingContext renderingContext) {
37 this.searchedCaseModel = Objects.requireNonNull(searchedCaseModel);
38 this.renderingContext = Objects.requireNonNull(renderingContext);
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 FragmentAndParameters.fromFragment("case");
52 }
53
54 private FragmentAndParameters renderWhenConditions() {
55 return searchedCaseModel.whenConditions().map(this::renderWhenCondition)
56 .collect(FragmentCollector.collect())
57 .toFragmentAndParameters(Collectors.joining(" "));
58 }
59
60 private FragmentAndParameters renderWhenCondition(SearchedCaseWhenCondition whenCondition) {
61 return Stream.of(renderWhen(whenCondition), renderThen(whenCondition)).collect(FragmentCollector.collect())
62 .toFragmentAndParameters(Collectors.joining(" "));
63 }
64
65 private FragmentAndParameters renderWhen(SearchedCaseWhenCondition whenCondition) {
66 SearchedCaseWhenConditionRenderer renderer = new SearchedCaseWhenConditionRenderer.Builder(whenCondition)
67 .withRenderingContext(renderingContext)
68 .build();
69
70 return renderer.render()
71 .orElseThrow(() -> new InvalidSqlException(Messages.getString("ERROR.39")));
72 }
73
74 private FragmentAndParameters renderThen(SearchedCaseWhenCondition whenCondition) {
75 return whenCondition.thenValue().render(renderingContext).mapFragment(f -> "then " + f);
76 }
77
78 private Optional<FragmentAndParameters> renderElse() {
79 return searchedCaseModel.elseValue().map(this::renderElse);
80 }
81
82 private FragmentAndParameters renderElse(BasicColumn elseValue) {
83 return elseValue.render(renderingContext).mapFragment(f -> "else " + f);
84 }
85
86 private FragmentAndParameters renderEnd() {
87 return FragmentAndParameters.fromFragment("end");
88 }
89 }