From dc0cba7210dbfbeb8fd1a3f3ad67e6c4af943366 Mon Sep 17 00:00:00 2001 From: lukaseder Date: Wed, 11 Nov 2015 14:26:12 +0100 Subject: [PATCH] [#4729] Emulate DSL.count(Table) and countDistinct(Table) for all other dialects --- .../main/java/org/jooq/impl/CountTable.java | 87 +++++++++++++++++++ jOOQ/src/main/java/org/jooq/impl/DSL.java | 16 +++- 2 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 jOOQ/src/main/java/org/jooq/impl/CountTable.java diff --git a/jOOQ/src/main/java/org/jooq/impl/CountTable.java b/jOOQ/src/main/java/org/jooq/impl/CountTable.java new file mode 100644 index 0000000000..e924a15c2b --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/impl/CountTable.java @@ -0,0 +1,87 @@ +/** + * Copyright (c) 2009-2015, Data Geekery GmbH (http://www.datageekery.com) + * All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Other licenses: + * ----------------------------------------------------------------------------- + * Commercial licenses for this work are available. These replace the above + * ASL 2.0 and offer limited warranties, support, maintenance, and commercial + * database integrations. + * + * For more information, please visit: http://www.jooq.org/licenses + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package org.jooq.impl; + +import org.jooq.Context; +import org.jooq.Table; +import org.jooq.UniqueKey; + +/** + * @author Lukas Eder + */ +class CountTable extends Function { + + /** + * Generated UID + */ + private static final long serialVersionUID = 7292087943334025737L; + + private final Table table; + private final boolean distinct; + + CountTable(Table table, boolean distinct) { + super("count", distinct, SQLDataType.INTEGER, DSL.field("{0}", DSL.name(table.getName()))); + + this.table = table; + this.distinct = distinct; + } + + @Override + public final void accept(Context ctx) { + switch (ctx.family()) { + case POSTGRES: { + super.accept(ctx); + break; + } + + default: { + UniqueKey pk = table.getPrimaryKey(); + + if (pk != null) + ctx.visit(new Function("count", distinct, SQLDataType.INTEGER, table.fields(pk.getFieldsArray()))); + else + super.accept(ctx); + + break; + } + } + } +} diff --git a/jOOQ/src/main/java/org/jooq/impl/DSL.java b/jOOQ/src/main/java/org/jooq/impl/DSL.java index da12e477f4..08e217d771 100644 --- a/jOOQ/src/main/java/org/jooq/impl/DSL.java +++ b/jOOQ/src/main/java/org/jooq/impl/DSL.java @@ -12525,10 +12525,14 @@ public class DSL { /** * Get the count(table) function. + *

+ * If this is not supported by a given database (i.e. non + * {@link SQLDialect#POSTGRES}, then the primary key is used with + * {@link #count(Field)}, instead. */ - @Support(POSTGRES) + @Support public static AggregateFunction count(Table table) { - return new Function("count", SQLDataType.INTEGER, tableByName(table.getName())); + return new CountTable(table, false); } /** @@ -12541,10 +12545,14 @@ public class DSL { /** * Get the count(distinct table) function. + *

+ * If this is not supported by a given database (i.e. non + * {@link SQLDialect#POSTGRES}, then the primary key is used with + * {@link #count(Field)}, instead. */ - @Support(POSTGRES) + @Support({ CUBRID, DERBY, H2, HSQLDB, FIREBIRD, MARIADB, MYSQL, POSTGRES, SQLITE }) public static AggregateFunction countDistinct(Table table) { - return new Function("count", true, SQLDataType.INTEGER, tableByName(table.getName())); + return new CountTable(table, true); } /**