From 5d672b666a1a48da95d1994026fbcd601b1ad875 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Mon, 7 Nov 2011 22:40:16 +0000 Subject: [PATCH] [#894] Move functions from Field to new org.jooq.impl.SQL and make them static - moved coalesce --- .../src/org/jooq/test/jOOQAbstractTest.java | 31 ++++++------ jOOQ/src/main/java/org/jooq/Field.java | 21 --------- .../java/org/jooq/impl/AbstractField.java | 11 ----- jOOQ/src/main/java/org/jooq/impl/Factory.java | 38 ++++++++++++--- .../src/main/java/org/jooq/impl/JooqUtil.java | 47 +++++++++++++------ .../src/test/java/org/jooq/test/jOOQTest.java | 15 ++++-- 6 files changed, 91 insertions(+), 72 deletions(-) diff --git a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java index cb057e4707..ee85f1f787 100644 --- a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java @@ -67,6 +67,7 @@ import static org.jooq.impl.Factory.cast; import static org.jooq.impl.Factory.castNull; import static org.jooq.impl.Factory.ceil; import static org.jooq.impl.Factory.charLength; +import static org.jooq.impl.Factory.coalesce; import static org.jooq.impl.Factory.concat; import static org.jooq.impl.Factory.cos; import static org.jooq.impl.Factory.cosh; @@ -5723,29 +5724,29 @@ public abstract class jOOQAbstractTest< // --------------------------------------------------------------------- // COALESCE // --------------------------------------------------------------------- - assertEquals(null, create().select(sNull.coalesce(sNull)).fetchOne(0)); - assertEquals(Integer.valueOf(1), create().select(iNull.coalesce(1)).fetchOne(0)); - assertEquals(Integer.valueOf(1), create().select(iNull.coalesce(iNull, val(1))).fetchOne(0)); - assertEquals(Integer.valueOf(1), create().select(iNull.coalesce(iNull, iNull, val(1))).fetchOne(0)); + assertEquals(null, create().select(coalesce(sNull, sNull)).fetchOne(0)); + assertEquals(Integer.valueOf(1), create().select(coalesce(iNull, val(1))).fetchOne(0)); + assertEquals(Integer.valueOf(1), create().select(coalesce(iNull, iNull, val(1))).fetchOne(0)); + assertEquals(Integer.valueOf(1), create().select(coalesce(iNull, iNull, iNull, val(1))).fetchOne(0)); - assertEquals("1", create().select(sNull.coalesce("1")).fetchOne(0)); - assertEquals("1", create().select(sNull.coalesce(sNull, val("1"))).fetchOne(0)); - assertEquals("1", create().select(sNull.coalesce(sNull, sNull, val("1"))).fetchOne(0)); + assertEquals("1", create().select(coalesce(sNull, val("1"))).fetchOne(0)); + assertEquals("1", create().select(coalesce(sNull, sNull, val("1"))).fetchOne(0)); + assertEquals("1", create().select(coalesce(sNull, sNull, sNull, val("1"))).fetchOne(0)); - assertEquals(Integer.valueOf(2), create().select(val(2).coalesce(1)).fetchOne(0)); - assertEquals(Integer.valueOf(2), create().select(val(2).coalesce(1, 1)).fetchOne(0)); - assertEquals(Integer.valueOf(2), create().select(val(2).coalesce(1, 1, 1)).fetchOne(0)); + assertEquals(Integer.valueOf(2), create().select(coalesce(2, 1)).fetchOne(0)); + assertEquals(Integer.valueOf(2), create().select(coalesce(2, 1, 1)).fetchOne(0)); + assertEquals(Integer.valueOf(2), create().select(coalesce(2, 1, 1, 1)).fetchOne(0)); - assertEquals("2", create().select(val("2").coalesce("1")).fetchOne(0)); - assertEquals("2", create().select(val("2").coalesce("1", "1")).fetchOne(0)); - assertEquals("2", create().select(val("2").coalesce("1", "1", "1")).fetchOne(0)); + assertEquals("2", create().select(coalesce("2", "1")).fetchOne(0)); + assertEquals("2", create().select(coalesce("2", "1", "1")).fetchOne(0)); + assertEquals("2", create().select(coalesce("2", "1", "1", "1")).fetchOne(0)); assertTrue(("" + create() - .select(TBook_CONTENT_TEXT().cast(String.class).coalesce(sNull, val("abc"))) + .select(coalesce(TBook_CONTENT_TEXT().cast(String.class), sNull, val("abc"))) .from(TBook()) .where(TBook_ID().equal(1)).fetchOne(0)).startsWith("To know and")); assertEquals("abc", create() - .select(TBook_CONTENT_TEXT().cast(String.class).coalesce(sNull, val("abc"))) + .select(coalesce(TBook_CONTENT_TEXT().cast(String.class), sNull, val("abc"))) .from(TBook()) .where(TBook_ID().equal(2)).fetchOne(0)); diff --git a/jOOQ/src/main/java/org/jooq/Field.java b/jOOQ/src/main/java/org/jooq/Field.java index a125da3719..9bfdb0db5f 100644 --- a/jOOQ/src/main/java/org/jooq/Field.java +++ b/jOOQ/src/main/java/org/jooq/Field.java @@ -438,27 +438,6 @@ public interface Field extends NamedTypeProviderQueryPart, AliasProvider Field decode(Field search, Field result, Field... more); - /** - * Gets the Oracle-style COALESCE(expr1, expr2, ... , exprn) - * function - * - * @see #coalesce(Field, Field...) - */ - Field coalesce(T option, T... options); - - /** - * Gets the Oracle-style COALESCE(expr1, expr2, ... , exprn) - * function - *

- * Returns the dialect's equivalent to COALESCE: - *

- */ - Field coalesce(Field option, Field... options); - // ------------------------------------------------------------------------ // Conditions created from this field // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index db1e78860e..4e77c9e867 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -40,7 +40,6 @@ import static org.jooq.impl.ExpressionOperator.DIVIDE; import static org.jooq.impl.ExpressionOperator.MULTIPLY; import static org.jooq.impl.ExpressionOperator.SUBTRACT; import static org.jooq.impl.Factory.falseCondition; -import static org.jooq.impl.Factory.function; import static org.jooq.impl.Factory.nullSafe; import static org.jooq.impl.Factory.trueCondition; import static org.jooq.impl.Factory.val; @@ -333,16 +332,6 @@ abstract class AbstractField extends AbstractNamedTypeProviderQueryPart im return new Decode(this, nullSafe(search), nullSafe(result), nullSafe(more)); } - @Override - public final Field coalesce(T option, T... options) { - return coalesce(val(option), vals(options).toArray(new Field[0])); - } - - @Override - public final Field coalesce(Field option, Field... options) { - return function("coalesce", getDataType(), nullSafe(combine(this, option, options))); - } - // ------------------------------------------------------------------------ // Conditions created from this field // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/Factory.java b/jOOQ/src/main/java/org/jooq/impl/Factory.java index 3b00e1df55..330e49267b 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Factory.java +++ b/jOOQ/src/main/java/org/jooq/impl/Factory.java @@ -36,6 +36,8 @@ package org.jooq.impl; +import static org.jooq.impl.JooqUtil.combine; + import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; @@ -1296,6 +1298,31 @@ public class Factory implements FactoryOperations { return (Field[]) castFields; } + /** + * Gets the Oracle-style COALESCE(value1, value2, ... , value n) + * function + * + * @see #coalesce(Field, Field, Field...) + */ + public static Field coalesce(T value1, T value2, T... values) { + return coalesce(val(value1), val(value2), vals(values).toArray(new Field[0])); + } + + /** + * Gets the Oracle-style COALESCE(field1, field2, ... , field n) + * function + *

+ * Returns the dialect's equivalent to COALESCE: + *

+ */ + public static Field coalesce(Field field1, Field field2, Field... fields) { + return function("coalesce", nullSafeDataType(field1), nullSafe(combine(field1, field2, fields))); + } + /** * Gets the Oracle-style NVL(value, defaultValue) function * @@ -3492,12 +3519,9 @@ public class Factory implements FactoryOperations { * Get a list of values and fields */ public static List> vals(Object... values) { - if (values == null) { - throw new IllegalArgumentException("Cannot create a list of constants for null"); - } - else { - FieldList result = new FieldList(); + FieldList result = new FieldList(); + if (values != null) { for (Object value : values) { // Fields can be mixed with constant values @@ -3508,9 +3532,9 @@ public class Factory implements FactoryOperations { result.add(val(value)); } } - - return result; } + + return result; } // ------------------------------------------------------------------------- diff --git a/jOOQ/src/main/java/org/jooq/impl/JooqUtil.java b/jOOQ/src/main/java/org/jooq/impl/JooqUtil.java index de4a047ca5..61a61db953 100644 --- a/jOOQ/src/main/java/org/jooq/impl/JooqUtil.java +++ b/jOOQ/src/main/java/org/jooq/impl/JooqUtil.java @@ -203,33 +203,50 @@ final class JooqUtil { * Combine a field with an array of fields */ static Field[] combine(Field field, Field... fields) { - Field[] result = new Field[fields.length + 1]; - result[0] = field; - System.arraycopy(fields, 0, result, 1, fields.length); - return result; + if (fields == null) { + return new Field[] { field }; + } + else { + Field[] result = new Field[fields.length + 1]; + result[0] = field; + System.arraycopy(fields, 0, result, 1, fields.length); + + return result; + } } /** * Combine a field with an array of fields */ static Field[] combine(Field field1, Field field2, Field... fields) { - Field[] result = new Field[fields.length + 2]; - result[0] = field1; - result[1] = field2; - System.arraycopy(fields, 0, result, 2, fields.length); - return result; + if (fields == null) { + return new Field[] { field1, field2 }; + } + else { + Field[] result = new Field[fields.length + 2]; + result[0] = field1; + result[1] = field2; + System.arraycopy(fields, 0, result, 2, fields.length); + + return result; + } } /** * Combine a field with an array of fields */ static Field[] combine(Field field1, Field field2, Field field3, Field... fields) { - Field[] result = new Field[fields.length + 3]; - result[0] = field1; - result[1] = field2; - result[2] = field3; - System.arraycopy(fields, 0, result, 3, fields.length); - return result; + if (fields == null) { + return new Field[] { field1, field2, field3 }; + } + else { + Field[] result = new Field[fields.length + 3]; + result[0] = field1; + result[1] = field2; + result[2] = field3; + System.arraycopy(fields, 0, result, 3, fields.length); + return result; + } } /** diff --git a/jOOQ/src/test/java/org/jooq/test/jOOQTest.java b/jOOQ/src/test/java/org/jooq/test/jOOQTest.java index 487241e4bc..3863531f73 100644 --- a/jOOQ/src/test/java/org/jooq/test/jOOQTest.java +++ b/jOOQ/src/test/java/org/jooq/test/jOOQTest.java @@ -194,9 +194,6 @@ public class jOOQTest { assertEquals( FIELD_ID1.between((Integer) null, null), FIELD_ID1.between((Field) null, null)); - assertEquals( - FIELD_ID1.coalesce((Integer) null), - FIELD_ID1.coalesce((Field) null)); assertEquals( FIELD_ID1.decode((Integer) null, null), FIELD_ID1.decode((Field) null, null)); @@ -332,6 +329,18 @@ public class jOOQTest { assertEquals( Factory.charLength((String) null), Factory.charLength((Field) null)); + assertEquals( + Factory.coalesce((Integer) null, (Integer) null), + Factory.coalesce((Field) null, (Field) null)); + assertEquals( + Factory.coalesce((Integer) null, (Integer) null, (Integer) null), + Factory.coalesce((Field) null, (Field) null, (Field) null)); + assertEquals( + Factory.coalesce((Integer) null, (Integer) null, (Integer[]) null), + Factory.coalesce((Field) null, (Field) null, (Field[]) null)); + assertEquals( + Factory.coalesce((Integer) null, (Integer) null, (Integer) null, (Integer) null), + Factory.coalesce((Field) null, (Field) null, (Field) null, (Field) null)); assertEquals( Factory.concat((String) null, (String) null), Factory.concat((Field) null, (Field) null));