diff --git a/jOOQ/src/main/java/org/jooq/Field.java b/jOOQ/src/main/java/org/jooq/Field.java index 67a6fcbb58..33ea1a797b 100644 --- a/jOOQ/src/main/java/org/jooq/Field.java +++ b/jOOQ/src/main/java/org/jooq/Field.java @@ -778,6 +778,54 @@ extends @Support({ CUBRID, FIREBIRD, H2, HSQLDB, MARIADB, MYSQL, POSTGRES, SQLITE, YUGABYTE }) Field bitXor(Field arg2); + /** + * The MOD operator. + * + * @param arg2 is wrapped as {@link #val(Object)}. + */ + @NotNull + @Support + Field mod(Number arg2); + + /** + * The MOD operator. + */ + @NotNull + @Support + Field mod(Field arg2); + + /** + * The MODULO operator, an alias for the MOD operator. + * + * @param arg2 is wrapped as {@link #val(Object)}. + */ + @NotNull + @Support + Field modulo(Number arg2); + + /** + * The MODULO operator, an alias for the MOD operator. + */ + @NotNull + @Support + Field modulo(Field arg2); + + /** + * The REM operator, an alias for the MOD operator. + * + * @param arg2 is wrapped as {@link #val(Object)}. + */ + @NotNull + @Support + Field rem(Number arg2); + + /** + * The REM operator, an alias for the MOD operator. + */ + @NotNull + @Support + Field rem(Field arg2); + /** * The SHL operator. *

@@ -1120,64 +1168,6 @@ extends @Support Field divide(Field value); - /** - * An arithmetic expression getting the modulo of this divided by value. - *

- * This renders the modulo operation where available: - *

[this] % [value]
... or the modulo function - * elsewhere:
mod([this], [value])
- */ - @NotNull - @Support - Field mod(Number value); - - /** - * An arithmetic expression getting the modulo of this divided by value. - *

- * This renders the modulo operation where available: - *

[this] % [value]
... or the modulo function - * elsewhere:
mod([this], [value])
- */ - @NotNull - @Support - Field mod(Field value); - - /** - * An alias for {@link #mod(Number)}. - * - * @see #mod(Number) - */ - @NotNull - @Support - Field modulo(Number value); - - /** - * An alias for {@link #mod(Field)}. - * - * @see #mod(Field) - */ - @NotNull - @Support - Field modulo(Field value); - - /** - * An alias for {@link #mod(Number)}. - * - * @see #mod(Number) - */ - @NotNull - @Support - Field rem(Number value); - - /** - * An alias for {@link #mod(Field)}. - * - * @see #mod(Field) - */ - @NotNull - @Support - Field rem(Field value); - /** * An arithmetic expression getting this value raised to the power of exponent. *

diff --git a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java index c28b8880b8..95ed418b77 100644 --- a/jOOQ/src/main/java/org/jooq/impl/AbstractField.java +++ b/jOOQ/src/main/java/org/jooq/impl/AbstractField.java @@ -103,7 +103,8 @@ import org.jooq.WindowPartitionByStep; * @author Lukas Eder */ abstract class AbstractField extends AbstractTypedNamed implements Field, ScopeMappable { - private static final Clause[] CLAUSES = { FIELD }; + + private static final Clause[] CLAUSES = { FIELD }; AbstractField(Name name, DataType type) { this(name, type, null); @@ -414,6 +415,38 @@ abstract class AbstractField extends AbstractTypedNamed implements Field) arg2); } + @Override + @SuppressWarnings({ "unchecked", "rawtypes" }) + public final Field mod(Number arg2) { + return new Mod(this, Tools.field(arg2)); + } + + @Override + @SuppressWarnings({ "unchecked", "rawtypes" }) + public final Field mod(Field arg2) { + return new Mod(this, arg2); + } + + @Override + public final Field modulo(Number arg2) { + return mod(arg2); + } + + @Override + public final Field modulo(Field arg2) { + return mod(arg2); + } + + @Override + public final Field rem(Number arg2) { + return mod(arg2); + } + + @Override + public final Field rem(Field arg2) { + return mod(arg2); + } + @Override @SuppressWarnings({ "unchecked", "rawtypes" }) public final Field shl(Number count) { @@ -499,16 +532,6 @@ abstract class AbstractField extends AbstractTypedNamed implements Field(DIVIDE, false, this, nullSafe(value, getDataType())); } - @Override - public final Field mod(Number value) { - return mod(Tools.field(value)); - } - - @Override - public final Field mod(Field value) { - return new Mod<>(this, nullSafe(value, getDataType())); - } - // ------------------------------------------------------------------------ // XXX: Arithmetic operation aliases // ------------------------------------------------------------------------ @@ -573,26 +596,6 @@ abstract class AbstractField extends AbstractTypedNamed implements Field modulo(Number value) { - return mod(value); - } - - @Override - public final Field modulo(Field value) { - return mod(value); - } - - @Override - public final Field rem(Number value) { - return mod(value); - } - - @Override - public final Field rem(Field value) { - return mod(value); - } - // ------------------------------------------------------------------------ // XXX: Conditions created from this field // ------------------------------------------------------------------------ diff --git a/jOOQ/src/main/java/org/jooq/impl/Expression.java b/jOOQ/src/main/java/org/jooq/impl/Expression.java index 4ceb183574..7b5529bb65 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Expression.java +++ b/jOOQ/src/main/java/org/jooq/impl/Expression.java @@ -198,7 +198,6 @@ final class Expression extends AbstractTransformable { - @Override @SuppressWarnings("null") diff --git a/jOOQ/src/main/java/org/jooq/impl/ExpressionOperator.java b/jOOQ/src/main/java/org/jooq/impl/ExpressionOperator.java index b5c3ad46c9..f4e171aee3 100644 --- a/jOOQ/src/main/java/org/jooq/impl/ExpressionOperator.java +++ b/jOOQ/src/main/java/org/jooq/impl/ExpressionOperator.java @@ -71,11 +71,6 @@ enum ExpressionOperator { */ DIVIDE("/"), - /** - * Modulo - */ - MODULO("%"), - ; private final String sql; diff --git a/jOOQ/src/main/java/org/jooq/impl/Mod.java b/jOOQ/src/main/java/org/jooq/impl/Mod.java index 3ed3040893..f2effba091 100644 --- a/jOOQ/src/main/java/org/jooq/impl/Mod.java +++ b/jOOQ/src/main/java/org/jooq/impl/Mod.java @@ -37,28 +37,55 @@ */ package org.jooq.impl; -import static org.jooq.impl.ExpressionOperator.MODULO; -import static org.jooq.impl.Keywords.K_MOD; -import static org.jooq.impl.Names.N_MOD; +import static org.jooq.impl.DSL.*; +import static org.jooq.impl.Internal.*; +import static org.jooq.impl.Keywords.*; +import static org.jooq.impl.Names.*; +import static org.jooq.impl.SQLDataType.*; +import static org.jooq.impl.Tools.*; +import static org.jooq.impl.Tools.BooleanDataKey.*; +import static org.jooq.impl.Tools.DataExtendedKey.*; +import static org.jooq.impl.Tools.DataKey.*; +import static org.jooq.SQLDialect.*; + +import org.jooq.*; +import org.jooq.Record; +import org.jooq.conf.*; +import org.jooq.impl.*; +import org.jooq.tools.*; + +import java.util.*; -import org.jooq.Context; -import org.jooq.Field; /** - * @author Lukas Eder + * The MOD statement. */ -final class Mod extends AbstractField { +@SuppressWarnings({ "rawtypes", "unchecked", "unused" }) +final class Mod +extends + AbstractField +{ private final Field arg1; private final Field arg2; - Mod(Field arg1, Field arg2) { - super(N_MOD, arg1.getDataType()); + Mod( + Field arg1, + Field arg2 + ) { + super( + N_MOD, + allNotNull((DataType) dataType(INTEGER, arg1, false), arg1, arg2) + ); - this.arg1 = arg1; - this.arg2 = arg2; + this.arg1 = nullSafeNotNull(arg1, INTEGER); + this.arg2 = nullSafeNotNull(arg2, INTEGER); } + // ------------------------------------------------------------------------- + // XXX: QueryPart API + // ------------------------------------------------------------------------- + @Override public final void accept(Context ctx) { switch (ctx.family()) { @@ -77,12 +104,46 @@ final class Mod extends AbstractField { - case SQLITE: - ctx.visit(new Expression<>(MODULO, false, arg1, arg2)); + + + + case SQLITE: { + ctx.sql('(').visit(arg1).sql(" % ").visit(arg2).sql(')'); break; + } + default: - ctx.visit(K_MOD).sql('(').visit(arg1).sql(", ").visit(arg2).sql(')'); + ctx.visit(function(N_MOD, getDataType(), arg1, arg2)); break; } } + + + + + + + + + + + + + + + // ------------------------------------------------------------------------- + // The Object API + // ------------------------------------------------------------------------- + + @Override + public boolean equals(Object that) { + if (that instanceof Mod) { + return + StringUtils.equals(arg1, ((Mod) that).arg1) && + StringUtils.equals(arg2, ((Mod) that).arg2) + ; + } + else + return super.equals(that); + } }