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