From 983ca51cfb4153c796ac2b0280108565a526cba8 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 8 Sep 2014 15:28:52 +0200 Subject: [PATCH] [#3627] Add simplified API for CASE WHEN [ condition ] THEN [ select ] expressions --- jOOQ/src/main/java/org/jooq/Case.java | 16 ++++++++++++ .../main/java/org/jooq/CaseConditionStep.java | 20 ++++++++++++++ .../src/main/java/org/jooq/CaseValueStep.java | 26 +++++++++++++++++++ .../org/jooq/impl/CaseConditionStepImpl.java | 12 +++++++++ .../src/main/java/org/jooq/impl/CaseImpl.java | 7 +++++ .../java/org/jooq/impl/CaseValueStepImpl.java | 20 +++++++++++--- 6 files changed, 97 insertions(+), 4 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/Case.java b/jOOQ/src/main/java/org/jooq/Case.java index e52455bf87..c29974a090 100644 --- a/jOOQ/src/main/java/org/jooq/Case.java +++ b/jOOQ/src/main/java/org/jooq/Case.java @@ -124,4 +124,20 @@ public interface Case { */ @Support CaseConditionStep when(Condition condition, Field result); + + /** + * This construct can be used to create expressions of the type
+     * CASE WHEN x < 1  THEN 'one'
+     *      WHEN x >= 2 THEN 'two'
+     *      ELSE            'three'
+     * END
+     * 
Instances of Case are created through the + * + * @param The generic field type parameter + * @param condition A condition to check in the case statement + * @param result The result if the condition holds true + * @return An intermediary step for case statement construction + */ + @Support + CaseConditionStep when(Condition condition, Select> result); } diff --git a/jOOQ/src/main/java/org/jooq/CaseConditionStep.java b/jOOQ/src/main/java/org/jooq/CaseConditionStep.java index 06cb58aa83..6e83270030 100644 --- a/jOOQ/src/main/java/org/jooq/CaseConditionStep.java +++ b/jOOQ/src/main/java/org/jooq/CaseConditionStep.java @@ -76,6 +76,17 @@ public interface CaseConditionStep extends Field { @Support CaseConditionStep when(Condition condition, Field result); + /** + * Compare a condition to the already constructed case statement, return + * result if the condition holds true + * + * @param condition The condition to add to the case statement + * @param result The result value if the condition holds true + * @return An intermediary step for case statement construction + */ + @Support + CaseConditionStep when(Condition condition, Select> result); + /** * Add an else clause to the already constructed case statement * @@ -93,4 +104,13 @@ public interface CaseConditionStep extends Field { */ @Support Field otherwise(Field result); + + /** + * Add an else clause to the already constructed case statement + * + * @param result The result value if no other value matches the case + * @return The resulting field from case statement construction + */ + @Support + Field otherwise(Select> result); } diff --git a/jOOQ/src/main/java/org/jooq/CaseValueStep.java b/jOOQ/src/main/java/org/jooq/CaseValueStep.java index 409410c964..c57cbe46fe 100644 --- a/jOOQ/src/main/java/org/jooq/CaseValueStep.java +++ b/jOOQ/src/main/java/org/jooq/CaseValueStep.java @@ -80,6 +80,19 @@ public interface CaseValueStep { @Support CaseWhenStep when(V compareValue, Field result); + /** + * Compare a value to the already constructed case statement, return result + * if values are equal. + * + * @param The generic result field type parameter + * @param compareValue The value to compare with the already constructed + * case statement + * @param result The result value if values are equal + * @return An intermediary step for case statement construction + */ + @Support + CaseWhenStep when(V compareValue, Select> result); + /** * Compare a value to the already constructed case statement, return result * if values are equal. @@ -105,4 +118,17 @@ public interface CaseValueStep { */ @Support CaseWhenStep when(Field compareValue, Field result); + + /** + * Compare a value to the already constructed case statement, return result + * if values are equal. + * + * @param The generic result field type parameter + * @param compareValue The value to compare with the already constructed + * case statement + * @param result The result value if values are equal + * @return An intermediary step for case statement construction + */ + @Support + CaseWhenStep when(Field compareValue, Select> result); } diff --git a/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java b/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java index 5a6586fd81..0e7079ee85 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CaseConditionStepImpl.java @@ -50,6 +50,8 @@ import org.jooq.Configuration; import org.jooq.Context; import org.jooq.Field; import org.jooq.QueryPart; +import org.jooq.Record1; +import org.jooq.Select; class CaseConditionStepImpl extends AbstractFunction implements CaseConditionStep { @@ -84,6 +86,11 @@ class CaseConditionStepImpl extends AbstractFunction implements CaseCondit return this; } + @Override + public final CaseConditionStep when(Condition condition, Select> result) { + return when(condition, DSL.field(result)); + } + @Override public final Field otherwise(T result) { return otherwise(Utils.field(result)); @@ -96,6 +103,11 @@ class CaseConditionStepImpl extends AbstractFunction implements CaseCondit return this; } + @Override + public final Field otherwise(Select> result) { + return otherwise(DSL.field(result)); + } + @Override final QueryPart getFunction0(Configuration configuration) { switch (configuration.dialect().family()) { diff --git a/jOOQ/src/main/java/org/jooq/impl/CaseImpl.java b/jOOQ/src/main/java/org/jooq/impl/CaseImpl.java index a30e98e8df..88cb67660f 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CaseImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CaseImpl.java @@ -45,6 +45,8 @@ import org.jooq.CaseConditionStep; import org.jooq.CaseValueStep; import org.jooq.Condition; import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Select; /** * @author Lukas Eder @@ -73,4 +75,9 @@ class CaseImpl implements Case { public final CaseConditionStep when(Condition condition, Field result) { return new CaseConditionStepImpl(condition, result); } + + @Override + public final CaseConditionStep when(Condition condition, Select> result) { + return when(condition, DSL.field(result)); + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CaseValueStepImpl.java b/jOOQ/src/main/java/org/jooq/impl/CaseValueStepImpl.java index 8a0a562ad0..23d0705368 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CaseValueStepImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CaseValueStepImpl.java @@ -43,6 +43,8 @@ package org.jooq.impl; import org.jooq.CaseValueStep; import org.jooq.CaseWhenStep; import org.jooq.Field; +import org.jooq.Record1; +import org.jooq.Select; /** * @author Lukas Eder @@ -56,22 +58,32 @@ class CaseValueStepImpl implements CaseValueStep { } @Override - public CaseWhenStep when(V compareValue, T result) { + public final CaseWhenStep when(V compareValue, T result) { return when(Utils.field(compareValue), Utils.field(result)); } @Override - public CaseWhenStep when(V compareValue, Field result) { + public final CaseWhenStep when(V compareValue, Field result) { return when(Utils.field(compareValue), result); } @Override - public CaseWhenStep when(Field compareValue, T result) { + public final CaseWhenStep when(V compareValue, Select> result) { + return when(Utils.field(compareValue), DSL.field(result)); + } + + @Override + public final CaseWhenStep when(Field compareValue, T result) { return when(compareValue, Utils.field(result)); } @Override - public CaseWhenStep when(Field compareValue, Field result) { + public final CaseWhenStep when(Field compareValue, Field result) { return new CaseWhenStepImpl(value, compareValue, result); } + + @Override + public final CaseWhenStep when(Field compareValue, Select> result) { + return when(compareValue, DSL.field(result)); + } }