diff --git a/src/main/java/org/springframework/data/redis/connection/DefaultStringTuple.java b/src/main/java/org/springframework/data/redis/connection/DefaultStringTuple.java index d50e8f09f..1b8817895 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringTuple.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringTuple.java @@ -15,6 +15,8 @@ */ package org.springframework.data.redis.connection; +import java.nio.charset.StandardCharsets; + import org.springframework.data.redis.connection.RedisZSetCommands.Tuple; import org.springframework.data.redis.connection.StringRedisConnection.StringTuple; import org.springframework.util.ObjectUtils; @@ -23,6 +25,8 @@ import org.springframework.util.ObjectUtils; * Default implementation for {@link StringTuple} interface. * * @author Costin Leau + * @author Mark Paluch + * @author Christoph Strobl */ public class DefaultStringTuple extends DefaultTuple implements StringTuple { @@ -35,6 +39,7 @@ public class DefaultStringTuple extends DefaultTuple implements StringTuple { * @param score */ public DefaultStringTuple(byte[] value, String valueAsString, Double score) { + super(value, score); this.valueAsString = valueAsString; @@ -43,13 +48,12 @@ public class DefaultStringTuple extends DefaultTuple implements StringTuple { /** * Constructs a new DefaultStringTuple instance. * - * @param valueAsString + * @param valueAsString must not be {@literal null}. * @param score * @since 2.6 */ public DefaultStringTuple(String valueAsString, double score) { - super(valueAsString.getBytes(), score); - this.valueAsString = valueAsString; + this(valueAsString.getBytes(StandardCharsets.UTF_8), valueAsString, score); } /** @@ -59,6 +63,7 @@ public class DefaultStringTuple extends DefaultTuple implements StringTuple { * @param valueAsString */ public DefaultStringTuple(Tuple tuple, String valueAsString) { + super(tuple.getValue(), tuple.getScore()); this.valueAsString = valueAsString; } diff --git a/src/main/java/org/springframework/data/redis/core/ZSetOperations.java b/src/main/java/org/springframework/data/redis/core/ZSetOperations.java index 11823e197..ff2188602 100644 --- a/src/main/java/org/springframework/data/redis/core/ZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/ZSetOperations.java @@ -916,38 +916,38 @@ public interface ZSetOperations { @Nullable Set rangeByLex(K key, Range range, Limit limit); - /** - * Get all elements with reverse lexicographical ordering from {@literal ZSET} at {@code key} with a value between - * {@link Range#getMin()} and {@link Range#getMax()}. - * - * @param key must not be {@literal null}. - * @param range must not be {@literal null}. - * @return {@literal null} when used in pipeline / transaction. - * @since 2.4 - * @see Redis Documentation: ZREVRANGEBYLEX - */ - @Nullable - default Set reverseRangeByLex(K key, Range range) { - return reverseRangeByLex(key, range, Limit.unlimited()); - } - - /** - * Get all elements {@literal n} elements, where {@literal n = } {@link Limit#getCount()}, starting at - * {@link Limit#getOffset()} with reverse lexicographical ordering from {@literal ZSET} at {@code key} with a value - * between {@link Range#getMin()} and {@link Range#getMax()}. - * - * @param key must not be {@literal null} - * @param range must not be {@literal null}. - * @param limit can be {@literal null}. - * @return {@literal null} when used in pipeline / transaction. - * @since 2.4 - * @see Redis Documentation: ZREVRANGEBYLEX - */ - @Nullable - Set reverseRangeByLex(K key, Range range, Limit limit); - - /** - * @return never {@literal null}. - */ - RedisOperations getOperations(); + /** + * Get all elements with reverse lexicographical ordering from {@literal ZSET} at {@code key} with a value between + * {@link Range#getMin()} and {@link Range#getMax()}. + * + * @param key must not be {@literal null}. + * @param range must not be {@literal null}. + * @return {@literal null} when used in pipeline / transaction. + * @since 2.4 + * @see Redis Documentation: ZREVRANGEBYLEX + */ + @Nullable + default Set reverseRangeByLex(K key, Range range) { + return reverseRangeByLex(key, range, Limit.unlimited()); } + + /** + * Get all elements {@literal n} elements, where {@literal n = } {@link Limit#getCount()}, starting at + * {@link Limit#getOffset()} with reverse lexicographical ordering from {@literal ZSET} at {@code key} with a value + * between {@link Range#getMin()} and {@link Range#getMax()}. + * + * @param key must not be {@literal null} + * @param range must not be {@literal null}. + * @param limit can be {@literal null}. + * @return {@literal null} when used in pipeline / transaction. + * @since 2.4 + * @see Redis Documentation: ZREVRANGEBYLEX + */ + @Nullable + Set reverseRangeByLex(K key, Range range, Limit limit); + + /** + * @return never {@literal null}. + */ + RedisOperations getOperations(); +} diff --git a/src/main/java/org/springframework/data/redis/support/collections/RedisZSet.java b/src/main/java/org/springframework/data/redis/support/collections/RedisZSet.java index 89002ebfb..09992c8d6 100644 --- a/src/main/java/org/springframework/data/redis/support/collections/RedisZSet.java +++ b/src/main/java/org/springframework/data/redis/support/collections/RedisZSet.java @@ -210,7 +210,7 @@ public interface RedisZSet extends RedisCollection, Set { /** * Union this set and other {@link RedisZSet}s. * - * @param set must not be {@literal null}. + * @param sets must not be {@literal null}. * @return a {@link Set} containing the combined values with their scores. * @since 2.6 */ diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index 881494630..0aeb887d0 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -1878,6 +1878,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZIncrBy() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zAdd("myset", 4, "Joe")); @@ -1890,6 +1891,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test // GH-2041 @EnabledOnCommand("ZDIFF") void testZDiff() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zAdd("myset", 4, "Joe")); @@ -1904,6 +1906,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test // GH-2041 @EnabledOnCommand("ZDIFFSTORE") void testZDiffStore() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zAdd("myset", 4, "Joe")); @@ -1917,6 +1920,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test // GH-2042 @EnabledOnCommand("ZINTER") void testZInter() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zAdd("myset", 4, "Joe")); @@ -1932,6 +1936,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test // GH-2042 @EnabledOnCommand("ZINTER") void testZInterAggWeights() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zAdd("myset", 4, "Joe")); @@ -1947,6 +1952,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZInterStore() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zAdd("myset", 4, "Joe")); @@ -1960,6 +1966,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZInterStoreAggWeights() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zAdd("myset", 4, "Joe")); @@ -1975,6 +1982,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRangeWithScores() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRangeWithScores("myset", 0, -1)); @@ -1985,6 +1993,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRangeByScore() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRangeByScore("myset", 1, 1)); @@ -1993,6 +2002,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRangeByScoreOffsetCount() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRangeByScore("myset", 1d, 3d, 1, -1)); @@ -2001,6 +2011,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRangeByScoreWithScores() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRangeByScoreWithScores("myset", 2d, 5d)); @@ -2010,6 +2021,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRangeByScoreWithScoresOffsetCount() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRangeByScoreWithScores("myset", 1d, 5d, 0, 1)); @@ -2019,6 +2031,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRevRange() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRevRange("myset", 0, -1)); @@ -2027,6 +2040,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRevRangeWithScores() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRevRangeWithScores("myset", 0, -1)); @@ -2037,6 +2051,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRevRangeByScoreOffsetCount() { + actual.add(connection.zAdd("myset".getBytes(), 2, "Bob".getBytes())); actual.add(connection.zAdd("myset".getBytes(), 1, "James".getBytes())); actual.add(connection.zRevRangeByScore("myset", 0d, 3d, 0, 5)); @@ -2045,6 +2060,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRevRangeByScore() { + actual.add(connection.zAdd("myset".getBytes(), 2, "Bob".getBytes())); actual.add(connection.zAdd("myset".getBytes(), 1, "James".getBytes())); actual.add(connection.zRevRangeByScore("myset", 0d, 3d)); @@ -2053,6 +2069,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRevRangeByScoreWithScoresOffsetCount() { + actual.add(connection.zAdd("myset".getBytes(), 2, "Bob".getBytes())); actual.add(connection.zAdd("myset".getBytes(), 1, "James".getBytes())); actual.add(connection.zRevRangeByScoreWithScores("myset", 0d, 3d, 0, 1)); @@ -2062,6 +2079,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRevRangeByScoreWithScores() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zAdd("myset", 3, "Joe")); @@ -2073,6 +2091,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRank() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRank("myset", "James")); @@ -2082,6 +2101,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRem() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRem("myset", "James")); @@ -2091,6 +2111,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRemMultiple() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zAdd("myset", 0.5, "Joe")); @@ -2103,6 +2124,7 @@ public abstract class AbstractConnectionIntegrationTests { @Test void testZRemRangeByRank() { + actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRemRange("myset", 0L, 3L)); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java index 20fbe77cc..158e1c699 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java @@ -2008,6 +2008,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // GH-2041 public void zDiffShouldThrowExceptionWhenKeysDoNotMapToSameSlots() { + assertThatExceptionOfType(DataAccessException.class) .isThrownBy(() -> clusterConnection.zDiff(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES)); assertThatExceptionOfType(DataAccessException.class) @@ -2046,6 +2047,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // GH-2042 public void zInterShouldThrowExceptionWhenKeysDoNotMapToSameSlots() { + assertThatExceptionOfType(DataAccessException.class) .isThrownBy(() -> clusterConnection.zInter(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES)); assertThatExceptionOfType(DataAccessException.class) @@ -2068,6 +2070,7 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { @Test // GH-2042 public void zInterStoreShouldThrowExceptionWhenKeysDoNotMapToSameSlots() { + assertThatExceptionOfType(DataAccessException.class) .isThrownBy(() -> clusterConnection.zInterStore(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES)); } diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java index d87d18188..acb2aa4cf 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java @@ -2049,6 +2049,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { @Test // GH-2041 public void zDiffShouldThrowExceptionWhenKeysDoNotMapToSameSlots() { + assertThatExceptionOfType(DataAccessException.class) .isThrownBy(() -> clusterConnection.zDiff(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES)); assertThatExceptionOfType(DataAccessException.class) @@ -2087,6 +2088,7 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { @Test // GH-2042 public void zInterShouldThrowExceptionWhenKeysDoNotMapToSameSlots() { + assertThatExceptionOfType(DataAccessException.class) .isThrownBy(() -> clusterConnection.zInter(KEY_3_BYTES, KEY_1_BYTES, KEY_2_BYTES)); assertThatExceptionOfType(DataAccessException.class)