diff --git a/src/main/java/redis/clients/jedis/Pipeline.java b/src/main/java/redis/clients/jedis/Pipeline.java index 97f856b..2687f84 100755 --- a/src/main/java/redis/clients/jedis/Pipeline.java +++ b/src/main/java/redis/clients/jedis/Pipeline.java @@ -31,6 +31,12 @@ public class Pipeline extends MultiKeyPipelineBase { return values; } + public void setResponseDependency(Response dependency) { + for (Response response : responses) { + response.setDependency(dependency); + } + } + public void addResponse(Response response) { responses.add(response); } @@ -106,6 +112,7 @@ public class Pipeline extends MultiKeyPipelineBase { public Response> exec() { client.exec(); Response> response = super.getResponse(currentMulti); + currentMulti.setResponseDependency(response); currentMulti = null; return response; } diff --git a/src/main/java/redis/clients/jedis/Response.java b/src/main/java/redis/clients/jedis/Response.java index b17f314..955277a 100644 --- a/src/main/java/redis/clients/jedis/Response.java +++ b/src/main/java/redis/clients/jedis/Response.java @@ -8,6 +8,8 @@ public class Response { private boolean set = false; private Builder builder; private Object data; + private Response dependency = null; + private boolean requestDependencyBuild = false; public Response(Builder b) { this.builder = b; @@ -19,23 +21,39 @@ public class Response { } public T get() { + // if response has dependency response and dependency is not built, + // build it first and no more!! + if (!requestDependencyBuild && dependency != null && dependency.set + && !dependency.built) { + requestDependencyBuild = true; + dependency.build(); + } if (!set) { throw new JedisDataException( "Please close pipeline or multi block before calling this method."); } if (!built) { - if (data != null) { - if (data instanceof JedisDataException) { - throw new JedisDataException((JedisDataException) data); - } - response = builder.build(data); - } - this.data = null; - built = true; + build(); } return response; } + public void setDependency(Response dependency) { + this.dependency = dependency; + this.requestDependencyBuild = false; + } + + private void build() { + if (data != null) { + if (data instanceof JedisDataException) { + throw new JedisDataException((JedisDataException) data); + } + response = builder.build(data); + } + data = null; + built = true; + } + public String toString() { return "Response " + builder.toString(); } diff --git a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java index aed67dc..d3cddd0 100755 --- a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java +++ b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java @@ -251,6 +251,27 @@ public class PipeliningTest extends Assert { } + @Test + public void multiWithSync() { + jedis.set("foo", "314"); + jedis.set("bar", "foo"); + jedis.set("hello", "world"); + Pipeline p = jedis.pipelined(); + Response r1 = p.get("bar"); + p.multi(); + Response r2 = p.get("foo"); + p.exec(); + Response r3 = p.get("hello"); + p.sync(); + + // before multi + assertEquals("foo", r1.get()); + // It should be readable whether exec's response was built or not + assertEquals("314", r2.get()); + // after multi + assertEquals("world", r3.get()); + } + @Test public void testDiscardInPipeline() { Pipeline pipeline = jedis.pipelined();