1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.dynamic.sql.select.aggregate;
17
18 import java.util.function.Function;
19
20 import org.mybatis.dynamic.sql.BasicColumn;
21 import org.mybatis.dynamic.sql.BindableColumn;
22 import org.mybatis.dynamic.sql.RenderableCondition;
23 import org.mybatis.dynamic.sql.render.RenderingContext;
24 import org.mybatis.dynamic.sql.select.function.AbstractUniTypeFunction;
25 import org.mybatis.dynamic.sql.util.FragmentAndParameters;
26 import org.mybatis.dynamic.sql.util.Validator;
27 import org.mybatis.dynamic.sql.where.render.ColumnAndConditionRenderer;
28
29 public class Sum<T> extends AbstractUniTypeFunction<T, Sum<T>> {
30 private final Function<RenderingContext, FragmentAndParameters> renderer;
31
32 private Sum(BasicColumn column) {
33 super(column);
34 renderer = rc -> column.render(rc).mapFragment(this::applyAggregate);
35 }
36
37 private Sum(BindableColumn<T> column, RenderableCondition<T> condition) {
38 super(column);
39 renderer = rc -> {
40 Validator.assertTrue(condition.shouldRender(rc), "ERROR.37", "sum");
41
42 return new ColumnAndConditionRenderer.Builder<T>()
43 .withColumn(column)
44 .withCondition(condition)
45 .withRenderingContext(rc)
46 .build()
47 .render()
48 .mapFragment(this::applyAggregate);
49 };
50 }
51
52 private Sum(BasicColumn column, Function<RenderingContext, FragmentAndParameters> renderer) {
53 super(column);
54 this.renderer = renderer;
55 }
56
57 @Override
58 public FragmentAndParameters render(RenderingContext renderingContext) {
59 return renderer.apply(renderingContext);
60 }
61
62 private String applyAggregate(String s) {
63 return "sum(" + s + ")";
64 }
65
66 @Override
67 protected Sum<T> copy() {
68 return new Sum<>(column, renderer);
69 }
70
71 public static <T> Sum<T> of(BindableColumn<T> column) {
72 return new Sum<>(column);
73 }
74
75 public static Sum<Object> of(BasicColumn column) {
76 return new Sum<>(column);
77 }
78
79 public static <T> Sum<T> of(BindableColumn<T> column, RenderableCondition<T> condition) {
80 return new Sum<>(column, condition);
81 }
82 }