[jOOQ/jOOQ#5695] Allow for expressions to be put in LIMIT / OFFSET

This commit is contained in:
Lukas Eder 2022-01-20 10:09:24 +01:00
parent 94c2dab4b8
commit f3935558eb
16 changed files with 99 additions and 99 deletions

View File

@ -85,5 +85,5 @@ public interface DeleteLimitStep<R extends Record> extends DeleteReturningStep<R
*/
@NotNull @CheckReturnValue
@Support
DeleteReturningStep<R> limit(Param<? extends Number> numberOfRows);
DeleteReturningStep<R> limit(Field<? extends Number> numberOfRows);
}

View File

@ -150,7 +150,7 @@ public interface DeleteQuery<R extends Record> extends ConditionProvider, Delete
* @param numberOfRows The number of rows to return
*/
@Support
void addLimit(Param<? extends Number> numberOfRows);
void addLimit(Field<? extends Number> numberOfRows);
// ------------------------------------------------------------------------
// XXX: Methods for the DELETE .. RETURNING syntax

View File

@ -167,6 +167,6 @@ public interface SelectLimitAfterOffsetStep<R extends Record> extends SelectForU
*/
@NotNull @CheckReturnValue
@Support
SelectLimitPercentAfterOffsetStep<R> limit(Param<? extends Number> numberOfRows);
SelectLimitPercentAfterOffsetStep<R> limit(Field<? extends Number> numberOfRows);
}

View File

@ -177,7 +177,7 @@ public interface SelectLimitStep<R extends Record> extends SelectForUpdateStep<R
*/
@NotNull @CheckReturnValue
@Support
SelectLimitPercentStep<R> limit(Param<? extends Number> numberOfRows);
SelectLimitPercentStep<R> limit(Field<? extends Number> numberOfRows);
/**
* Add a <code>LIMIT</code> clause to the query
@ -223,7 +223,7 @@ public interface SelectLimitStep<R extends Record> extends SelectForUpdateStep<R
*/
@NotNull @CheckReturnValue
@Support
SelectLimitPercentAfterOffsetStep<R> limit(int offset, Param<Integer> numberOfRows);
SelectLimitPercentAfterOffsetStep<R> limit(int offset, Field<Integer> numberOfRows);
/**
* Add a <code>LIMIT</code> clause to the query using named parameters
@ -239,7 +239,7 @@ public interface SelectLimitStep<R extends Record> extends SelectForUpdateStep<R
*/
@NotNull @CheckReturnValue
@Support
SelectLimitPercentAfterOffsetStep<R> limit(Number offset, Param<? extends Number> numberOfRows);
SelectLimitPercentAfterOffsetStep<R> limit(Number offset, Field<? extends Number> numberOfRows);
/**
* Add a <code>LIMIT</code> clause to the query using named parameters
@ -255,7 +255,7 @@ public interface SelectLimitStep<R extends Record> extends SelectForUpdateStep<R
*/
@NotNull @CheckReturnValue
@Support
SelectLimitPercentAfterOffsetStep<R> limit(Param<Integer> offset, int numberOfRows);
SelectLimitPercentAfterOffsetStep<R> limit(Field<Integer> offset, int numberOfRows);
/**
* Add a <code>LIMIT</code> clause to the query using named parameters
@ -271,7 +271,7 @@ public interface SelectLimitStep<R extends Record> extends SelectForUpdateStep<R
*/
@NotNull @CheckReturnValue
@Support
SelectLimitPercentAfterOffsetStep<R> limit(Param<? extends Number> offset, Number numberOfRows);
SelectLimitPercentAfterOffsetStep<R> limit(Field<? extends Number> offset, Number numberOfRows);
/**
* Add a <code>LIMIT</code> clause to the query using named parameters
@ -287,7 +287,7 @@ public interface SelectLimitStep<R extends Record> extends SelectForUpdateStep<R
*/
@NotNull @CheckReturnValue
@Support
SelectLimitPercentAfterOffsetStep<R> limit(Param<? extends Number> offset, Param<? extends Number> numberOfRows);
SelectLimitPercentAfterOffsetStep<R> limit(Field<? extends Number> offset, Field<? extends Number> numberOfRows);
/**
* Add a 0-based <code>OFFSET</code> clause to the query.
@ -330,5 +330,5 @@ public interface SelectLimitStep<R extends Record> extends SelectForUpdateStep<R
*/
@NotNull @CheckReturnValue
@Support
SelectLimitAfterOffsetStep<R> offset(Param<? extends Number> offset);
SelectLimitAfterOffsetStep<R> offset(Field<? extends Number> offset);
}

