1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.dynamic.sql.select.function;
17
18 import java.util.ArrayList;
19 import java.util.Arrays;
20 import java.util.List;
21 import java.util.Objects;
22 import java.util.function.Function;
23 import java.util.stream.Collectors;
24 import java.util.stream.Stream;
25
26 import org.mybatis.dynamic.sql.BasicColumn;
27 import org.mybatis.dynamic.sql.BindableColumn;
28 import org.mybatis.dynamic.sql.render.RenderingContext;
29 import org.mybatis.dynamic.sql.util.FragmentAndParameters;
30 import org.mybatis.dynamic.sql.util.FragmentCollector;
31
32 public class OperatorFunction<T> extends AbstractUniTypeFunction<T, OperatorFunction<T>> {
33
34 protected final BasicColumn secondColumn;
35 protected final List<BasicColumn> subsequentColumns = new ArrayList<>();
36 private final String operator;
37
38 protected OperatorFunction(String operator, BasicColumn firstColumn, BasicColumn secondColumn,
39 List<BasicColumn> subsequentColumns) {
40 super(firstColumn);
41 this.secondColumn = Objects.requireNonNull(secondColumn);
42 this.subsequentColumns.addAll(subsequentColumns);
43 this.operator = Objects.requireNonNull(operator);
44 }
45
46 @Override
47 protected OperatorFunction<T> copy() {
48 return new OperatorFunction<>(operator, column, secondColumn, subsequentColumns);
49 }
50
51 @Override
52 public FragmentAndParameters render(RenderingContext renderingContext) {
53 String paddedOperator = " " + operator + " ";
54
55 return Stream.of(Stream.of(column, secondColumn), subsequentColumns.stream())
56 .flatMap(Function.identity())
57 .map(column -> column.render(renderingContext))
58 .collect(FragmentCollector.collect())
59 .toFragmentAndParameters(Collectors.joining(paddedOperator, "(", ")"));
60 }
61
62 public static <T> OperatorFunction<T> of(String operator, BindableColumn<T> firstColumn, BasicColumn secondColumn,
63 BasicColumn... subsequentColumns) {
64 return of(operator, firstColumn, secondColumn, Arrays.asList(subsequentColumns));
65 }
66
67 public static <T> OperatorFunction<T> of(String operator, BindableColumn<T> firstColumn, BasicColumn secondColumn,
68 List<BasicColumn> subsequentColumns) {
69 return new OperatorFunction<>(operator, firstColumn, secondColumn, subsequentColumns);
70 }
71 }