diff --git a/jOOQ/src/main/java/org/jooq/Field.java b/jOOQ/src/main/java/org/jooq/Field.java index 0c2788052d..8940a2fbf7 100644 --- a/jOOQ/src/main/java/org/jooq/Field.java +++ b/jOOQ/src/main/java/org/jooq/Field.java @@ -62,11 +62,14 @@ import org.jooq.util.oracle.OracleFactory; /** * A field used in tables and conditions + *

+ * Note that all fields qualify as {@link GroupField}, i.e. they can always be + * used in GROUP BY clauses * * @param The field type * @author Lukas Eder */ -public interface Field extends QueryPart { +public interface Field extends GroupField { // ------------------------------------------------------------------------ // API diff --git a/jOOQ/src/main/java/org/jooq/GroupField.java b/jOOQ/src/main/java/org/jooq/GroupField.java new file mode 100644 index 0000000000..7f2c995739 --- /dev/null +++ b/jOOQ/src/main/java/org/jooq/GroupField.java @@ -0,0 +1,46 @@ +/** + * Copyright (c) 2009-2012, Lukas Eder, lukas.eder@gmail.com + * All rights reserved. + * + * This software is licensed to you under the Apache License, Version 2.0 + * (the "License"); You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * . Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * . Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * . Neither the name "jOOQ" nor the names of its contributors may be + * used to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +package org.jooq; + +/** + * A QueryPart to be used exclusively in GROUP BY + * clauses + * + * @author Lukas Eder + */ +public interface GroupField extends QueryPart { + +} diff --git a/jOOQ/src/main/java/org/jooq/SelectGroupByStep.java b/jOOQ/src/main/java/org/jooq/SelectGroupByStep.java index 850d1b9cb1..922e1e91c3 100644 --- a/jOOQ/src/main/java/org/jooq/SelectGroupByStep.java +++ b/jOOQ/src/main/java/org/jooq/SelectGroupByStep.java @@ -88,7 +88,7 @@ public interface SelectGroupByStep extends SelectHavingStep { * GROUP BY () clause being rendered. */ @Support - SelectHavingStep groupBy(Field... fields); + SelectHavingStep groupBy(GroupField... fields); /** * Add a GROUP BY clause to the query @@ -97,5 +97,5 @@ public interface SelectGroupByStep extends SelectHavingStep { * GROUP BY () clause being rendered. */ @Support - SelectHavingStep groupBy(Collection> fields); + SelectHavingStep groupBy(Collection fields); } diff --git a/jOOQ/src/main/java/org/jooq/SelectQuery.java b/jOOQ/src/main/java/org/jooq/SelectQuery.java index 5f44648864..0e1b1fede0 100644 --- a/jOOQ/src/main/java/org/jooq/SelectQuery.java +++ b/jOOQ/src/main/java/org/jooq/SelectQuery.java @@ -194,7 +194,7 @@ public interface SelectQuery extends SimpleSelectQuery { * @param fields The grouping fields */ @Support - void addGroupBy(Field... fields); + void addGroupBy(GroupField... fields); /** * Adds grouping fields @@ -205,7 +205,7 @@ public interface SelectQuery extends SimpleSelectQuery { * @param fields The grouping fields */ @Support - void addGroupBy(Collection> fields); + void addGroupBy(Collection fields); /** * Adds new conditions to the having clause of the query, connecting it to diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java b/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java index 660efa89fe..4f20d6cabf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractSubSelect.java @@ -57,6 +57,7 @@ import org.jooq.BindContext; import org.jooq.Condition; import org.jooq.Configuration; import org.jooq.Field; +import org.jooq.GroupField; import org.jooq.Operator; import org.jooq.Param; import org.jooq.QueryPart; @@ -81,28 +82,28 @@ abstract class AbstractSubSelect extends AbstractSelect imp /** * Generated UID */ - private static final long serialVersionUID = 1646393178384872967L; + private static final long serialVersionUID = 1646393178384872967L; - private final FieldList select; - private String hint; - private boolean distinct; - private boolean forUpdate; - private final FieldList forUpdateOf; - private final TableList forUpdateOfTables; - private ForUpdateMode forUpdateMode; - private int forUpdateWait; - private boolean forShare; - private final TableList from; - private final ConditionProviderImpl condition; - private final ConditionProviderImpl connectBy; - private boolean connectByNoCycle; - private final ConditionProviderImpl connectByStartWith; - private boolean grouping; - private final FieldList groupBy; - private final ConditionProviderImpl having; - private final SortFieldList orderBy; - private boolean orderBySiblings; - private final Limit limit; + private final FieldList select; + private String hint; + private boolean distinct; + private boolean forUpdate; + private final FieldList forUpdateOf; + private final TableList forUpdateOfTables; + private ForUpdateMode forUpdateMode; + private int forUpdateWait; + private boolean forShare; + private final TableList from; + private final ConditionProviderImpl condition; + private final ConditionProviderImpl connectBy; + private boolean connectByNoCycle; + private final ConditionProviderImpl connectByStartWith; + private boolean grouping; + private final QueryPartList groupBy; + private final ConditionProviderImpl having; + private final SortFieldList orderBy; + private boolean orderBySiblings; + private final Limit limit; AbstractSubSelect(Configuration configuration) { this(configuration, null); @@ -121,7 +122,7 @@ abstract class AbstractSubSelect extends AbstractSelect imp this.condition = new ConditionProviderImpl(); this.connectBy = new ConditionProviderImpl(); this.connectByStartWith = new ConditionProviderImpl(); - this.groupBy = new FieldList(); + this.groupBy = new QueryPartList(); this.having = new ConditionProviderImpl(); this.orderBy = new SortFieldList(); this.limit = new Limit(); @@ -748,7 +749,7 @@ abstract class AbstractSubSelect extends AbstractSelect imp grouping = true; } - final FieldList getGroupBy() { + final QueryPartList getGroupBy() { return groupBy; } diff --git a/jOOQ/src/main/java/org/jooq/impl/Factory.java b/jOOQ/src/main/java/org/jooq/impl/Factory.java index d5ef52d883..465edba2cf 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Factory.java +++ b/jOOQ/src/main/java/org/jooq/impl/Factory.java @@ -70,6 +70,7 @@ import org.jooq.DatePart; import org.jooq.FactoryOperations; import org.jooq.Field; import org.jooq.GroupConcatOrderByStep; +import org.jooq.GroupField; import org.jooq.Name; import org.jooq.OrderedAggregateFunction; import org.jooq.Param; @@ -2427,7 +2428,7 @@ public class Factory { * @return A field to be used in a GROUP BY clause */ @Support({ CUBRID, DB2, MYSQL, ORACLE, SQLSERVER, SYBASE }) - public static Field rollup(Field... fields) { + public static GroupField rollup(Field... fields) { return new Rollup(nullSafe(fields)); } @@ -2453,7 +2454,7 @@ public class Factory { * @return A field to be used in a GROUP BY clause */ @Support({ DB2, ORACLE, SQLSERVER, SYBASE }) - public static Field cube(Field... fields) { + public static GroupField cube(Field... fields) { return function("cube", Object.class, nullSafe(fields)); } @@ -2481,7 +2482,7 @@ public class Factory { */ @SuppressWarnings("unchecked") @Support({ DB2, ORACLE, SQLSERVER, SYBASE }) - public static Field groupingSets(Field... fields) { + public static GroupField groupingSets(Field... fields) { List>[] array = new List[fields.length]; for (int i = 0; i < fields.length; i++) { @@ -2515,7 +2516,7 @@ public class Factory { */ @SuppressWarnings("unchecked") @Support({ DB2, ORACLE, SQLSERVER, SYBASE }) - public static Field groupingSets(Field[]... fieldSets) { + public static GroupField groupingSets(Field[]... fieldSets) { List>[] array = new List[fieldSets.length]; for (int i = 0; i < fieldSets.length; i++) { @@ -2548,7 +2549,7 @@ public class Factory { * @return A field to be used in a GROUP BY clause */ @Support({ DB2, ORACLE, SQLSERVER, SYBASE }) - public static Field groupingSets(Collection>... fieldSets) { + public static GroupField groupingSets(Collection>... fieldSets) { WrappedList[] array = new WrappedList[fieldSets.length]; for (int i = 0; i < fieldSets.length; i++) { diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java index e374f98bff..eacb3a5e46 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectImpl.java @@ -47,6 +47,7 @@ import org.jooq.Condition; import org.jooq.Configuration; import org.jooq.Field; import org.jooq.ForeignKey; +import org.jooq.GroupField; import org.jooq.JoinType; import org.jooq.Operator; import org.jooq.Param; @@ -391,13 +392,13 @@ class SelectImpl extends AbstractDelegatingSelect implements } @Override - public final SelectImpl groupBy(Field... fields) { + public final SelectImpl groupBy(GroupField... fields) { getQuery().addGroupBy(fields); return this; } @Override - public final SelectImpl groupBy(Collection> fields) { + public final SelectImpl groupBy(Collection fields) { getQuery().addGroupBy(fields); return this; } diff --git a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java index c2dad3041e..a2c17195a9 100644 --- a/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java +++ b/jOOQ/src/main/java/org/jooq/impl/SelectQueryImpl.java @@ -43,6 +43,7 @@ import org.jooq.Condition; import org.jooq.Configuration; import org.jooq.Field; import org.jooq.ForeignKey; +import org.jooq.GroupField; import org.jooq.JoinType; import org.jooq.Operator; import org.jooq.Record; @@ -104,13 +105,13 @@ class SelectQueryImpl extends AbstractSubSelect implements SelectQuery { } @Override - public final void addGroupBy(Collection> fields) { + public final void addGroupBy(Collection fields) { setGrouping(); getGroupBy().addAll(fields); } @Override - public final void addGroupBy(Field... fields) { + public final void addGroupBy(GroupField... fields) { addGroupBy(Arrays.asList(fields)); }