From 111eb11440749a219bed3cd5bb5da116274b84ee Mon Sep 17 00:00:00 2001 From: Jonathan Leibiusky Date: Sat, 7 Aug 2010 18:27:51 -0300 Subject: [PATCH] Implemented ZRANGEBYSCORE --- README.md | 4 +- src/main/java/redis/clients/jedis/Client.java | 24 ++++++++ src/main/java/redis/clients/jedis/Jedis.java | 54 ++++++++++++----- .../tests/commands/SortedSetCommandsTest.java | 60 +++++++++++++++++++ 4 files changed, 124 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index cab5e88..6e820af 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Jedis is a WORK IN PROGRESS. - Sharding - Persistence control commands - Remote server control commands -- The ZRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE commands +- The ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE commands But stay close because things are going fast and all this will be implemented soon! @@ -22,7 +22,7 @@ But stay close because things are going fast and all this will be implemented so - Commands operating on hashes - Commands operating on lists - Commands operating on sets -- Commands operating on sorted sets (not ZRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE) +- Commands operating on sorted sets (not ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE) - Transactions - Pipelining - Publish/Subscribe diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index fbcc32e..879a7f7 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -439,4 +439,28 @@ public class Client extends Connection { public void zcount(String key, double min, double max) { sendCommand("ZCOUNT", key, String.valueOf(min), String.valueOf(max)); } + + public void zrangeByScore(String key, double min, double max) { + sendCommand("ZRANGEBYSCORE", key, String.valueOf(min), String + .valueOf(max)); + } + + public void zrangeByScore(String key, double min, double max, int offset, + int count) { + sendCommand("ZRANGEBYSCORE", key, String.valueOf(min), String + .valueOf(max), "LIMIT", String.valueOf(offset), String + .valueOf(count)); + } + + public void zrangeByScoreWithScores(String key, double min, double max) { + sendCommand("ZRANGEBYSCORE", key, String.valueOf(min), String + .valueOf(max), "WITHSCORES"); + } + + public void zrangeByScoreWithScores(String key, double min, double max, + int offset, int count) { + sendCommand("ZRANGEBYSCORE", key, String.valueOf(min), String + .valueOf(max), "LIMIT", String.valueOf(offset), String + .valueOf(count), "WITHSCORES"); + } } diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index b0452ad..3facf50 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -411,27 +411,13 @@ public class Jedis { public Set zrangeWithScores(String key, int start, int end) { client.zrangeWithScores(key, start, end); - List membersWithScores = client.getMultiBulkReply(); - Set set = new LinkedHashSet(); - Iterator iterator = membersWithScores.iterator(); - while (iterator.hasNext()) { - set - .add(new Tuple(iterator.next(), Double.valueOf(iterator - .next()))); - } + Set set = getTupledSet(); return set; } public Set zrevrangeWithScores(String key, int start, int end) { client.zrevrangeWithScores(key, start, end); - List membersWithScores = client.getMultiBulkReply(); - Set set = new LinkedHashSet(); - Iterator iterator = membersWithScores.iterator(); - while (iterator.hasNext()) { - set - .add(new Tuple(iterator.next(), Double.valueOf(iterator - .next()))); - } + Set set = getTupledSet(); return set; } @@ -550,4 +536,40 @@ public class Jedis { client.zcount(key, min, max); return client.getIntegerReply(); } + + public Set zrangeByScore(String key, double min, double max) { + client.zrangeByScore(key, min, max); + return new LinkedHashSet(client.getMultiBulkReply()); + } + + public Set zrangeByScore(String key, double min, double max, + int offset, int count) { + client.zrangeByScore(key, min, max, offset, count); + return new LinkedHashSet(client.getMultiBulkReply()); + } + + public Set zrangeByScoreWithScores(String key, double min, double max) { + client.zrangeByScoreWithScores(key, min, max); + Set set = getTupledSet(); + return set; + } + + public Set zrangeByScoreWithScores(String key, double min, + double max, int offset, int count) { + client.zrangeByScoreWithScores(key, min, max, offset, count); + Set set = getTupledSet(); + return set; + } + + private Set getTupledSet() { + List membersWithScores = client.getMultiBulkReply(); + Set set = new LinkedHashSet(); + Iterator iterator = membersWithScores.iterator(); + while (iterator.hasNext()) { + set + .add(new Tuple(iterator.next(), Double.valueOf(iterator + .next()))); + } + return set; + } } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java index e77d5c1..a75b8c4 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java @@ -192,4 +192,64 @@ public class SortedSetCommandsTest extends JedisCommandTestBase { assertEquals(2, result); } + + @Test + public void zrangebyscore() { + jedis.zadd("foo", 1d, "a"); + jedis.zadd("foo", 10d, "b"); + jedis.zadd("foo", 0.1d, "c"); + jedis.zadd("foo", 2d, "a"); + + Set range = jedis.zrangeByScore("foo", 0d, 2d); + + Set expected = new LinkedHashSet(); + expected.add("c"); + expected.add("a"); + + assertEquals(expected, range); + + range = jedis.zrangeByScore("foo", 0d, 2d, 0, 1); + + expected = new LinkedHashSet(); + expected.add("c"); + + assertEquals(expected, range); + + range = jedis.zrangeByScore("foo", 0d, 2d, 1, 1); + + expected = new LinkedHashSet(); + expected.add("a"); + + assertEquals(expected, range); + } + + @Test + public void zrangebyscoreWithScores() { + jedis.zadd("foo", 1d, "a"); + jedis.zadd("foo", 10d, "b"); + jedis.zadd("foo", 0.1d, "c"); + jedis.zadd("foo", 2d, "a"); + + Set range = jedis.zrangeByScoreWithScores("foo", 0d, 2d); + + Set expected = new LinkedHashSet(); + expected.add(new Tuple("c", 0.1d)); + expected.add(new Tuple("a", 2d)); + + assertEquals(expected, range); + + range = jedis.zrangeByScoreWithScores("foo", 0d, 2d, 0, 1); + + expected = new LinkedHashSet(); + expected.add(new Tuple("c", 0.1d)); + + assertEquals(expected, range); + + range = jedis.zrangeByScoreWithScores("foo", 0d, 2d, 1, 1); + + expected = new LinkedHashSet(); + expected.add(new Tuple("a", 2d)); + + assertEquals(expected, range); + } } \ No newline at end of file