Skip to content

Commit db21e70

Browse files
authored
Merge pull request #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)