DATAREDIS-623 - Fix RedisQueryEngine.count(…) with proper SINTER/SUNION usage.
Backport of RedisQueryEngine#count(RedisOperationChain, Serializable) fix using multiple indexed keys. Related ticket: DATAREDIS-605. Original pull request: #330.
This commit is contained in:
committed by
Mark Paluch
parent
c6540ec387
commit
f61b0d6fad
@@ -175,14 +175,17 @@ class RedisQueryEngine extends QueryEngine<RedisKeyValueAdapter, RedisOperationC
|
||||
@Override
|
||||
public Long doInRedis(RedisConnection connection) throws DataAccessException {
|
||||
|
||||
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;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -345,6 +345,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<Person> 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<Person, String> {
|
||||
|
||||
List<Person> findByFirstname(String firstname);
|
||||
@@ -355,6 +371,8 @@ public abstract class RedisRepositoryIntegrationTestBase {
|
||||
|
||||
List<Person> findByFirstnameAndLastname(String firstname, String lastname);
|
||||
|
||||
Page<Person> findByFirstnameAndLastname(String firstname, String lastname, Pageable page);
|
||||
|
||||
List<Person> findByFirstnameOrLastname(String firstname, String lastname);
|
||||
|
||||
List<Person> findFirstBy();
|
||||
|
||||
Reference in New Issue
Block a user