package ch.alv.components.data.repository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import java.util.ArrayList;
import java.util.List;
/**
* Utility class for repositories.
*
* @since 1.0.0
*/
public class RepositoryHelper {
/**
* Creates a list which considers the pageable.
*
* @param pageable the pageable requirements.
* @param result list of all result items.
* @return a fresh, pageable-conform list.
*/
public static <T> List<T> applyPageable(Pageable pageable, List<T> result) {
if (pageable == null) {
return result;
}
int offset = pageable.getOffset();
int pageSize = pageable.getPageSize();
int numberOfElements = result.size();
if (offset > numberOfElements) {
return new ArrayList<>();
}
if (numberOfElements < offset + pageSize) {
return result.subList(offset, numberOfElements);
}
return result.subList(offset, offset + pageSize);
}
/**
* Creates a page which considers the pageable.
*
* @param pageable the pageable requirements.
* @param result page of all result items.
* @return a fresh, pageable-conform page.
*/
public static <T> Page<T> applyPageable(Pageable pageable, Page<T> result) {
if (pageable == null) {
return result;
}
int offset = pageable.getOffset();
int pageSize = pageable.getPageSize();
int numberOfElements = result.getNumberOfElements();
if (offset > numberOfElements) {
return new PageImpl<>(new ArrayList<T>(), pageable, numberOfElements);
}
if (numberOfElements < offset + pageSize) {
return new PageImpl<>(applyPageable(pageable, result.getContent()), pageable, numberOfElements);
}
return new PageImpl<>(applyPageable(pageable, result.getContent()), pageable, numberOfElements);
}
/**
* Converts a result to a Page that corresponds to the given pageable.
*
* @param pageable the pageable to consider.
* @param result the result list of the current query.
* @return a matching with a sliced (or empty) result list as content.
*/
public static <T> Page<T> createPage(Pageable pageable, List<T> result) {
if (result == null) {
result = new ArrayList<>();
}
Page<T> page = new PageImpl<>(result);
int start = 0;
int pageNumber = 0;
int pageSize = result.size() + 1;
if (pageable != null) {
pageNumber = pageable.getPageNumber();
start = pageNumber * pageable.getPageSize();
pageSize = pageable.getPageSize();
}
if (start < result.size()) {
return RepositoryHelper.applyPageable(new PageRequest(pageNumber, pageSize), page);
} else {
return new PageImpl<>(new ArrayList<T>(), new PageRequest(pageNumber, pageSize), result.size());
}
}
}