diff --git a/src/main/java/redis/clients/jedis/Pipeline.java b/src/main/java/redis/clients/jedis/Pipeline.java index f3564ca..d89efea 100644 --- a/src/main/java/redis/clients/jedis/Pipeline.java +++ b/src/main/java/redis/clients/jedis/Pipeline.java @@ -10,8 +10,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; } @@ -40,9 +83,10 @@ 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()); + formatted.add(generateResponse(o).get()); } catch (JedisDataException e) { formatted.add(e); } @@ -1213,12 +1257,17 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING); } - public void exec() { + public Response> exec() { client.exec(); + Response> response = super.getResponse(currentMulti); + currentMulti = null; + return response; } public void multi() { client.multi(); + getResponse(BuilderFactory.STRING); //Expecting OK + currentMulti = new MultiResponseBuilder(); } public Response publish(String channel, String message) { @@ -1269,5 +1318,5 @@ 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..568a2cd 100644 --- a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java +++ b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java @@ -164,4 +164,33 @@ 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); + Response> r3 = 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)); + + assertEquals(new Long(-1), r3.get().get(0)); + assertEquals(new Long(-3), r3.get().get(1)); + + } }