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.mybatis3;
17  
18  import static org.assertj.core.api.Assertions.assertThat;
19  
20  import java.sql.JDBCType;
21  import java.util.Date;
22  import java.util.HashMap;
23  import java.util.Map;
24  
25  import org.junit.jupiter.api.Test;
26  import org.mybatis.dynamic.sql.ColumnAndConditionCriterion;
27  import org.mybatis.dynamic.sql.SqlBuilder;
28  import org.mybatis.dynamic.sql.SqlColumn;
29  import org.mybatis.dynamic.sql.SqlTable;
30  import org.mybatis.dynamic.sql.configuration.StatementConfiguration;
31  import org.mybatis.dynamic.sql.render.ExplicitTableAliasCalculator;
32  import org.mybatis.dynamic.sql.render.RenderingContext;
33  import org.mybatis.dynamic.sql.render.RenderingStrategies;
34  import org.mybatis.dynamic.sql.util.FragmentAndParameters;
35  import org.mybatis.dynamic.sql.where.condition.IsEqualTo;
36  import org.mybatis.dynamic.sql.where.render.CriterionRenderer;
37  
38  class CriterionRendererTest {
39      @Test
40      void testAliasWithIgnore() {
41          SqlTable table = SqlTable.of("foo");
42          SqlColumn<Integer> column = table.column("id", JDBCType.INTEGER);
43  
44          IsEqualTo<Integer> condition = SqlBuilder.isEqualTo(() -> 3);
45          ColumnAndConditionCriterion<Integer> criterion = ColumnAndConditionCriterion.withColumn(column)
46                  .withCondition(condition)
47                  .build();
48  
49          RenderingContext renderingContext =RenderingContext.withRenderingStrategy(RenderingStrategies.MYBATIS3)
50                  .withStatementConfiguration(new StatementConfiguration()).build();
51  
52          CriterionRenderer renderer = new CriterionRenderer(renderingContext);
53  
54          assertThat(criterion.accept(renderer)).hasValueSatisfying(rc -> {
55              FragmentAndParameters fp = rc.fragmentAndParametersWithConnector();
56              assertThat(fp.fragment()).isEqualTo("id = #{parameters.p1,jdbcType=INTEGER}");
57              assertThat(fp.parameters()).hasSize(1);
58          });
59      }
60  
61      @Test
62      void testAliasWithoutIgnore() {
63          SqlTable table = SqlTable.of("foo");
64          SqlColumn<Integer> column = table.column("id", JDBCType.INTEGER);
65          IsEqualTo<Integer> condition = SqlBuilder.isEqualTo(() -> 3);
66          ColumnAndConditionCriterion<Integer> criterion = ColumnAndConditionCriterion.withColumn(column)
67                  .withCondition(condition)
68                  .build();
69          Map<SqlTable, String> tableAliases = new HashMap<>();
70          tableAliases.put(table, "a");
71  
72          RenderingContext renderingContext = RenderingContext
73                  .withRenderingStrategy(RenderingStrategies.MYBATIS3)
74                  .withTableAliasCalculator(ExplicitTableAliasCalculator.of(tableAliases))
75                  .withStatementConfiguration(new StatementConfiguration())
76                  .build();
77  
78          CriterionRenderer renderer = new CriterionRenderer(renderingContext);
79  
80          assertThat(criterion.accept(renderer)).hasValueSatisfying(rc -> {
81              FragmentAndParameters fp = rc.fragmentAndParametersWithConnector();
82              assertThat(fp.fragment()).isEqualTo("a.id = #{parameters.p1,jdbcType=INTEGER}");
83              assertThat(fp.parameters()).hasSize(1);
84          });
85      }
86  
87      @Test
88      void testTypeHandler() {
89          SqlTable table = SqlTable.of("foo");
90          SqlColumn<Date> column = new SqlColumn.Builder<Date>()
91                  .withName("id")
92                  .withTable(table)
93                  .withJdbcType(JDBCType.DATE)
94                  .withTypeHandler("foo.Bar")
95                  .build();
96          IsEqualTo<Date> condition = SqlBuilder.isEqualTo(new Date());
97          ColumnAndConditionCriterion<Date> criterion = ColumnAndConditionCriterion.withColumn(column)
98                  .withCondition(condition)
99                  .build();
100 
101         RenderingContext renderingContext = RenderingContext
102                 .withRenderingStrategy(RenderingStrategies.MYBATIS3)
103                 .withStatementConfiguration(new StatementConfiguration())
104                 .build();
105 
106         CriterionRenderer renderer = new CriterionRenderer(renderingContext);
107 
108         assertThat(criterion.accept(renderer)).hasValueSatisfying(rc -> {
109             FragmentAndParameters fp = rc.fragmentAndParametersWithConnector();
110             assertThat(fp.fragment()).isEqualTo("id = #{parameters.p1,jdbcType=DATE,typeHandler=foo.Bar}");
111             assertThat(fp.parameters()).hasSize(1);
112         });
113     }
114 
115     @Test
116     void testTypeHandlerAndAlias() {
117         SqlTable table = SqlTable.of("foo");
118         SqlColumn<Integer> column = table.column("id", JDBCType.INTEGER, "foo.Bar");
119         IsEqualTo<Integer> condition = SqlBuilder.isEqualTo(() -> 3);
120         ColumnAndConditionCriterion<Integer> criterion = ColumnAndConditionCriterion.withColumn(column)
121                 .withCondition(condition)
122                 .build();
123         Map<SqlTable, String> tableAliases = new HashMap<>();
124         tableAliases.put(table, "a");
125 
126         RenderingContext renderingContext = RenderingContext
127                 .withRenderingStrategy(RenderingStrategies.MYBATIS3)
128                 .withTableAliasCalculator(ExplicitTableAliasCalculator.of(tableAliases))
129                 .withStatementConfiguration(new StatementConfiguration())
130                 .build();
131 
132         CriterionRenderer renderer = new CriterionRenderer(renderingContext);
133 
134         assertThat(criterion.accept(renderer)).hasValueSatisfying(rc -> {
135             FragmentAndParameters fp = rc.fragmentAndParametersWithConnector();
136             assertThat(fp.fragment()).isEqualTo("a.id = #{parameters.p1,jdbcType=INTEGER,typeHandler=foo.Bar}");
137             assertThat(fp.parameters()).hasSize(1);
138         });
139     }
140 }