From f4eb201592406b8d634cc59f8dce575463596e00 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Sat, 15 Oct 2011 15:54:01 +0000 Subject: [PATCH] [#870] Add support for MEDIAN aggregate function --- .../src/org/jooq/test/jOOQAbstractTest.java | 26 ++++++++++++++++++- jOOQ/src/main/java/org/jooq/Field.java | 12 +++++++++ .../java/org/jooq/impl/AbstractField.java | 5 ++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java index 5f44cd3bcf..2caf042b27 100644 --- a/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java +++ b/jOOQ-test/src/org/jooq/test/jOOQAbstractTest.java @@ -4662,6 +4662,27 @@ public abstract class jOOQAbstractTest< // Standard aggregate functions, available in all dialects: // -------------------------------------------------------- + Field median = TBook_ID().median(); + + // Some dialects don't support a median function or a simulation thereof + // Use AVG instead, as in this example the values of MEDIAN and AVG + // are the same + switch (getDialect()) { + case ASE: + case DERBY: + case H2: + case INGRES: + case MYSQL: + case SQLITE: + + // TODO [#871] This could be simulated + // case SQLSERVER: + // case POSTGRES: + // case DB2: + median = TBook_ID().avg(); + break; + } + Result result = create() .select( TBook_AUTHOR_ID(), @@ -4671,7 +4692,8 @@ public abstract class jOOQAbstractTest< TBook_ID().sum(), TBook_ID().avg(), TBook_ID().min(), - TBook_ID().max()) + TBook_ID().max(), + median) .from(TBook()) .groupBy(TBook_AUTHOR_ID()) .orderBy(TBook_AUTHOR_ID()) @@ -4684,6 +4706,7 @@ public abstract class jOOQAbstractTest< assertEquals(1.5d, result.getValueAsDouble(0, 5)); assertEquals(1, (int) result.getValueAsInteger(0, 6)); assertEquals(2, (int) result.getValueAsInteger(0, 7)); + assertEquals(1.5d, result.getValueAsDouble(0, 8)); assertEquals(2, (int) result.getValueAsInteger(1, 1)); assertEquals(2, (int) result.getValueAsInteger(1, 2)); @@ -4692,6 +4715,7 @@ public abstract class jOOQAbstractTest< assertEquals(3.5d, result.getValueAsDouble(1, 5)); assertEquals(3, (int) result.getValueAsInteger(1, 6)); assertEquals(4, (int) result.getValueAsInteger(1, 7)); + assertEquals(3.5d, result.getValueAsDouble(1, 8)); } @Test diff --git a/jOOQ/src/main/java/org/jooq/Field.java b/jOOQ/src/main/java/org/jooq/Field.java index 91bb378fb7..25fee962e7 100644 --- a/jOOQ/src/main/java/org/jooq/Field.java +++ b/jOOQ/src/main/java/org/jooq/Field.java @@ -615,6 +615,18 @@ public interface Field extends NamedTypeProviderQueryPart, AliasProvider avg(); + /** + * Get the median over a numeric field: median(field) + *

+ * This is known to be supported in any of these RDBMS: + *

    + *
  • HSQLDB
  • + *
  • Oracle
  • + *
  • Sybase SQL Anywhere
  • + *
+ */ + Field median(); + // ------------------------------------------------------------------------ // Analytic (or window) functions 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 fe4ed86879..080209abc9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -401,6 +401,11 @@ abstract class AbstractField extends AbstractNamedTypeProviderQueryPart im return new Function("avg", SQLDataType.NUMERIC, this); } + @Override + public final Field median() { + return new Function("median", SQLDataType.NUMERIC, this); + } + @Override public final Field sign() { return new Sign(this);