diff --git a/src/main/java/redis/clients/jedis/BuilderFactory.java b/src/main/java/redis/clients/jedis/BuilderFactory.java old mode 100644 new mode 100755 index 8a2320a..bebd2d6 --- a/src/main/java/redis/clients/jedis/BuilderFactory.java +++ b/src/main/java/redis/clients/jedis/BuilderFactory.java @@ -144,6 +144,13 @@ public class BuilderFactory { } List l = (List) data; final Set result = new LinkedHashSet(l); + for (final byte[] barray : l) { + if (barray == null) { + result.add(null); + } else { + result.add(barray); + } + } return result; } @@ -151,6 +158,24 @@ public class BuilderFactory { return "ZSet"; } }; + public static final Builder> BYTE_ARRAY_MAP = new Builder>() { + @SuppressWarnings("unchecked") + public Map build(Object data) { + final List flatHash = (List) data; + final Map hash = new HashMap(); + final Iterator iterator = flatHash.iterator(); + while (iterator.hasNext()) { + hash.put(iterator.next(), iterator.next()); + } + + return hash; + } + + public String toString() { + return "Map"; + } + + }; public static final Builder> STRING_ZSET = new Builder>() { @SuppressWarnings("unchecked") diff --git a/src/main/java/redis/clients/jedis/Pipeline.java b/src/main/java/redis/clients/jedis/Pipeline.java old mode 100644 new mode 100755 index d89efea..e032dbe --- a/src/main/java/redis/clients/jedis/Pipeline.java +++ b/src/main/java/redis/clients/jedis/Pipeline.java @@ -78,7 +78,6 @@ public class Pipeline extends Queable { * right response type (usually it is a waste of time). * * @return A list of all the responses in the order you executed them. - * @see sync */ public List syncAndReturnAll() { List unformatted = client.getAll(); @@ -109,9 +108,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING_LIST); } - public Response> blpop(byte[]... args) { + public Response> blpop(byte[]... args) { client.blpop(args); - return getResponse(BuilderFactory.STRING_LIST); + return getResponse(BuilderFactory.BYTE_ARRAY_LIST); } public Response> brpop(String... args) { @@ -119,9 +118,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING_LIST); } - public Response> brpop(byte[]... args) { + public Response> brpop(byte[]... args) { client.brpop(args); - return getResponse(BuilderFactory.STRING_LIST); + return getResponse(BuilderFactory.BYTE_ARRAY_LIST); } public Response decr(String key) { @@ -159,9 +158,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING); } - public Response echo(byte[] string) { + public Response echo(byte[] string) { client.echo(string); - return getResponse(BuilderFactory.STRING); + return getResponse(BuilderFactory.BYTE_ARRAY); } public Response exists(String key) { @@ -250,9 +249,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING); } - public Response hget(byte[] key, byte[] field) { + public Response hget(byte[] key, byte[] field) { client.hget(key, field); - return getResponse(BuilderFactory.STRING); + return getResponse(BuilderFactory.BYTE_ARRAY); } public Response> hgetAll(String key) { @@ -260,9 +259,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING_MAP); } - public Response> hgetAll(byte[] key) { + public Response> hgetAll(byte[] key) { client.hgetAll(key); - return getResponse(BuilderFactory.STRING_MAP); + return getResponse(BuilderFactory.BYTE_ARRAY_MAP); } public Response hincrBy(String key, String field, long value) { @@ -280,9 +279,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING_SET); } - public Response> hkeys(byte[] key) { + public Response> hkeys(byte[] key) { client.hkeys(key); - return getResponse(BuilderFactory.STRING_SET); + return getResponse(BuilderFactory.BYTE_ARRAY_ZSET); } public Response hlen(String key) { @@ -300,9 +299,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING_LIST); } - public Response> hmget(byte[] key, byte[]... fields) { + public Response> hmget(byte[] key, byte[]... fields) { client.hmget(key, fields); - return getResponse(BuilderFactory.STRING_LIST); + return getResponse(BuilderFactory.BYTE_ARRAY_LIST); } public Response hmset(String key, Map hash) { @@ -340,9 +339,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING_LIST); } - public Response> hvals(byte[] key) { + public Response> hvals(byte[] key) { client.hvals(key); - return getResponse(BuilderFactory.STRING_LIST); + return getResponse(BuilderFactory.BYTE_ARRAY_LIST); } public Response incr(String key) { @@ -370,9 +369,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING_SET); } - public Response> keys(byte[] pattern) { + public Response> keys(byte[] pattern) { client.keys(pattern); - return getResponse(BuilderFactory.STRING_SET); + return getResponse(BuilderFactory.BYTE_ARRAY_ZSET); } public Response lindex(String key, int index) { @@ -380,9 +379,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING); } - public Response lindex(byte[] key, int index) { + public Response lindex(byte[] key, int index) { client.lindex(key, index); - return getResponse(BuilderFactory.STRING); + return getResponse(BuilderFactory.BYTE_ARRAY); } public Response linsert(String key, LIST_POSITION where, @@ -412,9 +411,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING); } - public Response lpop(byte[] key) { + public Response lpop(byte[] key) { client.lpop(key); - return getResponse(BuilderFactory.STRING); + return getResponse(BuilderFactory.BYTE_ARRAY); } public Response lpush(String key, String string) { @@ -442,9 +441,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING_LIST); } - public Response> lrange(byte[] key, long start, long end) { + public Response> lrange(byte[] key, long start, long end) { client.lrange(key, start, end); - return getResponse(BuilderFactory.STRING_LIST); + return getResponse(BuilderFactory.BYTE_ARRAY_LIST); } public Response lrem(String key, long count, String value) { @@ -482,9 +481,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING_LIST); } - public Response> mget(byte[]... keys) { + public Response> mget(byte[]... keys) { client.mget(keys); - return getResponse(BuilderFactory.STRING_LIST); + return getResponse(BuilderFactory.BYTE_ARRAY_LIST); } public Response move(String key, int dbIndex) { @@ -552,9 +551,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING); } - public Response rpop(byte[] key) { + public Response rpop(byte[] key) { client.rpop(key); - return getResponse(BuilderFactory.STRING); + return getResponse(BuilderFactory.BYTE_ARRAY); } public Response rpoplpush(String srckey, String dstkey) { @@ -562,9 +561,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING); } - public Response rpoplpush(byte[] srckey, byte[] dstkey) { + public Response rpoplpush(byte[] srckey, byte[] dstkey) { client.rpoplpush(srckey, dstkey); - return getResponse(BuilderFactory.STRING); + return getResponse(BuilderFactory.BYTE_ARRAY); } public Response rpush(String key, String string) { @@ -612,9 +611,9 @@ public class Pipeline extends Queable { return getResponse(BuilderFactory.STRING_SET); } - public Response> sdiff(byte[]... keys) { + public Response> sdiff(byte[]... keys) { client.sdiff(keys); - return getResponse(BuilderFactory.STRING_SET); + return getResponse(BuilderFactory.BYTE_ARRAY_ZSET); } public Response sdiffstore(String dstkey, String... keys) { @@ -1319,4 +1318,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 old mode 100644 new mode 100755 index 568a2cd..ffe2c9b --- a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java +++ b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java @@ -8,10 +8,7 @@ import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.tests.HostAndPortUtil.HostAndPort; import java.io.UnsupportedEncodingException; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.UUID; +import java.util.*; public class PipeliningTest extends Assert { private static HostAndPort hnp = HostAndPortUtil.getRedisServers().get(0); @@ -100,7 +97,59 @@ public class PipeliningTest extends Assert { assertNotNull(score.get()); } - + + @Test + public void pipelineBinarySafeHashCommands() { + jedis.hset("key".getBytes(), "f1".getBytes(), "v111".getBytes()); + jedis.hset("key".getBytes(), "f22".getBytes(), "v2222".getBytes()); + + Pipeline p = jedis.pipelined(); + Response> fmap = p.hgetAll("key".getBytes()); + Response> fkeys = p.hkeys("key".getBytes()); + Response> fordered = p.hmget("key".getBytes(), "f22".getBytes(), "f1".getBytes()); + Response> fvals = p.hvals("key".getBytes()); + p.sync(); + + assertNotNull(fmap.get()); + // we have to do these strange contortions because byte[] is not a very good key + // for a java Map. It only works with equality (you need the exact key object to retrieve + // the value) I recommend we switch to using ByteBuffer or something similar: + // http://stackoverflow.com/questions/1058149/using-a-byte-array-as-hashmap-key-java + Map map = fmap.get(); + Set mapKeys = map.keySet(); + Iterator iterMap = mapKeys.iterator(); + byte[] firstMapKey = iterMap.next(); + byte[] secondMapKey = iterMap.next(); + assertFalse(iterMap.hasNext()); + verifyHasBothValues(firstMapKey, secondMapKey, "f1".getBytes(), "f22".getBytes()); + byte[] firstMapValue = map.get(firstMapKey); + byte[] secondMapValue = map.get(secondMapKey); + verifyHasBothValues(firstMapValue, secondMapValue, "v111".getBytes(), "v2222".getBytes()); + + assertNotNull(fkeys.get()); + Iterator iter = fkeys.get().iterator(); + byte[] firstKey = iter.next(); + byte[] secondKey = iter.next(); + assertFalse(iter.hasNext()); + verifyHasBothValues(firstKey, secondKey, "f1".getBytes(), "f22".getBytes()); + + assertNotNull(fordered.get()); + assertArrayEquals("v2222".getBytes(), fordered.get().get(0)); + assertArrayEquals("v111".getBytes(), fordered.get().get(1)); + + assertNotNull(fvals.get()); + assertEquals(2, fvals.get().size()); + byte[] firstValue = fvals.get().get(0); + byte[] secondValue = fvals.get().get(1); + verifyHasBothValues(firstValue, secondValue, "v111".getBytes(), "v2222".getBytes()); + } + + private void verifyHasBothValues(byte[] firstKey, byte[] secondKey, byte[] value1, byte[] value2) { + assertFalse(Arrays.equals(firstKey, secondKey)); + assertTrue(Arrays.equals(firstKey, value1) || Arrays.equals(firstKey, value2)); + assertTrue(Arrays.equals(secondKey, value1) || Arrays.equals(secondKey, value2)); + } + @Test public void pipelineSelect() { Pipeline p = jedis.pipelined();