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.stream.Stream;
23
24 import org.jspecify.annotations.Nullable;
25 import org.mybatis.dynamic.sql.render.RenderingStrategy;
26 import org.mybatis.dynamic.sql.select.render.SelectRenderer;
27 import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
28 import org.mybatis.dynamic.sql.util.Validator;
29
30 public class SelectModel extends AbstractSelectModel {
31 private final List<QueryExpressionModel> queryExpressions;
32 private final @Nullable String forClause;
33 private final @Nullable String waitClause;
34
35 private SelectModel(Builder builder) {
36 super(builder);
37 queryExpressions = Objects.requireNonNull(builder.queryExpressions);
38 Validator.assertNotEmpty(queryExpressions, "ERROR.14");
39 forClause = builder.forClause;
40 waitClause = builder.waitClause;
41 }
42
43 public Stream<QueryExpressionModel> queryExpressions() {
44 return queryExpressions.stream();
45 }
46
47 public Optional<String> forClause() {
48 return Optional.ofNullable(forClause);
49 }
50
51 public Optional<String> waitClause() {
52 return Optional.ofNullable(waitClause);
53 }
54
55 public SelectStatementProvider render(RenderingStrategy renderingStrategy) {
56 return SelectRenderer.withSelectModel(this)
57 .withRenderingStrategy(renderingStrategy)
58 .build()
59 .render();
60 }
61
62 public static Builder withQueryExpressions(List<QueryExpressionModel> queryExpressions) {
63 return new Builder().withQueryExpressions(queryExpressions);
64 }
65
66 public static class Builder extends AbstractBuilder<Builder> {
67 private final List<QueryExpressionModel> queryExpressions = new ArrayList<>();
68 private @Nullable String forClause;
69 private @Nullable String waitClause;
70
71 public Builder withQueryExpression(QueryExpressionModel queryExpression) {
72 this.queryExpressions.add(queryExpression);
73 return this;
74 }
75
76 public Builder withQueryExpressions(List<QueryExpressionModel> queryExpressions) {
77 this.queryExpressions.addAll(queryExpressions);
78 return this;
79 }
80
81 public Builder withForClause(@Nullable String forClause) {
82 this.forClause = forClause;
83 return this;
84 }
85
86 public Builder withWaitClause(@Nullable String waitClause) {
87 this.waitClause = waitClause;
88 return this;
89 }
90
91 @Override
92 protected Builder getThis() {
93 return this;
94 }
95
96 public SelectModel build() {
97 return new SelectModel(this);
98 }
99 }
100 }