From 96d7902c69c1a247db5e3fc641bda45f0590e5a6 Mon Sep 17 00:00:00 2001 From: Costin Leau Date: Fri, 24 Jun 2011 15:01:08 +0300 Subject: [PATCH] DATAKV-72 + add missing rangeWithScores and reverserRangeWithScores ops for ZSets --- .../DefaultStringRedisConnection.java | 48 ++++-- .../redis/connection/RedisZSetCommands.java | 22 ++- .../connection/StringRedisConnection.java | 8 +- .../connection/jedis/JedisConnection.java | 79 ++++++++-- .../connection/jredis/JredisConnection.java | 29 +++- .../redis/connection/rjc/RjcConnection.java | 148 +++++++++++++----- .../redis/core/AbstractOperations.java | 12 ++ .../redis/core/BoundZSetOperations.java | 12 ++ .../core/DefaultBoundZSetOperations.java | 26 +++ .../redis/core/DefaultTypedTuple.java | 50 ++++++ .../redis/core/DefaultZSetOperations.java | 104 ++++++++++-- .../keyvalue/redis/core/ZSetOperations.java | 23 ++- .../support/collections/CollectionUtils.java | 1 + .../support/collections/DefaultRedisZSet.java | 26 +++ .../RedisCollectionFactoryBean.java | 1 + .../redis/support/collections/RedisZSet.java | 12 ++ 16 files changed, 504 insertions(+), 97 deletions(-) create mode 100644 spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultTypedTuple.java diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/DefaultStringRedisConnection.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/DefaultStringRedisConnection.java index 04484b29f..61b973ed3 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/DefaultStringRedisConnection.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/DefaultStringRedisConnection.java @@ -516,16 +516,32 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return delegate.zRangeByScore(key, min, max); } - public Set zRangeByScoreWithScore(byte[] key, double min, double max, long offset, long count) { - return delegate.zRangeByScoreWithScore(key, min, max, offset, count); + public Set zRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) { + return delegate.zRangeByScoreWithScores(key, min, max, offset, count); } - public Set zRangeByScoreWithScore(byte[] key, double min, double max) { - return delegate.zRangeByScoreWithScore(key, min, max); + public Set zRangeByScoreWithScores(byte[] key, double min, double max) { + return delegate.zRangeByScoreWithScores(key, min, max); } - public Set zRangeWithScore(byte[] key, long start, long end) { - return delegate.zRangeWithScore(key, start, end); + public Set zRangeWithScores(byte[] key, long start, long end) { + return delegate.zRangeWithScores(key, start, end); + } + + public Set zRevRangeByScore(byte[] key, double min, double max, long offset, long count) { + return delegate.zRevRangeByScore(key, min, max, offset, count); + } + + public Set zRevRangeByScore(byte[] key, double min, double max) { + return delegate.zRevRangeByScore(key, min, max); + } + + public Set zRevRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) { + return delegate.zRevRangeByScoreWithScores(key, min, max, offset, count); + } + + public Set zRevRangeByScoreWithScores(byte[] key, double min, double max) { + return delegate.zRevRangeByScoreWithScores(key, min, max); } public Long zRank(byte[] key, byte[] value) { @@ -548,8 +564,8 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return delegate.zRevRange(key, start, end); } - public Set zRevRangeWithScore(byte[] key, long start, long end) { - return delegate.zRevRangeWithScore(key, start, end); + public Set zRevRangeWithScores(byte[] key, long start, long end) { + return delegate.zRevRangeWithScores(key, start, end); } public Long zRevRank(byte[] key, byte[] value) { @@ -1058,18 +1074,18 @@ public class DefaultStringRedisConnection implements StringRedisConnection { } @Override - public Set zRangeByScoreWithScore(String key, double min, double max, long offset, long count) { - return deserializeTuple(delegate.zRangeByScoreWithScore(serialize(key), min, max, offset, count)); + public Set zRangeByScoreWithScores(String key, double min, double max, long offset, long count) { + return deserializeTuple(delegate.zRangeByScoreWithScores(serialize(key), min, max, offset, count)); } @Override - public Set zRangeByScoreWithScore(String key, double min, double max) { - return deserializeTuple(delegate.zRangeByScoreWithScore(serialize(key), min, max)); + public Set zRangeByScoreWithScores(String key, double min, double max) { + return deserializeTuple(delegate.zRangeByScoreWithScores(serialize(key), min, max)); } @Override - public Set zRangeWithScore(String key, long start, long end) { - return deserializeTuple(delegate.zRangeWithScore(serialize(key), start, end)); + public Set zRangeWithScores(String key, long start, long end) { + return deserializeTuple(delegate.zRangeWithScores(serialize(key), start, end)); } @Override @@ -1098,8 +1114,8 @@ public class DefaultStringRedisConnection implements StringRedisConnection { } @Override - public Set zRevRangeWithScore(String key, long start, long end) { - return deserializeTuple(delegate.zRevRangeWithScore(serialize(key), start, end)); + public Set zRevRangeWithScores(String key, long start, long end) { + return deserializeTuple(delegate.zRevRangeWithScores(serialize(key), start, end)); } @Override diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/RedisZSetCommands.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/RedisZSetCommands.java index eacc7de72..ff6073b8c 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/RedisZSetCommands.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/RedisZSetCommands.java @@ -54,19 +54,27 @@ public interface RedisZSetCommands { Set zRange(byte[] key, long begin, long end); - Set zRangeWithScore(byte[] key, long begin, long end); - - Set zRevRange(byte[] key, long begin, long end); - - Set zRevRangeWithScore(byte[] key, long begin, long end); + Set zRangeWithScores(byte[] key, long begin, long end); Set zRangeByScore(byte[] key, double min, double max); - Set zRangeByScoreWithScore(byte[] key, double min, double max); + Set zRangeByScoreWithScores(byte[] key, double min, double max); Set zRangeByScore(byte[] key, double min, double max, long offset, long count); - Set zRangeByScoreWithScore(byte[] key, double min, double max, long offset, long count); + Set zRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count); + + Set zRevRange(byte[] key, long begin, long end); + + Set zRevRangeWithScores(byte[] key, long begin, long end); + + Set zRevRangeByScore(byte[] key, double min, double max); + + Set zRevRangeByScoreWithScores(byte[] key, double min, double max); + + Set zRevRangeByScore(byte[] key, double min, double max, long offset, long count); + + Set zRevRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count); Long zCount(byte[] key, double min, double max); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/StringRedisConnection.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/StringRedisConnection.java index 28886d595..fc7c170aa 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/StringRedisConnection.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/StringRedisConnection.java @@ -181,19 +181,19 @@ public interface StringRedisConnection extends RedisConnection { Set zRange(String key, long start, long end); - Set zRangeWithScore(String key, long start, long end); + Set zRangeWithScores(String key, long start, long end); Set zRevRange(String key, long start, long end); - Set zRevRangeWithScore(String key, long start, long end); + Set zRevRangeWithScores(String key, long start, long end); Set zRangeByScore(String key, double min, double max); - Set zRangeByScoreWithScore(String key, double min, double max); + Set zRangeByScoreWithScores(String key, double min, double max); Set zRangeByScore(String key, double min, double max, long offset, long count); - Set zRangeByScoreWithScore(String key, double min, double max, long offset, long count); + Set zRangeByScoreWithScores(String key, double min, double max, long offset, long count); Long zCount(String key, double min, double max); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java index 0d751765a..b55ea93ba 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jedis/JedisConnection.java @@ -1740,7 +1740,7 @@ public class JedisConnection implements RedisConnection { } @Override - public Set zRangeWithScore(byte[] key, long start, long end) { + public Set zRangeWithScores(byte[] key, long start, long end) { try { if (isQueueing()) { transaction.zrangeWithScores(key, (int) start, (int) end); @@ -1773,7 +1773,7 @@ public class JedisConnection implements RedisConnection { } @Override - public Set zRangeByScoreWithScore(byte[] key, double min, double max) { + public Set zRangeByScoreWithScores(byte[] key, double min, double max) { try { if (isQueueing()) { throw new UnsupportedOperationException(); @@ -1789,16 +1789,17 @@ public class JedisConnection implements RedisConnection { } @Override - public Set zRevRangeWithScore(byte[] key, long start, long end) { + public Set zRevRangeWithScores(byte[] key, long start, long end) { try { if (isQueueing()) { - throw new UnsupportedOperationException(); - } - if (isPipelined()) { - pipeline.zrangeByScoreWithScores(key, (int) start, (int) end); + transaction.zrevrangeWithScores(key, (int) start, (int) end); return null; } - return JedisUtils.convertJedisTuple(jedis.zrangeByScoreWithScores(key, (int) start, (int) end)); + if (isPipelined()) { + pipeline.zrevrangeWithScores(key, (int) start, (int) end); + return null; + } + return JedisUtils.convertJedisTuple(jedis.zrevrangeWithScores(key, (int) start, (int) end)); } catch (Exception ex) { throw convertJedisAccessException(ex); } @@ -1821,7 +1822,7 @@ public class JedisConnection implements RedisConnection { } @Override - public Set zRangeByScoreWithScore(byte[] key, double min, double max, long offset, long count) { + public Set zRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) { try { if (isQueueing()) { throw new UnsupportedOperationException(); @@ -1836,6 +1837,66 @@ public class JedisConnection implements RedisConnection { } } + @Override + public Set zRevRangeByScore(byte[] key, double min, double max, long offset, long count) { + try { + if (isQueueing()) { + throw new UnsupportedOperationException(); + } + if (isPipelined()) { + throw new UnsupportedOperationException(); + } + throw new UnsupportedOperationException(); + } catch (Exception ex) { + throw convertJedisAccessException(ex); + } + } + + @Override + public Set zRevRangeByScore(byte[] key, double min, double max) { + try { + if (isQueueing()) { + throw new UnsupportedOperationException(); + } + if (isPipelined()) { + throw new UnsupportedOperationException(); + } + throw new UnsupportedOperationException(); + } catch (Exception ex) { + throw convertJedisAccessException(ex); + } + } + + @Override + public Set zRevRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) { + try { + if (isQueueing()) { + throw new UnsupportedOperationException(); + } + if (isPipelined()) { + throw new UnsupportedOperationException(); + } + throw new UnsupportedOperationException(); + } catch (Exception ex) { + throw convertJedisAccessException(ex); + } + } + + @Override + public Set zRevRangeByScoreWithScores(byte[] key, double min, double max) { + try { + if (isQueueing()) { + throw new UnsupportedOperationException(); + } + if (isPipelined()) { + throw new UnsupportedOperationException(); + } + throw new UnsupportedOperationException(); + } catch (Exception ex) { + throw convertJedisAccessException(ex); + } + } + @Override public Long zRank(byte[] key, byte[] value) { try { diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnection.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnection.java index ada3441e1..00433eee2 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnection.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/jredis/JredisConnection.java @@ -886,9 +886,8 @@ public class JredisConnection implements RedisConnection { } @Override - public Set zRangeWithScore(byte[] key, long start, long end) { + public Set zRangeWithScores(byte[] key, long start, long end) { throw new UnsupportedOperationException(); - } @Override @@ -901,7 +900,7 @@ public class JredisConnection implements RedisConnection { } @Override - public Set zRangeByScoreWithScore(byte[] key, double min, double max) { + public Set zRangeByScoreWithScores(byte[] key, double min, double max) { throw new UnsupportedOperationException(); } @@ -911,7 +910,27 @@ public class JredisConnection implements RedisConnection { } @Override - public Set zRangeByScoreWithScore(byte[] key, double min, double max, long offset, long count) { + public Set zRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) { + throw new UnsupportedOperationException(); + } + + @Override + public Set zRevRangeByScore(byte[] key, double min, double max, long offset, long count) { + throw new UnsupportedOperationException(); + } + + @Override + public Set zRevRangeByScore(byte[] key, double min, double max) { + throw new UnsupportedOperationException(); + } + + @Override + public Set zRevRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) { + throw new UnsupportedOperationException(); + } + + @Override + public Set zRevRangeByScoreWithScores(byte[] key, double min, double max) { throw new UnsupportedOperationException(); } @@ -961,7 +980,7 @@ public class JredisConnection implements RedisConnection { } @Override - public Set zRevRangeWithScore(byte[] key, long start, long end) { + public Set zRevRangeWithScores(byte[] key, long start, long end) { throw new UnsupportedOperationException(); } diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/rjc/RjcConnection.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/rjc/RjcConnection.java index 5b9c739a1..1176fc57d 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/rjc/RjcConnection.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/connection/rjc/RjcConnection.java @@ -1547,7 +1547,7 @@ public class RjcConnection implements RedisConnection { } @Override - public Set zRangeWithScore(byte[] key, long start, long end) { + public Set zRangeWithScores(byte[] key, long start, long end) { String stringKey = RjcUtils.decode(key); try { @@ -1578,41 +1578,6 @@ public class RjcConnection implements RedisConnection { } } - @Override - public Set zRangeByScoreWithScore(byte[] key, double min, double max) { - String stringKey = RjcUtils.decode(key); - String minString = Double.toString(min); - String maxString = Double.toString(max); - - try { - if (isPipelined()) { - pipeline.zrangeByScoreWithScores(stringKey, minString, maxString); - return null; - } - return RjcUtils.convertElementScore(session.zrangeByScoreWithScores(stringKey, minString, maxString)); - } catch (Exception ex) { - throw convertRjcAccessException(ex); - } - } - - @Override - public Set zRevRangeWithScore(byte[] key, long start, long end) { - String stringKey = RjcUtils.decode(key); - String minString = Long.toString(start); - String maxString = Long.toString(end); - - try { - - if (isPipelined()) { - pipeline.zrangeByScoreWithScores(stringKey, minString, maxString); - return null; - } - return RjcUtils.convertElementScore(session.zrangeByScoreWithScores(stringKey, minString, maxString)); - } catch (Exception ex) { - throw convertRjcAccessException(ex); - } - } - @Override public Set zRangeByScore(byte[] key, double min, double max, long offset, long count) { String stringKey = RjcUtils.decode(key); @@ -1631,8 +1596,79 @@ public class RjcConnection implements RedisConnection { } } + @Override - public Set zRangeByScoreWithScore(byte[] key, double min, double max, long offset, long count) { + public Set zRevRangeByScore(byte[] key, double min, double max, long offset, long count) { + String stringKey = RjcUtils.decode(key); + String minString = Double.toString(min); + String maxString = Double.toString(max); + + try { + if (isPipelined()) { + pipeline.zrevrangeByScore(stringKey, minString, maxString, (int) offset, (int) count); + return null; + } + return RjcUtils.convertToSet(session.zrevrangeByScore(stringKey, minString, maxString, (int) offset, + (int) count)); + } catch (Exception ex) { + throw convertRjcAccessException(ex); + } + } + + @Override + public Set zRevRangeByScore(byte[] key, double min, double max) { + String stringKey = RjcUtils.decode(key); + String minString = Double.toString(min); + String maxString = Double.toString(max); + + try { + if (isPipelined()) { + pipeline.zrevrangeByScore(stringKey, minString, maxString); + return null; + } + return RjcUtils.convertToSet(session.zrevrangeByScore(stringKey, minString, maxString)); + } catch (Exception ex) { + throw convertRjcAccessException(ex); + } + } + + @Override + public Set zRangeByScoreWithScores(byte[] key, double min, double max) { + String stringKey = RjcUtils.decode(key); + String minString = Double.toString(min); + String maxString = Double.toString(max); + + try { + if (isPipelined()) { + pipeline.zrangeByScoreWithScores(stringKey, minString, maxString); + return null; + } + return RjcUtils.convertElementScore(session.zrangeByScoreWithScores(stringKey, minString, maxString)); + } catch (Exception ex) { + throw convertRjcAccessException(ex); + } + } + + @Override + public Set zRevRangeWithScores(byte[] key, long start, long end) { + String stringKey = RjcUtils.decode(key); + String minString = Long.toString(start); + String maxString = Long.toString(end); + + try { + + if (isPipelined()) { + pipeline.zrevrangeByScoreWithScores(stringKey, minString, maxString); + return null; + } + return RjcUtils.convertElementScore(session.zrevrangeByScoreWithScores(stringKey, minString, maxString)); + } catch (Exception ex) { + throw convertRjcAccessException(ex); + } + } + + @Override + public Set zRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) { String stringKey = RjcUtils.decode(key); String minString = Double.toString(min); String maxString = Double.toString(max); @@ -1649,6 +1685,44 @@ public class RjcConnection implements RedisConnection { } } + + @Override + public Set zRevRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) { + String stringKey = RjcUtils.decode(key); + String minString = Double.toString(min); + String maxString = Double.toString(max); + + try { + + if (isPipelined()) { + pipeline.zrevrangeByScoreWithScores(stringKey, minString, maxString, (int) offset, (int) count); + return null; + } + return RjcUtils.convertElementScore(session.zrevrangeByScoreWithScores(stringKey, minString, maxString, + (int) offset, (int) count)); + } catch (Exception ex) { + throw convertRjcAccessException(ex); + } + } + + @Override + public Set zRevRangeByScoreWithScores(byte[] key, double min, double max) { + String stringKey = RjcUtils.decode(key); + String minString = Double.toString(min); + String maxString = Double.toString(max); + + try { + + if (isPipelined()) { + pipeline.zrevrangeByScoreWithScores(stringKey, minString, maxString); + return null; + } + return RjcUtils.convertElementScore(session.zrevrangeByScoreWithScores(stringKey, minString, maxString)); + } catch (Exception ex) { + throw convertRjcAccessException(ex); + } + } + @Override public Long zRank(byte[] key, byte[] value) { String stringKey = RjcUtils.decode(key); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/AbstractOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/AbstractOperations.java index ccaeedfe4..1b15b4747 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/AbstractOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/AbstractOperations.java @@ -17,11 +17,14 @@ package org.springframework.data.keyvalue.redis.core; import java.util.Collection; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.springframework.data.keyvalue.redis.connection.RedisConnection; +import org.springframework.data.keyvalue.redis.connection.RedisZSetCommands.Tuple; +import org.springframework.data.keyvalue.redis.core.ZSetOperations.TypedTuple; import org.springframework.data.keyvalue.redis.serializer.RedisSerializer; import org.springframework.data.keyvalue.redis.serializer.SerializationUtils; import org.springframework.util.Assert; @@ -136,6 +139,15 @@ abstract class AbstractOperations { return SerializationUtils.deserialize(rawValues, valueSerializer); } + @SuppressWarnings("unchecked") + Set> deserializeTupleValues(Set rawValues) { + Set> set = new LinkedHashSet>(rawValues.size()); + for (Tuple rawValue : rawValues) { + set.add(new DefaultTypedTuple(valueSerializer.deserialize(rawValue.getValue()), rawValue.getScore())); + } + return set; + } + @SuppressWarnings("unchecked") List deserializeValues(List rawValues) { return SerializationUtils.deserialize(rawValues, valueSerializer); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundZSetOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundZSetOperations.java index 2ba5783d4..162e9dd51 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundZSetOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/BoundZSetOperations.java @@ -19,6 +19,8 @@ package org.springframework.data.keyvalue.redis.core; import java.util.Collection; import java.util.Set; +import org.springframework.data.keyvalue.redis.core.ZSetOperations.TypedTuple; + /** * ZSet (or SortedSet) operations bound to a certain key. @@ -39,6 +41,16 @@ public interface BoundZSetOperations extends BoundKeyOperations { Set reverseRange(long start, long end); + Set reverseRangeByScore(double min, double max); + + Set> rangeWithScores(long start, long end); + + Set> rangeByScoreWithScores(double min, double max); + + Set> reverseRangeWithScores(long start, long end); + + Set> reverseRangeByScoreWithScores(double min, double max); + void removeRange(long start, long end); void removeRangeByScore(double min, double max); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundZSetOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundZSetOperations.java index 71590d863..60f847bc5 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundZSetOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultBoundZSetOperations.java @@ -20,6 +20,7 @@ import java.util.Collection; import java.util.Set; import org.springframework.data.keyvalue.redis.connection.DataType; +import org.springframework.data.keyvalue.redis.core.ZSetOperations.TypedTuple; /** * Default implementation for {@link BoundZSetOperations}. @@ -76,6 +77,31 @@ class DefaultBoundZSetOperations extends DefaultBoundKeyOperations impl return ops.rangeByScore(getKey(), min, max); } + @Override + public Set> rangeByScoreWithScores(double min, double max) { + return ops.rangeByScoreWithScores(getKey(), min, max); + } + + @Override + public Set> rangeWithScores(long start, long end) { + return ops.rangeWithScores(getKey(), start, end); + } + + @Override + public Set reverseRangeByScore(double min, double max) { + return ops.reverseRangeByScore(getKey(), min, max); + } + + @Override + public Set> reverseRangeByScoreWithScores(double min, double max) { + return ops.reverseRangeByScoreWithScores(getKey(), min, max); + } + + @Override + public Set> reverseRangeWithScores(long start, long end) { + return ops.reverseRangeWithScores(getKey(), start, end); + } + @Override public Long rank(Object o) { return ops.rank(getKey(), o); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultTypedTuple.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultTypedTuple.java new file mode 100644 index 000000000..fc23e6d79 --- /dev/null +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultTypedTuple.java @@ -0,0 +1,50 @@ +/* + * Copyright 2011 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.keyvalue.redis.core; + +import org.springframework.data.keyvalue.redis.core.ZSetOperations.TypedTuple; + +/** + * Default implementation of TypedTuple. + * + * @author Costin Leau + */ +class DefaultTypedTuple implements TypedTuple { + + private final Double score; + private final V value; + + /** + * Constructs a new DefaultTypedTuple instance. + * + * @param value + * @param score + */ + public DefaultTypedTuple(V value, Double score) { + this.score = score; + this.value = value; + } + + @Override + public Double getScore() { + return score; + } + + @Override + public V getValue() { + return value; + } +} diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultZSetOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultZSetOperations.java index 154163fe7..c0198d010 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultZSetOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/DefaultZSetOperations.java @@ -20,6 +20,7 @@ import java.util.Collections; import java.util.Set; import org.springframework.data.keyvalue.redis.connection.RedisConnection; +import org.springframework.data.keyvalue.redis.connection.RedisZSetCommands.Tuple; /** * Default implementation of {@link ZSetOperations}. @@ -76,7 +77,6 @@ class DefaultZSetOperations extends AbstractOperations implements ZS }, true); } - @SuppressWarnings("unchecked") @Override public Set range(K key, final long start, final long end) { final byte[] rawKey = rawKey(key); @@ -91,7 +91,48 @@ class DefaultZSetOperations extends AbstractOperations implements ZS return deserializeValues(rawValues); } - @SuppressWarnings("unchecked") + @Override + public Set reverseRange(K key, final long start, final long end) { + final byte[] rawKey = rawKey(key); + + Set rawValues = execute(new RedisCallback>() { + @Override + public Set doInRedis(RedisConnection connection) { + return connection.zRevRange(rawKey, start, end); + } + }, true); + + return deserializeValues(rawValues); + } + + @Override + public Set> rangeWithScores(K key, final long start, final long end) { + final byte[] rawKey = rawKey(key); + + Set rawValues = execute(new RedisCallback>() { + @Override + public Set doInRedis(RedisConnection connection) { + return connection.zRangeWithScores(rawKey, start, end); + } + }, true); + + return deserializeTupleValues(rawValues); + } + + @Override + public Set> reverseRangeWithScores(K key, final long start, final long end) { + final byte[] rawKey = rawKey(key); + + Set rawValues = execute(new RedisCallback>() { + @Override + public Set doInRedis(RedisConnection connection) { + return connection.zRevRangeWithScores(rawKey, start, end); + } + }, true); + + return deserializeTupleValues(rawValues); + } + @Override public Set rangeByScore(K key, final double min, final double max) { final byte[] rawKey = rawKey(key); @@ -106,6 +147,50 @@ class DefaultZSetOperations extends AbstractOperations implements ZS return deserializeValues(rawValues); } + + @Override + public Set reverseRangeByScore(K key, final double min, final double max) { + final byte[] rawKey = rawKey(key); + + Set rawValues = execute(new RedisCallback>() { + @Override + public Set doInRedis(RedisConnection connection) { + return connection.zRevRangeByScore(rawKey, min, max); + } + }, true); + + return deserializeValues(rawValues); + } + + @Override + public Set> rangeByScoreWithScores(K key, final double min, final double max) { + final byte[] rawKey = rawKey(key); + + Set rawValues = execute(new RedisCallback>() { + @Override + public Set doInRedis(RedisConnection connection) { + return connection.zRangeByScoreWithScores(rawKey, min, max); + } + }, true); + + return deserializeTupleValues(rawValues); + } + + @Override + public Set> reverseRangeByScoreWithScores(K key, final double min, final double max) { + final byte[] rawKey = rawKey(key); + + Set rawValues = execute(new RedisCallback>() { + @Override + public Set doInRedis(RedisConnection connection) { + return connection.zRevRangeByScoreWithScores(rawKey, min, max); + + } + }, true); + + return deserializeTupleValues(rawValues); + } + @Override public Long rank(K key, Object o) { final byte[] rawKey = rawKey(key); @@ -171,21 +256,6 @@ class DefaultZSetOperations extends AbstractOperations implements ZS }, true); } - @SuppressWarnings("unchecked") - @Override - public Set reverseRange(K key, final long start, final long end) { - final byte[] rawKey = rawKey(key); - - Set rawValues = execute(new RedisCallback>() { - @Override - public Set doInRedis(RedisConnection connection) { - return connection.zRevRange(rawKey, start, end); - } - }, true); - - return deserializeValues(rawValues); - } - @Override public Double score(K key, Object o) { final byte[] rawKey = rawKey(key); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/ZSetOperations.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/ZSetOperations.java index 221138af9..87bf0784c 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/ZSetOperations.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/core/ZSetOperations.java @@ -26,6 +26,15 @@ import java.util.Set; */ public interface ZSetOperations { + /** + * Typed ZSet tuple. + */ + public interface TypedTuple { + V getValue(); + + Double getScore(); + } + void intersectAndStore(K key, K otherKey, K destKey); void intersectAndStore(K key, Collection otherKeys, K destKey); @@ -36,9 +45,19 @@ public interface ZSetOperations { Set range(K key, long start, long end); + Set reverseRange(K key, long start, long end); + + Set> rangeWithScores(K key, long start, long end); + + Set> reverseRangeWithScores(K key, long start, long end); + Set rangeByScore(K key, double min, double max); - Set reverseRange(K key, long start, long end); + Set reverseRangeByScore(K key, double min, double max); + + Set> rangeByScoreWithScores(K key, double min, double max); + + Set> reverseRangeByScoreWithScores(K key, double min, double max); Boolean add(K key, V value, double score); @@ -61,4 +80,4 @@ public interface ZSetOperations { Long size(K key); RedisOperations getOperations(); -} +} \ No newline at end of file diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/CollectionUtils.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/CollectionUtils.java index e98c8287a..1e4ee5fea 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/CollectionUtils.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/CollectionUtils.java @@ -76,6 +76,7 @@ abstract class CollectionUtils { static Boolean renameIfAbsent(final K key, final K newKey, RedisOperations operations) { return operations.execute(new SessionCallback() { + @SuppressWarnings("unchecked") @Override public Boolean execute(RedisOperations operations) throws DataAccessException { List exec = null; diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/DefaultRedisZSet.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/DefaultRedisZSet.java index 4794aae99..3da68a34d 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/DefaultRedisZSet.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/DefaultRedisZSet.java @@ -23,6 +23,7 @@ import java.util.Set; import org.springframework.data.keyvalue.redis.connection.DataType; import org.springframework.data.keyvalue.redis.core.BoundZSetOperations; import org.springframework.data.keyvalue.redis.core.RedisOperations; +import org.springframework.data.keyvalue.redis.core.ZSetOperations.TypedTuple; /** * Default implementation for {@link RedisZSet}. @@ -118,6 +119,31 @@ public class DefaultRedisZSet extends AbstractRedisCollection implements R return boundZSetOps.rangeByScore(min, max); } + @Override + public Set reverseRangeByScore(double min, double max) { + return boundZSetOps.reverseRangeByScore(min, max); + } + + @Override + public Set> rangeByScoreWithScores(double min, double max) { + return boundZSetOps.rangeByScoreWithScores(min, max); + } + + @Override + public Set> rangeWithScores(long start, long end) { + return boundZSetOps.rangeWithScores(start, end); + } + + @Override + public Set> reverseRangeByScoreWithScores(double min, double max) { + return boundZSetOps.reverseRangeByScoreWithScores(min, max); + } + + @Override + public Set> reverseRangeWithScores(long start, long end) { + return boundZSetOps.reverseRangeWithScores(start, end); + } + @Override public RedisZSet remove(long start, long end) { boundZSetOps.removeRange(start, end); diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/RedisCollectionFactoryBean.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/RedisCollectionFactoryBean.java index 0f0fa8249..2ea8086f2 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/RedisCollectionFactoryBean.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/RedisCollectionFactoryBean.java @@ -98,6 +98,7 @@ public class RedisCollectionFactoryBean implements InitializingBean, BeanNameAwa } } + @SuppressWarnings("unchecked") private RedisStore createStore(DataType dt) { switch (dt) { case LIST: diff --git a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/RedisZSet.java b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/RedisZSet.java index 0d6c24221..437fa5f09 100644 --- a/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/RedisZSet.java +++ b/spring-data-redis/src/main/java/org/springframework/data/keyvalue/redis/support/collections/RedisZSet.java @@ -21,6 +21,8 @@ import java.util.NoSuchElementException; import java.util.Set; import java.util.SortedSet; +import org.springframework.data.keyvalue.redis.core.ZSetOperations.TypedTuple; + /** * Redis ZSet (or sorted set (by weight)). Acts as a {@link SortedSet} based on the given priorities or weights associated with each item. *

@@ -44,6 +46,16 @@ public interface RedisZSet extends RedisCollection, Set { Set rangeByScore(double min, double max); + Set reverseRangeByScore(double min, double max); + + Set> rangeWithScores(long start, long end); + + Set> reverseRangeWithScores(long start, long end); + + Set> rangeByScoreWithScores(double min, double max); + + Set> reverseRangeByScoreWithScores(double min, double max); + RedisZSet remove(long start, long end); RedisZSet removeByScore(double min, double max);