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.stream.Collectors;
20
21 import org.mybatis.dynamic.sql.BindableColumn;
22 import org.mybatis.dynamic.sql.RenderableCondition;
23 import org.mybatis.dynamic.sql.render.RenderedParameterInfo;
24 import org.mybatis.dynamic.sql.render.RenderingContext;
25 import org.mybatis.dynamic.sql.select.caseexpression.BasicWhenCondition;
26 import org.mybatis.dynamic.sql.select.caseexpression.ConditionBasedWhenCondition;
27 import org.mybatis.dynamic.sql.select.caseexpression.SimpleCaseWhenConditionVisitor;
28 import org.mybatis.dynamic.sql.util.FragmentAndParameters;
29 import org.mybatis.dynamic.sql.util.FragmentCollector;
30 import org.mybatis.dynamic.sql.util.Validator;
31
32 public class SimpleCaseWhenConditionRenderer<T> implements SimpleCaseWhenConditionVisitor<T, FragmentAndParameters> {
33 private final RenderingContext renderingContext;
34 private final BindableColumn<T> column;
35
36 public SimpleCaseWhenConditionRenderer(RenderingContext renderingContext, BindableColumn<T> column) {
37 this.renderingContext = Objects.requireNonNull(renderingContext);
38 this.column = Objects.requireNonNull(column);
39 }
40
41 @Override
42 public FragmentAndParameters visit(ConditionBasedWhenCondition<T> whenCondition) {
43 FragmentCollector fragmentCollector = whenCondition.conditions()
44 .filter(this::shouldRender)
45 .map(this::renderCondition)
46 .collect(FragmentCollector.collect());
47
48 Validator.assertFalse(fragmentCollector.isEmpty(), "ERROR.39");
49
50 return fragmentCollector.toFragmentAndParameters(Collectors.joining(", "));
51 }
52
53 @Override
54 public FragmentAndParameters visit(BasicWhenCondition<T> whenCondition) {
55 return whenCondition.conditions().map(this::renderBasicValue)
56 .collect(FragmentCollector.collect())
57 .toFragmentAndParameters(Collectors.joining(", "));
58 }
59
60 private boolean shouldRender(RenderableCondition<T> condition) {
61 return condition.shouldRender(renderingContext);
62 }
63
64 private FragmentAndParameters renderCondition(RenderableCondition<T> condition) {
65 return condition.renderCondition(renderingContext, column);
66 }
67
68 private FragmentAndParameters renderBasicValue(T value) {
69 RenderedParameterInfo rpi = renderingContext.calculateParameterInfo(column);
70 return FragmentAndParameters.withFragment(rpi.renderedPlaceHolder())
71 .withParameter(rpi.parameterMapKey(), value)
72 .build();
73 }
74 }