From fece3fcd57328657309a426f845c5dfa51f23b54 Mon Sep 17 00:00:00 2001 From: Zhongning Fan Date: Wed, 11 Apr 2018 22:10:11 +0800 Subject: [PATCH] =?UTF-8?q?DATAREDIS-623=20-=20Fix=20RedisQueryEngine.coun?= =?UTF-8?q?t(=E2=80=A6)=20with=20proper=20SINTER/SUNION=20usage.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backport of RedisQueryEngine#count(RedisOperationChain, Serializable) fix using multiple indexed keys. Related ticket: DATAREDIS-605. Original pull request: #330. --- .../data/redis/core/RedisQueryEngine.java | 14 ++++++++------ .../RedisRepositoryIntegrationTestBase.java | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) 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 664769919..c2c002024 100644 --- a/src/main/java/org/springframework/data/redis/core/RedisQueryEngine.java +++ b/src/main/java/org/springframework/data/redis/core/RedisQueryEngine.java @@ -165,14 +165,16 @@ class RedisQueryEngine extends QueryEngine { - String key = keyspace + ":"; - byte[][] keys = new byte[criteria.getSismember().size()][]; - int i = 0; - for (Object o : criteria.getSismember()) { - keys[i] = getAdapter().getConverter().getConversionService().convert(key + o, byte[].class); + long result = 0; + if (!criteria.getOrSismember().isEmpty()) { + result += connection.sUnion(keys(keyspace + ":", criteria.getOrSismember())).size(); } - return (long) connection.sInter(keys).size(); + if (!criteria.getSismember().isEmpty()) { + result += connection.sInter(keys(keyspace + ":", criteria.getSismember())).size(); + } + + return result; }); } 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 b08e46d9d..92e483739 100644 --- a/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTestBase.java +++ b/src/test/java/org/springframework/data/redis/repository/RedisRepositoryIntegrationTestBase.java @@ -347,6 +347,22 @@ public abstract class RedisRepositoryIntegrationTestBase { assertThat(result, not(hasItems(p1))); } + @Test // DATAREDIS-623 + public void pageableQueryWithTwoKeywordsShouldReturnCorrectly() { + + 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.findByFirstnameAndLastname("sansa", "stark", new PageRequest(0, 2)); + + assertThat(page1.getNumberOfElements(), is(1)); + assertThat(page1.getContent(), hasSize(1)); + assertThat(page1.getTotalElements(), is(1L)); + } + public static interface PersonRepository extends PagingAndSortingRepository { List findByFirstname(String firstname); @@ -357,6 +373,8 @@ public abstract class RedisRepositoryIntegrationTestBase { List findByFirstnameAndLastname(String firstname, String lastname); + Page findByFirstnameAndLastname(String firstname, String lastname, Pageable page); + List findByFirstnameOrLastname(String firstname, String lastname); List findFirstBy();