From 8ddba03add9319d1300eea3233e372040bc184c6 Mon Sep 17 00:00:00 2001 From: Eric Hauser Date: Thu, 2 Jun 2011 20:25:19 -0400 Subject: [PATCH] switch SharededJedisPipeline to use return Response and deprecate existing API --- .../clients/jedis/BinaryShardedJedis.java | 15 +- .../redis/clients/jedis/ShardedJedis.java | 6 +- .../clients/jedis/ShardedJedisPipeline.java | 403 +++++++++++------- .../jedis/tests/SharedJedisPipelineTest.java | 109 +++++ 4 files changed, 379 insertions(+), 154 deletions(-) create mode 100644 src/test/java/redis/clients/jedis/tests/SharedJedisPipelineTest.java diff --git a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java index 113511b..9c1abd2 100644 --- a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java @@ -1,5 +1,9 @@ package redis.clients.jedis; +import redis.clients.jedis.BinaryClient.LIST_POSITION; +import redis.clients.util.Hashing; +import redis.clients.util.Sharded; + import java.io.IOException; import java.util.Collection; import java.util.List; @@ -7,10 +11,6 @@ import java.util.Map; import java.util.Set; import java.util.regex.Pattern; -import redis.clients.jedis.BinaryClient.LIST_POSITION; -import redis.clients.util.Hashing; -import redis.clients.util.Sharded; - public class BinaryShardedJedis extends Sharded implements BinaryJedisCommands { public BinaryShardedJedis(List shards) { @@ -395,9 +395,16 @@ public class BinaryShardedJedis extends Sharded return j.linsert(key, where, pivot, value); } + @Deprecated public List pipelined(ShardedJedisPipeline shardedJedisPipeline) { shardedJedisPipeline.setShardedJedis(this); shardedJedisPipeline.execute(); return shardedJedisPipeline.getResults(); } + + public ShardedJedisPipeline pipelined() { + ShardedJedisPipeline pipeline = new ShardedJedisPipeline(); + pipeline.setShardedJedis(this); + return pipeline; + } } \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/ShardedJedis.java b/src/main/java/redis/clients/jedis/ShardedJedis.java index ca95af9..b8c00e7 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedis.java +++ b/src/main/java/redis/clients/jedis/ShardedJedis.java @@ -1,13 +1,13 @@ package redis.clients.jedis; +import redis.clients.jedis.BinaryClient.LIST_POSITION; +import redis.clients.util.Hashing; + import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Pattern; -import redis.clients.jedis.BinaryClient.LIST_POSITION; -import redis.clients.util.Hashing; - public class ShardedJedis extends BinaryShardedJedis implements JedisCommands { public ShardedJedis(List shards) { super(shards); diff --git a/src/main/java/redis/clients/jedis/ShardedJedisPipeline.java b/src/main/java/redis/clients/jedis/ShardedJedisPipeline.java index 544ce73..cb0dc61 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedisPipeline.java +++ b/src/main/java/redis/clients/jedis/ShardedJedisPipeline.java @@ -2,13 +2,12 @@ package redis.clients.jedis; import redis.clients.jedis.BinaryClient.LIST_POSITION; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; -public abstract class ShardedJedisPipeline { +public class ShardedJedisPipeline extends Queable { private BinaryShardedJedis jedis; private List results = new ArrayList(); + private Queue clients = new LinkedList(); private class FutureResult { private Client client; @@ -26,427 +25,498 @@ public abstract class ShardedJedisPipeline { this.jedis = jedis; } - protected void set(String key, String value) { - Client c = jedis.getShard(key).getClient(); + public Response set(String key, String value) { + Client c = getClient(key); c.set(key, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void get(String key) { - Client c = jedis.getShard(key).getClient(); + public Response get(String key) { + Client c = getClient(key); c.get(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void exists(String key) { - Client c = jedis.getShard(key).getClient(); + public Response exists(String key) { + Client c = getClient(key); c.exists(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.BOOLEAN); } - protected void type(String key) { - Client c = jedis.getShard(key).getClient(); + public Response type(String key) { + Client c = getClient(key); c.type(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.BOOLEAN); } - protected void expire(String key, int seconds) { - Client c = jedis.getShard(key).getClient(); + public Response expire(String key, int seconds) { + Client c = getClient(key); c.expire(key, seconds); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void expireAt(String key, long unixTime) { - Client c = jedis.getShard(key).getClient(); + public Response expireAt(String key, long unixTime) { + Client c = getClient(key); c.expireAt(key, unixTime); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void ttl(String key) { - Client c = jedis.getShard(key).getClient(); + public Response ttl(String key) { + Client c = getClient(key); c.ttl(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void getSet(String key, String value) { - Client c = jedis.getShard(key).getClient(); + public Response getSet(String key, String value) { + Client c = getClient(key); c.getSet(key, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void setnx(String key, String value) { - Client c = jedis.getShard(key).getClient(); + public Response setnx(String key, String value) { + Client c = getClient(key); c.setnx(key, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void setex(String key, int seconds, String value) { - Client c = jedis.getShard(key).getClient(); + public Response setex(String key, int seconds, String value) { + Client c = getClient(key); c.setex(key, seconds, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void decrBy(String key, int integer) { - Client c = jedis.getShard(key).getClient(); + public Response decrBy(String key, long integer) { + Client c = getClient(key); c.decrBy(key, integer); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void decr(String key) { - Client c = jedis.getShard(key).getClient(); + public Response decr(String key) { + Client c = getClient(key); c.decr(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void incrBy(String key, int integer) { - Client c = jedis.getShard(key).getClient(); + public Response incrBy(String key, int integer) { + Client c = getClient(key); c.incrBy(key, integer); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void incr(String key) { - Client c = jedis.getShard(key).getClient(); + public Response incr(String key) { + Client c = getClient(key); c.incr(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void append(String key, String value) { - Client c = jedis.getShard(key).getClient(); + public Response append(String key, String value) { + Client c = getClient(key); c.append(key, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void substr(String key, int start, int end) { - Client c = jedis.getShard(key).getClient(); + public Response substr(String key, int start, int end) { + Client c = getClient(key); c.substr(key, start, end); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void hset(String key, String field, String value) { - Client c = jedis.getShard(key).getClient(); + public Response hset(String key, String field, String value) { + Client c = getClient(key); c.hset(key, field, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void hget(String key, String field) { - Client c = jedis.getShard(key).getClient(); + public Response hget(String key, String field) { + Client c = getClient(key); c.hget(key, field); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void hsetnx(String key, String field, String value) { - Client c = jedis.getShard(key).getClient(); + public Response hsetnx(String key, String field, String value) { + Client c = getClient(key); c.hsetnx(key, field, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void hmset(String key, Map hash) { - Client c = jedis.getShard(key).getClient(); + public Response hmset(String key, Map hash) { + Client c = getClient(key); c.hmset(key, hash); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void hmget(String key, String... fields) { - Client c = jedis.getShard(key).getClient(); + public Response> hmget(String key, String... fields) { + Client c = getClient(key); c.hmget(key, fields); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_LIST); } - protected void hincrBy(String key, String field, int value) { - Client c = jedis.getShard(key).getClient(); + public Response hincrBy(String key, String field, int value) { + Client c = getClient(key); c.hincrBy(key, field, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void hexists(String key, String field) { - Client c = jedis.getShard(key).getClient(); + public Response hexists(String key, String field) { + Client c = getClient(key); c.hexists(key, field); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.BOOLEAN); } - protected void hdel(String key, String field) { - Client c = jedis.getShard(key).getClient(); + public Response hdel(String key, String field) { + Client c = getClient(key); c.hdel(key, field); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void hlen(String key) { - Client c = jedis.getShard(key).getClient(); + public Response hlen(String key) { + Client c = getClient(key); c.hlen(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void hkeys(String key) { - Client c = jedis.getShard(key).getClient(); + public Response> hkeys(String key) { + Client c = getClient(key); c.hkeys(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_SET); } - protected void hvals(String key) { - Client c = jedis.getShard(key).getClient(); + public Response> hvals(String key) { + Client c = getClient(key); c.hvals(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_SET); } - protected void hgetAll(String key) { - Client c = jedis.getShard(key).getClient(); + public Response> hgetAll(String key) { + Client c = getClient(key); c.hgetAll(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_MAP); } - protected void rpush(String key, String string) { - Client c = jedis.getShard(key).getClient(); + public Response rpush(String key, String string) { + Client c = getClient(key); c.rpush(key, string); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void lpush(String key, String string) { - Client c = jedis.getShard(key).getClient(); + public Response lpush(String key, String string) { + Client c = getClient(key); c.lpush(key, string); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void llen(String key) { - Client c = jedis.getShard(key).getClient(); + public Response llen(String key) { + Client c = getClient(key); c.llen(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void lrange(String key, int start, int end) { - Client c = jedis.getShard(key).getClient(); + public Response> lrange(String key, int start, int end) { + Client c = getClient(key); c.lrange(key, start, end); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_LIST); } - protected void ltrim(String key, int start, int end) { - Client c = jedis.getShard(key).getClient(); + public Response ltrim(String key, int start, int end) { + Client c = getClient(key); c.ltrim(key, start, end); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void lindex(String key, int index) { - Client c = jedis.getShard(key).getClient(); + public Response lindex(String key, int index) { + Client c = getClient(key); c.lindex(key, index); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void lset(String key, int index, String value) { - Client c = jedis.getShard(key).getClient(); + public Response lset(String key, int index, String value) { + Client c = getClient(key); c.lset(key, index, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void lrem(String key, int count, String value) { - Client c = jedis.getShard(key).getClient(); + public Response lrem(String key, int count, String value) { + Client c = getClient(key); c.lrem(key, count, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void lpop(String key) { - Client c = jedis.getShard(key).getClient(); + public Response lpop(String key) { + Client c = getClient(key); c.lpop(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void rpop(String key) { - Client c = jedis.getShard(key).getClient(); + public Response rpop(String key) { + Client c = getClient(key); c.rpop(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void sadd(String key, String member) { - Client c = jedis.getShard(key).getClient(); + public Response sadd(String key, String member) { + Client c = getClient(key); c.sadd(key, member); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void smembers(String key) { - Client c = jedis.getShard(key).getClient(); + public Response> smembers(String key) { + Client c = getClient(key); c.smembers(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_SET); } - protected void srem(String key, String member) { - Client c = jedis.getShard(key).getClient(); + public Response srem(String key, String member) { + Client c = getClient(key); c.srem(key, member); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void spop(String key) { - Client c = jedis.getShard(key).getClient(); + public Response spop(String key) { + Client c = getClient(key); c.spop(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void scard(String key) { - Client c = jedis.getShard(key).getClient(); + public Response scard(String key) { + Client c = getClient(key); c.scard(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void sismember(String key, String member) { - Client c = jedis.getShard(key).getClient(); + public Response sismember(String key, String member) { + Client c = getClient(key); c.sismember(key, member); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.BOOLEAN); } - protected void srandmember(String key) { - Client c = jedis.getShard(key).getClient(); + public Response srandmember(String key) { + Client c = getClient(key); c.srandmember(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING); } - protected void zadd(String key, double score, String member) { - Client c = jedis.getShard(key).getClient(); + public Response zadd(String key, double score, String member) { + Client c = getClient(key); c.zadd(key, score, member); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void zrange(String key, int start, int end) { - Client c = jedis.getShard(key).getClient(); + public Response> zrange(String key, int start, int end) { + Client c = getClient(key); c.zrange(key, start, end); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_SET); } - protected void zrem(String key, String member) { - Client c = jedis.getShard(key).getClient(); + public Response zrem(String key, String member) { + Client c = getClient(key); c.zrem(key, member); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void zincrby(String key, double score, String member) { - Client c = jedis.getShard(key).getClient(); + public Response zincrby(String key, double score, String member) { + Client c = getClient(key); c.zincrby(key, score, member); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.DOUBLE); } - protected void zrank(String key, String member) { - Client c = jedis.getShard(key).getClient(); + public Response zrank(String key, String member) { + Client c = getClient(key); c.zrank(key, member); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void zrevrank(String key, String member) { - Client c = jedis.getShard(key).getClient(); + public Response zrevrank(String key, String member) { + Client c = getClient(key); c.zrevrank(key, member); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void zrevrange(String key, int start, int end) { - Client c = jedis.getShard(key).getClient(); + public Response> zrevrange(String key, int start, int end) { + Client c = getClient(key); c.zrevrange(key, start, end); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_ZSET); } - protected void zrangeWithScores(String key, int start, int end) { - Client c = jedis.getShard(key).getClient(); + public Response> zrangeWithScores(String key, int start, int end) { + Client c = getClient(key); c.zrangeWithScores(key, start, end); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.TUPLE_ZSET); } - protected void zrevrangeWithScores(String key, int start, int end) { - Client c = jedis.getShard(key).getClient(); + public Response> zrevrangeWithScores(String key, int start, int end) { + Client c = getClient(key); c.zrevrangeWithScores(key, start, end); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.TUPLE_ZSET); } - protected void zcard(String key) { - Client c = jedis.getShard(key).getClient(); + public Response zcard(String key) { + Client c = getClient(key); c.zcard(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void zscore(String key, String member) { - Client c = jedis.getShard(key).getClient(); + public Response zscore(String key, String member) { + Client c = getClient(key); c.zscore(key, member); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.DOUBLE); } - protected void sort(String key) { - Client c = jedis.getShard(key).getClient(); + public Response sort(String key) { + Client c = getClient(key); c.sort(key); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.DOUBLE); } - protected void sort(String key, SortingParams sortingParameters) { - Client c = jedis.getShard(key).getClient(); + public Response> sort(String key, SortingParams sortingParameters) { + Client c = getClient(key); c.sort(key, sortingParameters); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_LIST); } - protected void zcount(String key, double min, double max) { - Client c = jedis.getShard(key).getClient(); + public Response zcount(String key, double min, double max) { + Client c = getClient(key); c.zcount(key, min, max); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void zrangeByScore(String key, double min, double max) { - Client c = jedis.getShard(key).getClient(); + public Response> zrangeByScore(String key, double min, double max) { + Client c = getClient(key); c.zrangeByScore(key, min, max); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_ZSET); } - protected void zrangeByScore(String key, double min, double max, - int offset, int count) { - Client c = jedis.getShard(key).getClient(); + public Response> zrangeByScore(String key, double min, double max, + int offset, int count) { + Client c = getClient(key); c.zrangeByScore(key, min, max, offset, count); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.STRING_ZSET); } - protected void zrangeByScoreWithScores(String key, double min, double max) { - Client c = jedis.getShard(key).getClient(); + public Response> zrangeByScoreWithScores(String key, double min, double max) { + Client c = getClient(key); c.zrangeByScoreWithScores(key, min, max); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.TUPLE_ZSET); } - protected void zrangeByScoreWithScores(String key, double min, double max, + public Response> zrangeByScoreWithScores(String key, double min, double max, int offset, int count) { - Client c = jedis.getShard(key).getClient(); + Client c = getClient(key); c.zrangeByScoreWithScores(key, min, max, offset, count); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.TUPLE_ZSET); } - protected void zremrangeByRank(String key, int start, int end) { - Client c = jedis.getShard(key).getClient(); + public Response zremrangeByRank(String key, int start, int end) { + Client c = getClient(key); c.zremrangeByRank(key, start, end); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void zremrangeByScore(String key, double start, double end) { - Client c = jedis.getShard(key).getClient(); + public Response zremrangeByScore(String key, double start, double end) { + Client c = getClient(key); c.zremrangeByScore(key, start, end); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void linsert(String key, LIST_POSITION where, String pivot, - String value) { - Client c = jedis.getShard(key).getClient(); + public Response linsert(String key, LIST_POSITION where, String pivot, + String value) { + Client c = getClient(key); c.linsert(key, where, pivot, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } - protected void getbit(String key, long offset) { - Client c = jedis.getShard(key).getClient(); + public Response getbit(String key, long offset) { + Client c = getClient(key); c.getbit(key, offset); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.BOOLEAN); } - public void setbit(String key, long offset, boolean value) { - Client c = jedis.getShard(key).getClient(); + public Response setbit(String key, long offset, boolean value) { + Client c = getClient(key); c.setbit(key, offset, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.BOOLEAN); } - public void setrange(String key, long offset, String value) { - Client c = jedis.getShard(key).getClient(); + public Response setrange(String key, long offset, String value) { + Client c = getClient(key); c.setrange(key, offset, value); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); + } - public void getrange(String key, long startOffset, long endOffset) { - Client c = jedis.getShard(key).getClient(); + public Response getrange(String key, long startOffset, long endOffset) { + Client c = getClient(key); c.getrange(key, startOffset, endOffset); results.add(new FutureResult(c)); + return getResponse(BuilderFactory.LONG); } public List getResults() { @@ -457,5 +527,44 @@ public abstract class ShardedJedisPipeline { return r; } - public abstract void execute(); + /** + * Syncronize pipeline by reading all responses. This operation closes the + * pipeline. In order to get return values from pipelined commands, capture + * the different Response<?> of the commands you execute. + */ + public void sync() { + for (Client client : clients) { + generateResponse(client.getOne()); + } + } + + /** + * Syncronize pipeline by reading all responses. This operation closes the + * pipeline. Whenever possible try to avoid using this version and use + * ShardedJedisPipeline.sync() as it won't go through all the responses and generate the + * right response type (usually it is a waste of time). + * + * @return A list of all the responses in the order you executed them. + */ + public List syncAndReturnAll() { + List formatted = new ArrayList(); + for (Client client : clients) { + formatted.add(generateResponse(client.getOne()).get()); + } + return formatted; + } + + /** + * This method will be removed in Jedis 3.0. Use the methods that return Response's and call + * sync(). + */ + @Deprecated + public void execute() { + } + + private Client getClient(String key) { + Client client = jedis.getShard(key).getClient(); + clients.add(client); + return client; + } } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/SharedJedisPipelineTest.java b/src/test/java/redis/clients/jedis/tests/SharedJedisPipelineTest.java new file mode 100644 index 0000000..7ca2a52 --- /dev/null +++ b/src/test/java/redis/clients/jedis/tests/SharedJedisPipelineTest.java @@ -0,0 +1,109 @@ +package redis.clients.jedis.tests; + +import org.junit.Before; +import org.junit.Test; +import redis.clients.jedis.*; +import redis.clients.jedis.exceptions.JedisDataException; + +import java.io.UnsupportedEncodingException; +import java.util.*; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertNull; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +public class SharedJedisPipelineTest { + private static HostAndPortUtil.HostAndPort redis1 = HostAndPortUtil.getRedisServers() + .get(0); + private static HostAndPortUtil.HostAndPort redis2 = HostAndPortUtil.getRedisServers() + .get(1); + + private ShardedJedis jedis; + + @Before + public void setUp() throws Exception { + Jedis jedis = new Jedis(redis1.host, redis1.port); + jedis.flushAll(); + jedis.disconnect(); + jedis = new Jedis(redis2.host, redis2.port); + jedis.flushAll(); + jedis.disconnect(); + + List shards = new ArrayList(); + shards.add(new JedisShardInfo(redis1.host, redis1.port)); + shards.add(new JedisShardInfo(redis2.host, redis2.port)); + this.jedis = new ShardedJedis(shards); + } + + @Test + public void pipeline() throws UnsupportedEncodingException { + ShardedJedisPipeline p = jedis.pipelined(); + p.set("foo", "bar"); + p.get("foo"); + List results = p.syncAndReturnAll(); + + assertEquals(2, results.size()); + assertEquals("OK", results.get(0)); + assertEquals("bar", results.get(1)); + + } + + @Test + public void pipelineResponse() { + jedis.set("string", "foo"); + jedis.lpush("list", "foo"); + jedis.hset("hash", "foo", "bar"); + jedis.zadd("zset", 1, "foo"); + jedis.sadd("set", "foo"); + + ShardedJedisPipeline p = jedis.pipelined(); + Response string = p.get("string"); + Response list = p.lpop("list"); + Response hash = p.hget("hash", "foo"); + Response> zset = p.zrange("zset", 0, -1); + Response set = p.spop("set"); + Response blist = p.exists("list"); + Response zincrby = p.zincrby("zset", 1, "foo"); + Response zcard = p.zcard("zset"); + p.lpush("list", "bar"); + Response> lrange = p.lrange("list", 0, -1); + Response> hgetAll = p.hgetAll("hash"); + p.sadd("set", "foo"); + Response> smembers = p.smembers("set"); + Response> zrangeWithScores = p.zrangeWithScores("zset", 0, + -1); + p.sync(); + + assertEquals("foo", string.get()); + assertEquals("foo", list.get()); + assertEquals("bar", hash.get()); + assertEquals("foo", zset.get().iterator().next()); + assertEquals("foo", set.get()); + assertFalse(blist.get()); + assertEquals(new Double(2), zincrby.get()); + assertEquals(new Long(1), zcard.get()); + assertEquals(1, lrange.get().size()); + assertNotNull(hgetAll.get().get("foo")); + assertEquals(1, smembers.get().size()); + assertEquals(1, zrangeWithScores.get().size()); + } + + @Test(expected = JedisDataException.class) + public void pipelineResponseWithinPipeline() { + jedis.set("string", "foo"); + + ShardedJedisPipeline p = jedis.pipelined(); + Response string = p.get("string"); + string.get(); + p.sync(); + } + + @Test + public void canRetrieveUnsetKey() { + ShardedJedisPipeline p = jedis.pipelined(); + Response shouldNotExist = p.get(UUID.randomUUID().toString()); + p.sync(); + assertNull(shouldNotExist.get()); + } +}