View Javadoc
1   /*
2    *    Copyright 2016-2025 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       https://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.mybatis.dynamic.sql.where;
17  
18  import java.util.Objects;
19  import java.util.Optional;
20  
21  import org.jspecify.annotations.Nullable;
22  import org.mybatis.dynamic.sql.common.AbstractBooleanExpressionModel;
23  import org.mybatis.dynamic.sql.configuration.StatementConfiguration;
24  import org.mybatis.dynamic.sql.render.RenderingContext;
25  import org.mybatis.dynamic.sql.render.RenderingStrategy;
26  import org.mybatis.dynamic.sql.render.TableAliasCalculator;
27  import org.mybatis.dynamic.sql.util.FragmentAndParameters;
28  import org.mybatis.dynamic.sql.where.render.DefaultWhereClauseProvider;
29  import org.mybatis.dynamic.sql.where.render.WhereClauseProvider;
30  import org.mybatis.dynamic.sql.where.render.WhereRenderer;
31  
32  public class WhereModel extends AbstractBooleanExpressionModel {
33      private final StatementConfiguration statementConfiguration;
34  
35      private WhereModel(Builder builder) {
36          super(builder);
37          statementConfiguration = Objects.requireNonNull(builder.statementConfiguration);
38      }
39  
40      /**
41       * Renders a where clause without table aliases.
42       *
43       * @param renderingStrategy
44       *            rendering strategy
45       *
46       * @return rendered where clause
47       */
48      public Optional<WhereClauseProvider> render(RenderingStrategy renderingStrategy) {
49          RenderingContext renderingContext = RenderingContext.withRenderingStrategy(renderingStrategy)
50                  .withStatementConfiguration(statementConfiguration).build();
51  
52          return render(renderingContext);
53      }
54  
55      public Optional<WhereClauseProvider> render(RenderingStrategy renderingStrategy,
56                                                  TableAliasCalculator tableAliasCalculator) {
57          RenderingContext renderingContext = RenderingContext
58                  .withRenderingStrategy(renderingStrategy)
59                  .withTableAliasCalculator(tableAliasCalculator)
60                  .withStatementConfiguration(statementConfiguration)
61                  .build();
62  
63          return render(renderingContext);
64      }
65  
66      public Optional<WhereClauseProvider> render(RenderingStrategy renderingStrategy, String parameterName) {
67          RenderingContext renderingContext = RenderingContext
68                  .withRenderingStrategy(renderingStrategy)
69                  .withParameterName(parameterName)
70                  .withStatementConfiguration(statementConfiguration)
71                  .build();
72  
73          return render(renderingContext);
74      }
75  
76      public Optional<WhereClauseProvider> render(RenderingStrategy renderingStrategy,
77              TableAliasCalculator tableAliasCalculator, String parameterName) {
78          RenderingContext renderingContext = RenderingContext
79                  .withRenderingStrategy(renderingStrategy)
80                  .withTableAliasCalculator(tableAliasCalculator)
81                  .withParameterName(parameterName)
82                  .withStatementConfiguration(statementConfiguration)
83                  .build();
84  
85          return render(renderingContext);
86      }
87  
88      private Optional<WhereClauseProvider> render(RenderingContext renderingContext) {
89          return WhereRenderer.withWhereModel(this)
90                  .withRenderingContext(renderingContext)
91                  .build()
92                  .render()
93                  .map(this::toWhereClauseProvider);
94      }
95  
96      private WhereClauseProvider toWhereClauseProvider(FragmentAndParameters fragmentAndParameters) {
97          return DefaultWhereClauseProvider.withWhereClause(fragmentAndParameters.fragment())
98                  .withParameters(fragmentAndParameters.parameters())
99                  .build();
100     }
101 
102     public static class Builder extends AbstractBuilder<Builder> {
103         private @Nullable StatementConfiguration statementConfiguration;
104 
105         public Builder withStatementConfiguration(StatementConfiguration statementConfiguration) {
106             this.statementConfiguration = statementConfiguration;
107             return this;
108         }
109 
110         public WhereModel build() {
111             return new WhereModel(this);
112         }
113 
114         @Override
115         protected Builder getThis() {
116             return this;
117         }
118     }
119 }