diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisOperations.java index 33535714e..a95cb1bd4 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisOperations.java @@ -22,7 +22,8 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import org.springframework.data.keyvalue.redis.connection.DataType; -import org.springframework.data.keyvalue.redis.connection.SortParameters; +import org.springframework.data.keyvalue.redis.core.query.SortQuery; +import org.springframework.data.keyvalue.redis.serializer.RedisSerializer; /** @@ -102,10 +103,6 @@ public interface RedisOperations { Object exec(); - List sort(K key, SortParameters params); - - Long sort(K key, SortParameters params, K destination); - // pubsub functionality on the template void convertAndSend(String destination, Object message); @@ -191,4 +188,16 @@ public interface RedisOperations { * @return hash operations bound to the given key. */ BoundHashOperations boundHashOps(K key); + + + List sort(SortQuery query); + + + List sort(SortQuery query, RedisSerializer resultSerializer); + + + List sort(SortQuery query, BulkMapper bulkMapper); + + + Long sort(SortQuery query, K storeKey); } \ No newline at end of file diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java index 8f9f7ec77..2ddfab695 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/RedisTemplate.java @@ -423,15 +423,16 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation @SuppressWarnings("unchecked") private > T deserializeValues(Collection rawValues, Class type) { - return deserializeValues(rawValues, type, valueSerializer); + return (T) deserializeValues(rawValues, type, valueSerializer); } - private > T deserializeValues(Collection rawValues, Class type, RedisSerializer redisSerializer) { - Collection values = (List.class.isAssignableFrom(type) ? new ArrayList(rawValues.size()) - : new LinkedHashSet(rawValues.size())); + @SuppressWarnings("unchecked") + private > T deserializeValues(Collection rawValues, Class type, RedisSerializer redisSerializer) { + Collection values = (List.class.isAssignableFrom(type) ? new ArrayList(rawValues.size()) + : new LinkedHashSet(rawValues.size())); for (byte[] bs : rawValues) { if (bs != null) { - values.add((X) redisSerializer.deserialize(bs)); + values.add(redisSerializer.deserialize(bs)); } } @@ -625,33 +626,6 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation }, true); } - @Override - public List sort(K key, final SortParameters params) { - final byte[] rawKey = rawKey(key); - - List rawValues = execute(new RedisCallback>() { - @Override - public List doInRedis(RedisConnection connection) { - return connection.sort(rawKey, params); - } - }, true); - - return deserializeValues(rawValues, List.class); - } - - @Override - public Long sort(K key, final SortParameters params, K destination) { - final byte[] rawKey = rawKey(key); - final byte[] rawDestKey = rawKey(destination); - - return execute(new RedisCallback() { - @Override - public Long doInRedis(RedisConnection connection) { - return connection.sort(rawKey, params, rawDestKey); - } - }, true); - } - @Override public void convertAndSend(String channel, Object message) { Assert.hasText(channel, "a non-empty channel is required"); @@ -1955,11 +1929,13 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation // Sort operations @SuppressWarnings("unchecked") + @Override public List sort(SortQuery query) { return sort(query, valueSerializer); } @SuppressWarnings("unchecked") + @Override public List sort(SortQuery query, RedisSerializer resultSerializer) { final byte[] rawKey = rawKey(query.getKey()); final SortParameters params = convertQuery(query, stringSerializer); @@ -1974,6 +1950,7 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation return (List) deserializeValues(vals, List.class, resultSerializer); } + @Override public List sort(SortQuery query, BulkMapper bulkMapper) { final byte[] rawKey = rawKey(query.getKey()); final SortParameters params = convertQuery(query, stringSerializer); @@ -2002,16 +1979,16 @@ public class RedisTemplate extends RedisAccessor implements RedisOperation return result; } - public void sort(SortQuery query, K storeKey) { + @Override + public Long sort(SortQuery query, K storeKey) { final byte[] rawStoreKey = rawKey(storeKey); final byte[] rawKey = rawKey(query.getKey()); final SortParameters params = convertQuery(query, stringSerializer); - execute(new RedisCallback() { + return execute(new RedisCallback() { @Override - public Object doInRedis(RedisConnection connection) throws DataAccessException { - connection.sort(rawKey, params, rawStoreKey); - return null; + public Long doInRedis(RedisConnection connection) throws DataAccessException { + return connection.sort(rawKey, params, rawStoreKey); } }, true); } diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortCriterion.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortCriterion.java index 962631b3f..242a7af6e 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortCriterion.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/DefaultSortCriterion.java @@ -22,6 +22,8 @@ import org.springframework.data.keyvalue.redis.connection.SortParameters.Order; import org.springframework.data.keyvalue.redis.connection.SortParameters.Range; /** + * Default implementation for {@link SortCriterion}. + * * @author Costin Leau */ class DefaultSortCriterion implements SortCriterion { diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortCriterion.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortCriterion.java index ef21918a5..50929b04d 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortCriterion.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortCriterion.java @@ -19,6 +19,8 @@ import org.springframework.data.keyvalue.redis.connection.SortParameters.Order; import org.springframework.data.keyvalue.redis.connection.SortParameters.Range; /** + * Internal interface part of the Sort DSL. Exposes generic operations. + * * @author Costin Leau */ public interface SortCriterion { diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQuery.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQuery.java index ff31bce5c..27643c962 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQuery.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQuery.java @@ -17,10 +17,16 @@ package org.springframework.data.keyvalue.redis.core.query; import java.util.List; +import org.springframework.data.keyvalue.redis.connection.RedisConnection; +import org.springframework.data.keyvalue.redis.connection.SortParameters; import org.springframework.data.keyvalue.redis.connection.SortParameters.Order; import org.springframework.data.keyvalue.redis.connection.SortParameters.Range; +import org.springframework.data.keyvalue.redis.core.RedisTemplate; /** + * High-level abstraction over a Redis SORT (generified equivalent of {@link SortParameters}). To be used with {@link RedisTemplate} + * (just as {@link SortParameters} is used by {@link RedisConnection}). + * * @author Costin Leau */ public interface SortQuery { diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQueryBuilder.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQueryBuilder.java index 5c4969e08..588d80694 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQueryBuilder.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/query/SortQueryBuilder.java @@ -17,14 +17,14 @@ package org.springframework.data.keyvalue.redis.core.query; /** - * Builder class for constructing {@link SortQuery}. + * Simple builder class for constructing {@link SortQuery}. * * @author Costin Leau */ public class SortQueryBuilder extends DefaultSortCriterion { private static final String NO_SORT_KEY = "~"; - + private SortQueryBuilder(K key) { super(key); }