54 lines
2.6 KiB
Java
54 lines
2.6 KiB
Java
package eu.eudat.managers;
|
|
|
|
import eu.eudat.entities.DataEntity;
|
|
import eu.eudat.models.helpers.common.ColumnOrderings;
|
|
import eu.eudat.models.helpers.common.Ordering;
|
|
import eu.eudat.models.helpers.requests.TableRequest;
|
|
import eu.eudat.queryable.QueryableList;
|
|
|
|
import java.util.Collection;
|
|
|
|
public class PaginationManager {
|
|
|
|
public static <T extends DataEntity<T>> QueryableList<T> applyPaging(QueryableList<T> items, TableRequest tableRequest) throws Exception {
|
|
if (tableRequest.getOrderings() != null) applyOrder(items, tableRequest);
|
|
if (tableRequest.getLength() != null) items.take(tableRequest.getLength());
|
|
if (tableRequest.getOffset() != null) items.skip(tableRequest.getOffset());
|
|
return items;
|
|
}
|
|
|
|
public static <T extends DataEntity<T>> void applyOrder(QueryableList<T> items, TableRequest tableRequest) throws Exception {
|
|
ColumnOrderings columnOrderings = tableRequest.getOrderings();
|
|
for (Ordering ordering : columnOrderings.getFieldOrderings()) {
|
|
if (ordering.getOrderByType() == Ordering.OrderByType.ASC)
|
|
applyAscOrder(items,ordering);
|
|
if (ordering.getOrderByType() == Ordering.OrderByType.DESC) {
|
|
applyDescOrder(items,ordering);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
private static <T extends DataEntity<T>> void applyAscOrder(QueryableList<T> items, Ordering ordering) {
|
|
if (ordering.getColumnType() == Ordering.ColumnType.COUNT) {
|
|
items.orderBy((builder, root) -> builder.asc(builder.size(root.<Collection>get(ordering.getFieldName()))));
|
|
} else if (ordering.getColumnType() == Ordering.ColumnType.JOIN_COLUMN) {
|
|
String[] fields = ordering.getFieldName().split(":");
|
|
items.orderBy((builder, root) -> builder.asc(root.get(fields[0]).get(fields[1])));
|
|
} else {
|
|
items.orderBy((builder, root) -> builder.asc(root.get(ordering.getFieldName())));
|
|
}
|
|
}
|
|
|
|
private static <T extends DataEntity<T>> void applyDescOrder(QueryableList<T> items, Ordering ordering) {
|
|
if (ordering.getColumnType() == Ordering.ColumnType.COUNT) {
|
|
items.orderBy((builder, root) -> builder.desc(builder.size(root.<Collection>get(ordering.getFieldName()))));
|
|
} else if (ordering.getColumnType() == Ordering.ColumnType.JOIN_COLUMN) {
|
|
String[] fields = ordering.getFieldName().split(":");
|
|
items.orderBy((builder, root) -> builder.desc(root.get(fields[0]).get(fields[1])));
|
|
} else {
|
|
items.orderBy((builder, root) -> builder.desc(root.get(ordering.getFieldName())));
|
|
}
|
|
}
|
|
}
|