Skip to content

Commit db21e70

Browse files
authored
Merge pull request mybatis#97 from jeffgbutler/master
Add missing fetch first methods
2 parents ad45656 + 95cc764 commit db21e70

File tree

4 files changed

+134
-18
lines changed

4 files changed

+134
-18
lines changed

src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,12 @@ public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
429429
selectDSL.addQueryExpression(buildModel());
430430
return selectDSL.offset(offset);
431431
}
432+
433+
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
434+
joinModel = buildJoinModel();
435+
selectDSL.addQueryExpression(buildModel());
436+
return selectDSL.fetchFirst(fetchFirstRows);
437+
}
432438
}
433439

434440
public class GroupByFinisher implements Buildable<R> {
@@ -449,6 +455,10 @@ public SelectDSL<R>.LimitFinisher limit(long limit) {
449455
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
450456
return selectDSL.offset(offset);
451457
}
458+
459+
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
460+
return selectDSL.fetchFirst(fetchFirstRows);
461+
}
452462
}
453463

454464
public class UnionBuilder {

src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -177,38 +177,28 @@ public R build() {
177177
}
178178

179179
public class FetchFirstFinisher {
180-
private Long offset;
181-
private Long fetchFirstRows;
182-
183180
public FetchFirstFinisher(long fetchFirstRows) {
184-
this.fetchFirstRows = fetchFirstRows;
181+
SelectDSL.this.pagingModel = new FetchFirstPagingModel.Builder()
182+
.withFetchFirstRows(fetchFirstRows)
183+
.build();
185184
}
186185

187186
public FetchFirstFinisher(long offset, long fetchFirstRows) {
188-
this.offset = offset;
189-
this.fetchFirstRows = fetchFirstRows;
187+
SelectDSL.this.pagingModel = new FetchFirstPagingModel.Builder()
188+
.withOffset(offset)
189+
.withFetchFirstRows(fetchFirstRows)
190+
.build();
190191
}
191192

192193
public RowsOnlyFinisher rowsOnly() {
193-
return new RowsOnlyFinisher(offset, fetchFirstRows);
194+
return new RowsOnlyFinisher();
194195
}
195196
}
196197

197198
public class RowsOnlyFinisher implements Buildable<R> {
198-
private Long offset;
199-
private Long fetchFirstRows;
200-
201-
public RowsOnlyFinisher(Long offset, Long fetchFirstRows) {
202-
this.offset = offset;
203-
this.fetchFirstRows = fetchFirstRows;
204-
}
205199

206200
@Override
207201
public R build() {
208-
SelectDSL.this.pagingModel = new FetchFirstPagingModel.Builder()
209-
.withOffset(offset)
210-
.withFetchFirstRows(fetchFirstRows)
211-
.build();
212202
return SelectDSL.this.build();
213203
}
214204
}

src/test/java/examples/groupby/GroupByTest.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,4 +265,51 @@ public void testOffsetOnlyAfterGroupBy() {
265265
assertThat(row.get("COUNT")).isEqualTo(3L);
266266
}
267267
}
268+
269+
@Test
270+
public void testOffsetAndFetchFirstAfterGroupBy() {
271+
try (SqlSession session = sqlSessionFactory.openSession()) {
272+
GroupByMapper mapper = session.getMapper(GroupByMapper.class);
273+
274+
SelectStatementProvider selectStatement = select(lastName, count().as("count"))
275+
.from(person)
276+
.groupBy(lastName)
277+
.offset(1)
278+
.fetchFirst(1).rowsOnly()
279+
.build()
280+
.render(RenderingStrategy.MYBATIS3);
281+
282+
String expected = "select last_name, count(*) as count from Person group by last_name offset #{parameters._offset} fetch first #{parameters._fetchFirstRows} rows only";
283+
assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
284+
285+
List<Map<String, Object>> rows = mapper.generalSelect(selectStatement);
286+
assertThat(rows.size()).isEqualTo(1);
287+
Map<String, Object> row = rows.get(0);
288+
assertThat(row.get("LAST_NAME")).isEqualTo("Rubble");
289+
assertThat(row.get("COUNT")).isEqualTo(3L);
290+
}
291+
}
292+
293+
@Test
294+
public void testFetchFirstOnlyAfterGroupBy() {
295+
try (SqlSession session = sqlSessionFactory.openSession()) {
296+
GroupByMapper mapper = session.getMapper(GroupByMapper.class);
297+
298+
SelectStatementProvider selectStatement = select(lastName, count().as("count"))
299+
.from(person)
300+
.groupBy(lastName)
301+
.fetchFirst(1).rowsOnly()
302+
.build()
303+
.render(RenderingStrategy.MYBATIS3);
304+
305+
String expected = "select last_name, count(*) as count from Person group by last_name fetch first #{parameters._fetchFirstRows} rows only";
306+
assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
307+
308+
List<Map<String, Object>> rows = mapper.generalSelect(selectStatement);
309+
assertThat(rows.size()).isEqualTo(1);
310+
Map<String, Object> row = rows.get(0);
311+
assertThat(row.get("LAST_NAME")).isEqualTo("Flintstone");
312+
assertThat(row.get("COUNT")).isEqualTo(4L);
313+
}
314+
}
268315
}

