From 32a166a198b245d6805ff0b9a0f1fbc235a75495 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Thu, 7 Feb 2013 15:29:14 +0100 Subject: [PATCH] [#2172] Add set(Field, Select>) methods to UPDATE, MERGE and INSERT statements --- .../jooq/test/_/testcases/InsertUpdateTests.java | 14 +++++++++++++- .../jooq/test/_/testcases/RenderAndBindTests.java | 2 +- jOOQ-tools/src/org/jooq/xtend/GenerateAll.xtend | 2 +- jOOQ-tools/src/org/jooq/xtend/InsertDSL.xtend | 6 ++++++ .../jooq/xtend/{Update.xtend => UpdateDSL.xtend} | 4 ++-- .../java/org/jooq/InsertOnDuplicateSetStep.java | 7 +++++++ jOOQ/src/main/java/org/jooq/InsertSetStep.java | 12 +++++++++--- .../main/java/org/jooq/MergeMatchedSetStep.java | 7 +++++++ .../main/java/org/jooq/MergeNotMatchedSetStep.java | 7 +++++++ jOOQ/src/main/java/org/jooq/UpdateSetStep.java | 6 ++++++ jOOQ/src/main/java/org/jooq/impl/InsertImpl.java | 6 ++++++ jOOQ/src/main/java/org/jooq/impl/MergeImpl.java | 6 ++++++ jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java | 5 +++++ 13 files changed, 76 insertions(+), 8 deletions(-) rename jOOQ-tools/src/org/jooq/xtend/{Update.xtend => UpdateDSL.xtend} (98%) diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/InsertUpdateTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/InsertUpdateTests.java index 88632cf0ea..d29e74ec26 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/InsertUpdateTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/InsertUpdateTests.java @@ -444,15 +444,27 @@ extends BaseTest asField()) .where(TAuthor_ID().equal(3)) - .execute(); + .execute()); author = create().fetchOne(TAuthor(), TAuthor_LAST_NAME().equal("Hitchcock")); assertEquals(Integer.valueOf(4), author.getValue(TAuthor_ID())); assertEquals("Hitchcock", author.getValue(TAuthor_LAST_NAME())); + + assertEquals(1, + create().update(TAuthor()) + .set(TAuthor_ID(), select(inline(5))) + .set(TAuthor_LAST_NAME(), select(val("Hesse"))) + .where(TAuthor_ID().equal(4)) + .execute()); + + author = create().fetchOne(TAuthor(), TAuthor_LAST_NAME().equal("Hesse")); + assertEquals(Integer.valueOf(5), author.getValue(TAuthor_ID())); + assertEquals("Hesse", author.getValue(TAuthor_LAST_NAME())); } @Test diff --git a/jOOQ-test/src/org/jooq/test/_/testcases/RenderAndBindTests.java b/jOOQ-test/src/org/jooq/test/_/testcases/RenderAndBindTests.java index ca60437cf0..beed147e5d 100644 --- a/jOOQ-test/src/org/jooq/test/_/testcases/RenderAndBindTests.java +++ b/jOOQ-test/src/org/jooq/test/_/testcases/RenderAndBindTests.java @@ -153,7 +153,7 @@ extends BaseTest insert1 = create().insertInto(TAuthor()) .set(TAuthor_ID(), 1) - .set(TAuthor_FIRST_NAME(), null) + .set(TAuthor_FIRST_NAME(), (String) null) .set(TAuthor_LAST_NAME(), "Koontz"); assertEquals( diff --git a/jOOQ-tools/src/org/jooq/xtend/GenerateAll.xtend b/jOOQ-tools/src/org/jooq/xtend/GenerateAll.xtend index 67e9105df1..e048fa0ea6 100644 --- a/jOOQ-tools/src/org/jooq/xtend/GenerateAll.xtend +++ b/jOOQ-tools/src/org/jooq/xtend/GenerateAll.xtend @@ -9,6 +9,6 @@ class GenerateAll { InsertDSL::main(args); Records::main(args); Rows::main(args); - Update::main(args); + UpdateDSL::main(args); } } \ No newline at end of file diff --git a/jOOQ-tools/src/org/jooq/xtend/InsertDSL.xtend b/jOOQ-tools/src/org/jooq/xtend/InsertDSL.xtend index 82121cae4b..b55ea224e6 100644 --- a/jOOQ-tools/src/org/jooq/xtend/InsertDSL.xtend +++ b/jOOQ-tools/src/org/jooq/xtend/InsertDSL.xtend @@ -146,6 +146,7 @@ class InsertDSL extends Generators { «ENDFOR» import org.jooq.InsertValuesStepN; import org.jooq.Record; + import org.jooq.Record1; import org.jooq.Result; import org.jooq.Select; import org.jooq.Table; @@ -295,6 +296,11 @@ class InsertDSL extends Generators { return this; } + @Override + public final InsertImpl set(Field field, Select> value) { + return set(field, value.asField()); + } + @Override public final InsertImpl set(Map, ?> map) { if (onDuplicateKeyUpdate) { diff --git a/jOOQ-tools/src/org/jooq/xtend/Update.xtend b/jOOQ-tools/src/org/jooq/xtend/UpdateDSL.xtend similarity index 98% rename from jOOQ-tools/src/org/jooq/xtend/Update.xtend rename to jOOQ-tools/src/org/jooq/xtend/UpdateDSL.xtend index e490f55372..7e55eb433a 100644 --- a/jOOQ-tools/src/org/jooq/xtend/Update.xtend +++ b/jOOQ-tools/src/org/jooq/xtend/UpdateDSL.xtend @@ -40,10 +40,10 @@ import org.jooq.Constants /** * @author Lukas Eder */ -class Update extends Generators { +class UpdateDSL extends Generators { def static void main(String[] args) { - val update = new Update(); + val update = new UpdateDSL(); update.generateUpdateQuery(); update.generateUpdateQueryImpl(); update.generateUpdateSetFirstStep(); diff --git a/jOOQ/src/main/java/org/jooq/InsertOnDuplicateSetStep.java b/jOOQ/src/main/java/org/jooq/InsertOnDuplicateSetStep.java index 37c5c1a84c..29dc136378 100644 --- a/jOOQ/src/main/java/org/jooq/InsertOnDuplicateSetStep.java +++ b/jOOQ/src/main/java/org/jooq/InsertOnDuplicateSetStep.java @@ -78,6 +78,13 @@ public interface InsertOnDuplicateSetStep { @Support({ CUBRID, DB2, HSQLDB, MYSQL, ORACLE, SQLSERVER, SYBASE }) InsertOnDuplicateSetMoreStep set(Field field, Field value); + /** + * Set values for UPDATE in the INSERT statement's + * ON DUPLICATE KEY UPDATE clause + */ + @Support({ CUBRID, DB2, HSQLDB, MYSQL, ORACLE, SQLSERVER, SYBASE }) + InsertOnDuplicateSetMoreStep set(Field field, Select> value); + /** * Set multiple values for UPDATE in the INSERT * statement's ON DUPLICATE KEY UPDATE clause diff --git a/jOOQ/src/main/java/org/jooq/InsertSetStep.java b/jOOQ/src/main/java/org/jooq/InsertSetStep.java index 66df0c0e87..8fbde7242f 100644 --- a/jOOQ/src/main/java/org/jooq/InsertSetStep.java +++ b/jOOQ/src/main/java/org/jooq/InsertSetStep.java @@ -63,19 +63,25 @@ import org.jooq.impl.Executor; public interface InsertSetStep { /** - * Set a value for a field in the UPDATE statement + * Set a value for a field in the INSERT statement */ @Support InsertSetMoreStep set(Field field, T value); /** - * Set a value for a field in the UPDATE statement + * Set a value for a field in the INSERT statement */ @Support InsertSetMoreStep set(Field field, Field value); /** - * Set a value for a field in the UPDATE statement + * Set a value for a field in the INSERT statement + */ + @Support + InsertSetMoreStep set(Field field, Select> value); + + /** + * Set a value for a field in the INSERT statement *

* Please assure that key/value pairs have matching <T> * types. Values can either be of type <T> or diff --git a/jOOQ/src/main/java/org/jooq/MergeMatchedSetStep.java b/jOOQ/src/main/java/org/jooq/MergeMatchedSetStep.java index a7ad1e7f9c..e4a0e1d1ec 100644 --- a/jOOQ/src/main/java/org/jooq/MergeMatchedSetStep.java +++ b/jOOQ/src/main/java/org/jooq/MergeMatchedSetStep.java @@ -79,6 +79,13 @@ public interface MergeMatchedSetStep { @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) MergeMatchedSetMoreStep set(Field field, Field value); + /** + * Set values for UPDATE in the MERGE statement's + * WHEN MATCHED clause + */ + @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) + MergeMatchedSetMoreStep set(Field field, Select> value); + /** * Set multiple values for UPDATE in the MERGE * statement's WHEN MATCHED clause. diff --git a/jOOQ/src/main/java/org/jooq/MergeNotMatchedSetStep.java b/jOOQ/src/main/java/org/jooq/MergeNotMatchedSetStep.java index 6f05048952..896c973bee 100644 --- a/jOOQ/src/main/java/org/jooq/MergeNotMatchedSetStep.java +++ b/jOOQ/src/main/java/org/jooq/MergeNotMatchedSetStep.java @@ -79,6 +79,13 @@ public interface MergeNotMatchedSetStep { @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) MergeNotMatchedSetMoreStep set(Field field, Field value); + /** + * Set values for INSERT in the MERGE statement's + * WHEN NOT MATCHED clause + */ + @Support({ CUBRID, DB2, HSQLDB, ORACLE, SQLSERVER, SYBASE }) + MergeMatchedSetMoreStep set(Field field, Select> value); + /** * Set multiple values for INSERT in the MERGE * statement's WHEN NOT MATCHED clause. diff --git a/jOOQ/src/main/java/org/jooq/UpdateSetStep.java b/jOOQ/src/main/java/org/jooq/UpdateSetStep.java index 5d1a5dd49b..de2681f76c 100644 --- a/jOOQ/src/main/java/org/jooq/UpdateSetStep.java +++ b/jOOQ/src/main/java/org/jooq/UpdateSetStep.java @@ -66,6 +66,12 @@ public interface UpdateSetStep { @Support UpdateSetMoreStep set(Field field, Field value); + /** + * Set a value for a field in the UPDATE statement + */ + @Support + UpdateSetMoreStep set(Field field, Select> value); + /** * Set a value for a field in the UPDATE statement *

diff --git a/jOOQ/src/main/java/org/jooq/impl/InsertImpl.java b/jOOQ/src/main/java/org/jooq/impl/InsertImpl.java index 6da37107bf..1c381babaa 100644 --- a/jOOQ/src/main/java/org/jooq/impl/InsertImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/InsertImpl.java @@ -73,6 +73,7 @@ import org.jooq.InsertValuesStep21; import org.jooq.InsertValuesStep22; import org.jooq.InsertValuesStepN; import org.jooq.Record; +import org.jooq.Record1; import org.jooq.Result; import org.jooq.Select; import org.jooq.Table; @@ -447,6 +448,11 @@ class InsertImpl InsertImpl set(Field field, Select> value) { + return set(field, value.asField()); + } + @Override public final InsertImpl set(Map, ?> map) { if (onDuplicateKeyUpdate) { diff --git a/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java b/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java index c7cb18aa42..24ffdf3b7a 100644 --- a/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/MergeImpl.java @@ -110,6 +110,7 @@ import org.jooq.MergeUsingStep; import org.jooq.Operator; import org.jooq.QueryPart; import org.jooq.Record; +import org.jooq.Record1; import org.jooq.RenderContext; import org.jooq.Row; import org.jooq.Select; @@ -675,6 +676,11 @@ implements return this; } + @Override + public final MergeImpl set(Field field, Select> value) { + return set(field, value.asField()); + } + @Override public final MergeImpl set(Map, ?> map) { if (matchedClause) { diff --git a/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java b/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java index bccf7c7a80..5de264fb08 100644 --- a/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/UpdateImpl.java @@ -137,6 +137,11 @@ final class UpdateImpl return this; } + @Override + public final UpdateImpl set(Field field, Select> value) { + return set(field, value.asField()); + } + @Override public final UpdateImpl set(Map, ?> map) { getDelegate().addValues(map);