From a907072a41979dea5341ca8051eccb68b9e217e7 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 2 Jul 2019 04:54:07 -0400 Subject: [PATCH 1/7] Failing tests for issues 100 and 102 --- .../java/issues/gh100/FromJoinWhereTest.java | 739 ++++++++++++++++++ src/test/java/issues/gh100/Issue100Test.java | 253 ++++++ .../gh100/Issue100TestStartAfterJoin.java | 190 +++++ src/test/java/issues/gh100/README.md | 102 +++ .../gh100/StudentDynamicSqlSupport.java | 36 + .../gh100/StudentRegDynamicSqlSupport.java | 36 + 6 files changed, 1356 insertions(+) create mode 100644 src/test/java/issues/gh100/FromJoinWhereTest.java create mode 100644 src/test/java/issues/gh100/Issue100Test.java create mode 100644 src/test/java/issues/gh100/Issue100TestStartAfterJoin.java create mode 100644 src/test/java/issues/gh100/README.md create mode 100644 src/test/java/issues/gh100/StudentDynamicSqlSupport.java create mode 100644 src/test/java/issues/gh100/StudentRegDynamicSqlSupport.java diff --git a/src/test/java/issues/gh100/FromJoinWhereTest.java b/src/test/java/issues/gh100/FromJoinWhereTest.java new file mode 100644 index 000000000..54058b958 --- /dev/null +++ b/src/test/java/issues/gh100/FromJoinWhereTest.java @@ -0,0 +1,739 @@ +package issues.gh100; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mybatis.dynamic.sql.SqlBuilder.*; + +import org.junit.jupiter.api.Test; +import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.QueryExpressionDSL; +import org.mybatis.dynamic.sql.select.SelectDSL; +import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; + +public class FromJoinWhereTest { + + @Test + public void testNormalUsage() { + SelectStatementProvider selectStatement = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .orderBy(StudentDynamicSqlSupport.id) + .limit(3) + .offset(2) + .build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFrom() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + String expected = "select id, name, idcard" + + " from student"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testfromJoinWhereB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testfromJoinWhereB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testfromJoinWhereB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffset() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + SelectDSL.OffsetFinisher builder7 = builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder7.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffset() { + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirst() { + + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirst() { + + } + + @Test + public void testFromJoinWhereUnionLimit() { + + } + + @Test + public void testFromJoinWhereUnionLimitOffset() { + + } + + @Test + public void testFromJoinWhereUnionOffset() { + + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirst() { + + } + + @Test + public void testFromJoinWhereUnionFetchFirst() { + + } + + @Test + public void testFromJoinWhereOrderBy() { + + } + + @Test + public void testFromJoinWhereOrderByLimit() { + + } + + @Test + public void testFromJoinWhereOrderByLimitOffset() { + + } + + @Test + public void testFromJoinWhereOrderByOffset() { + + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirst() { + + } + + @Test + public void testFromJoinWhereOrderByFetchFirst() { + + } + + @Test + public void testFromJoinWhereLimit() { + + } + + @Test + public void testFromJoinWhereLimitOffset() { + + } + + @Test + public void testFromJoinWhereOffset() { + + } + + @Test + public void testFromJoinWhereOffsetFetchFirst() { + + } + + @Test + public void testFromJoinWhereFetchFirst() { + + } +} diff --git a/src/test/java/issues/gh100/Issue100Test.java b/src/test/java/issues/gh100/Issue100Test.java new file mode 100644 index 000000000..78385f35e --- /dev/null +++ b/src/test/java/issues/gh100/Issue100Test.java @@ -0,0 +1,253 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mybatis.dynamic.sql.SqlBuilder.*; + +import org.junit.jupiter.api.Test; +import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.QueryExpressionDSL; +import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; + +/** + * This set of tests is related to issues raised in https://github.com/mybatis/mybatis-dynamic-sql/issues/100 and + * https://github.com/mybatis/mybatis-dynamic-sql/issues/102. + * + * The basic idea is that we want to enable the user to call the build() method from any object along the + * DSL chain and have predictable results. + * + * So this set of test cases tests calling the build() method at various points along the chain. + * + * @author Jeff Butler + * + */ +public class Issue100Test { + + @Test + public void testNormalUsage() { + SelectStatementProvider selectStatement = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .orderBy(StudentDynamicSqlSupport.id) + .limit(3) + .offset(2) + .build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild01() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild02() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild03() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild04() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .limit(3); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild05() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .limit(3) + .offset(2); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild06() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .offset(2); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild07() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .offset(2) + .fetchFirst(3).rowsOnly(); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild08() { + QueryExpressionDSL builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)) + .where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .fetchFirst(3).rowsOnly(); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void test3() { + QueryExpressionDSL.JoinSpecificationFinisher on = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + on.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectStatementProvider selectStatement = on + .build() + .render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()) + .isEqualTo("select student.id, student.name, student.idcard from student join student_reg on student.id = student_reg.studentId where student.idcard = #{parameters.p1}"); + } +} diff --git a/src/test/java/issues/gh100/Issue100TestStartAfterJoin.java b/src/test/java/issues/gh100/Issue100TestStartAfterJoin.java new file mode 100644 index 000000000..25d2acafa --- /dev/null +++ b/src/test/java/issues/gh100/Issue100TestStartAfterJoin.java @@ -0,0 +1,190 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mybatis.dynamic.sql.SqlBuilder.*; + +import org.junit.jupiter.api.Test; +import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.QueryExpressionDSL; +import org.mybatis.dynamic.sql.select.SelectDSL; +import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; + +/** + * This set of tests is related to issues raised in https://github.com/mybatis/mybatis-dynamic-sql/issues/100 and + * https://github.com/mybatis/mybatis-dynamic-sql/issues/102. + * + * The basic idea is that we want to enable the user to call the build() method from any object along the + * DSL chain and have predictable results. + * + * So this set of test cases tests calling the build() method at various points along the chain. + * + * @author Jeff Butler + * + */ +public class Issue100TestStartAfterJoin { + + @Test + public void testSuccessiveBuild02() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild03() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + SelectDSL selectModel = builder.orderBy(StudentDynamicSqlSupport.id); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " order by id"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + selectStatement = selectModel.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild04() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.limit(3); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " limit #{parameters._limit}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild05() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .limit(3) + .offset(2); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild06() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .offset(2); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild07() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .offset(2) + .fetchFirst(3).rowsOnly(); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testSuccessiveBuild08() { + QueryExpressionDSL.JoinSpecificationFinisher builder = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + builder.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")) + .orderBy(StudentDynamicSqlSupport.id) + .fetchFirst(3).rowsOnly(); + + SelectStatementProvider selectStatement = builder.build() + .render(RenderingStrategy.MYBATIS3); + + String expected = "select student.id, student.name, student.idcard" + + " from student join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } +} diff --git a/src/test/java/issues/gh100/README.md b/src/test/java/issues/gh100/README.md new file mode 100644 index 000000000..fb91e0d8c --- /dev/null +++ b/src/test/java/issues/gh100/README.md @@ -0,0 +1,102 @@ +# About these Tests + +GitHub issues 100 and 102 exposed issues where calling the `build()` method at an unexpected location caused the rendered SQL to be incorrect. Changes for this issue now allow for the `build()` method to be called on any intermediate object in the select statement chain - regardless if further operations have been performed - and consistent renderings will occur. + +Tests in this directory cover the possible places where a `build()` method could be called and virtually all the possible paths through a select statement. + +- from +- from join + - from join where + - from join where union + - from join where union order by + - from join where union order by limit + - from join where union order by limit offset + - from join where union order by offset + - from join where union order by offset fetch first + - from join where union order by fetch first + - from join where union limit + - from join where union limit offset + - from join where union offset + - from join where union offset fetch first + - from join where union fetch first + - from join where order by + - from join where order by limit + - from join where order by limit offset + - from join where order by offset + - from join where order by offset fetch first + - from join where order by fetch first + - from join where limit + - from join where limit offset + - from join where offset + - from join where offset fetch first + - from join where fetch first + - from join union + - from join union order by + - from join union order by limit + - from join union order by limit offset + - from join union order by offset + - from join union order by offset fetch first + - from join union order by fetch first + - from join union limit + - from join union limit offset + - from join union offset + - from join union offset fetch first + - from join union fetch first + - from join order by + - from join order by limit + - from join order by limit offset + - from join order by offset + - from join order by offset fetch first + - from join order by fetch first + - from join limit + - from join limit offset + - from join offset + - from join offset fetch first + - from join fetch first +- from where + - from where union + - from where union order by + - from where union order by limit + - from where union order by limit offset + - from where union order by offset + - from where union order by offset fetch first + - from where union order by fetch first + - from where union limit + - from where union limit offset + - from where union offset + - from where union offset fetch first + - from where union fetch first + - from where order by + - from where order by limit + - from where order by limit offset + - from where order by offset + - from where order by offset fetch first + - from where order by fetch first + - from where limit + - from where limit offset + - from where offset + - from where offset fetch first + - from where fetch first +- from union + - from union order by + - from union order by limit + - from union order by limit offset + - from union order by offset + - from union order by offset fetch first + - from union order by fetch first + - from union limit + - from union limit offset + - from union offset + - from union offset fetch first + - from union fetch first +- from order by + - from order by limit + - from order by limit offset + - from order by offset + - from order by offset fetch first + - from order by fetch first +- from limit + - from limit offset +- from offset + - from offset fetch first +- from fetch first diff --git a/src/test/java/issues/gh100/StudentDynamicSqlSupport.java b/src/test/java/issues/gh100/StudentDynamicSqlSupport.java new file mode 100644 index 000000000..294fab0e3 --- /dev/null +++ b/src/test/java/issues/gh100/StudentDynamicSqlSupport.java @@ -0,0 +1,36 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import org.mybatis.dynamic.sql.SqlColumn; +import org.mybatis.dynamic.sql.SqlTable; + +public class StudentDynamicSqlSupport { + public static final Student student = new Student(); + public static final SqlColumn id = student.id; + public static final SqlColumn name = student.name; + public static final SqlColumn idcard = student.idcard; + + public static final class Student extends SqlTable { + public final SqlColumn id = column("id"); + public final SqlColumn name = column("name"); + public final SqlColumn idcard = column("idcard"); + + public Student() { + super("student"); + } + } +} diff --git a/src/test/java/issues/gh100/StudentRegDynamicSqlSupport.java b/src/test/java/issues/gh100/StudentRegDynamicSqlSupport.java new file mode 100644 index 000000000..af3b69c39 --- /dev/null +++ b/src/test/java/issues/gh100/StudentRegDynamicSqlSupport.java @@ -0,0 +1,36 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import org.mybatis.dynamic.sql.SqlColumn; +import org.mybatis.dynamic.sql.SqlTable; + +public class StudentRegDynamicSqlSupport { + public static final StudentReg studentReg = new StudentReg(); + public static final SqlColumn studentid = studentReg.studentid; + public static final SqlColumn examnumber = studentReg.examnumber; + public static final SqlColumn regcode = studentReg.regcode; + + public static final class StudentReg extends SqlTable { + public final SqlColumn studentid = column("studentId"); + public final SqlColumn examnumber = column("examnumber"); + public final SqlColumn regcode = column("regcode"); + + public StudentReg() { + super("student_reg"); + } + } +} From 005fc68503d27b69589314f7936cf9f5e2289d95 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 2 Jul 2019 04:55:53 -0400 Subject: [PATCH 2/7] Beginning of a fix for 100 and 102 --- .../sql/select/QueryExpressionDSL.java | 42 ++++++++++++- .../mybatis/dynamic/sql/select/SelectDSL.java | 62 ++++++++++++++----- 2 files changed, 86 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java index 98c670806..65e29ab1d 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.Supplier; import org.mybatis.dynamic.sql.BasicColumn; import org.mybatis.dynamic.sql.BindableColumn; @@ -49,6 +50,7 @@ public class QueryExpressionDSL implements Buildable { private GroupByModel groupByModel; private JoinModel joinModel; private List joinSpecifications = new ArrayList<>(); + private Supplier buildDelegateMethod; private QueryExpressionDSL(FromGatherer fromGatherer) { connector = fromGatherer.builder.connector; @@ -57,6 +59,7 @@ private QueryExpressionDSL(FromGatherer fromGatherer) { selectDSL = Objects.requireNonNull(fromGatherer.builder.selectDSL); table = Objects.requireNonNull(fromGatherer.table); tableAliases.putAll(fromGatherer.tableAliasMap); + buildDelegateMethod = this::internalBuild; } public QueryExpressionWhereBuilder where(BindableColumn column, VisitableCondition condition) { @@ -70,6 +73,10 @@ public QueryExpressionWhereBuilder where(BindableColumn column, Visitable @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalBuild() { selectDSL.addQueryExpression(buildModel()); return selectDSL.build(); } @@ -117,6 +124,7 @@ public GroupByFinisher groupBy(BasicColumn...columns) { } public SelectDSL orderBy(SortSpecification...columns) { + buildDelegateMethod = selectDSL::build; selectDSL.addQueryExpression(buildModel()); selectDSL.setOrderByModel(OrderByModel.of(columns)); return selectDSL; @@ -145,16 +153,19 @@ protected QueryExpressionModel buildModel() { } public SelectDSL.LimitFinisher limit(long limit) { + buildDelegateMethod = selectDSL::build; selectDSL.addQueryExpression(buildModel()); return selectDSL.limit(limit); } public SelectDSL.OffsetFirstFinisher offset(long offset) { + buildDelegateMethod = selectDSL::build; selectDSL.addQueryExpression(buildModel()); return selectDSL.offset(offset); } public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { + buildDelegateMethod = selectDSL::build; selectDSL.addQueryExpression(buildModel()); return selectDSL.fetchFirst(fetchFirstRows); } @@ -216,11 +227,13 @@ public class QueryExpressionWhereBuilder extends AbstractWhereDSL { private QueryExpressionWhereBuilder(BindableColumn column, VisitableCondition condition) { super(column, condition); + buildDelegateMethod = this::internalBuild; } private QueryExpressionWhereBuilder(BindableColumn column, VisitableCondition condition, SqlCriterion...subCriteria) { super(column, condition, subCriteria); + buildDelegateMethod = this::internalBuild; } public UnionBuilder union() { @@ -236,6 +249,7 @@ public UnionBuilder unionAll() { } public SelectDSL orderBy(SortSpecification...columns) { + buildDelegateMethod = selectDSL::build; whereModel = buildWhereModel(); selectDSL.addQueryExpression(buildModel()); selectDSL.setOrderByModel(OrderByModel.of(columns)); @@ -262,6 +276,7 @@ public SelectDSL.OffsetFirstFinisher offset(long offset) { } public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { + buildDelegateMethod = selectDSL::build; whereModel = buildWhereModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.fetchFirst(fetchFirstRows); @@ -269,6 +284,10 @@ public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalBuild() { whereModel = buildWhereModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.build(); @@ -300,7 +319,6 @@ public JoinSpecificationFinisher on(BasicColumn joinColumn, JoinCondition joinCo } public class JoinSpecificationFinisher implements Buildable { - private SqlTable joinTable; private List joinCriteria = new ArrayList<>(); private JoinType joinType; @@ -316,6 +334,7 @@ public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn, .build(); joinCriteria.add(joinCriterion); + buildDelegateMethod = this::internalbuild; } public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn, @@ -330,6 +349,7 @@ public JoinSpecificationFinisher(SqlTable table, BasicColumn joinColumn, this.joinCriteria.add(joinCriterion); this.joinCriteria.addAll(Arrays.asList(joinCriteria)); + buildDelegateMethod = this::internalbuild; } protected JoinSpecification buildJoinSpecification() { @@ -346,6 +366,10 @@ protected JoinModel buildJoinModel() { @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalbuild() { joinModel = buildJoinModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.build(); @@ -412,6 +436,7 @@ public JoinSpecificationStarter fullJoin(SqlTable joinTable, String tableAlias) } public SelectDSL orderBy(SortSpecification...columns) { + buildDelegateMethod = selectDSL::build; joinModel = buildJoinModel(); selectDSL.addQueryExpression(buildModel()); selectDSL.setOrderByModel(OrderByModel.of(columns)); @@ -419,18 +444,21 @@ public SelectDSL orderBy(SortSpecification...columns) { } public SelectDSL.LimitFinisher limit(long limit) { + buildDelegateMethod = selectDSL::build; joinModel = buildJoinModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.limit(limit); } public SelectDSL.OffsetFirstFinisher offset(long offset) { + buildDelegateMethod = selectDSL::build; joinModel = buildJoinModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.offset(offset); } public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { + buildDelegateMethod = selectDSL::build; joinModel = buildJoinModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.fetchFirst(fetchFirstRows); @@ -438,25 +466,37 @@ public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { } public class GroupByFinisher implements Buildable { + public GroupByFinisher() { + buildDelegateMethod = this::internalBuild; + } + public SelectDSL orderBy(SortSpecification...columns) { + buildDelegateMethod = selectDSL::build; selectDSL.setOrderByModel(OrderByModel.of(columns)); return selectDSL; } @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalBuild() { return selectDSL.build(); } public SelectDSL.LimitFinisher limit(long limit) { + buildDelegateMethod = selectDSL::build; return selectDSL.limit(limit); } public SelectDSL.OffsetFirstFinisher offset(long offset) { + buildDelegateMethod = selectDSL::build; return selectDSL.offset(offset); } public SelectDSL.FetchFirstFinisher fetchFirst(long fetchFirstRows) { + buildDelegateMethod = selectDSL::build; return selectDSL.fetchFirst(fetchFirstRows); } } diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java index 334066c2c..420cb61af 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java @@ -19,10 +19,9 @@ import java.util.List; import java.util.Objects; import java.util.function.Function; +import java.util.function.Supplier; import org.mybatis.dynamic.sql.BasicColumn; -import org.mybatis.dynamic.sql.select.QueryExpressionDSL.FromGatherer; -import org.mybatis.dynamic.sql.select.QueryExpressionDSL.FromGathererBuilder; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; import org.mybatis.dynamic.sql.util.Buildable; @@ -39,52 +38,54 @@ public class SelectDSL implements Buildable { private List queryExpressions = new ArrayList<>(); private OrderByModel orderByModel; private PagingModel pagingModel; + private Supplier buildDelegateMethod; private SelectDSL(Function adapterFunction) { this.adapterFunction = Objects.requireNonNull(adapterFunction); + buildDelegateMethod = this::internalBuild; } - private FromGatherer queryExpressionBuilder(BasicColumn...selectList) { - return new FromGathererBuilder() + private QueryExpressionDSL.FromGatherer queryExpressionBuilder(BasicColumn...selectList) { + return new QueryExpressionDSL.FromGathererBuilder() .withSelectDSL(this) .withSelectList(selectList) .build(); } - private FromGatherer distinctQueryExpressionBuilder(BasicColumn...selectList) { - return new FromGathererBuilder() + private QueryExpressionDSL.FromGatherer distinctQueryExpressionBuilder(BasicColumn...selectList) { + return new QueryExpressionDSL.FromGathererBuilder() .withSelectDSL(this) .withSelectList(selectList) .isDistinct() .build(); } - public static FromGatherer select(BasicColumn...selectList) { + public static QueryExpressionDSL.FromGatherer select(BasicColumn...selectList) { return select(Function.identity(), selectList); } - public static FromGatherer select(Function adapterFunction, + public static QueryExpressionDSL.FromGatherer select(Function adapterFunction, BasicColumn...selectList) { SelectDSL selectModelBuilder = new SelectDSL<>(adapterFunction); return selectModelBuilder.queryExpressionBuilder(selectList); } - public static FromGatherer selectDistinct(BasicColumn...selectList) { + public static QueryExpressionDSL.FromGatherer selectDistinct(BasicColumn...selectList) { return selectDistinct(Function.identity(), selectList); } - public static FromGatherer selectDistinct(Function adapterFunction, + public static QueryExpressionDSL.FromGatherer selectDistinct(Function adapterFunction, BasicColumn...selectList) { SelectDSL selectModelBuilder = new SelectDSL<>(adapterFunction); return selectModelBuilder.distinctQueryExpressionBuilder(selectList); } - public static FromGatherer> selectWithMapper( + public static QueryExpressionDSL.FromGatherer> selectWithMapper( Function mapperMethod, BasicColumn...selectList) { return select(selectModel -> MyBatis3SelectModelAdapter.of(selectModel, mapperMethod), selectList); } - public static FromGatherer> selectDistinctWithMapper( + public static QueryExpressionDSL.FromGatherer> selectDistinctWithMapper( Function mapperMethod, BasicColumn...selectList) { return selectDistinct(selectModel -> MyBatis3SelectModelAdapter.of(selectModel, mapperMethod), selectList); @@ -112,6 +113,10 @@ public FetchFirstFinisher fetchFirst(long fetchFirstRows) { @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalBuild() { SelectModel selectModel = SelectModel.withQueryExpressions(queryExpressions) .withOrderByModel(orderByModel) .withPagingModel(pagingModel) @@ -124,6 +129,7 @@ public class LimitFinisher implements Buildable { public LimitFinisher(long limit) { this.limit = limit; + buildDelegateMethod = this::internalBuild; } public OffsetFinisher offset(long offset) { @@ -132,15 +138,20 @@ public OffsetFinisher offset(long offset) { @Override public R build() { - SelectDSL.this.pagingModel = new LimitAndOffsetPagingModel.Builder() + return buildDelegateMethod.get(); + } + + private R internalBuild() { + pagingModel = new LimitAndOffsetPagingModel.Builder() .withLimit(limit) .build(); - return SelectDSL.this.build(); + return SelectDSL.this.internalBuild(); } } public class OffsetFinisher implements Buildable { public OffsetFinisher(long limit, long offset) { + buildDelegateMethod = this::internalBuild; SelectDSL.this.pagingModel = new LimitAndOffsetPagingModel.Builder() .withLimit(limit) .withOffset(offset) @@ -149,7 +160,11 @@ public OffsetFinisher(long limit, long offset) { @Override public R build() { - return SelectDSL.this.build(); + return buildDelegateMethod.get(); + } + + private R internalBuild() { + return SelectDSL.this.internalBuild(); } } @@ -158,6 +173,7 @@ public class OffsetFirstFinisher implements Buildable { public OffsetFirstFinisher(long offset) { this.offset = offset; + buildDelegateMethod = this::internalBuild; } public FetchFirstFinisher fetchFirst(long fetchFirstRows) { @@ -166,10 +182,14 @@ public FetchFirstFinisher fetchFirst(long fetchFirstRows) { @Override public R build() { + return buildDelegateMethod.get(); + } + + private R internalBuild() { SelectDSL.this.pagingModel = new FetchFirstPagingModel.Builder() .withOffset(offset) .build(); - return SelectDSL.this.build(); + return SelectDSL.this.internalBuild(); } } @@ -193,9 +213,17 @@ public RowsOnlyFinisher rowsOnly() { } public class RowsOnlyFinisher implements Buildable { + public RowsOnlyFinisher() { + buildDelegateMethod = this::internalBuild; + } + @Override public R build() { - return SelectDSL.this.build(); + return buildDelegateMethod.get(); + } + + private R internalBuild() { + return SelectDSL.this.internalBuild(); } } } From 5840ffee86ba41f7379c1a2d088955b1c219090a Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 2 Jul 2019 08:27:28 -0400 Subject: [PATCH 3/7] Remove useless this references --- .../java/org/mybatis/dynamic/sql/select/SelectDSL.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java index 8e750dad2..87bd1e736 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/SelectDSL.java @@ -137,7 +137,7 @@ private R internalBuild() { public class OffsetFinisher implements Buildable { public OffsetFinisher(long limit, long offset) { buildDelegateMethod = this::internalBuild; - SelectDSL.this.pagingModel = new LimitAndOffsetPagingModel.Builder() + pagingModel = new LimitAndOffsetPagingModel.Builder() .withLimit(limit) .withOffset(offset) .build(); @@ -171,7 +171,7 @@ public R build() { } private R internalBuild() { - SelectDSL.this.pagingModel = new FetchFirstPagingModel.Builder() + pagingModel = new FetchFirstPagingModel.Builder() .withOffset(offset) .build(); return SelectDSL.this.internalBuild(); @@ -180,13 +180,13 @@ private R internalBuild() { public class FetchFirstFinisher { public FetchFirstFinisher(long fetchFirstRows) { - SelectDSL.this.pagingModel = new FetchFirstPagingModel.Builder() + pagingModel = new FetchFirstPagingModel.Builder() .withFetchFirstRows(fetchFirstRows) .build(); } public FetchFirstFinisher(long offset, long fetchFirstRows) { - SelectDSL.this.pagingModel = new FetchFirstPagingModel.Builder() + pagingModel = new FetchFirstPagingModel.Builder() .withOffset(offset) .withFetchFirstRows(fetchFirstRows) .build(); From 1954e4315bf39b34ae42edd158e4470d6cae5996 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 2 Jul 2019 08:32:36 -0400 Subject: [PATCH 4/7] Setup build delegate method for union queries --- .../sql/select/QueryExpressionDSL.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java index 3d5a2bf6c..8b43694d7 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.function.Supplier; import org.mybatis.dynamic.sql.BasicColumn; @@ -195,22 +196,29 @@ public static class FromGatherer { private SelectDSL selectDSL; private boolean isDistinct; private SqlTable table; + private Optional> priorQuery; public FromGatherer(Builder builder) { this.connector = builder.connector; this.selectList = Objects.requireNonNull(builder.selectList); this.selectDSL = Objects.requireNonNull(builder.selectDSL); this.isDistinct = builder.isDistinct; + this.priorQuery = Optional.ofNullable(builder.priorQuery); } public QueryExpressionDSL from(SqlTable table) { this.table = table; - return new QueryExpressionDSL<>(this); + return setPriorBuildDelegate(new QueryExpressionDSL<>(this)); } public QueryExpressionDSL from(SqlTable table, String tableAlias) { this.table = table; - return new QueryExpressionDSL<>(this, tableAlias); + return setPriorBuildDelegate(new QueryExpressionDSL<>(this, tableAlias)); + } + + private QueryExpressionDSL setPriorBuildDelegate(QueryExpressionDSL newQuery) { + priorQuery.ifPresent(pq -> pq.buildDelegateMethod = newQuery::build); + return newQuery; } public static class Builder { @@ -218,6 +226,7 @@ public static class Builder { private BasicColumn[] selectList; private SelectDSL selectDSL; private boolean isDistinct; + private QueryExpressionDSL priorQuery; public Builder withConnector(String connector) { this.connector = connector; @@ -239,6 +248,11 @@ public Builder isDistinct() { return this; } + public Builder withPriorQuery(QueryExpressionDSL priorQuery) { + this.priorQuery = priorQuery; + return this; + } + public FromGatherer build() { return new FromGatherer<>(this); } @@ -535,6 +549,7 @@ public FromGatherer select(BasicColumn...selectList) { .withConnector(connector) .withSelectList(selectList) .withSelectDSL(selectDSL) + .withPriorQuery(QueryExpressionDSL.this) .build(); } @@ -544,6 +559,7 @@ public FromGatherer selectDistinct(BasicColumn...selectList) { .withSelectList(selectList) .withSelectDSL(selectDSL) .isDistinct() + .withPriorQuery(QueryExpressionDSL.this) .build(); } } From e3c982edc05551046823a9dd0b2e512ff2feae77 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 2 Jul 2019 12:27:34 -0400 Subject: [PATCH 5/7] Testing progress --- .../java/issues/gh100/FromJoinWhereTest.java | 236 ++++++++++++++++-- 1 file changed, 220 insertions(+), 16 deletions(-) diff --git a/src/test/java/issues/gh100/FromJoinWhereTest.java b/src/test/java/issues/gh100/FromJoinWhereTest.java index 54058b958..ac967a3cb 100644 --- a/src/test/java/issues/gh100/FromJoinWhereTest.java +++ b/src/test/java/issues/gh100/FromJoinWhereTest.java @@ -1,7 +1,21 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package issues.gh100; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; import static org.mybatis.dynamic.sql.SqlBuilder.*; import org.junit.jupiter.api.Test; @@ -61,7 +75,7 @@ public void testFromJoinB1() { QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) .from(StudentDynamicSqlSupport.student); - QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + builder1.join(StudentRegDynamicSqlSupport.studentReg) .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); String expected = "select student.id, student.name, student.idcard" @@ -98,7 +112,7 @@ public void testfromJoinWhereB1() { QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); - QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); String expected = "select student.id, student.name, student.idcard" + " from student" @@ -118,7 +132,7 @@ public void testfromJoinWhereB2() { QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); - QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); String expected = "select student.id, student.name, student.idcard" + " from student" @@ -160,7 +174,7 @@ public void testFromJoinWhereUnionB1() { QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); - QueryExpressionDSL builder4 = builder3.union() + builder3.union() .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) .from(StudentDynamicSqlSupport.student); @@ -187,7 +201,7 @@ public void testFromJoinWhereUnionB2() { QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); - QueryExpressionDSL builder4 = builder3.union() + builder3.union() .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) .from(StudentDynamicSqlSupport.student); @@ -214,7 +228,7 @@ public void testFromJoinWhereUnionB3() { QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); - QueryExpressionDSL builder4 = builder3.union() + builder3.union() .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) .from(StudentDynamicSqlSupport.student); @@ -258,6 +272,196 @@ public void testFromJoinWhereUnionB4() { assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } + @Test + public void testFromJoinWhereUnionUnionB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNotNull()); + + builder4.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNull()); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is not null" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is null"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionUnionB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNotNull()); + + builder4.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNull()); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is not null" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is null"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionUnionB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNotNull()); + + builder4.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNull()); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is not null" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is null"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionUnionB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNotNull()); + + builder4.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNull()); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is not null" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is null"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionUnionB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNotNull()); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder5 = builder4.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student) + .where(StudentDynamicSqlSupport.id, isNull()); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is not null" + + " union" + + " select id, name, idcard" + + " from student" + + " where id is null"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + @Test public void testFromJoinWhereUnionOrderByB1() { QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) @@ -272,7 +476,7 @@ public void testFromJoinWhereUnionOrderByB1() { .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) .from(StudentDynamicSqlSupport.student); - SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + builder4.orderBy(StudentDynamicSqlSupport.id); String expected = "select student.id, student.name, student.idcard" + " from student" @@ -302,7 +506,7 @@ public void testFromJoinWhereUnionOrderByB2() { .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) .from(StudentDynamicSqlSupport.student); - SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + builder4.orderBy(StudentDynamicSqlSupport.id); String expected = "select student.id, student.name, student.idcard" + " from student" @@ -332,7 +536,7 @@ public void testFromJoinWhereUnionOrderByB3() { .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) .from(StudentDynamicSqlSupport.student); - SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + builder4.orderBy(StudentDynamicSqlSupport.id); String expected = "select student.id, student.name, student.idcard" + " from student" @@ -362,7 +566,7 @@ public void testFromJoinWhereUnionOrderByB4() { .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) .from(StudentDynamicSqlSupport.student); - SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + builder4.orderBy(StudentDynamicSqlSupport.id); String expected = "select student.id, student.name, student.idcard" + " from student" @@ -424,7 +628,7 @@ public void testFromJoinWhereUnionOrderByLimitB1() { SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); - SelectDSL.LimitFinisher builder6 = builder5.limit(3); + builder5.limit(3); String expected = "select student.id, student.name, student.idcard" + " from student" @@ -457,7 +661,7 @@ public void testFromJoinWhereUnionOrderByLimitB2() { SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); - SelectDSL.LimitFinisher builder6 = builder5.limit(3); + builder5.limit(3); String expected = "select student.id, student.name, student.idcard" + " from student" @@ -490,7 +694,7 @@ public void testFromJoinWhereUnionOrderByLimitB3() { SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); - SelectDSL.LimitFinisher builder6 = builder5.limit(3); + builder5.limit(3); String expected = "select student.id, student.name, student.idcard" + " from student" @@ -523,7 +727,7 @@ public void testFromJoinWhereUnionOrderByLimitB4() { SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); - SelectDSL.LimitFinisher builder6 = builder5.limit(3); + builder5.limit(3); String expected = "select student.id, student.name, student.idcard" + " from student" @@ -556,7 +760,7 @@ public void testFromJoinWhereUnionOrderByLimitB5() { SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); - SelectDSL.LimitFinisher builder6 = builder5.limit(3); + builder5.limit(3); String expected = "select student.id, student.name, student.idcard" + " from student" From b1ce9387dd21f967e3c4038a510dad7d5a89e36b Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 2 Jul 2019 16:00:24 -0400 Subject: [PATCH 6/7] More tests and a couple of missed spots --- .../sql/select/QueryExpressionDSL.java | 2 + .../java/issues/gh100/FromGroupByTest.java | 377 ++ .../java/issues/gh100/FromJoinWhereTest.java | 3069 ++++++++++++++++- src/test/java/issues/gh100/Issue100Test.java | 12 - .../gh100/Issue100TestStartAfterJoin.java | 12 - src/test/java/issues/gh100/README.md | 101 +- 6 files changed, 3409 insertions(+), 164 deletions(-) create mode 100644 src/test/java/issues/gh100/FromGroupByTest.java diff --git a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java index 8b43694d7..c18474c25 100644 --- a/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java +++ b/src/main/java/org/mybatis/dynamic/sql/select/QueryExpressionDSL.java @@ -300,12 +300,14 @@ public GroupByFinisher groupBy(BasicColumn...columns) { } public SelectDSL.LimitFinisher limit(long limit) { + buildDelegateMethod = selectDSL::build; whereModel = buildWhereModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.limit(limit); } public SelectDSL.OffsetFirstFinisher offset(long offset) { + buildDelegateMethod = selectDSL::build; whereModel = buildWhereModel(); selectDSL.addQueryExpression(buildModel()); return selectDSL.offset(offset); diff --git a/src/test/java/issues/gh100/FromGroupByTest.java b/src/test/java/issues/gh100/FromGroupByTest.java new file mode 100644 index 000000000..990f3b9db --- /dev/null +++ b/src/test/java/issues/gh100/FromGroupByTest.java @@ -0,0 +1,377 @@ +/** + * Copyright 2016-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package issues.gh100; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mybatis.dynamic.sql.SqlBuilder.*; + +import org.junit.jupiter.api.Test; +import org.mybatis.dynamic.sql.render.RenderingStrategy; +import org.mybatis.dynamic.sql.select.QueryExpressionDSL; +import org.mybatis.dynamic.sql.select.SelectDSL; +import org.mybatis.dynamic.sql.select.SelectModel; +import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; + +public class FromGroupByTest { + + @Test + public void testFromGroupByB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + builder1.groupBy(StudentDynamicSqlSupport.name); + + String expected = "select name, count(*)" + + " from student" + + " group by name"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + String expected = "select name, count(*)" + + " from student" + + " group by name"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByLimitB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.limit(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByLimitB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.limit(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByLimitB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL.LimitFinisher builder3 = builder2.limit(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.offset(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.offset(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL.OffsetFirstFinisher builder3 = builder2.offset(3); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.fetchFirst(2).rowsOnly(); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.fetchFirst(2).rowsOnly(); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL.RowsOnlyFinisher builder3 = builder2.fetchFirst(2).rowsOnly(); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.orderBy(StudentDynamicSqlSupport.name); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + builder2.orderBy(StudentDynamicSqlSupport.name); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL builder3 = builder2.orderBy(StudentDynamicSqlSupport.name); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL builder3 = builder2.orderBy(StudentDynamicSqlSupport.name); + + builder3.offset(2); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL builder3 = builder2.orderBy(StudentDynamicSqlSupport.name); + + builder3.offset(2); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL builder3 = builder2.orderBy(StudentDynamicSqlSupport.name); + + builder3.offset(2); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromGroupByOrderByOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.name, count()) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.GroupByFinisher builder2 = builder1.groupBy(StudentDynamicSqlSupport.name); + + SelectDSL builder3 = builder2.orderBy(StudentDynamicSqlSupport.name); + + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(2); + + String expected = "select name, count(*)" + + " from student" + + " group by name" + + " order by name" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } +} diff --git a/src/test/java/issues/gh100/FromJoinWhereTest.java b/src/test/java/issues/gh100/FromJoinWhereTest.java index ac967a3cb..a2b30cde6 100644 --- a/src/test/java/issues/gh100/FromJoinWhereTest.java +++ b/src/test/java/issues/gh100/FromJoinWhereTest.java @@ -811,7 +811,223 @@ public void testFromJoinWhereUnionOrderByLimitB6() { } @Test - public void testFromJoinWhereUnionOrderByLimitOffset() { + public void testFromJoinWhereUnionOrderByLimitOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder6 = builder5.limit(3); + + builder6.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByLimitOffsetB7() { QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) .from(StudentDynamicSqlSupport.student); @@ -834,110 +1050,2881 @@ public void testFromJoinWhereUnionOrderByLimitOffset() { + " from student" + " join student_reg on student.id = student_reg.studentId" + " where student.idcard = #{parameters.p1}" - + " union" - + " select id, name, idcard" - + " from student" - + " order by id" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder7.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByOffsetFetchFirstB7() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder6 = builder5.offset(2); + + SelectDSL.RowsOnlyFinisher builder7 = builder6.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder7.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOrderByFetchFirstB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL builder5 = builder4.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.RowsOnlyFinisher builder6 = builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionLimitOffsetB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + SelectDSL.OffsetFinisher builder6 = builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionOffsetFetchFirstB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + SelectDSL.RowsOnlyFinisher builder6 = builder5.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereUnionFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + QueryExpressionDSL builder4 = builder3.union() + .select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + SelectDSL.RowsOnlyFinisher builder5 = builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " union" + + " select id, name, idcard" + + " from student" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByLimitOffsetB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.LimitFinisher builder5 = builder4.limit(3); + + SelectDSL.OffsetFinisher builder6 = builder5.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByOffsetFetchFirstB6() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.OffsetFirstFinisher builder5 = builder4.offset(2); + + SelectDSL.RowsOnlyFinisher builder6 = builder5.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder6.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + builder4.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereOrderByFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL builder4 = builder3.orderBy(StudentDynamicSqlSupport.id); + + SelectDSL.RowsOnlyFinisher builder5 = builder4.fetchFirst(3).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " order by id" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.limit(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.limit(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.limit(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + builder4.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + builder4.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + builder4.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + + @Test + public void testFromJoinWhereLimitOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + builder4.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + " limit #{parameters._limit}" + " offset #{parameters._offset}"; - SelectStatementProvider selectStatement = builder7.build().render(RenderingStrategy.MYBATIS3); + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } @Test - public void testFromJoinWhereUnionOrderByOffset() { + public void testFromJoinWhereLimitOffsetB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.LimitFinisher builder4 = builder3.limit(2); + + SelectDSL.OffsetFinisher builder5 = builder4.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " limit #{parameters._limit}" + + " offset #{parameters._offset}"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } @Test - public void testFromJoinWhereUnionOrderByOffsetFetchFirst() { + public void testFromJoinWhereOffsetB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } - + @Test - public void testFromJoinWhereUnionOrderByFetchFirst() { + public void testFromJoinWhereOffsetB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } - + @Test - public void testFromJoinWhereUnionLimit() { + public void testFromJoinWhereOffsetB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } - + @Test - public void testFromJoinWhereUnionLimitOffset() { + public void testFromJoinWhereOffsetB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } @Test - public void testFromJoinWhereUnionOffset() { + public void testFromJoinWhereOffsetFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } @Test - public void testFromJoinWhereUnionOffsetFetchFirst() { + public void testFromJoinWhereOffsetFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); - } + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); - @Test - public void testFromJoinWhereUnionFetchFirst() { + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } @Test - public void testFromJoinWhereOrderBy() { + public void testFromJoinWhereOffsetFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); - } + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); - @Test - public void testFromJoinWhereOrderByLimit() { + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + builder4.fetchFirst(2).rowsOnly(); + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } - + @Test - public void testFromJoinWhereOrderByLimitOffset() { + public void testFromJoinWhereOffsetFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); - } + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); - @Test - public void testFromJoinWhereOrderByOffset() { + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } - + @Test - public void testFromJoinWhereOrderByOffsetFetchFirst() { + public void testFromJoinWhereOffsetFetchFirstB5() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); - } + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); - @Test - public void testFromJoinWhereOrderByFetchFirst() { + SelectDSL.OffsetFirstFinisher builder4 = builder3.offset(3); + + SelectDSL.RowsOnlyFinisher builder5 = builder4.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " offset #{parameters._offset} rows" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder5.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } @Test - public void testFromJoinWhereLimit() { + public void testFromJoinWhereFetchFirstB1() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); - } + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); - @Test - public void testFromJoinWhereLimitOffset() { + builder3.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder1.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } @Test - public void testFromJoinWhereOffset() { + public void testFromJoinWhereFetchFirstB2() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); - } + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.fetchFirst(2).rowsOnly(); + + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder2.build().render(RenderingStrategy.MYBATIS3); + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); + } + @Test - public void testFromJoinWhereOffsetFetchFirst() { + public void testFromJoinWhereFetchFirstB3() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + builder3.fetchFirst(2).rowsOnly(); + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder3.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } @Test - public void testFromJoinWhereFetchFirst() { + public void testFromJoinWhereFetchFirstB4() { + QueryExpressionDSL builder1 = select(StudentDynamicSqlSupport.id, StudentDynamicSqlSupport.name, StudentDynamicSqlSupport.idcard) + .from(StudentDynamicSqlSupport.student); + + QueryExpressionDSL.JoinSpecificationFinisher builder2 = builder1.join(StudentRegDynamicSqlSupport.studentReg) + .on(StudentDynamicSqlSupport.id, equalTo(StudentRegDynamicSqlSupport.studentid)); + + QueryExpressionDSL.QueryExpressionWhereBuilder builder3 = builder2.where(StudentDynamicSqlSupport.idcard, isEqualTo("fred")); + + SelectDSL.RowsOnlyFinisher builder4 = builder3.fetchFirst(2).rowsOnly(); + String expected = "select student.id, student.name, student.idcard" + + " from student" + + " join student_reg on student.id = student_reg.studentId" + + " where student.idcard = #{parameters.p1}" + + " fetch first #{parameters._fetchFirstRows} rows only"; + + SelectStatementProvider selectStatement = builder4.build().render(RenderingStrategy.MYBATIS3); + + assertThat(selectStatement.getSelectStatement()).isEqualTo(expected); } } diff --git a/src/test/java/issues/gh100/Issue100Test.java b/src/test/java/issues/gh100/Issue100Test.java index 78385f35e..96cf55113 100644 --- a/src/test/java/issues/gh100/Issue100Test.java +++ b/src/test/java/issues/gh100/Issue100Test.java @@ -24,18 +24,6 @@ import org.mybatis.dynamic.sql.select.SelectModel; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; -/** - * This set of tests is related to issues raised in https://github.com/mybatis/mybatis-dynamic-sql/issues/100 and - * https://github.com/mybatis/mybatis-dynamic-sql/issues/102. - * - * The basic idea is that we want to enable the user to call the build() method from any object along the - * DSL chain and have predictable results. - * - * So this set of test cases tests calling the build() method at various points along the chain. - * - * @author Jeff Butler - * - */ public class Issue100Test { @Test diff --git a/src/test/java/issues/gh100/Issue100TestStartAfterJoin.java b/src/test/java/issues/gh100/Issue100TestStartAfterJoin.java index 25d2acafa..7f613e35e 100644 --- a/src/test/java/issues/gh100/Issue100TestStartAfterJoin.java +++ b/src/test/java/issues/gh100/Issue100TestStartAfterJoin.java @@ -25,18 +25,6 @@ import org.mybatis.dynamic.sql.select.SelectModel; import org.mybatis.dynamic.sql.select.render.SelectStatementProvider; -/** - * This set of tests is related to issues raised in https://github.com/mybatis/mybatis-dynamic-sql/issues/100 and - * https://github.com/mybatis/mybatis-dynamic-sql/issues/102. - * - * The basic idea is that we want to enable the user to call the build() method from any object along the - * DSL chain and have predictable results. - * - * So this set of test cases tests calling the build() method at various points along the chain. - * - * @author Jeff Butler - * - */ public class Issue100TestStartAfterJoin { @Test diff --git a/src/test/java/issues/gh100/README.md b/src/test/java/issues/gh100/README.md index fb91e0d8c..80732bbcf 100644 --- a/src/test/java/issues/gh100/README.md +++ b/src/test/java/issues/gh100/README.md @@ -1,102 +1,5 @@ # About these Tests -GitHub issues 100 and 102 exposed issues where calling the `build()` method at an unexpected location caused the rendered SQL to be incorrect. Changes for this issue now allow for the `build()` method to be called on any intermediate object in the select statement chain - regardless if further operations have been performed - and consistent renderings will occur. +GitHub issues 100 and 102 exposed issues where calling the `build()` method at an unexpected location caused the rendered SQL to be incorrect. Changes for this issue now allow for the `build()` method to be called on any intermediate object in the select statement chain * regardless if further operations have been performed * and consistent renderings will occur. -Tests in this directory cover the possible places where a `build()` method could be called and virtually all the possible paths through a select statement. - -- from -- from join - - from join where - - from join where union - - from join where union order by - - from join where union order by limit - - from join where union order by limit offset - - from join where union order by offset - - from join where union order by offset fetch first - - from join where union order by fetch first - - from join where union limit - - from join where union limit offset - - from join where union offset - - from join where union offset fetch first - - from join where union fetch first - - from join where order by - - from join where order by limit - - from join where order by limit offset - - from join where order by offset - - from join where order by offset fetch first - - from join where order by fetch first - - from join where limit - - from join where limit offset - - from join where offset - - from join where offset fetch first - - from join where fetch first - - from join union - - from join union order by - - from join union order by limit - - from join union order by limit offset - - from join union order by offset - - from join union order by offset fetch first - - from join union order by fetch first - - from join union limit - - from join union limit offset - - from join union offset - - from join union offset fetch first - - from join union fetch first - - from join order by - - from join order by limit - - from join order by limit offset - - from join order by offset - - from join order by offset fetch first - - from join order by fetch first - - from join limit - - from join limit offset - - from join offset - - from join offset fetch first - - from join fetch first -- from where - - from where union - - from where union order by - - from where union order by limit - - from where union order by limit offset - - from where union order by offset - - from where union order by offset fetch first - - from where union order by fetch first - - from where union limit - - from where union limit offset - - from where union offset - - from where union offset fetch first - - from where union fetch first - - from where order by - - from where order by limit - - from where order by limit offset - - from where order by offset - - from where order by offset fetch first - - from where order by fetch first - - from where limit - - from where limit offset - - from where offset - - from where offset fetch first - - from where fetch first -- from union - - from union order by - - from union order by limit - - from union order by limit offset - - from union order by offset - - from union order by offset fetch first - - from union order by fetch first - - from union limit - - from union limit offset - - from union offset - - from union offset fetch first - - from union fetch first -- from order by - - from order by limit - - from order by limit offset - - from order by offset - - from order by offset fetch first - - from order by fetch first -- from limit - - from limit offset -- from offset - - from offset fetch first -- from fetch first +Tests in this directory cover many of the possible places where a `build()` method could be called and many of the possible paths through a select statement. From 2010c8f0d8d979da30890f9978224044e5c81f57 Mon Sep 17 00:00:00 2001 From: Jeff Butler Date: Tue, 2 Jul 2019 16:21:42 -0400 Subject: [PATCH 7/7] Update the Changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 49ae77c14..3783d2b89 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ GitHub milestone: [https://github.com/mybatis/mybatis-dynamic-sql/issues?q=miles ### Added - Changed the public SQLBuilder API to accept Collection instead of List for in conditions and batch record inserts. This should have no impact on existing code, but allow for some future flexibility -- Added the ability have have table catalog and/or schema calculated at query runtime. This is useful for situations where there are different database schemas for different environments, or in some sharding situations +- Added the ability have have table catalog and/or schema calculated at query runtime. This is useful for situations where there are different database schemas for different environments, or in some sharding situations +- Added the ability to call a builder method on any intermediate object in a select statement and receive a fully rendered statement. This makes it easier to build very dynamic queries ## Release 1.1.1 - April 7, 2019