2020import static org .assertj .core .api .Assertions .assertThat ;
2121import static org .mybatis .dynamic .sql .SqlBuilder .*;
2222
23- import java .util .* ;
23+ import java .util .Optional ;
2424import java .util .stream .Stream ;
2525
26+ import org .jspecify .annotations .NullMarked ;
27+ import org .jspecify .annotations .Nullable ;
2628import org .junit .jupiter .api .Test ;
2729import org .junit .jupiter .params .ParameterizedTest ;
2830import org .junit .jupiter .params .provider .MethodSource ;
3941import org .mybatis .dynamic .sql .where .WhereDSL ;
4042import org .mybatis .dynamic .sql .where .render .WhereClauseProvider ;
4143
44+ @ NullMarked
4245class EmptyWhereTest {
46+ private static final String FIRST_NAME = "Fred" ;
47+ private static final String LAST_NAME = "Flintstone" ;
4348
44- static List <Variation > baseVariations () {
45- String firstName = "Fred" ;
46- String lastName = "Flintstone" ;
47-
48- Variation v1 = new Variation (firstName , lastName ,
49+ static Stream <Variation > whereVariations () {
50+ Variation v1 = new Variation (FIRST_NAME , LAST_NAME ,
4951 "where first_name = #{parameters.p1} or last_name = #{parameters.p2}" );
5052
51- Variation v2 = new Variation (null , lastName ,
53+ Variation v2 = new Variation (null , LAST_NAME ,
5254 "where last_name = #{parameters.p1}" );
5355
54- Variation v3 = new Variation (firstName , null ,
56+ Variation v3 = new Variation (FIRST_NAME , null ,
5557 "where first_name = #{parameters.p1}" );
5658
5759 Variation v4 = new Variation (null , null , "" );
5860
59- return List .of (v1 , v2 , v3 , v4 );
60- }
61-
62- static Stream <Variation > whereVariations () {
63- return baseVariations ().stream ();
61+ return Stream .of (v1 , v2 , v3 , v4 );
6462 }
6563
6664 static Stream <Variation > joinWhereVariations () {
67- List <Variation > baseVariations = baseVariations ();
65+ Variation v1 = new Variation (FIRST_NAME , LAST_NAME ,
66+ "where person.first_name = #{parameters.p1} or person.last_name = #{parameters.p2}" );
6867
69- baseVariations .get (0 ).whereClause =
70- "where person.first_name = #{parameters.p1} or person.last_name = #{parameters.p2}" ;
71- baseVariations .get (1 ).whereClause = "where person.last_name = #{parameters.p1}" ;
72- baseVariations .get (2 ).whereClause = "where person.first_name = #{parameters.p1}" ;
68+ Variation v2 = new Variation (null , LAST_NAME ,
69+ "where person.last_name = #{parameters.p1}" );
7370
74- return baseVariations .stream ();
71+ Variation v3 = new Variation (FIRST_NAME , null ,
72+ "where person.first_name = #{parameters.p1}" );
73+
74+ Variation v4 = new Variation (null , null , "" );
75+
76+ return Stream .of (v1 , v2 , v3 , v4 );
7577 }
7678
7779 static Stream <Variation > updateWhereVariations () {
78- List <Variation > baseVariations = baseVariations ();
80+ Variation v1 = new Variation (FIRST_NAME , LAST_NAME ,
81+ "where first_name = #{parameters.p2} or last_name = #{parameters.p3}" );
7982
80- baseVariations .get (0 ).whereClause =
81- "where first_name = #{parameters.p2} or last_name = #{parameters.p3}" ;
82- baseVariations .get (1 ).whereClause ="where last_name = #{parameters.p2}" ;
83- baseVariations .get (2 ).whereClause = "where first_name = #{parameters.p2}" ;
83+ Variation v2 = new Variation (null , LAST_NAME ,
84+ "where last_name = #{parameters.p2}" );
8485
85- return baseVariations .stream ();
86+ Variation v3 = new Variation (FIRST_NAME , null ,
87+ "where first_name = #{parameters.p2}" );
88+
89+ Variation v4 = new Variation (null , null , "" );
90+
91+ return Stream .of (v1 , v2 , v3 , v4 );
8692 }
8793
8894 @ Test
8995 void testDeleteThreeConditions () {
90- String fName = "Fred" ;
91- String lName = "Flintstone" ;
92-
9396 DeleteDSL <DeleteModel >.DeleteWhereBuilder builder = deleteFrom (person )
9497 .where (id , isEqualTo (3 ));
9598
96- builder .and (firstName , isEqualTo (fName ). filter ( Objects :: nonNull ));
97- builder .and (PersonDynamicSqlSupport .lastName , isEqualTo (lName ). filter ( Objects :: nonNull ));
99+ builder .and (firstName , isEqualTo (FIRST_NAME ));
100+ builder .and (PersonDynamicSqlSupport .lastName , isEqualTo (LAST_NAME ));
98101
99102 DeleteStatementProvider deleteStatement = builder .build ().render (RenderingStrategies .MYBATIS3 );
100103
@@ -112,8 +115,8 @@ void testDeleteVariations(Variation variation) {
112115 DeleteDSL <DeleteModel >.DeleteWhereBuilder builder = deleteFrom (person )
113116 .where ();
114117
115- builder .and (firstName , isEqualTo (variation .firstName ). filter ( Objects :: nonNull ));
116- builder .or (PersonDynamicSqlSupport .lastName , isEqualTo (variation .lastName ). filter ( Objects :: nonNull ));
118+ builder .and (firstName , isEqualToWhenPresent (variation .firstName ));
119+ builder .or (PersonDynamicSqlSupport .lastName , isEqualToWhenPresent (variation .lastName ));
117120 builder .configureStatement (c -> c .setNonRenderingWhereClauseAllowed (true ));
118121
119122 DeleteStatementProvider deleteStatement = builder .build ().render (RenderingStrategies .MYBATIS3 );
@@ -125,15 +128,12 @@ void testDeleteVariations(Variation variation) {
125128
126129 @ Test
127130 void testSelectThreeConditions () {
128- String fName = "Fred" ;
129- String lName = "Flintstone" ;
130-
131131 QueryExpressionDSL <SelectModel >.QueryExpressionWhereBuilder builder = select (id , firstName , PersonDynamicSqlSupport .lastName )
132132 .from (person )
133133 .where (id , isEqualTo (3 ));
134134
135- builder .and (firstName , isEqualTo (fName ). filter ( Objects :: nonNull ));
136- builder .and (PersonDynamicSqlSupport .lastName , isEqualTo (lName ). filter ( Objects :: nonNull ));
135+ builder .and (firstName , isEqualTo (FIRST_NAME ));
136+ builder .and (PersonDynamicSqlSupport .lastName , isEqualTo (LAST_NAME ));
137137
138138 SelectStatementProvider selectStatement = builder .build ().render (RenderingStrategies .MYBATIS3 );
139139
@@ -153,8 +153,8 @@ void testSelectVariations(Variation variation) {
153153 .from (person )
154154 .where ();
155155
156- builder .and (firstName , isEqualTo (variation .firstName ). filter ( Objects :: nonNull ));
157- builder .or (PersonDynamicSqlSupport .lastName , isEqualTo (variation .lastName ). filter ( Objects :: nonNull ));
156+ builder .and (firstName , isEqualToWhenPresent (variation .firstName ));
157+ builder .or (PersonDynamicSqlSupport .lastName , isEqualToWhenPresent (variation .lastName ));
158158 builder .configureStatement (c -> c .setNonRenderingWhereClauseAllowed (true ));
159159
160160 SelectStatementProvider selectStatement = builder .build ().render (RenderingStrategies .MYBATIS3 );
@@ -166,15 +166,12 @@ void testSelectVariations(Variation variation) {
166166
167167 @ Test
168168 void testJoinThreeConditions () {
169- String fName = "Fred" ;
170- String lName = "Flintstone" ;
171-
172169 QueryExpressionDSL <SelectModel >.QueryExpressionWhereBuilder builder = select (id , firstName , PersonDynamicSqlSupport .lastName , orderDate )
173170 .from (person ).join (order ).on (person .id , isEqualTo (order .personId ))
174171 .where (id , isEqualTo (3 ));
175172
176- builder .and (firstName , isEqualTo (fName ). filter ( Objects :: nonNull ));
177- builder .and (PersonDynamicSqlSupport .lastName , isEqualTo (lName ). filter ( Objects :: nonNull ));
173+ builder .and (firstName , isEqualTo (FIRST_NAME ));
174+ builder .and (PersonDynamicSqlSupport .lastName , isEqualTo (LAST_NAME ));
178175
179176 SelectStatementProvider selectStatement = builder .build ().render (RenderingStrategies .MYBATIS3 );
180177
@@ -195,8 +192,8 @@ void testJoinVariations(Variation variation) {
195192 .from (person ).join (order ).on (person .id , isEqualTo (order .personId ))
196193 .where ();
197194
198- builder .and (firstName , isEqualTo (variation .firstName ). filter ( Objects :: nonNull ));
199- builder .or (PersonDynamicSqlSupport .lastName , isEqualTo (variation .lastName ). filter ( Objects :: nonNull ));
195+ builder .and (firstName , isEqualToWhenPresent (variation .firstName ));
196+ builder .or (PersonDynamicSqlSupport .lastName , isEqualToWhenPresent (variation .lastName ));
200197 builder .configureStatement (c -> c .setNonRenderingWhereClauseAllowed (true ));
201198
202199 SelectStatementProvider selectStatement = builder .build ().render (RenderingStrategies .MYBATIS3 );
@@ -211,15 +208,12 @@ void testJoinVariations(Variation variation) {
211208
212209 @ Test
213210 void testUpdateThreeConditions () {
214- String fName = "Fred" ;
215- String lName = "Flintstone" ;
216-
217211 UpdateDSL <UpdateModel >.UpdateWhereBuilder builder = update (person )
218212 .set (id ).equalTo (3 )
219213 .where (id , isEqualTo (3 ));
220214
221- builder .and (firstName , isEqualTo (fName ). filter ( Objects :: nonNull ));
222- builder .and (PersonDynamicSqlSupport .lastName , isEqualTo (lName ). filter ( Objects :: nonNull ));
215+ builder .and (firstName , isEqualTo (FIRST_NAME ));
216+ builder .and (PersonDynamicSqlSupport .lastName , isEqualTo (LAST_NAME ));
223217
224218 UpdateStatementProvider updateStatement = builder .build ().render (RenderingStrategies .MYBATIS3 );
225219
@@ -239,8 +233,8 @@ void testUpdateVariations(Variation variation) {
239233 .set (id ).equalTo (3 )
240234 .where ();
241235
242- builder .and (firstName , isEqualTo (variation .firstName ). filter ( Objects :: nonNull ));
243- builder .or (PersonDynamicSqlSupport .lastName , isEqualTo (variation .lastName ). filter ( Objects :: nonNull ));
236+ builder .and (firstName , isEqualToWhenPresent (variation .firstName ));
237+ builder .or (PersonDynamicSqlSupport .lastName , isEqualToWhenPresent (variation .lastName ));
244238 builder .configureStatement (c -> c .setNonRenderingWhereClauseAllowed (true ));
245239
246240 UpdateStatementProvider updateStatement = builder .build ().render (RenderingStrategies .MYBATIS3 );
@@ -254,13 +248,10 @@ void testUpdateVariations(Variation variation) {
254248
255249 @ Test
256250 void testWhereThreeConditions () {
257- String fName = "Fred" ;
258- String lName = "Flintstone" ;
259-
260251 WhereDSL .StandaloneWhereFinisher builder = where (id , isEqualTo (3 ));
261252
262- builder .and (firstName , isEqualTo (fName ). filter ( Objects :: nonNull ));
263- builder .and (PersonDynamicSqlSupport .lastName , isEqualTo (lName ). filter ( Objects :: nonNull ));
253+ builder .and (firstName , isEqualTo (FIRST_NAME ));
254+ builder .and (PersonDynamicSqlSupport .lastName , isEqualTo (LAST_NAME ));
264255
265256 Optional <WhereClauseProvider > whereClause = builder .build ().render (RenderingStrategies .MYBATIS3 );
266257
@@ -278,8 +269,8 @@ void testWhereThreeConditions() {
278269 void testWhereVariations (Variation variation ) {
279270 WhereDSL .StandaloneWhereFinisher builder = where ();
280271
281- builder .and (firstName , isEqualTo (variation .firstName ). filter ( Objects :: nonNull ));
282- builder .or (PersonDynamicSqlSupport .lastName , isEqualTo (variation .lastName ). filter ( Objects :: nonNull ));
272+ builder .and (firstName , isEqualToWhenPresent (variation .firstName ));
273+ builder .or (PersonDynamicSqlSupport .lastName , isEqualToWhenPresent (variation .lastName ));
283274 builder .configureStatement (c -> c .setNonRenderingWhereClauseAllowed (true ));
284275
285276 Optional <WhereClauseProvider > whereClause = builder .build ().render (RenderingStrategies .MYBATIS3 );
@@ -293,15 +284,5 @@ void testWhereVariations(Variation variation) {
293284 }
294285 }
295286
296- private static class Variation {
297- String firstName ;
298- String lastName ;
299- String whereClause ;
300-
301- public Variation (String firstName , String lastName , String whereClause ) {
302- this .firstName = firstName ;
303- this .lastName = lastName ;
304- this .whereClause = whereClause ;
305- }
306- }
287+ private record Variation (@ Nullable String firstName , @ Nullable String lastName , String whereClause ) {}
307288}
0 commit comments