diff --git a/src/main/asciidoc/reference/redis-repositories.adoc b/src/main/asciidoc/reference/redis-repositories.adoc index 3ef6b219c..18010e8b3 100644 --- a/src/main/asciidoc/reference/redis-repositories.adoc +++ b/src/main/asciidoc/reference/redis-repositories.adoc @@ -579,6 +579,7 @@ Here's an overview of the keywords supported for Redis and what a method contain |`And`|`findByLastnameAndFirstname`|`SINTER …:firstname:rand …:lastname:al’thor` |`Or`|`findByLastnameOrFirstname`|`SUNION …:firstname:rand …:lastname:al’thor` |`Is,Equals`|`findByFirstname`,`findByFirstnameIs`,`findByFirstnameEquals`|`SINTER …:firstname:rand` +|`Top,First`|`findFirst10ByFirstname`,`findTop5ByFirstname`| |=============== ==== diff --git a/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java b/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java index d75c567f0..292acc99f 100644 --- a/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java +++ b/src/main/java/org/springframework/data/redis/core/RedisKeyValueAdapter.java @@ -18,6 +18,7 @@ package org.springframework.data.redis.core; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -364,6 +365,11 @@ public class RedisKeyValueAdapter extends AbstractKeyValueAdapter List keys = new ArrayList(ids); + + if (keys.isEmpty() || keys.size() < offset) { + return Collections.emptyList(); + } + offset = Math.max(0, offset); if (offset >= 0 && rows > 0) { keys = keys.subList(offset, Math.min(offset + rows, keys.size())); diff --git a/src/main/java/org/springframework/data/redis/core/RedisQueryEngine.java b/src/main/java/org/springframework/data/redis/core/RedisQueryEngine.java index 542cf0e96..60f4e7b79 100644 --- a/src/main/java/org/springframework/data/redis/core/RedisQueryEngine.java +++ b/src/main/java/org/springframework/data/redis/core/RedisQueryEngine.java @@ -102,7 +102,7 @@ class RedisQueryEngine extends QueryEngine> rawData = new LinkedHashMap>(); - if (allKeys.size() == 0 || allKeys.size() < offset) { + if (allKeys.isEmpty() || allKeys.size() < offset) { return Collections.emptyMap(); } diff --git a/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTestBase.java b/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTestBase.java index e861318f9..c8458e95f 100644 --- a/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTestBase.java +++ b/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTestBase.java @@ -47,6 +47,7 @@ import org.springframework.data.repository.PagingAndSortingRepository; * Base for testing Redis repository support in different configurations. * * @author Christoph Strobl + * @author Mark Paluch */ public abstract class RedisRepositoryIntegrationTestBase { @@ -217,8 +218,49 @@ public abstract class RedisRepositoryIntegrationTestBase { repo.save(Arrays.asList(eddard, robb, jon)); Page firstPage = repo.findAll(new PageRequest(0, 2)); - assertThat(firstPage.getContent(), hasSize(2)); - assertThat(repo.findAll(firstPage.nextPageable()).getContent(), hasSize(1)); + assertThat(firstPage.getContent(), hasSize(2)); + assertThat(repo.findAll(firstPage.nextPageable()).getContent(), hasSize(1)); + } + + /** + * @see DATAREDIS-547 + */ + @Test + public void shouldReturnEmptyListWhenPageableOutOfBoundsUsingFindAll() { + + Person eddard = new Person("eddard", "stark"); + Person robb = new Person("robb", "stark"); + Person jon = new Person("jon", "snow"); + + repo.save(Arrays.asList(eddard, robb, jon)); + + Page firstPage = repo.findAll(new PageRequest(100, 2)); + assertThat(firstPage.getContent(), hasSize(0)); + } + + /** + * @see DATAREDIS-547 + */ + @Test + public void shouldReturnEmptyListWhenPageableOutOfBoundsUsingQueryMethod() { + + Person eddard = new Person("eddard", "stark"); + Person robb = new Person("robb", "stark"); + Person sansa = new Person("sansa", "stark"); + + repo.save(Arrays.asList(eddard, robb, sansa)); + + Page page1 = repo.findPersonByLastname("stark", new PageRequest(1, 3)); + + assertThat(page1.getNumberOfElements(), is(0)); + assertThat(page1.getContent(), hasSize(0)); + assertThat(page1.getTotalElements(), is(3L)); + + Page page2 = repo.findPersonByLastname("stark", new PageRequest(2, 3)); + + assertThat(page2.getNumberOfElements(), is(0)); + assertThat(page2.getContent(), hasSize(0)); + assertThat(page2.getTotalElements(), is(3L)); } /**