View Javadoc
1   /*
2    *    Copyright 2009-2024 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.apache.ibatis.jdbc;
17  
18  import static org.apache.ibatis.jdbc.SelectBuilder.FROM;
19  import static org.apache.ibatis.jdbc.SelectBuilder.GROUP_BY;
20  import static org.apache.ibatis.jdbc.SelectBuilder.HAVING;
21  import static org.apache.ibatis.jdbc.SelectBuilder.INNER_JOIN;
22  import static org.apache.ibatis.jdbc.SelectBuilder.OR;
23  import static org.apache.ibatis.jdbc.SelectBuilder.ORDER_BY;
24  import static org.apache.ibatis.jdbc.SelectBuilder.SELECT;
25  import static org.apache.ibatis.jdbc.SelectBuilder.SQL;
26  import static org.apache.ibatis.jdbc.SelectBuilder.WHERE;
27  import static org.junit.jupiter.api.Assertions.assertEquals;
28  
29  import org.junit.jupiter.api.Test;
30  
31  class SelectBuilderTest {
32  
33    @Test
34    void shouldProduceExpectedSimpleSelectStatement() {
35      String expected = """
36          SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME
37          FROM PERSON P
38          WHERE (P.ID like #id# AND P.FIRST_NAME like #firstName# AND P.LAST_NAME like #lastName#)
39          ORDER BY P.LAST_NAME""";
40      assertEquals(expected, example2("a", "b", "c"));
41    }
42  
43    @Test
44    void shouldProduceExpectedSimpleSelectStatementMissingFirstParam() {
45      String expected = """
46          SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME
47          FROM PERSON P
48          WHERE (P.FIRST_NAME like #firstName# AND P.LAST_NAME like #lastName#)
49          ORDER BY P.LAST_NAME""";
50      assertEquals(expected, example2(null, "b", "c"));
51    }
52  
53    @Test
54    void shouldProduceExpectedSimpleSelectStatementMissingFirstTwoParams() {
55      String expected = """
56          SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME
57          FROM PERSON P
58          WHERE (P.LAST_NAME like #lastName#)
59          ORDER BY P.LAST_NAME""";
60      assertEquals(expected, example2(null, null, "c"));
61    }
62  
63    @Test
64    void shouldProduceExpectedSimpleSelectStatementMissingAllParams() {
65      String expected = """
66          SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME
67          FROM PERSON P
68          ORDER BY P.LAST_NAME""";
69      assertEquals(expected, example2(null, null, null));
70    }
71  
72    @Test
73    void shouldProduceExpectedComplexSelectStatement() {
74      String expected = """
75          SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON
76          FROM PERSON P, ACCOUNT A
77          INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID
78          INNER JOIN COMPANY C on D.COMPANY_ID = C.ID
79          WHERE (P.ID = A.ID AND P.FIRST_NAME like ?)\s
80          OR (P.LAST_NAME like ?)
81          GROUP BY P.ID
82          HAVING (P.LAST_NAME like ?)\s
83          OR (P.FIRST_NAME like ?)
84          ORDER BY P.ID, P.FULL_NAME""";
85      assertEquals(expected, example1());
86    }
87  
88    private static String example1() {
89      SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
90      SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
91      FROM("PERSON P");
92      FROM("ACCOUNT A");
93      INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
94      INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
95      WHERE("P.ID = A.ID");
96      WHERE("P.FIRST_NAME like ?");
97      OR();
98      WHERE("P.LAST_NAME like ?");
99      GROUP_BY("P.ID");
100     HAVING("P.LAST_NAME like ?");
101     OR();
102     HAVING("P.FIRST_NAME like ?");
103     ORDER_BY("P.ID");
104     ORDER_BY("P.FULL_NAME");
105     return SQL();
106   }
107 
108   private static String example2(String id, String firstName, String lastName) {
109     SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
110     FROM("PERSON P");
111     if (id != null) {
112       WHERE("P.ID like #id#");
113     }
114     if (firstName != null) {
115       WHERE("P.FIRST_NAME like #firstName#");
116     }
117     if (lastName != null) {
118       WHERE("P.LAST_NAME like #lastName#");
119     }
120     ORDER_BY("P.LAST_NAME");
121     return SQL();
122   }
123 
124 }