public PageDTO(List<T> content, Pageable pageable, long total) { this.total = total; this.content = content; this.page = pageable.getPageNumber(); this.size = pageable.getPageSize(); }
/** * Add a dynamic part of a query for the pagination support. * * @param sql Builder instance. * @param pageable Pageable instance. * @return Builder instance. */ public static StringBuilder addPaging(StringBuilder sql, Pageable pageable) { if (pageable.getSort() != null) addSorting(sql, pageable.getSort()); sql.append(" LIMIT ").append(pageable.getPageSize()).append(" OFFSET ").append(pageable.getOffset()); return sql; }
/** * Add a dynamic part of a query for the pagination support. * * @param sql Builder instance. * @param pageable Pageable instance. * @return Builder instance. */ public static StringBuilder addPaging(StringBuilder sql, Pageable pageable) { if (pageable.getSort() != null) addSorting(sql, pageable.getSort()); sql.append(" LIMIT ").append(pageable.getPageSize()).append(" OFFSET ").append(pageable.getOffset()); return sql; }
@Override @SuppressWarnings("unchecked") protected Object doExecute(AbstractJpaQuery query, Object[] values) { ParametersParameterAccessor accessor = new ParametersParameterAccessor(parameters, values); Pageable pageable = accessor.getPageable(); Query createQuery = query.createQuery(values); int pageSize = pageable.getPageSize(); createQuery.setMaxResults(pageSize + 1); List<Object> resultList = createQuery.getResultList(); boolean hasNext = resultList.size() > pageSize; return new SliceImpl<Object>(hasNext ? resultList.subList(0, pageSize) : resultList, pageable, hasNext); } }
/** * Configures the {@link Pageable} to use. * * @param pageable must not be {@literal null} * @return */ public NearQuery with(Pageable pageable) { Assert.notNull(pageable, "Pageable must not be 'null'."); if (pageable.isPaged()) { this.num = pageable.getOffset() + pageable.getPageSize(); this.skip = pageable.getOffset(); } return this; }
@Override @SuppressWarnings({ "unchecked", "rawtypes" }) public Object execute(Query query) { int pageSize = pageable.getPageSize(); // Apply Pageable but tweak limit to peek into next page Query modifiedQuery = query.with(pageable).limit(pageSize + 1); List result = find.matching(modifiedQuery).all(); boolean hasNext = result.size() > pageSize; return new SliceImpl<Object>(hasNext ? result.subList(0, pageSize) : result, pageable, hasNext); } }
/** * Reads the given {@link TypedQuery} into a {@link Page} applying the given {@link Pageable} and * {@link Specification}. * * @param query must not be {@literal null}. * @param domainClass must not be {@literal null}. * @param spec can be {@literal null}. * @param pageable can be {@literal null}. * @return */ protected <S extends T> Page<S> readPage(TypedQuery<S> query, final Class<S> domainClass, Pageable pageable, @Nullable Specification<S> spec) { if (pageable.isPaged()) { query.setFirstResult((int) pageable.getOffset()); query.setMaxResults(pageable.getPageSize()); } return PageableExecutionUtils.getPage(query.getResultList(), pageable, () -> executeCountQuery(getCountQuery(spec, domainClass))); }
/** * Sets the given pagination information on the {@link Query} instance. Will transparently set {@code skip} and * {@code limit} as well as applying the {@link Sort} instance defined with the {@link Pageable}. * * @param pageable * @return */ public Query with(Pageable pageable) { if (pageable.isUnpaged()) { return this; } this.limit = pageable.getPageSize(); this.skip = pageable.getOffset(); return with(pageable.getSort()); }
/** * Applies the given {@link Pageable} to the given {@link SpringDataMongodbQuery}. * * @param query * @param pageable * @return */ private SpringDataMongodbQuery<T> applyPagination(SpringDataMongodbQuery<T> query, Pageable pageable) { query = query.offset(pageable.getOffset()).limit(pageable.getPageSize()); return applySorting(query, pageable.getSort()); }
/** * Binds the parameters to the given query and applies special parameter types (e.g. pagination). * * @param query must not be {@literal null}. * @param values values of method parameters to be assigned to the query parameters. */ Query bindAndPrepare(Query query, Object[] values) { Assert.notNull(query, "Query must not be null!"); ParametersParameterAccessor accessor = new ParametersParameterAccessor(parameters, values); Query result = bind(query, values); if (!useJpaForPaging || !parameters.hasPageableParameter() || accessor.getPageable().isUnpaged()) { return result; } result.setFirstResult((int) accessor.getPageable().getOffset()); result.setMaxResults(accessor.getPageable().getPageSize()); return result; } }
/** * Applies the given {@link Pageable} to the given {@link JPQLQuery}. * * @param pageable * @param query must not be {@literal null}. * @return the Querydsl {@link JPQLQuery}. */ public <T> JPQLQuery<T> applyPagination(Pageable pageable, JPQLQuery<T> query) { if (pageable.isUnpaged()) { return query; } query.offset(pageable.getOffset()); query.limit(pageable.getPageSize()); return applySorting(pageable.getSort(), query); }
@Override public Object execute(Query query) { int overallLimit = query.getLimit(); TerminatingFind<?> matching = operation.matching(query); // Apply raw pagination query.with(pageable); // Adjust limit if page would exceed the overall limit if (overallLimit != 0 && pageable.getOffset() + pageable.getPageSize() > overallLimit) { query.limit((int) (overallLimit - pageable.getOffset())); } return PageableExecutionUtils.getPage(matching.all(), pageable, () -> { long count = matching.count(); return overallLimit != 0 ? Math.min(count, overallLimit) : count; }); } }
@Override public <S extends T> Page<S> findAll(Example<S> example, Pageable pageable) { Assert.notNull(pageable, "Pageable must not be null!"); RedisOperationChain operationChain = createQuery(example); KeyValueQuery<RedisOperationChain> query = new KeyValueQuery<>(operationChain); Iterable<T> result = keyValueTemplate.find( query.orderBy(pageable.getSort()).skip(pageable.getOffset()).limit(pageable.getPageSize()), entityInformation.getJavaType()); long count = operationChain.isEmpty() ? keyValueTemplate.count(entityInformation.getJavaType()) : keyValueTemplate.count(query, entityInformation.getJavaType()); List<S> list = new ArrayList<>(); for (T t : result) { list.add((S) t); } return new PageImpl<>(list, pageable, count); }
@Test public void testDoReadFirstReadNoResults() throws Exception { ArgumentCaptor<PageRequest> pageRequestContainer = ArgumentCaptor.forClass(PageRequest.class); when(repository.findAll(pageRequestContainer.capture())).thenReturn(new PageImpl<>(new ArrayList<>())); assertNull(reader.doRead()); Pageable pageRequest = pageRequestContainer.getValue(); assertEquals(0, pageRequest.getOffset()); assertEquals(0, pageRequest.getPageNumber()); assertEquals(1, pageRequest.getPageSize()); assertEquals("id: ASC", pageRequest.getSort().toString()); }
@Test @SuppressWarnings("serial") public void testDoReadFirstReadExhausted() throws Exception { ArgumentCaptor<PageRequest> pageRequestContainer = ArgumentCaptor.forClass(PageRequest.class); final Object result = new Object(); when(repository.findAll(pageRequestContainer.capture())).thenReturn(new PageImpl<>(new ArrayList<Object>() {{ add(new Object()); }})).thenReturn(new PageImpl<>(new ArrayList<Object>(){{ add(result); }})).thenReturn(new PageImpl<>(new ArrayList<>())); assertFalse(reader.doRead() == result); assertEquals(result, reader.doRead()); assertNull(reader.doRead()); Pageable pageRequest = pageRequestContainer.getValue(); assertEquals(2, pageRequest.getOffset()); assertEquals(2, pageRequest.getPageNumber()); assertEquals(1, pageRequest.getPageSize()); assertEquals("id: ASC", pageRequest.getSort().toString()); }
@Test @SuppressWarnings("serial") public void testJumpToItem() throws Exception { reader.setPageSize(100); ArgumentCaptor<PageRequest> pageRequestContainer = ArgumentCaptor.forClass(PageRequest.class); when(repository.findAll(pageRequestContainer.capture())).thenReturn(new PageImpl<>(new ArrayList<Object>() {{ add(new Object()); }})); reader.jumpToItem(485); Pageable pageRequest = pageRequestContainer.getValue(); assertEquals(400, pageRequest.getOffset()); assertEquals(4, pageRequest.getPageNumber()); assertEquals(100, pageRequest.getPageSize()); assertEquals("id: ASC", pageRequest.getSort().toString()); }
@Test @SuppressWarnings("serial") public void testDoReadFirstReadSecondPage() throws Exception { ArgumentCaptor<PageRequest> pageRequestContainer = ArgumentCaptor.forClass(PageRequest.class); final Object result = new Object(); when(repository.findAll(pageRequestContainer.capture())).thenReturn(new PageImpl<>(new ArrayList<Object>() {{ add(new Object()); }})).thenReturn(new PageImpl<>(new ArrayList<Object>(){{ add(result); }})); assertFalse(reader.doRead() == result); assertEquals(result, reader.doRead()); Pageable pageRequest = pageRequestContainer.getValue(); assertEquals(1, pageRequest.getOffset()); assertEquals(1, pageRequest.getPageNumber()); assertEquals(1, pageRequest.getPageSize()); assertEquals("id: ASC", pageRequest.getSort().toString()); }
@Test @SuppressWarnings("serial") public void testDoReadFirstReadResults() throws Exception { ArgumentCaptor<PageRequest> pageRequestContainer = ArgumentCaptor.forClass(PageRequest.class); final Object result = new Object(); when(repository.findAll(pageRequestContainer.capture())).thenReturn(new PageImpl<>(new ArrayList<Object>(){{ add(result); }})); assertEquals(result, reader.doRead()); Pageable pageRequest = pageRequestContainer.getValue(); assertEquals(0, pageRequest.getOffset()); assertEquals(0, pageRequest.getPageNumber()); assertEquals(1, pageRequest.getPageSize()); assertEquals("id: ASC", pageRequest.getSort().toString()); }
private SearchRequest prepareScroll(Query query, long scrollTimeInMillis) { SearchRequest request = new SearchRequest(toArray(query.getIndices())); SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); request.types(toArray(query.getTypes())); request.scroll(TimeValue.timeValueMillis(scrollTimeInMillis)); if (query.getPageable().isPaged()) { searchSourceBuilder.size(query.getPageable().getPageSize()); } if (!isEmpty(query.getFields())) { searchSourceBuilder.fetchSource(toArray(query.getFields()), null); } request.source(searchSourceBuilder); return request; }
@Test public void testDifferentTypes() throws Exception { TestRepository differentRepository = mock(TestRepository.class); RepositoryItemReader<String> reader = new RepositoryItemReader<>(); sorts = new HashMap<>(); sorts.put("id", Direction.ASC); reader.setRepository(differentRepository); reader.setPageSize(1); reader.setSort(sorts); reader.setMethodName("findFirstNames"); ArgumentCaptor<PageRequest> pageRequestContainer = ArgumentCaptor.forClass(PageRequest.class); when(differentRepository.findFirstNames(pageRequestContainer.capture())).thenReturn(new PageImpl<>(new ArrayList<String>(){{ add("result"); }})); assertEquals("result", reader.doRead()); Pageable pageRequest = pageRequestContainer.getValue(); assertEquals(0, pageRequest.getOffset()); assertEquals(0, pageRequest.getPageNumber()); assertEquals(1, pageRequest.getPageSize()); assertEquals("id: ASC", pageRequest.getSort().toString()); }