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.Objects;
19 import java.util.Optional;
20
21 import org.jspecify.annotations.Nullable;
22 import org.mybatis.dynamic.sql.BasicColumn;
23 import org.mybatis.dynamic.sql.render.RenderingContext;
24 import org.mybatis.dynamic.sql.util.FragmentAndParameters;
25
26 public class Cast implements BasicColumn {
27 private final BasicColumn column;
28 private final String targetType;
29 private final @Nullable String alias;
30
31 private Cast(Builder builder) {
32 column = Objects.requireNonNull(builder.column);
33 targetType = Objects.requireNonNull(builder.targetType);
34 alias = builder.alias;
35 }
36
37 @Override
38 public Optional<String> alias() {
39 return Optional.ofNullable(alias);
40 }
41
42 @Override
43 public Cast as(String alias) {
44 return new Builder().withColumn(column)
45 .withTargetType(targetType)
46 .withAlias(alias)
47 .build();
48 }
49
50 @Override
51 public FragmentAndParameters render(RenderingContext renderingContext) {
52 return column.render(renderingContext).mapFragment(this::applyCast);
53 }
54
55 private String applyCast(String in) {
56 return "cast(" + in + " as " + targetType + ")";
57 }
58
59 public static class Builder {
60 private @Nullable BasicColumn column;
61 private @Nullable String targetType;
62 private @Nullable String alias;
63
64 public Builder withColumn(BasicColumn column) {
65 this.column = column;
66 return this;
67 }
68
69 public Builder withTargetType(String targetType) {
70 this.targetType = targetType;
71 return this;
72 }
73
74 public Builder withAlias(String alias) {
75 this.alias = alias;
76 return this;
77 }
78
79 public Cast build() {
80 return new Cast(this);
81 }
82 }
83 }