Skip to content

Commit 2e90ca1

Browse files
committed
Having Coverage and Tests
1 parent f28edaa commit 2e90ca1

File tree

2 files changed

+129
-12
lines changed

2 files changed

+129
-12
lines changed

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

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,10 @@ public <T> QueryExpressionHavingBuilder having(BindableColumn<T> column, Visitab
557557
.build());
558558
}
559559

560+
public QueryExpressionHavingBuilder having(SqlCriterion initialCriterion, AndOrCriteriaGroup... subCriteria) {
561+
return having(initialCriterion, Arrays.asList(subCriteria));
562+
}
563+
560564
public QueryExpressionHavingBuilder having(SqlCriterion initialCriterion, List<AndOrCriteriaGroup> subCriteria) {
561565
return QueryExpressionDSL.this.having(initialCriterion, subCriteria);
562566
}
@@ -601,6 +605,18 @@ public QueryExpressionHavingBuilder(SqlCriterion initialCriterion) {
601605
this.initialCriterion = initialCriterion;
602606
}
603607

608+
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
609+
return QueryExpressionDSL.this.fetchFirst(fetchFirstRows);
610+
}
611+
612+
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
613+
return QueryExpressionDSL.this.offset(offset);
614+
}
615+
616+
public SelectDSL<R>.LimitFinisher limit(long limit) {
617+
return QueryExpressionDSL.this.limit(limit);
618+
}
619+
604620
public SelectDSL<R> orderBy(SortSpecification... columns) {
605621
return orderBy(Arrays.asList(columns));
606622
}
@@ -617,18 +633,6 @@ public UnionBuilder unionAll() {
617633
return QueryExpressionDSL.this.unionAll();
618634
}
619635

