From 06574b9d4c1c88579bf0bd8ad376fc7a02158bd2 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Tue, 3 Jun 2014 16:20:32 +0200 Subject: [PATCH] [#454] Added CTE / LIMIT / OFFSET integration tests --- .../org/jooq/test/all/testcases/CTETests.java | 58 +++++++++++++++++-- .../java/org/jooq/test/jOOQAbstractTest.java | 10 ++++ jOOQ/src/main/java/org/jooq/Name.java | 9 +++ .../src/main/java/org/jooq/impl/NameImpl.java | 8 +++ 4 files changed, 81 insertions(+), 4 deletions(-) diff --git a/jOOQ-test/src/test/java/org/jooq/test/all/testcases/CTETests.java b/jOOQ-test/src/test/java/org/jooq/test/all/testcases/CTETests.java index 585fda7050..f9d69f6c4a 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/all/testcases/CTETests.java +++ b/jOOQ-test/src/test/java/org/jooq/test/all/testcases/CTETests.java @@ -236,10 +236,6 @@ extends BaseTest> t1 = name("t1").as( + select(TAuthor_FIRST_NAME(), TAuthor_LAST_NAME(), TBook_ID()) + .from(TAuthor()) + .join(TBook()) + .on(TBook_AUTHOR_ID().eq(TAuthor_ID())) + .orderBy(TBook_ID()) + .limit(3) + ); + + Result result = + create().with(t1) + .select(t1.fields()) + .from(t1) + .orderBy(t1.field(2).desc()) + .limit(2) + .fetch(); + + assertEquals(2, result.size()); + assertEquals(asList("Paulo", "George"), result.getValues(0)); + assertEquals(asList("Coelho", "Orwell"), result.getValues(1)); + assertEquals(asList(3, 2), result.getValues(2, int.class)); + } + + public void testCTEWithLimitOffset() throws Exception { + assumeFamilyNotIn(CUBRID, DERBY, H2, MARIADB, MYSQL, SQLITE); + + CommonTableExpression> t1 = name("t1").as( + select(TAuthor_FIRST_NAME(), TAuthor_LAST_NAME(), TBook_ID()) + .from(TAuthor()) + .join(TBook()) + .on(TBook_AUTHOR_ID().eq(TAuthor_ID())) + .orderBy(TBook_ID()) + .limit(3) + .offset(1) + ); + + Result result = + create().with(t1) + .select(t1.fields()) + .from(t1) + .orderBy(t1.field(2).desc()) + .limit(2) + .offset(1) + .fetch(); + + assertEquals(2, result.size()); + assertEquals(asList("Paulo", "George"), result.getValues(0)); + assertEquals(asList("Coelho", "Orwell"), result.getValues(1)); + assertEquals(asList(3, 2), result.getValues(2, int.class)); + } } diff --git a/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java index 2e68dfc04b..14daf9e61d 100644 --- a/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/test/java/org/jooq/test/jOOQAbstractTest.java @@ -2267,6 +2267,16 @@ public abstract class jOOQAbstractTest< new CTETests(this).testRecursiveCTEMultiple(); } + @Test + public void testCTEWithLimit() throws Exception { + new CTETests(this).testCTEWithLimit(); + } + + @Test + public void testCTEWithLimitOffset() throws Exception { + new CTETests(this).testCTEWithLimitOffset(); + } + @Test public void testJoinDuplicateFieldNames() throws Exception { new JoinTests(this).testJoinDuplicateFieldNames(); diff --git a/jOOQ/src/main/java/org/jooq/Name.java b/jOOQ/src/main/java/org/jooq/Name.java index 2686edea54..bdbf55b0c8 100644 --- a/jOOQ/src/main/java/org/jooq/Name.java +++ b/jOOQ/src/main/java/org/jooq/Name.java @@ -70,6 +70,15 @@ public interface Name extends QueryPart { */ WindowDefinition as(WindowSpecification window); + /** + * Specify a subselect to refer to by the Name to form a common + * table expression. + *

+ * Column names are implicitly inherited from the SELECT + * statement. + */ + CommonTableExpression as(Select select); + /** * Add a list of fields to this name to make this name a * {@link DerivedColumnList}. diff --git a/jOOQ/src/main/java/org/jooq/impl/NameImpl.java b/jOOQ/src/main/java/org/jooq/impl/NameImpl.java index da5774ed2b..373d21cf99 100644 --- a/jOOQ/src/main/java/org/jooq/impl/NameImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/NameImpl.java @@ -43,9 +43,12 @@ package org.jooq.impl; import java.util.Arrays; import org.jooq.Clause; +import org.jooq.CommonTableExpression; import org.jooq.Context; import org.jooq.DerivedColumnList; import org.jooq.Name; +import org.jooq.Record; +import org.jooq.Select; import org.jooq.WindowDefinition; import org.jooq.WindowSpecification; import org.jooq.tools.StringUtils; @@ -95,6 +98,11 @@ class NameImpl extends AbstractQueryPart implements Name { return new WindowDefinitionImpl(this, window); } + @Override + public final CommonTableExpression as(Select select) { + return fields(new String[0]).as(select); + } + @Override public final DerivedColumnList fields(String... fieldNames) { if (qualifiedName.length != 1)