diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index 7df5ac58f..f9f63d573 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -1476,10 +1476,11 @@ public class LettuceConnection implements RedisConnection { public Set zRevRangeByScore(byte[] key, double min, double max, long offset, long count) { try { if (isPipelined()) { - pipeline(asyncConn.zrevrangebyscore(key, min, max, offset, count)); + pipeline(asyncConn.zrevrangebyscore(key, max, min, offset, count)); return null; } - return new LinkedHashSet(con.zrevrangebyscore(key, min, max, offset, count)); + final List results = con.zrevrangebyscore(key, max, min, offset, count); + return results != null ? new LinkedHashSet(results) : null; } catch (Exception ex) { throw convertLettuceAccessException(ex); } @@ -1489,10 +1490,11 @@ public class LettuceConnection implements RedisConnection { public Set zRevRangeByScore(byte[] key, double min, double max) { try { if (isPipelined()) { - pipeline(asyncConn.zrevrangebyscore(key, min, max)); + pipeline(asyncConn.zrevrangebyscore(key, max, min)); return null; } - return new LinkedHashSet(con.zrevrangebyscore(key, min, max)); + final List results = con.zrevrangebyscore(key, max, min); + return results != null ? new LinkedHashSet(results) : null; } catch (Exception ex) { throw convertLettuceAccessException(ex); } @@ -1502,10 +1504,10 @@ public class LettuceConnection implements RedisConnection { public Set zRevRangeByScoreWithScores(byte[] key, double min, double max, long offset, long count) { try { if (isPipelined()) { - pipeline(asyncConn.zrevrangebyscoreWithScores(key, min, max)); + pipeline(asyncConn.zrevrangebyscoreWithScores(key, max, min, offset, count)); return null; } - return LettuceUtils.convertTuple(con.zrevrangebyscoreWithScores(key, min, max)); + return LettuceUtils.convertTuple(con.zrevrangebyscoreWithScores(key, max, min, offset, count)); } catch (Exception ex) { throw convertLettuceAccessException(ex); } @@ -1515,10 +1517,10 @@ public class LettuceConnection implements RedisConnection { public Set zRevRangeByScoreWithScores(byte[] key, double min, double max) { try { if (isPipelined()) { - pipeline(asyncConn.zrevrangebyscoreWithScores(key, min, max)); + pipeline(asyncConn.zrevrangebyscoreWithScores(key, max, min)); return null; } - return LettuceUtils.convertTuple(con.zrevrangebyscoreWithScores(key, min, max)); + return LettuceUtils.convertTuple(con.zrevrangebyscoreWithScores(key, max, min)); } catch (Exception ex) { throw convertLettuceAccessException(ex); } diff --git a/src/main/java/org/springframework/data/redis/connection/rjc/RjcConnection.java b/src/main/java/org/springframework/data/redis/connection/rjc/RjcConnection.java index baf855800..09518c534 100644 --- a/src/main/java/org/springframework/data/redis/connection/rjc/RjcConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/rjc/RjcConnection.java @@ -1625,10 +1625,10 @@ public class RjcConnection implements RedisConnection { try { if (isPipelined()) { - pipeline.zrevrangeByScore(stringKey, minString, maxString, (int) offset, (int) count); + pipeline.zrevrangeByScore(stringKey, maxString, minString, (int) offset, (int) count); return null; } - return RjcUtils.convertToSet(session.zrevrangeByScore(stringKey, minString, maxString, (int) offset, + return RjcUtils.convertToSet(session.zrevrangeByScore(stringKey, maxString, minString, (int) offset, (int) count)); } catch (Exception ex) { throw convertRjcAccessException(ex); @@ -1643,10 +1643,10 @@ public class RjcConnection implements RedisConnection { try { if (isPipelined()) { - pipeline.zrevrangeByScore(stringKey, minString, maxString); + pipeline.zrevrangeByScore(stringKey, maxString, minString); return null; } - return RjcUtils.convertToSet(session.zrevrangeByScore(stringKey, minString, maxString)); + return RjcUtils.convertToSet(session.zrevrangeByScore(stringKey, maxString, minString)); } catch (Exception ex) { throw convertRjcAccessException(ex); } @@ -1713,10 +1713,10 @@ public class RjcConnection implements RedisConnection { try { if (isPipelined()) { - pipeline.zrevrangeByScoreWithScores(stringKey, minString, maxString, (int) offset, (int) count); + pipeline.zrevrangeByScoreWithScores(stringKey, maxString, minString, (int) offset, (int) count); return null; } - return RjcUtils.convertElementScore(session.zrevrangeByScoreWithScores(stringKey, minString, maxString, + return RjcUtils.convertElementScore(session.zrevrangeByScoreWithScores(stringKey, maxString, minString, (int) offset, (int) count)); } catch (Exception ex) { throw convertRjcAccessException(ex); @@ -1732,10 +1732,10 @@ public class RjcConnection implements RedisConnection { try { if (isPipelined()) { - pipeline.zrevrangeByScoreWithScores(stringKey, minString, maxString); + pipeline.zrevrangeByScoreWithScores(stringKey, maxString, minString); return null; } - return RjcUtils.convertElementScore(session.zrevrangeByScoreWithScores(stringKey, minString, maxString)); + return RjcUtils.convertElementScore(session.zrevrangeByScoreWithScores(stringKey, maxString, minString)); } catch (Exception ex) { throw convertRjcAccessException(ex); } 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 691fd845d..fa8d33fea 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -46,6 +46,7 @@ import org.springframework.data.redis.Address; import org.springframework.data.redis.Person; import org.springframework.data.redis.connection.RedisListCommands.Position; import org.springframework.data.redis.connection.RedisZSetCommands.Aggregate; +import org.springframework.data.redis.connection.RedisZSetCommands.Tuple; import org.springframework.data.redis.connection.SortParameters.Order; import org.springframework.data.redis.connection.StringRedisConnection.StringTuple; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; @@ -53,6 +54,7 @@ import org.springframework.data.redis.connection.srp.SrpConnectionFactory; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationUtils; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.test.annotation.IfProfileValue; import org.springframework.test.annotation.ProfileValueSourceConfiguration; @@ -78,9 +80,12 @@ public abstract class AbstractConnectionIntegrationTests { @Autowired protected RedisConnectionFactory connectionFactory; + protected RedisConnection byteConnection; + @Before public void setUp() { - connection = new DefaultStringRedisConnection(connectionFactory.getConnection()); + byteConnection = connectionFactory.getConnection(); + connection = new DefaultStringRedisConnection(byteConnection); } @After @@ -1001,6 +1006,53 @@ public abstract class AbstractConnectionIntegrationTests { connection.zRevRangeWithScores("myset", 0, -1)); } + @Test + public void testZRevRangeByScoreOffsetCount() { + byteConnection.zAdd("myset".getBytes(), 2, "Bob".getBytes()); + byteConnection.zAdd("myset".getBytes(), 1, "James".getBytes()); + assertEquals( + new LinkedHashSet(Arrays.asList(new String[] { "Bob", + "James" })), SerializationUtils.deserialize( + byteConnection.zRevRangeByScore("myset".getBytes(), 0d, + 3d, 0, 5), stringSerializer)); + } + + @Test + public void testZRevRangeByScore() { + byteConnection.zAdd("myset".getBytes(), 2, "Bob".getBytes()); + byteConnection.zAdd("myset".getBytes(), 1, "James".getBytes()); + assertEquals( + new LinkedHashSet(Arrays.asList(new String[] { "Bob", + "James" })), SerializationUtils.deserialize( + byteConnection.zRevRangeByScore("myset".getBytes(), 0d, + 3d), stringSerializer)); + } + + @Test + public void testZRevRangeByScoreWithScoresOffsetCount() { + byteConnection.zAdd("myset".getBytes(), 2, "Bob".getBytes()); + byteConnection.zAdd("myset".getBytes(), 1, "James".getBytes()); + assertEquals( + new LinkedHashSet( + Arrays.asList(new Tuple[] { new DefaultTuple("Bob" + .getBytes(), 2d) })), + byteConnection.zRevRangeByScoreWithScores("myset".getBytes(), + 0d, 3d, 0, 1)); + } + + @Test + public void testZRevRangeByScoreWithScores() { + byteConnection.zAdd("myset".getBytes(), 2, "Bob".getBytes()); + byteConnection.zAdd("myset".getBytes(), 1, "James".getBytes()); + byteConnection.zAdd("myset".getBytes(), 3, "Joe".getBytes()); + assertEquals( + new LinkedHashSet(Arrays.asList(new Tuple[] { + new DefaultTuple("Bob".getBytes(), 2d), + new DefaultTuple("James".getBytes(), 1d) })), + byteConnection.zRevRangeByScoreWithScores("myset".getBytes(), + 0d, 2d)); + } + @Test public void testZRank() { connection.zAdd("myset", 2, "Bob"); diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java index 6066e9f6f..71338edd7 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java @@ -617,6 +617,63 @@ abstract public class AbstractConnectionPipelineIntegrationTests extends actual); } + @Test + public void testZRevRangeByScoreOffsetCount() { + actual.add(connection.zAdd("myset".getBytes(), 2, "Bob".getBytes())); + actual.add(connection.zAdd("myset".getBytes(), 1, "James".getBytes())); + actual.add(byteConnection.zRevRangeByScore("myset".getBytes(), 0d, 3d, + 0, 5)); + verifyResults( + Arrays.asList(new Object[] { 1l, 1l, + Arrays.asList(new String[] { "Bob", "James" }) }), + actual); + } + + @Test + public void testZRevRangeByScore() { + actual.add(connection.zAdd("myset".getBytes(), 2, "Bob".getBytes())); + actual.add(connection.zAdd("myset".getBytes(), 1, "James".getBytes())); + actual.add(byteConnection.zRevRangeByScore("myset".getBytes(), 0d, 3d)); + verifyResults( + Arrays.asList(new Object[] { 1l, 1l, + Arrays.asList(new String[] { "Bob", "James" }) }), + actual); + } + + @Test + public void testZRevRangeByScoreWithScoresOffsetCount() { + convertResultToTuples = true; + actual.add(connection.zAdd("myset".getBytes(), 2, "Bob".getBytes())); + actual.add(connection.zAdd("myset".getBytes(), 1, "James".getBytes())); + actual.add(byteConnection.zRevRangeByScoreWithScores( + "myset".getBytes(), 0d, 3d, 0, 1)); + verifyResults(Arrays.asList(new Object[] { + 1l, + 1l, + Arrays.asList(new StringTuple[] { new DefaultStringTuple("Bob" + .getBytes(), "Bob", 2d) }) }), actual); + } + + @Test + public void testZRevRangeByScoreWithScores() { + convertResultToTuples = true; + actual.add(connection.zAdd("myset".getBytes(), 2, "Bob".getBytes())); + actual.add(connection.zAdd("myset".getBytes(), 1, "James".getBytes())); + actual.add(connection.zAdd("myset".getBytes(), 3, "Joe".getBytes())); + actual.add(byteConnection.zRevRangeByScoreWithScores( + "myset".getBytes(), 0d, 2d)); + verifyResults( + Arrays.asList(new Object[] { + 1l, + 1l, + 1l, + Arrays.asList(new StringTuple[] { + new DefaultStringTuple("Bob".getBytes(), "Bob", + 2d), + new DefaultStringTuple("James".getBytes(), + "James", 1d) }) }), actual); + } + @Test public void testZRank() { actual.add(connection.zAdd("myset", 2, "Bob")); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java index 3ee17f2dc..3f2fe9e16 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java @@ -117,6 +117,26 @@ public class JedisConnectionPipelineIntegrationTests extends super.testInfo(); } + @Test(expected = RedisSystemException.class) + public void testZRevRangeByScore() { + super.testZRevRangeByScore(); + } + + @Test(expected = RedisSystemException.class) + public void testZRevRangeByScoreOffsetCount() { + super.testZRevRangeByScoreOffsetCount(); + } + + @Test(expected = RedisSystemException.class) + public void testZRevRangeByScoreWithScores() { + super.testZRevRangeByScoreWithScores(); + } + + @Test(expected = RedisSystemException.class) + public void testZRevRangeByScoreWithScoresOffsetCount() { + super.testZRevRangeByScoreWithScoresOffsetCount(); + } + // Overrides, usually due to return values being Long vs Boolean or Set vs // List diff --git a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java index 2b96cf871..ef9174d3e 100644 --- a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java @@ -240,6 +240,27 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat super.testBRPopLPushTimeout(); } + @Test(expected = UnsupportedOperationException.class) + public void testZRevRangeByScore() { + super.testZRevRangeByScore(); + } + + @Test(expected = UnsupportedOperationException.class) + public void testZRevRangeByScoreOffsetCount() { + super.testZRevRangeByScoreOffsetCount(); + } + + @Test(expected = UnsupportedOperationException.class) + public void testZRevRangeByScoreWithScores() { + super.testZRevRangeByScoreWithScores(); + } + + @Test(expected = UnsupportedOperationException.class) + public void testZRevRangeByScoreWithScoresOffsetCount() { + super.testZRevRangeByScoreWithScoresOffsetCount(); + } + + // Jredis returns null for rPush @Test public void testSort() {