From 6bc2ac0a4fd7d8467d9b2f0c2266ede71fcc9e02 Mon Sep 17 00:00:00 2001 From: ivowiblo Date: Sun, 29 Apr 2012 02:43:39 -0400 Subject: [PATCH 1/3] Pipeline supports Multi. Issue #251 is fixed. --- .../java/redis/clients/jedis/Pipeline.java | 56 ++++++++++++++++++- .../clients/jedis/tests/PipeliningTest.java | 25 +++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/main/java/redis/clients/jedis/Pipeline.java b/src/main/java/redis/clients/jedis/Pipeline.java index 520e975..05ee8d0 100644 --- a/src/main/java/redis/clients/jedis/Pipeline.java +++ b/src/main/java/redis/clients/jedis/Pipeline.java @@ -9,8 +9,51 @@ import redis.clients.jedis.BinaryClient.LIST_POSITION; import redis.clients.jedis.exceptions.JedisDataException; public class Pipeline extends Queable { - private Client client; + + private MultiResponseBuilder currentMulti; + + private class MultiResponseBuilder extends Builder>{ + private List> responses = new ArrayList>(); + + @Override + public List build(Object data) { + @SuppressWarnings("unchecked") + List list = (List)data; + List values = new ArrayList(); + + if(list.size() != responses.size()){ + throw new JedisDataException("Expected data size " + responses.size() + " but was " + list.size()); + } + + for(int i=0;i response = responses.get(i); + response.set(list.get(i)); + values.add(response.get()); + } + return values; + } + public void addResponse(Response response){ + responses.add(response); + } + } + + @Override + protected Response getResponse(Builder builder) { + if(currentMulti != null){ + super.getResponse(BuilderFactory.STRING); //Expected QUEUED + + Response lr = new Response(builder); + currentMulti.addResponse(lr); + return lr; + } + else{ + return super.getResponse(builder); + } + } + + private Client client; + public void setClient(Client client) { this.client = client; } @@ -39,9 +82,11 @@ public class Pipeline extends Queable { public List syncAndReturnAll() { List unformatted = client.getAll(); List formatted = new ArrayList(); + for (Object o : unformatted) { try { - formatted.add(generateResponse(o).get()); + Response pr = generateResponse(o); + formatted.add(pr.get()); } catch (JedisDataException e) { formatted.add(e); } @@ -1176,10 +1221,14 @@ public class Pipeline extends Queable { public void exec() { client.exec(); + super.getResponse(currentMulti); + currentMulti = null; } public void multi() { client.multi(); + getResponse(BuilderFactory.STRING); //Expecting OK + currentMulti = new MultiResponseBuilder(); } public Response publish(String channel, String message) { @@ -1230,5 +1279,6 @@ public class Pipeline extends Queable { public Response select(int index){ client.select(index); return getResponse(BuilderFactory.STRING); - } + } + } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java index 0a2f7d4..93afb10 100644 --- a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java +++ b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java @@ -164,4 +164,29 @@ public class PipeliningTest extends Assert { } assertEquals(r.get(), "bar"); } + + @Test + public void multi(){ + Pipeline p = jedis.pipelined(); + p.multi(); + Response r1 = p.hincrBy("a", "f1", -1); + Response r2 = p.hincrBy("a", "f1", -2); + p.exec(); + List result = p.syncAndReturnAll(); + + assertEquals(new Long(-1), r1.get()); + assertEquals(new Long(-3), r2.get()); + + assertEquals(4, result.size()); + + assertEquals("OK", result.get(0)); + assertEquals("QUEUED", result.get(1)); + assertEquals("QUEUED", result.get(2)); + + //4th result is a list with the results from the multi + @SuppressWarnings("unchecked") + List multiResult = (List) result.get(3); + assertEquals(new Long(-1), multiResult.get(0)); + assertEquals(new Long(-3), multiResult.get(1)); + } } From d84ffdd8bc6c2f25c9a417291632516a44b77f08 Mon Sep 17 00:00:00 2001 From: ivowiblo Date: Sun, 29 Apr 2012 02:48:11 -0400 Subject: [PATCH 2/3] Format improved --- src/main/java/redis/clients/jedis/Pipeline.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/redis/clients/jedis/Pipeline.java b/src/main/java/redis/clients/jedis/Pipeline.java index 05ee8d0..3f417a6 100644 --- a/src/main/java/redis/clients/jedis/Pipeline.java +++ b/src/main/java/redis/clients/jedis/Pipeline.java @@ -85,8 +85,7 @@ public class Pipeline extends Queable { for (Object o : unformatted) { try { - Response pr = generateResponse(o); - formatted.add(pr.get()); + formatted.add(generateResponse(o).get()); } catch (JedisDataException e) { formatted.add(e); } From d526a32b12403609b9c7c68f17a8cfbc00c48f40 Mon Sep 17 00:00:00 2001 From: ivowiblo Date: Sun, 29 Apr 2012 02:55:22 -0400 Subject: [PATCH 3/3] Pipeline.exec() now returns a response --- src/main/java/redis/clients/jedis/Pipeline.java | 6 +++--- src/test/java/redis/clients/jedis/tests/PipeliningTest.java | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/redis/clients/jedis/Pipeline.java b/src/main/java/redis/clients/jedis/Pipeline.java index 3f417a6..1e04deb 100644 --- a/src/main/java/redis/clients/jedis/Pipeline.java +++ b/src/main/java/redis/clients/jedis/Pipeline.java @@ -1218,10 +1218,11 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING); } - public void exec() { + public Response> exec() { client.exec(); - super.getResponse(currentMulti); + Response> response = super.getResponse(currentMulti); currentMulti = null; + return response; } public void multi() { @@ -1279,5 +1280,4 @@ public class Pipeline extends Queable { client.select(index); return getResponse(BuilderFactory.STRING); } - } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java index 93afb10..568a2cd 100644 --- a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java +++ b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java @@ -171,7 +171,7 @@ public class PipeliningTest extends Assert { p.multi(); Response r1 = p.hincrBy("a", "f1", -1); Response r2 = p.hincrBy("a", "f1", -2); - p.exec(); + Response> r3 = p.exec(); List result = p.syncAndReturnAll(); assertEquals(new Long(-1), r1.get()); @@ -188,5 +188,9 @@ public class PipeliningTest extends Assert { List multiResult = (List) result.get(3); assertEquals(new Long(-1), multiResult.get(0)); assertEquals(new Long(-3), multiResult.get(1)); + + assertEquals(new Long(-1), r3.get().get(0)); + assertEquals(new Long(-3), r3.get().get(1)); + } }