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 issues.gh100;
17  
18  import static org.assertj.core.api.Assertions.assertThat;
19  import static org.mybatis.dynamic.sql.SqlBuilder.count;
20  import static org.mybatis.dynamic.sql.SqlBuilder.select;
21  
22  import org.junit.jupiter.api.Test;
23  import org.mybatis.dynamic.sql.render.RenderingStrategies;
24  import org.mybatis.dynamic.sql.select.QueryExpressionDSL;
25  import org.mybatis.dynamic.sql.select.SelectDSL;
26  import org.mybatis.dynamic.sql.select.SelectModel;
27  import org.mybatis.dynamic.sql.select.render.SelectStatementProvider;
28  
29  class FromGroupByTest {
30  
31      @Test
32      void testFromGroupByB1() {
33          QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
34                  .from(StudentDynamicSqlSupport.student);
35  
36          builder1.groupBy(StudentDynamicSqlSupport.name);
37  
38          String expected = "select name, count(*)"
39                  + " from student"
40                  + " group by name";
41  
42          SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
43  
44          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
45      }
46  
47      @Test
48      void testFromGroupByB2() {
49          QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
50                  .from(StudentDynamicSqlSupport.student);
51  
52          QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
53  
54          String expected = "select name, count(*)"
55                  + " from student"
56                  + " group by name";
57  
58          SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
59  
60          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
61      }
62  
63      @Test
64      void testFromGroupByLimitB1() {
65          QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
66                  .from(StudentDynamicSqlSupport.student);
67  
68          QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
69  
70          builder2.limit(3);
71  
72          String expected = "select name, count(*)"
73                  + " from student"
74                  + " group by name"
75                  + " limit #{parameters.p1}";
76  
77          SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
78  
79          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
80      }
81  
82      @Test
83      void testFromGroupByLimitB2() {
84          QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
85                  .from(StudentDynamicSqlSupport.student);
86  
87          QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
88  
89          builder2.limit(3);
90  
91          String expected = "select name, count(*)"
92                  + " from student"
93                  + " group by name"
94                  + " limit #{parameters.p1}";
95  
96          SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
97  
98          assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
99      }
100 
101     @Test
102     void testFromGroupByLimitB3() {
103         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
104                 .from(StudentDynamicSqlSupport.student);
105 
106         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
107 
108         var builder3 = builder2.limit(3);
109 
110         String expected = "select name, count(*)"
111                 + " from student"
112                 + " group by name"
113                 + " limit #{parameters.p1}";
114 
115         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
116 
117         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
118     }
119 
120     @Test
121     void testFromGroupByOffsetB1() {
122         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
123                 .from(StudentDynamicSqlSupport.student);
124 
125         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
126 
127         builder2.offset(3);
128 
129         String expected = "select name, count(*)"
130                 + " from student"
131                 + " group by name"
132                 + " offset #{parameters.p1} rows";
133 
134         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
135 
136         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
137     }
138 
139     @Test
140     void testFromGroupByOffsetB2() {
141         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
142                 .from(StudentDynamicSqlSupport.student);
143 
144         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
145 
146         builder2.offset(3);
147 
148         String expected = "select name, count(*)"
149                 + " from student"
150                 + " group by name"
151                 + " offset #{parameters.p1} rows";
152 
153         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
154 
155         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
156     }
157 
158     @Test
159     void testFromGroupByOffsetB3() {
160         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
161                 .from(StudentDynamicSqlSupport.student);
162 
163         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
164 
165         var builder3 = builder2.offset(3);
166 
167         String expected = "select name, count(*)"
168                 + " from student"
169                 + " group by name"
170                 + " offset #{parameters.p1} rows";
171 
172         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
173 
174         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
175     }
176 
177     @Test
178     void testFromGroupByFetchFirstB1() {
179         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
180                 .from(StudentDynamicSqlSupport.student);
181 
182         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
183 
184         builder2.fetchFirst(2).rowsOnly();
185 
186         String expected = "select name, count(*)"
187                 + " from student"
188                 + " group by name"
189                 + " fetch first #{parameters.p1} rows only";
190 
191         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
192 
193         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
194     }
195 
196     @Test
197     void testFromGroupByFetchFirstB2() {
198         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
199                 .from(StudentDynamicSqlSupport.student);
200 
201         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
202 
203         builder2.fetchFirst(2).rowsOnly();
204 
205         String expected = "select name, count(*)"
206                 + " from student"
207                 + " group by name"
208                 + " fetch first #{parameters.p1} rows only";
209 
210         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
211 
212         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
213     }
214 
215     @Test
216     void testFromGroupByFetchFirstB3() {
217         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
218                 .from(StudentDynamicSqlSupport.student);
219 
220         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
221 
222         var builder3 = builder2.fetchFirst(2).rowsOnly();
223 
224         String expected = "select name, count(*)"
225                 + " from student"
226                 + " group by name"
227                 + " fetch first #{parameters.p1} rows only";
228 
229         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
230 
231         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
232     }
233 
234     @Test
235     void testFromGroupByOrderByB1() {
236         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
237                 .from(StudentDynamicSqlSupport.student);
238 
239         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
240 
241         builder2.orderBy(StudentDynamicSqlSupport.name);
242 
243         String expected = "select name, count(*)"
244                 + " from student"
245                 + " group by name"
246                 + " order by name";
247 
248         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
249 
250         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
251     }
252 
253     @Test
254     void testFromGroupByOrderByB2() {
255         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
256                 .from(StudentDynamicSqlSupport.student);
257 
258         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
259 
260         builder2.orderBy(StudentDynamicSqlSupport.name);
261 
262         String expected = "select name, count(*)"
263                 + " from student"
264                 + " group by name"
265                 + " order by name";
266 
267         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
268 
269         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
270     }
271 
272     @Test
273     void testFromGroupByOrderByB3() {
274         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
275                 .from(StudentDynamicSqlSupport.student);
276 
277         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
278 
279         SelectDSL<SelectModel> builder3 = builder2.orderBy(StudentDynamicSqlSupport.name);
280 
281         String expected = "select name, count(*)"
282                 + " from student"
283                 + " group by name"
284                 + " order by name";
285 
286         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
287 
288         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
289     }
290 
291     @Test
292     void testFromGroupByOrderByOffsetB1() {
293         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
294                 .from(StudentDynamicSqlSupport.student);
295 
296         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
297 
298         SelectDSL<SelectModel> builder3 = builder2.orderBy(StudentDynamicSqlSupport.name);
299 
300         builder3.offset(2);
301 
302         String expected = "select name, count(*)"
303                 + " from student"
304                 + " group by name"
305                 + " order by name"
306                 + " offset #{parameters.p1} rows";
307 
308         SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategies.MYBATIS3);
309 
310         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
311     }
312 
313     @Test
314     void testFromGroupByOrderByOffsetB2() {
315         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
316                 .from(StudentDynamicSqlSupport.student);
317 
318         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
319 
320         SelectDSL<SelectModel> builder3 = builder2.orderBy(StudentDynamicSqlSupport.name);
321 
322         builder3.offset(2);
323 
324         String expected = "select name, count(*)"
325                 + " from student"
326                 + " group by name"
327                 + " order by name"
328                 + " offset #{parameters.p1} rows";
329 
330         SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategies.MYBATIS3);
331 
332         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
333     }
334 
335     @Test
336     void testFromGroupByOrderByOffsetB3() {
337         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
338                 .from(StudentDynamicSqlSupport.student);
339 
340         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
341 
342         SelectDSL<SelectModel> builder3 = builder2.orderBy(StudentDynamicSqlSupport.name);
343 
344         builder3.offset(2);
345 
346         String expected = "select name, count(*)"
347                 + " from student"
348                 + " group by name"
349                 + " order by name"
350                 + " offset #{parameters.p1} rows";
351 
352         SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategies.MYBATIS3);
353 
354         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
355     }
356 
357     @Test
358     void testFromGroupByOrderByOffsetB4() {
359         QueryExpressionDSL<SelectModel> builder1 = select(StudentDynamicSqlSupport.name, count())
360                 .from(StudentDynamicSqlSupport.student);
361 
362         QueryExpressionDSL<SelectModel>.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name);
363 
364         SelectDSL<SelectModel> builder3 = builder2.orderBy(StudentDynamicSqlSupport.name);
365 
366         var builder4 = builder3.offset(2);
367 
368         String expected = "select name, count(*)"
369                 + " from student"
370                 + " group by name"
371                 + " order by name"
372                 + " offset #{parameters.p1} rows";
373 
374         SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategies.MYBATIS3);
375 
376         assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
377     }
378 }