View File

@ -173,5 +173,5 @@ public interface SelectOffsetStep<R extends Record> extends SelectForUpdateStep<
*/
@NotNull @CheckReturnValue
@Support
SelectForUpdateStep<R> offset(Param<? extends Number> offset);
SelectForUpdateStep<R> offset(Field<? extends Number> offset);
}

View File

@ -732,7 +732,7 @@ public interface SelectQuery<R extends Record> extends Select<R>, ConditionProvi
* <code>SELECT</code> statements.
*/
@Support
void addOffset(Param<? extends Number> offset);
void addOffset(Field<? extends Number> offset);
/**
* Limit the results of this select.
@ -771,7 +771,7 @@ public interface SelectQuery<R extends Record> extends Select<R>, ConditionProvi
* @param numberOfRows The number of rows to return
*/
@Support
void addLimit(Param<? extends Number> numberOfRows);
void addLimit(Field<? extends Number> numberOfRows);
/**
* Limit the results of this select.
@ -823,7 +823,7 @@ public interface SelectQuery<R extends Record> extends Select<R>, ConditionProvi
* @param numberOfRows The number of rows to return
*/
@Support
void addLimit(Param<Integer> offset, int numberOfRows);
void addLimit(Field<Integer> offset, int numberOfRows);
/**
* Limit the results of this select.
@ -841,7 +841,7 @@ public interface SelectQuery<R extends Record> extends Select<R>, ConditionProvi
* @param numberOfRows The number of rows to return
*/
@Support
void addLimit(Param<? extends Number> offset, Number numberOfRows);
void addLimit(Field<? extends Number> offset, Number numberOfRows);
/**
* Limit the results of this select using named parameters.
@ -859,7 +859,7 @@ public interface SelectQuery<R extends Record> extends Select<R>, ConditionProvi
* @param numberOfRows The number of rows to return
*/
@Support
void addLimit(int offset, Param<Integer> numberOfRows);
void addLimit(int offset, Field<Integer> numberOfRows);
/**
* Limit the results of this select using named parameters.
@ -877,7 +877,7 @@ public interface SelectQuery<R extends Record> extends Select<R>, ConditionProvi
* @param numberOfRows The number of rows to return
*/
@Support
void addLimit(Number offset, Param<? extends Number> numberOfRows);
void addLimit(Number offset, Field<? extends Number> numberOfRows);
/**
* Limit the results of this select using named parameters.
@ -895,7 +895,7 @@ public interface SelectQuery<R extends Record> extends Select<R>, ConditionProvi
* @param numberOfRows The number of rows to return
*/
@Support
void addLimit(Param<? extends Number> offset, Param<? extends Number> numberOfRows);
void addLimit(Field<? extends Number> offset, Field<? extends Number> numberOfRows);
/**
* Add the <code>PERCENT</code> clause to a <code>LIMIT</code> clause.

View File

@ -160,6 +160,6 @@ public interface SelectSeekLimitStep<R extends Record> extends SelectForUpdateSt
*/
@NotNull @CheckReturnValue
@Support
SelectForUpdateStep<R> limit(Param<? extends Number> numberOfRows);
SelectForUpdateStep<R> limit(Field<? extends Number> numberOfRows);
}

View File

@ -87,7 +87,7 @@ public interface UpdateLimitStep<R extends Record> extends UpdateReturningStep<R
*/
@NotNull @CheckReturnValue
@Support
UpdateReturningStep<R> limit(Param<? extends Number> numberOfRows);
UpdateReturningStep<R> limit(Field<? extends Number> numberOfRows);
}

View File

@ -438,7 +438,7 @@ public interface UpdateQuery<R extends Record> extends StoreQuery<R>, ConditionP
* @param numberOfRows The number of rows to return
*/
@Support
void addLimit(Param<? extends Number> numberOfRows);
void addLimit(Field<? extends Number> numberOfRows);
// ------------------------------------------------------------------------
// XXX: Methods for the UPDATE .. RETURNING syntax

View File