620-
public SelectDSL<R>.LimitFinisher limit(long limit) {
621-
return QueryExpressionDSL.this.limit(limit);
622-
}
623-
624-
public SelectDSL<R>.OffsetFirstFinisher offset(long offset) {
625-
return QueryExpressionDSL.this.offset(offset);
626-
}
627-
628-
public SelectDSL<R>.FetchFirstFinisher fetchFirst(long fetchFirstRows) {
629-
return QueryExpressionDSL.this.fetchFirst(fetchFirstRows);
630-
}
631-
632636
@NotNull
633637
@Override
634638
public R build() {

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

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,30 @@ void testCountDistinct() {
529529

530530
@Test
531531
void testHaving() {
532+
try (SqlSession session = sqlSessionFactory.openSession()) {
533+
CommonSelectMapper mapper = session.getMapper(CommonSelectMapper.class);
534+
535+
SelectStatementProvider selectStatement = select(lastName, count())
536+
.from(person)
537+
.groupBy(lastName)
538+
.having(count(), isEqualTo(3L))
539+
.and(lastName, isEqualTo("Rubble"))
540+
.build()
541+
.render(RenderingStrategies.MYBATIS3);
542+
543+
String expected = "select last_name, count(*) from Person group by last_name " +
544+
"having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR}";
545+
assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
546+
547+
List<Map<String, Object>> rows = mapper.selectManyMappedRows(selectStatement);
548+
assertThat(rows).hasSize(1);
549+
Map<String, Object> row = rows.get(0);
550+
assertThat(row).containsEntry("LAST_NAME", "Rubble");
551+
}
552+
}
553+
554+
@Test
555+
void testHavingAndOrderBy() {
532556
try (SqlSession session = sqlSessionFactory.openSession()) {
533557
CommonSelectMapper mapper = session.getMapper(CommonSelectMapper.class);
534558

@@ -549,4 +573,93 @@ void testHaving() {
549573
assertThat(row).containsEntry("LAST_NAME", "Rubble");
550574
}
551575
}
576+
577+
@Test
578+
void testHavingWithGroup() {
579+
try (SqlSession session = sqlSessionFactory.openSession()) {
580+
CommonSelectMapper mapper = session.getMapper(CommonSelectMapper.class);
581+
582+
SelectStatementProvider selectStatement = select(lastName, count())
583+
.from(person)
584+
.groupBy(lastName)
585+
.having(group(count(), isEqualTo(3L), and(lastName, isEqualTo("Rubble"))))
586+
.limit(1)
587+
.build()
588+
.render(RenderingStrategies.MYBATIS3);
589+
590+
String expected = "select last_name, count(*) from Person group by last_name " +
591+
"having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR} " +
592+
"limit #{parameters.p3}";
593+
assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
594+
595+
List<Map<String, Object>> rows = mapper.selectManyMappedRows(selectStatement);
596+
assertThat(rows).hasSize(1);
597+
Map<String, Object> row = rows.get(0);
598+
assertThat(row).containsEntry("LAST_NAME", "Rubble");
599+
}
600+
}
601+
602+
@Test
603+
void testHavingWithUnion() {
604+
try (SqlSession session = sqlSessionFactory.openSession()) {
605+
CommonSelectMapper mapper = session.getMapper(CommonSelectMapper.class);
606+
607+
SelectStatementProvider selectStatement = select(lastName, count())
608+
.from(person)
609+
.groupBy(lastName)
610+
.having(group(count(), isEqualTo(3L), and(lastName, isEqualTo("Rubble"))))
611+
.union()
612+
.select(lastName, count())
613+
.from(person)
614+
.groupBy(lastName)
615+
.having(group(count(), isGreaterThan(1L), and(lastName, isEqualTo("Flintstone"))))
616+
.fetchFirst(5).rowsOnly()
617+
.build()
618+
.render(RenderingStrategies.MYBATIS3);
619+
620+
String expected = "select last_name, count(*) from Person group by last_name " +
621+
"having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR} " +
622+
"union select last_name, count(*) from Person group by last_name " +
623+
"having count(*) > #{parameters.p3} and last_name = #{parameters.p4,jdbcType=VARCHAR} " +
624+
"fetch first #{parameters.p5} rows only";
625+
assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
626+
627+
List<Map<String, Object>> rows = mapper.selectManyMappedRows(selectStatement);
628+
assertThat(rows).hasSize(2);
629+
Map<String, Object> row = rows.get(0);
630+
assertThat(row).containsEntry("LAST_NAME", "Flintstone");
631+
}
632+
}
633+
634+
@Test
635+
void testHavingWithUnionAll() {
636+
try (SqlSession session = sqlSessionFactory.openSession()) {
637+
CommonSelectMapper mapper = session.getMapper(CommonSelectMapper.class);
638+
639+
SelectStatementProvider selectStatement = select(lastName, count())
640+
.from(person)
641+
.groupBy(lastName)
642+
.having(group(count(), isEqualTo(3L), and(lastName, isEqualTo("Rubble"))))
643+
.unionAll()
644+
.select(lastName, count())
645+
.from(person)
646+
.groupBy(lastName)
647+
.having(group(count(), isGreaterThan(1L), and(lastName, isEqualTo("Flintstone"))))
648+
.offset(1)
649+
.build()
650+
.render(RenderingStrategies.MYBATIS3);
651+
652+
String expected = "select last_name, count(*) from Person group by last_name " +
653+
"having count(*) = #{parameters.p1} and last_name = #{parameters.p2,jdbcType=VARCHAR} " +
654+
"union all select last_name, count(*) from Person group by last_name " +
655+
"having count(*) > #{parameters.p3} and last_name = #{parameters.p4,jdbcType=VARCHAR} " +
656+
"offset #{parameters.p5} rows";
657+
assertThat(selectStatement.getSelectStatement()).isEqualTo(expected);
658+
659+
List<Map<String, Object>> rows = mapper.selectManyMappedRows(selectStatement);
660+
assertThat(rows).hasSize(1);
661+
Map<String, Object> row = rows.get(0);
662+
assertThat(row).containsEntry("LAST_NAME", "Flintstone");
663+
}
664+
}
552665
}

0 commit comments

Comments
 (0)