From 1557cfc73bec145940fa93e88ca94454bec38a6e Mon Sep 17 00:00:00 2001 From: lukaseder Date: Thu, 10 Mar 2016 15:32:02 +0100 Subject: [PATCH] [#3691] Improve API to create CASE expressions with arbitrary numbers of arguments --- .../src/main/java/org/jooq/CaseValueStep.java | 19 ++++++++ jOOQ/src/main/java/org/jooq/CaseWhenStep.java | 18 ++++++++ .../java/org/jooq/impl/CaseValueStepImpl.java | 19 ++++++++ .../java/org/jooq/impl/CaseWhenStepImpl.java | 43 ++++++++++++++++++- 4 files changed, 97 insertions(+), 2 deletions(-) diff --git a/jOOQ/src/main/java/org/jooq/CaseValueStep.java b/jOOQ/src/main/java/org/jooq/CaseValueStep.java index 166f7db2f6..eff7ab2b93 100644 --- a/jOOQ/src/main/java/org/jooq/CaseValueStep.java +++ b/jOOQ/src/main/java/org/jooq/CaseValueStep.java @@ -40,6 +40,8 @@ */ package org.jooq; +import java.util.Map; + /** * An intermediary step in creating a case statement of the type
  * CASE x WHEN 1 THEN 'one'
@@ -131,4 +133,21 @@ public interface CaseValueStep {
      */
     @Support
      CaseWhenStep when(Field compareValue, Select> result);
+
+    /**
+     * Create WHEN .. THEN expressions from a {@link Map}.
+     * 

+ * This will iterate over the map's entries to create individual + * WHEN .. THEN expressions for each map entry. + */ + CaseWhenStep mapValues(Map values); + + /** + * Create WHEN .. THEN expressions from a {@link Map}. + *

+ * This will iterate over the map's entries to create individual + * WHEN .. THEN expressions for each map entry. + */ + CaseWhenStep mapFields(Map, ? extends Field> fields); + } diff --git a/jOOQ/src/main/java/org/jooq/CaseWhenStep.java b/jOOQ/src/main/java/org/jooq/CaseWhenStep.java index 660e9ae1b9..4d0e69bb6e 100644 --- a/jOOQ/src/main/java/org/jooq/CaseWhenStep.java +++ b/jOOQ/src/main/java/org/jooq/CaseWhenStep.java @@ -40,6 +40,8 @@ */ package org.jooq; +import java.util.Map; + /** * The final step in creating a case statement of the type

  * CASE x WHEN 1 THEN 'one'
@@ -103,6 +105,22 @@ public interface CaseWhenStep extends Field {
     @Support
     CaseWhenStep when(Field compareValue, Field result);
 
+    /**
+     * Create WHEN .. THEN expressions from a {@link Map}.
+     * 

+ * This will iterate over the map's entries to create individual + * WHEN .. THEN expressions for each map entry. + */ + CaseWhenStep mapValues(Map values); + + /** + * Create WHEN .. THEN expressions from a {@link Map}. + *

+ * This will iterate over the map's entries to create individual + * WHEN .. THEN expressions for each map entry. + */ + CaseWhenStep mapFields(Map, ? extends Field> fields); + /** * Add an else clause to the already constructed case statement * diff --git a/jOOQ/src/main/java/org/jooq/impl/CaseValueStepImpl.java b/jOOQ/src/main/java/org/jooq/impl/CaseValueStepImpl.java index c2dc3bc5d6..8028e4295d 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CaseValueStepImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CaseValueStepImpl.java @@ -40,6 +40,10 @@ */ package org.jooq.impl; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Map.Entry; + import org.jooq.CaseValueStep; import org.jooq.CaseWhenStep; import org.jooq.Field; @@ -86,4 +90,19 @@ final class CaseValueStepImpl implements CaseValueStep { public final CaseWhenStep when(Field compareValue, Select> result) { return when(compareValue, DSL.field(result)); } + + @Override + public final CaseWhenStep mapValues(Map values) { + Map, Field> fields = new LinkedHashMap, Field>(); + + for (Entry entry : values.entrySet()) + fields.put(Tools.field(entry.getKey()), Tools.field(entry.getValue())); + + return mapFields(fields); + } + + @Override + public final CaseWhenStep mapFields(Map, ? extends Field> fields) { + return new CaseWhenStepImpl(value, fields); + } } diff --git a/jOOQ/src/main/java/org/jooq/impl/CaseWhenStepImpl.java b/jOOQ/src/main/java/org/jooq/impl/CaseWhenStepImpl.java index 0953433fdb..11df6f94f5 100644 --- a/jOOQ/src/main/java/org/jooq/impl/CaseWhenStepImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/CaseWhenStepImpl.java @@ -41,12 +41,16 @@ package org.jooq.impl; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; import org.jooq.CaseWhenStep; import org.jooq.Clause; import org.jooq.Configuration; import org.jooq.Context; +import org.jooq.DataType; import org.jooq.Field; import org.jooq.QueryPart; @@ -63,13 +67,33 @@ final class CaseWhenStepImpl extends AbstractFunction implements CaseWh private Field otherwise; CaseWhenStepImpl(Field value, Field compareValue, Field result) { - super("case", result.getDataType()); + this(value, result.getDataType()); + + when(compareValue, result); + } + + CaseWhenStepImpl(Field value, Map, ? extends Field> map) { + this(value, dataType(map)); + + for (Entry, ? extends Field> entry : map.entrySet()) + when(entry.getKey(), entry.getValue()); + } + + private CaseWhenStepImpl(Field value, DataType type) { + super("case", type); this.value = value; this.compareValues = new ArrayList>(); this.results = new ArrayList>(); + } - when(compareValue, result); + + @SuppressWarnings("unchecked") + private static final DataType dataType(Map, ? extends Field> map) { + if (map.isEmpty()) + return (DataType) SQLDataType.OTHER; + else + return map.entrySet().iterator().next().getValue().getDataType(); } @Override @@ -107,6 +131,21 @@ final class CaseWhenStepImpl extends AbstractFunction implements CaseWh return this; } + @Override + public final CaseWhenStep mapValues(Map values) { + Map, Field> fields = new LinkedHashMap, Field>(); + + for (Entry entry : values.entrySet()) + fields.put(Tools.field(entry.getKey()), Tools.field(entry.getValue())); + + return mapFields(fields); + } + + @Override + public final CaseWhenStep mapFields(Map, ? extends Field> fields) { + return null; + } + @Override final QueryPart getFunction0(Configuration configuration) { switch (configuration.dialect().family()) {