1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.mybatis.dynamic.sql.select;
17
18 import java.util.ArrayList;
19 import java.util.List;
20 import java.util.Objects;
21 import java.util.Optional;
22 import java.util.function.Function;
23 import java.util.stream.Stream;
24
25 import org.jspecify.annotations.Nullable;
26 import org.mybatis.dynamic.sql.render.RenderingStrategy;
27 import org.mybatis.dynamic.sql.select.render.SelectRenderer;
28 import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
29 import org.mybatis.dynamic.sql.util.Validator;
30
31 public class SelectModel extends AbstractSelectModel {
32 private final List<QueryExpressionModel> queryExpressions;
33 private final @Nullable String forClause;
34 private final @Nullable String waitClause;
35
36 private SelectModel(Builder builder) {
37 super(builder);
38 queryExpressions = Objects.requireNonNull(builder.queryExpressions);
39 Validator.assertNotEmpty(queryExpressions, "ERROR.14");
40 forClause = builder.forClause;
41 waitClause = builder.waitClause;
42 }
43
44 public Stream<QueryExpressionModel> queryExpressions() {
45 return queryExpressions.stream();
46 }
47
48 public Optional<String> forClause() {
49 return Optional.ofNullable(forClause);
50 }
51
52 public Optional<String> waitClause() {
53 return Optional.ofNullable(waitClause);
54 }
55
56 public SelectStatementProvider render(RenderingStrategy renderingStrategy) {
57 return SelectRenderer.withSelectModel(this)
58 .withRenderingStrategy(renderingStrategy)
59 .build()
60 .render();
61 }
62
63 public <R> R map(Function<SelectModel, R> mapper) {
64 return mapper.apply(this);
65 }
66
67 public static Builder withQueryExpressions(List<QueryExpressionModel> queryExpressions) {
68 return new Builder().withQueryExpressions(queryExpressions);
69 }
70
71 public static class Builder extends AbstractBuilder<Builder> {
72 private final List<QueryExpressionModel> queryExpressions = new ArrayList<>();
73 private @Nullable String forClause;
74 private @Nullable String waitClause;
75
76 public Builder withQueryExpression(QueryExpressionModel queryExpression) {
77 this.queryExpressions.add(queryExpression);
78 return this;
79 }
80
81 public Builder withQueryExpressions(List<QueryExpressionModel> queryExpressions) {
82 this.queryExpressions.addAll(queryExpressions);
83 return this;
84 }
85
86 public Builder withForClause(@Nullable String forClause) {
87 this.forClause = forClause;
88 return this;
89 }
90
91 public Builder withWaitClause(@Nullable String waitClause) {
92 this.waitClause = waitClause;
93 return this;
94 }
95
96 @Override
97 protected Builder getThis() {
98 return this;
99 }
100
101 public SelectModel build() {
102 return new SelectModel(this);
103 }
104 }
105 }