src/test/java/examples/joins/JoinMapperTest.java

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,4 +614,73 @@ public void testOffsetOnlyAfterJoin() {
614614
assertThat(row.get("ITEM_ID")).isEqualTo(44);
615615
}
616616
}
617+
618+
@Test
619+
public void testOffsetAndFetchFirstAfterJoin() {
620+
try (SqlSession session = sqlSessionFactory.openSession()) {
621+
JoinMapper mapper = session.getMapper(JoinMapper.class);
622+
623+
SelectStatementProvider selectStatement = select(orderLine.orderId, orderLine.quantity, itemMaster.itemId, itemMaster.description)
624+
.from(itemMaster, "im")
625+
.leftJoin(orderLine, "ol").on(orderLine.itemId, equalTo(itemMaster.itemId))
626+
.offset(1)
627+
.fetchFirst(2).rowsOnly()
628+
.build()
629+
.render(RenderingStrategy.MYBATIS3);
630+
631+
String expectedStatment = "select ol.order_id, ol.quantity, im.item_id, im.description"
632+
+ " from ItemMaster im left join OrderLine ol on ol.item_id = im.item_id"
633+
+ " offset #{parameters._offset} fetch first #{parameters._fetchFirstRows} rows only";
634+
assertThat(selectStatement.getSelectStatement()).isEqualTo(expectedStatment);
635+
636+
List<Map<String, Object>> rows = mapper.generalSelect(selectStatement);
637+
638+
assertThat(rows.size()).isEqualTo(2);
639+
Map<String, Object> row = rows.get(0);
640+
assertThat(row.get("ORDER_ID")).isEqualTo(2);
641+
assertThat(row.get("QUANTITY")).isEqualTo(1);
642+
assertThat(row.get("DESCRIPTION")).isEqualTo("Helmet");
643+
assertThat(row.get("ITEM_ID")).isEqualTo(22);
644+
645+
row = rows.get(1);
646+
assertThat(row.get("ORDER_ID")).isEqualTo(1);
647+
assertThat(row.get("QUANTITY")).isEqualTo(1);
648+
assertThat(row.get("DESCRIPTION")).isEqualTo("First Base Glove");
649+
assertThat(row.get("ITEM_ID")).isEqualTo(33);
650+
}
651+
}
652+
653+
@Test
654+
public void testFetchFirstOnlyAfterJoin() {
655+
try (SqlSession session = sqlSessionFactory.openSession()) {
656+
JoinMapper mapper = session.getMapper(JoinMapper.class);
657+
658+
SelectStatementProvider selectStatement = select(orderLine.orderId, orderLine.quantity, itemMaster.itemId, itemMaster.description)
659+
.from(itemMaster, "im")
660+
.leftJoin(orderLine, "ol").on(orderLine.itemId, equalTo(itemMaster.itemId))
661+
.fetchFirst(2).rowsOnly()
662+
.build()
663+
.render(RenderingStrategy.MYBATIS3);
664+
665+
String expectedStatment = "select ol.order_id, ol.quantity, im.item_id, im.description"
666+
+ " from ItemMaster im left join OrderLine ol on ol.item_id = im.item_id"
667+
+ " fetch first #{parameters._fetchFirstRows} rows only";
668+
assertThat(selectStatement.getSelectStatement()).isEqualTo(expectedStatment);
669+
670+
List<Map<String, Object>> rows = mapper.generalSelect(selectStatement);
671+
672+
assertThat(rows.size()).isEqualTo(2);
673+
Map<String, Object> row = rows.get(0);
674+
assertThat(row.get("ORDER_ID")).isEqualTo(1);
675+
assertThat(row.get("QUANTITY")).isEqualTo(1);
676+
assertThat(row.get("DESCRIPTION")).isEqualTo("Helmet");
677+
assertThat(row.get("ITEM_ID")).isEqualTo(22);
678+
679+
row = rows.get(1);
680+
assertThat(row.get("ORDER_ID")).isEqualTo(2);
681+
assertThat(row.get("QUANTITY")).isEqualTo(1);
682+
assertThat(row.get("DESCRIPTION")).isEqualTo("Helmet");
683+
assertThat(row.get("ITEM_ID")).isEqualTo(22);
684+
}
685+
}
617686
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy