From ef5518e5816e91af2e0c6388d9606a70042d1ab2 Mon Sep 17 00:00:00 2001 From: Jonathan Leibiusky Date: Tue, 3 Aug 2010 00:32:13 -0300 Subject: [PATCH] Implemented BLPOP --- README.md | 4 ++-- pom.xml | 2 +- src/main/java/redis/clients/jedis/Client.java | 4 ++++ src/main/java/redis/clients/jedis/Jedis.java | 22 ++++++++++++++--- .../java/redis/clients/jedis/Protocol.java | 5 +++- .../clients/jedis/tests/ProtocolTest.java | 9 +++++++ .../tests/commands/ListCommandsTest.java | 24 ++++++++++++++++++- .../commands/TransactionCommandsTest.java | 2 +- 8 files changed, 63 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 6c9a823..e9df416 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ Jedis is a WORK IN PROGRESS. - Publish/Subscribe - Persistence control commands - Remote server control commands -- The AUTH, SORT, BLPOP, BRPOP, ZRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE commands +- The AUTH, SORT, BRPOP, ZRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE commands But stay close because things are going fast and all this will be implemented soon! @@ -20,7 +20,7 @@ But stay close because things are going fast and all this will be implemented so - Commands operating on all the kind of values - Commands operating on string values - Commands operating on hashes -- Commands operating on lists (not SORT, BLPOP, BRPOP) +- Commands operating on lists (not SORT, BRPOP) - Commands operating on sets - Commands operating on sorted sets (not SORT, ZRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE) - Transactions diff --git a/pom.xml b/pom.xml index e55a4a5..5b16ffa 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 redis.clients jedis - 0.0.8 + 0.0.9 junit diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index a3b83cb..d653702 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -395,4 +395,8 @@ public class Client extends Connection { args.addAll(sortingParameters.getParams()); sendCommand("SORT", args.toArray(new String[args.size()])); } + + public void blpop(String[] args) throws JedisException { + sendCommand("BLPOP", args); + } } diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 2ca7c41..c007639 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -2,6 +2,7 @@ package redis.clients.jedis; import java.io.IOException; import java.net.UnknownHostException; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; @@ -428,7 +429,9 @@ public class Jedis { Set set = new LinkedHashSet(); Iterator iterator = membersWithScores.iterator(); while (iterator.hasNext()) { - set.add(new Tuple(iterator.next(), Double.valueOf(iterator.next()))); + set + .add(new Tuple(iterator.next(), Double.valueOf(iterator + .next()))); } return set; } @@ -440,7 +443,9 @@ public class Jedis { Set set = new LinkedHashSet(); Iterator iterator = membersWithScores.iterator(); while (iterator.hasNext()) { - set.add(new Tuple(iterator.next(), Double.valueOf(iterator.next()))); + set + .add(new Tuple(iterator.next(), Double.valueOf(iterator + .next()))); } return set; } @@ -503,4 +508,15 @@ public class Jedis { return client.getMultiBulkReply(); } -} + public List blpop(int timeout, String... keys) + throws JedisException { + List args = new ArrayList(); + for (String arg : keys) { + args.add(arg); + } + args.add(String.valueOf(timeout)); + + client.blpop(args.toArray(new String[args.size()])); + return client.getMultiBulkReply(); + } +} \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index 875b66b..7ec33d6 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -129,8 +129,11 @@ public class Protocol { } private Object processMultiBulkReply(InputStream is) throws JedisException { - List ret = new ArrayList(); int num = Integer.parseInt(readLine(is)); + if (num == -1) { + return null; + } + List ret = new ArrayList(); for (int i = 0; i < num; i++) { ret.add(process(is)); } diff --git a/src/test/java/redis/clients/jedis/tests/ProtocolTest.java b/src/test/java/redis/clients/jedis/tests/ProtocolTest.java index 5f16b38..6de1386 100644 --- a/src/test/java/redis/clients/jedis/tests/ProtocolTest.java +++ b/src/test/java/redis/clients/jedis/tests/ProtocolTest.java @@ -102,6 +102,15 @@ public class ProtocolTest extends Assert { expected2.add(sub); assertEquals(expected2, response2); + } + @SuppressWarnings("unchecked") + @Test + public void nullMultiBulkReply() throws JedisException { + InputStream is = new ByteArrayInputStream("*-1\r\n".getBytes()); + Protocol protocol = new Protocol(); + List response = (List) (List) protocol + .getMultiBulkReply(is); + assertNull(response); } } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/commands/ListCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/ListCommandsTest.java index f1bd068..4693583 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/ListCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/ListCommandsTest.java @@ -220,4 +220,26 @@ public class ListCommandsTest extends Assert { assertEquals(srcExpected, jedis.lrange("foo", 0, 1000)); assertEquals(dstExpected, jedis.lrange("dst", 0, 1000)); } -} + + @Test + public void blpop() throws JedisException { + List result = jedis.blpop(2, "foo"); + assertNull(result); + + new Thread(new Runnable() { + public void run() { + try { + Jedis j = new Jedis("localhost"); + j.connect(); + List result = j.blpop(0, "foo"); + assertNotNull(result); + assertEquals(1, result.size()); + assertEquals("bar", result.get(0)); + } catch (Exception ex) { + fail(ex.getMessage()); + } + } + }); + jedis.lpush("foo", "bar"); + } +} \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java index 2de2a27..8da1e82 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java @@ -90,7 +90,7 @@ public class TransactionCommandsTest extends Assert { t.set("mykey", val); List resp = t.exec(); - assertEquals(new ArrayList(), resp); + assertEquals(null, resp); } @Test