From c7d125a321b0fc367a9e6ffe2ced575c66d6a042 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Wed, 29 Jan 2014 11:22:16 +0100 Subject: [PATCH] [#2984] Add Table table(Result) to allow to fetch from / join / etc in-memory tables --- .../_/testcases/ValuesConstructorTests.java | 23 +++++++++++++ .../src/org/jooq/test/jOOQAbstractTest.java | 5 +++ jOOQ/src/main/java/org/jooq/impl/DSL.java | 34 +++++++++++++++++-- jOOQ/src/main/java/org/jooq/impl/Values.java | 9 ++++- 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/ValuesConstructorTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/ValuesConstructorTests.java index fd90c5c27c..7050451a08 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/ValuesConstructorTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/ValuesConstructorTests.java @@ -42,6 +42,7 @@ package org.jooq.test._.testcases; import static junit.framework.Assert.assertEquals; import static org.jooq.impl.DSL.row; +import static org.jooq.impl.DSL.table; import static org.jooq.impl.DSL.values; import java.sql.Date; @@ -53,6 +54,7 @@ import org.jooq.Record3; import org.jooq.Record6; import org.jooq.Result; import org.jooq.RowN; +import org.jooq.Table; import org.jooq.TableRecord; import org.jooq.UpdatableRecord; import org.jooq.test.BaseTest; @@ -117,4 +119,25 @@ extends BaseTest> booksResult = + create().select(TBook_ID(), TBook_TITLE()) + .from(TBook()) + .orderBy(TBook_ID()) + .fetch(); + + Table> booksTable = table(booksResult); + + assertEquals( + booksResult, + create().selectFrom(booksTable).fetch()); + + assertEquals( + BOOK_IDS, + create().select(booksTable.field(TBook_ID())) + .from(booksTable) + .fetch(TBook_ID())); + } } diff --git a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java index 3596d51844..a2286128fb 100644 --- a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java @@ -1891,6 +1891,11 @@ public abstract class jOOQAbstractTest< new ValuesConstructorTests(this).testValuesConstructor(); } + @Test + public void testResultConstructor() throws Exception { + new ValuesConstructorTests(this).testResultConstructor(); + } + @Test public void testOrderByInSubquery() throws Exception { new OrderByTests(this).testOrderByInSubquery(); diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index a76507a295..ed0d530584 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -4489,6 +4489,33 @@ public class DSL { return select.asTable(); } + /** + * Use a previously obtained result as a new {@link Table} that can be used + * in SQL statements through {@link #values(RowN...)}. + * + * @see #values(RowN...) + */ + @Support + @Transition( + name = "TABLE", + args = "Result" + ) + public static Table table(Result result) { + int size = result.size(); + + RowN[] rows = new RowN[size]; + for (int i = 0; i < size; i++) + rows[i] = (RowN) result.get(i).valuesRow(); + + Field[] fields = result.fields(); + String[] columns = new String[fields.length]; + for (int i = 0; i < fields.length; i++) + columns[i] = fields[i].getName(); + + // TODO [#2986] Coerce the record type upon the resulting table. + return (Table) values(rows).as("v", columns); + } + /** * A synonym for {@link #unnest(List)}. * @@ -12364,9 +12391,12 @@ public class DSL { args = "Row+" ) public static Table values(RowN... rows) { - String[] columns = new String[rows.length]; + Values.assertNotEmpty(rows); + int size = rows[0].size(); - for (int i = 0; i < rows.length; i++) + String[] columns = new String[size]; + + for (int i = 0; i < size; i++) columns[i] = "c" + i; return new Values(rows).as("v", columns); diff --git a/jOOQ/src/main/java/org/jooq/impl/Values.java b/jOOQ/src/main/java/org/jooq/impl/Values.java index 1f37d49340..cd1d64500f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Values.java +++ b/jOOQ/src/main/java/org/jooq/impl/Values.java @@ -68,7 +68,14 @@ class Values extends AbstractTable { Values(Row[] rows) { super("values"); - this.rows = rows; + this.rows = assertNotEmpty(rows); + } + + static Row[] assertNotEmpty(Row[] rows) { + if (rows == null || rows.length == 0) + throw new IllegalArgumentException("Cannot create a VALUES() constructor with an empty set of rows"); + + return rows; } @SuppressWarnings("unchecked")