@ -325,7 +325,7 @@ final class DeleteImpl<R extends Record>
}
@Override
public final DeleteImpl<R> limit(Param<? extends Number> numberOfRows) {
public final DeleteImpl<R> limit(Field<? extends Number> numberOfRows) {
getDelegate().addLimit(numberOfRows);
return this;
}

View File

@ -135,7 +135,7 @@ final class DeleteQueryImpl<R extends Record> extends AbstractDMLQuery<R> implem
private final TableList using;
private final ConditionProviderImpl condition;
private final SortFieldList orderBy;
private Param<? extends Number> limit;
private Field<? extends Number> limit;
DeleteQueryImpl(Configuration configuration, WithImpl with, Table<R> table) {
super(configuration, with, table);
@ -220,7 +220,7 @@ final class DeleteQueryImpl<R extends Record> extends AbstractDMLQuery<R> implem
}
@Override
public final void addLimit(Param<? extends Number> numberOfRows) {
public final void addLimit(Field<? extends Number> numberOfRows) {
limit = numberOfRows;
}

View File

@ -72,6 +72,8 @@ import org.jooq.exception.DataAccessException;
import org.jooq.impl.QOM.UTransient;
import org.jooq.impl.Tools.BooleanDataKey;
import org.jetbrains.annotations.Nullable;
/**
* @author Lukas Eder
*/
@ -81,11 +83,11 @@ final class Limit extends AbstractQueryPart implements UTransient {
private static final Param<Integer> ONE = one();
private static final Param<Integer> MAX = DSL.inline(Integer.MAX_VALUE);
Param<?> limit;
private Param<?> limitOrMax = MAX;
Param<?> offset;
private Param<?> offsetOrZero = ZERO;
private Param<?> offsetPlusOne = ONE;
Field<? extends Number> limit;
private Field<? extends Number> limitOrMax = MAX;
Field<? extends Number> offset;
private Field<? extends Number> offsetOrZero = ZERO;
private Field<? extends Number> offsetPlusOne = ONE;
boolean withTies;
boolean percent;
@ -404,7 +406,7 @@ final class Limit extends AbstractQueryPart implements UTransient {
return !limitZero()
&& !withTies()
&& !percent()
&& Long.valueOf(1L).equals(limit.getValue());
&& Long.valueOf(1L).equals(getLimit());
}
/**
@ -442,23 +444,28 @@ final class Limit extends AbstractQueryPart implements UTransient {
this.offsetPlusOne = val(offset.longValue() + 1L, BIGINT);
}
final void setOffset(Param<?> offset) {
final void setOffset(Field<? extends Number> offset) {
this.offset = offset;
this.offsetOrZero = offset;
}
final void setLimit(Number numberOfRows) {
this.limit = val(numberOfRows.longValue(), SQLDataType.BIGINT);
final void setLimit(Number l) {
this.limit = val(l.longValue(), SQLDataType.BIGINT);
this.limitOrMax = this.limit;
}
final void setLimit(Param<?> numberOfRows) {
this.limit = numberOfRows;
this.limitOrMax = numberOfRows;
final void setLimit(Field<? extends Number> l) {
this.limit = l;
this.limitOrMax = l;
}
final Long getLimit() {
return Convert.convert((limit != null ? limit : limitOrMax).getValue(), long.class);
Field<?> l = limit != null ? limit : limitOrMax;
if (l instanceof Param)
return Convert.convert(((Param<?>) l).getValue(), long.class);
else
return Convert.convert(MAX.getValue(), long.class);
}
final void setPercent(boolean percent) {
@ -477,21 +484,22 @@ final class Limit extends AbstractQueryPart implements UTransient {
return withTies;
}
final Limit from(Limit limit) {
final Limit from(Limit other) {
// [#9017] Take the lower number of two LIMIT clauses, maintaining
// inline flags and parameter names
if (limit.limit != null)
if (limit == null)
this.setLimit(limit.limit);
// [#5695] TODO: What to do if LIMIT is an expression?
if (other.limit != null)
if (this.limit == null)
this.setLimit(other.limit);
else
this.setLimit(((Val<?>) limit.limit).copy(Math.min(getLimit(), limit.getLimit())));
this.setLimit(((Val<? extends Number>) other.limit).copy(Math.min(getLimit(), other.getLimit())));
if (limit.offset != null)
this.setOffset(limit.offset);
if (other.offset != null)
this.setOffset(other.offset);
this.setPercent(limit.percent);
this.setWithTies(limit.withTies);
this.setPercent(other.percent);
this.setWithTies(other.withTies);
return this;
}

View File

@ -230,9 +230,9 @@ implements
* The limit that has been added in a limit(Number).offset(Number) construct
*/
private transient Number limit;
private transient Param<? extends Number> limitParam;
private transient Field<? extends Number> limitParam;
private transient Number offset;
private transient Param<? extends Number> offsetParam;
private transient Field<? extends Number> offsetParam;
@ -1644,7 +1644,7 @@ implements
}
@Override
public final SelectImpl limit(Param<? extends Number> l) {
public final SelectImpl limit(Field<? extends Number> l) {
limit = null;
limitParam = l;
return limitOffset();
@ -1665,12 +1665,12 @@ implements
}
@Override
public final SelectImpl limit(int o, Param<Integer> l) {
public final SelectImpl limit(int o, Field<Integer> l) {
return limit((Number) o, l);
}
@Override
public final SelectImpl limit(Number o, Param<? extends Number> l) {
public final SelectImpl limit(Number o, Field<? extends Number> l) {
offset = o;
offsetParam = null;
limit = null;
@ -1679,12 +1679,12 @@ implements
}
@Override
public final SelectImpl limit(Param<Integer> o, int l) {
public final SelectImpl limit(Field<Integer> o, int l) {
return limit(o, (Number) l);
}
@Override
public final SelectImpl limit(Param<? extends Number> o, Number l) {
public final SelectImpl limit(Field<? extends Number> o, Number l) {
offset = null;
offsetParam = o;
limit = l;
@ -1693,7 +1693,7 @@ implements
}
@Override
public final SelectImpl limit(Param<? extends Number> o, Param<? extends Number> l) {
public final SelectImpl limit(Field<? extends Number> o, Field<? extends Number> l) {
offset = null;
offsetParam = o;
limit = null;
@ -1714,7 +1714,7 @@ implements
}
@Override
public final SelectImpl offset(Param<? extends Number> o) {
public final SelectImpl offset(Field<? extends Number> o) {
offset = null;
offsetParam = o;
return limitOffset();

View File

@ -250,7 +250,6 @@ import org.jooq.JoinType;
import org.jooq.Name;
import org.jooq.Operator;
import org.jooq.OrderField;
import org.jooq.Param;
// ...
import org.jooq.QualifiedAsterisk;
import org.jooq.QueryPart;
@ -291,9 +290,6 @@ import org.jooq.impl.Tools.DataKey;
import org.jooq.tools.JooqLogger;
import org.jooq.tools.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* A sub-select is a <code>SELECT</code> statement that can be combined with
@ -1245,14 +1241,14 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
.where(rn.eq(one()))
.orderBy(map(orderBy, o -> unqualified(o)));
if (limit.numberOfRows != null) {
SelectLimitPercentStep<?> s2 = s1.limit((Param) limit.numberOfRows);
if (limit.limit != null) {
SelectLimitPercentStep<?> s2 = s1.limit(limit.limit);
SelectWithTiesStep<?> s3 = limit.percent ? s2.percent() : s2;
SelectOffsetStep<?> s4 = limit.withTies ? s3.withTies() : s3;
return limit.offset != null ? s4.offset((Param) limit.offset) : s4;
return limit.offset != null ? s4.offset(limit.offset) : s4;
}
else
return limit.offset != null ? s1.offset((Param) limit.offset) : s1;
return limit.offset != null ? s1.offset(limit.offset) : s1;
}
@ -3296,23 +3292,23 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
}
@Override
public final void addOffset(Param<? extends Number> offset) {
public final void addOffset(Field<? extends Number> offset) {
getLimit().setOffset(offset);
}
@Override
public final void addLimit(int numberOfRows) {
addLimit((Number) numberOfRows);
public final void addLimit(int l) {
addLimit((Number) l);
}
@Override
public final void addLimit(Number numberOfRows) {
getLimit().setNumberOfRows(numberOfRows);
public final void addLimit(Number l) {
getLimit().setLimit(l);
}
@Override
public final void addLimit(Param<? extends Number> numberOfRows) {
getLimit().setNumberOfRows(numberOfRows);
public final void addLimit(Field<? extends Number> l) {
getLimit().setLimit(l);
}
@Override
@ -3321,37 +3317,37 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
}
@Override
public final void addLimit(Number offset, Number numberOfRows) {
public final void addLimit(Number offset, Number l) {
getLimit().setOffset(offset);
getLimit().setNumberOfRows(numberOfRows);
getLimit().setLimit(l);
}
@Override
public final void addLimit(int offset, Param<Integer> numberOfRows) {
addLimit((Number) offset, numberOfRows);
public final void addLimit(int offset, Field<Integer> l) {
addLimit((Number) offset, l);
}
@Override
public final void addLimit(Number offset, Param<? extends Number> numberOfRows) {
public final void addLimit(Number offset, Field<? extends Number> l) {
getLimit().setOffset(offset);
getLimit().setNumberOfRows(numberOfRows);
getLimit().setLimit(l);
}
@Override
public final void addLimit(Param<Integer> offset, int numberOfRows) {
addLimit(offset, (Number) numberOfRows);
public final void addLimit(Field<Integer> offset, int l) {
addLimit(offset, (Number) l);
}
@Override
public final void addLimit(Param<? extends Number> offset, Number numberOfRows) {
public final void addLimit(Field<? extends Number> offset, Number l) {
getLimit().setOffset(offset);
getLimit().setNumberOfRows(numberOfRows);
getLimit().setLimit(l);
}
@Override
public final void addLimit(Param<? extends Number> offset, Param<? extends Number> numberOfRows) {
public final void addLimit(Field<? extends Number> offset, Field<? extends Number> l) {
getLimit().setOffset(offset);
getLimit().setNumberOfRows(numberOfRows);
getLimit().setLimit(l);
}
@Override
@ -4590,17 +4586,15 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
@Override
public final Field<? extends Number> $limit() {
return (Field<? extends Number>) getLimit().numberOfRows;
return getLimit().limit;
}
@Override
public final Select<R> $limit(Field<? extends Number> newLimit) {
if ($limit() == newLimit)
return this;
// [#5695] TODO: Support all types of Field!
else
return copy(s -> s.getLimit().setNumberOfRows((Param<?>) newLimit));
return copy(s -> s.getLimit().setLimit(newLimit));
}
@Override
@ -4631,7 +4625,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
@Override
public final Field<? extends Number> $offset() {
return (Field<? extends Number>) getLimit().offset;
return getLimit().offset;
}
@Override
@ -4641,7 +4635,7 @@ final class SelectQueryImpl<R extends Record> extends AbstractResultQuery<R> imp
// [#5695] TODO: Support all types of Field!
else
return copy(s -> s.getLimit().setOffset((Param<?>) newOffset));
return copy(s -> s.getLimit().setOffset(newOffset));
}

View File

@ -52,7 +52,6 @@ import org.jooq.Field;
import org.jooq.Name;
import org.jooq.Operator;
import org.jooq.OrderField;
import org.jooq.Param;
import org.jooq.QueryPart;
import org.jooq.Record;
import org.jooq.Record1;
@ -666,14 +665,14 @@ final class UpdateImpl<R extends Record>
}
@Override
public final UpdateImpl<R> limit(Number numberOfRows) {
getDelegate().addLimit(numberOfRows);
public final UpdateImpl<R> limit(Number limit) {
getDelegate().addLimit(limit);
return this;
}
@Override
public final UpdateImpl<R> limit(Param<? extends Number> numberOfRows) {
getDelegate().addLimit(numberOfRows);
public final UpdateImpl<R> limit(Field<? extends Number> limit) {
getDelegate().addLimit(limit);
return this;
}

View File

@ -108,7 +108,6 @@ import org.jooq.Context;
import org.jooq.Field;
import org.jooq.Operator;
import org.jooq.OrderField;
import org.jooq.Param;
// ...
import org.jooq.Record;
import org.jooq.Record1;
@ -197,7 +196,7 @@ final class UpdateQueryImpl<R extends Record> extends AbstractStoreQuery<R> impl
private Row multiValue;
private Select<?> multiSelect;
private final SortFieldList orderBy;
private Param<? extends Number> limit;
private Field<? extends Number> limit;
UpdateQueryImpl(Configuration configuration, WithImpl with, Table<R> table) {
super(configuration, with, table);
@ -519,13 +518,13 @@ final class UpdateQueryImpl<R extends Record> extends AbstractStoreQuery<R> impl
}
@Override
public final void addLimit(Number numberOfRows) {
addLimit(DSL.val(numberOfRows));
public final void addLimit(Number l) {
addLimit(DSL.val(l));
}
@Override
public final void addLimit(Param<? extends Number> numberOfRows) {
limit = numberOfRows;
public final void addLimit(Field<? extends Number> l) {
limit = l;
}
final Condition getWhere() {