Merge pull request #1944 from ebean-orm/feature/1943

#1943 - Use limit & offset via setFirstRow() and setMaxRows() on filterMany()
This commit is contained in:
Rob Bygrave
2020-02-22 09:26:03 +13:00
committed by GitHub
9 changed files with 139 additions and 26 deletions
+3 -3
View File
@@ -506,7 +506,7 @@ public interface ExpressionList<T> {
* @param expressions Filter expressions with and, or and ? or ?1 type bind parameters
* @param params Bind parameters used in the expressions
*/
Query<T> filterMany(String manyProperty, String expressions, Object... params);
ExpressionList<T> filterMany(String manyProperty, String expressions, Object... params);
/**
* Specify specific properties to fetch on the main/root bean (aka partial
@@ -557,14 +557,14 @@ public interface ExpressionList<T> {
*
* @see Query#setFirstRow(int)
*/
Query<T> setFirstRow(int firstRow);
ExpressionList<T> setFirstRow(int firstRow);
/**
* Set the maximum number of rows to fetch.
*
* @see Query#setMaxRows(int)
*/
Query<T> setMaxRows(int maxRows);
ExpressionList<T> setMaxRows(int maxRows);
/**
* Set the name of the property which values become the key of a map.
@@ -36,4 +36,11 @@ public interface SpiExpressionList<T> extends ExpressionList<T>, SpiExpression {
* Write the top level where expressions taking into account possible extra idEquals expression.
*/
void writeDocQuery(DocQueryContext context, SpiExpression idEquals) throws IOException;
/**
* Apply firstRow maxRows limits on the filterMany query.
*/
default void applyRowLimits(SpiQuery<?> query) {
// do nothing by default
}
}
@@ -480,9 +480,8 @@ public class DefaultExpressionList<T> implements SpiExpressionList<T> {
}
@Override
public Query<T> filterMany(String manyProperty, String expressions, Object... params) {
query.filterMany(manyProperty).where(expressions, params);
return query;
public ExpressionList<T> filterMany(String manyProperty, String expressions, Object... params) {
return query.filterMany(manyProperty).where(expressions, params);
}
@Override
@@ -521,13 +520,15 @@ public class DefaultExpressionList<T> implements SpiExpressionList<T> {
}
@Override
public Query<T> setFirstRow(int firstRow) {
return query.setFirstRow(firstRow);
public ExpressionList<T> setFirstRow(int firstRow) {
query.setFirstRow(firstRow);
return this;
}
@Override
public Query<T> setMaxRows(int maxRows) {
return query.setMaxRows(maxRows);
public ExpressionList<T> setMaxRows(int maxRows) {
query.setMaxRows(maxRows);
return this;
}
@Override
@@ -9,6 +9,7 @@ import io.ebean.Junction;
import io.ebean.OrderBy;
import io.ebean.Query;
import io.ebeaninternal.api.SpiExpressionList;
import io.ebeaninternal.api.SpiQuery;
import javax.persistence.PersistenceException;
import java.util.Collection;
@@ -25,6 +26,9 @@ public class FilterExpressionList<T> extends DefaultExpressionList<T> {
private final FilterExprPath pathPrefix;
private int firstRow;
private int maxRows;
public FilterExpressionList(FilterExprPath pathPrefix, FilterExpressionList<T> original) {
super(null, original.expr, null, original.getUnderlyingList());
this.pathPrefix = pathPrefix;
@@ -144,19 +148,21 @@ public class FilterExpressionList<T> extends DefaultExpressionList<T> {
throw new PersistenceException(notAllowedMessage);
}
@Override
public Query<T> setFirstRow(int firstRow) {
return rootQuery.setFirstRow(firstRow);
}
@Override
public Query<T> setMapKey(String mapKey) {
return rootQuery.setMapKey(mapKey);
}
@Override
public Query<T> setMaxRows(int maxRows) {
return rootQuery.setMaxRows(maxRows);
public ExpressionList<T> setMaxRows(int maxRows) {
this.maxRows = maxRows;
return this;
}
@Override
public ExpressionList<T> setFirstRow(int firstRow) {
this.firstRow = firstRow;
return this;
}
@Override
@@ -169,5 +175,14 @@ public class FilterExpressionList<T> extends DefaultExpressionList<T> {
return rootQuery.where();
}
@Override
public void applyRowLimits(SpiQuery<?> query) {
if (firstRow > 0) {
query.setFirstRow(firstRow);
}
if (maxRows > 0) {
query.setMaxRows(maxRows);
}
}
}
@@ -337,7 +337,7 @@ class JunctionExpression<T> implements SpiJunction<T>, SpiExpression, Expression
}
@Override
public Query<T> filterMany(String manyProperty, String expressions, Object... params) {
public ExpressionList<T> filterMany(String manyProperty, String expressions, Object... params) {
throw new IllegalStateException("filterMany not allowed on Junction expression list");
}
@@ -864,7 +864,7 @@ class JunctionExpression<T> implements SpiJunction<T>, SpiExpression, Expression
}
@Override
public Query<T> setFirstRow(int firstRow) {
public ExpressionList<T> setFirstRow(int firstRow) {
return exprList.setFirstRow(firstRow);
}
@@ -874,7 +874,7 @@ class JunctionExpression<T> implements SpiJunction<T>, SpiExpression, Expression
}
@Override
public Query<T> setMaxRows(int maxRows) {
public ExpressionList<T> setMaxRows(int maxRows) {
return exprList.setMaxRows(maxRows);
}
@@ -245,9 +245,9 @@ public class OrmQueryProperties implements Serializable {
}
if (filterMany != null) {
filterMany.applyRowLimits(query);
SpiExpressionList<?> trimPath = filterMany.trimPath(path.length() + 1);
List<SpiExpression> underlyingList = trimPath.getUnderlyingList();
for (SpiExpression spiExpression : underlyingList) {
for (SpiExpression spiExpression : trimPath.getUnderlyingList()) {
query.where().add(spiExpression);
}
}