1
2
3
4
5
6
7
8
9
10
11
12
13
14
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 }