private <T> ResultIterator<T> forFetchLimit(ResultIterator<T> iterator, SelectTranslator translator) { // wrap iterator in a fetch limit checker ... there are a few cases when // in-memory fetch limit is a noop, however in a general case this is // needed, as the SQL result count does not directly correspond to the // number of objects returned from Cayenne. int fetchLimit = query.getFetchLimit(); int offset = translator.isSuppressingDistinct() ? query.getFetchOffset() : getInMemoryOffset(query .getFetchOffset()); if (fetchLimit > 0 || offset > 0) { return new LimitResultIterator<>(iterator, offset, fetchLimit); } else { return iterator; } }
if (query.getFetchOffset() > 0 || query.getFetchLimit() > 0) { key.append('/'); if (query.getFetchOffset() > 0) { key.append('o').append(query.getFetchOffset());
@Test public void testBuildQuery_Pagination() { ResourceEntity<E1> resourceEntity = new ResourceEntity<>(getAgEntity(E1.class)); resourceEntity.setFetchLimit(10); resourceEntity.setFetchOffset(0); SelectContext<E1> c = new SelectContext<E1>(E1.class); c.setEntity(resourceEntity); SelectQuery<E1> q1 = makeQueryStage.buildQuery(c); assertEquals("Pagination in the query for paginated request is expected", 10, q1.getPageSize()); assertEquals(0, q1.getFetchOffset()); assertEquals(0, q1.getFetchLimit()); resourceEntity.setFetchLimit(0); resourceEntity.setFetchOffset(0); SelectQuery<E1> q2 = makeQueryStage.buildQuery(c); assertEquals(0, q2.getPageSize()); assertEquals(0, q2.getFetchOffset()); assertEquals(0, q2.getFetchLimit()); resourceEntity.setFetchLimit(0); resourceEntity.setFetchOffset(5); SelectQuery<E1> q3 = makeQueryStage.buildQuery(c); assertEquals(0, q3.getPageSize()); assertEquals(0, q3.getFetchOffset()); assertEquals(0, q3.getFetchLimit()); }