From cd722e5a8283ff9f6c89bef232ee58010e82d218 Mon Sep 17 00:00:00 2001 From: Alok Singh Date: Mon, 28 Apr 2014 14:17:46 -0700 Subject: [PATCH 1/3] Add support for pfcount with multiple keys --- .../redis/clients/jedis/BinaryClient.java | 30 +++++++++---------- src/main/java/redis/clients/jedis/Client.java | 8 +++-- src/main/java/redis/clients/jedis/Jedis.java | 22 +++++++------- .../redis/clients/jedis/JedisCluster.java | 15 ++++++++-- .../redis/clients/jedis/JedisCommands.java | 2 ++ .../redis/clients/jedis/ShardedJedis.java | 13 ++++++-- .../commands/HyperLogLogCommandsTest.java | 25 ++++++++++++++++ 7 files changed, 82 insertions(+), 33 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 1537293..edb9274 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -1,26 +1,22 @@ package redis.clients.jedis; -import static redis.clients.jedis.Protocol.toByteArray; -import static redis.clients.jedis.Protocol.Command.*; -import static redis.clients.jedis.Protocol.Keyword.ENCODING; -import static redis.clients.jedis.Protocol.Keyword.IDLETIME; -import static redis.clients.jedis.Protocol.Keyword.LEN; -import static redis.clients.jedis.Protocol.Keyword.LIMIT; -import static redis.clients.jedis.Protocol.Keyword.NO; -import static redis.clients.jedis.Protocol.Keyword.ONE; -import static redis.clients.jedis.Protocol.Keyword.REFCOUNT; -import static redis.clients.jedis.Protocol.Keyword.RESET; -import static redis.clients.jedis.Protocol.Keyword.STORE; -import static redis.clients.jedis.Protocol.Keyword.WITHSCORES; +import redis.clients.jedis.Protocol.Command; +import redis.clients.jedis.Protocol.Keyword; +import redis.clients.util.SafeEncoder; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import redis.clients.jedis.Protocol.Command; -import redis.clients.jedis.Protocol.Keyword; -import redis.clients.util.SafeEncoder; +import static redis.clients.jedis.Protocol.Command.*; +import static redis.clients.jedis.Protocol.Command.EXISTS; +import static redis.clients.jedis.Protocol.Command.PSUBSCRIBE; +import static redis.clients.jedis.Protocol.Command.PUNSUBSCRIBE; +import static redis.clients.jedis.Protocol.Command.SUBSCRIBE; +import static redis.clients.jedis.Protocol.Command.UNSUBSCRIBE; +import static redis.clients.jedis.Protocol.Keyword.*; +import static redis.clients.jedis.Protocol.toByteArray; public class BinaryClient extends Connection { public enum LIST_POSITION { @@ -1262,6 +1258,10 @@ public class BinaryClient extends Connection { sendCommand(PFCOUNT, key); } + public void pfcount(final byte[]...keys) { + sendCommand(PFCOUNT, keys); + } + public void pfmerge(final byte[] destkey, final byte[]... sourcekeys) { sendCommand(PFMERGE, joinParameters(destkey, sourcekeys)); } diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index f6b9529..a424528 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -1,6 +1,6 @@ package redis.clients.jedis; -import static redis.clients.jedis.Protocol.toByteArray; +import redis.clients.util.SafeEncoder; import java.util.ArrayList; import java.util.HashMap; @@ -8,7 +8,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import redis.clients.util.SafeEncoder; +import static redis.clients.jedis.Protocol.toByteArray; public class Client extends BinaryClient implements Commands { public Client(final String host) { @@ -960,6 +960,10 @@ public class Client extends BinaryClient implements Commands { pfcount(SafeEncoder.encode(key)); } + public void pfcount(final String...keys) { + pfcount(SafeEncoder.encodeMany(keys)); + } + public void pfmerge(final String destkey, final String... sourcekeys) { pfmerge(SafeEncoder.encode(destkey), SafeEncoder.encodeMany(sourcekeys)); } diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 8782fc9..29e53a2 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -1,20 +1,13 @@ package redis.clients.jedis; -import java.net.URI; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - import redis.clients.jedis.BinaryClient.LIST_POSITION; import redis.clients.util.SafeEncoder; import redis.clients.util.Slowlog; +import java.net.URI; +import java.util.*; +import java.util.Map.Entry; + public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommands, AdvancedJedisCommands, ScriptingCommands, BasicCommands, ClusterCommands { @@ -3425,6 +3418,13 @@ public class Jedis extends BinaryJedis implements JedisCommands, return client.getIntegerReply(); } + @Override + public long pfcount(String... keys) { + checkIsInMulti(); + client.pfcount(keys); + return client.getIntegerReply(); + } + public String pfmerge(final String destkey, final String... sourcekeys) { checkIsInMulti(); client.pfmerge(destkey, sourcekeys); diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index a359226..163f033 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -1,12 +1,12 @@ package redis.clients.jedis; +import redis.clients.jedis.BinaryClient.LIST_POSITION; + import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; -import redis.clients.jedis.BinaryClient.LIST_POSITION; - public class JedisCluster implements JedisCommands, BasicCommands { public static final short HASHSLOTS = 16384; private static final int DEFAULT_TIMEOUT = 1; @@ -1504,4 +1504,15 @@ public class JedisCluster implements JedisCommands, BasicCommands { }.run(key); } + @Override + public long pfcount(final String... keys) { + return new JedisClusterCommand(connectionHandler, + timeout, maxRedirections) { + @Override + public Long execute(Jedis connection) { + return connection.pfcount(keys); + } + }.run(keys[0]); + } + } diff --git a/src/main/java/redis/clients/jedis/JedisCommands.java b/src/main/java/redis/clients/jedis/JedisCommands.java index 5ce0121..52c1798 100644 --- a/src/main/java/redis/clients/jedis/JedisCommands.java +++ b/src/main/java/redis/clients/jedis/JedisCommands.java @@ -244,4 +244,6 @@ public interface JedisCommands { Long pfadd(final String key, final String... elements); long pfcount(final String key); + + long pfcount(final String...keys); } diff --git a/src/main/java/redis/clients/jedis/ShardedJedis.java b/src/main/java/redis/clients/jedis/ShardedJedis.java index 46110ad..fc78ddc 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedis.java +++ b/src/main/java/redis/clients/jedis/ShardedJedis.java @@ -1,14 +1,14 @@ 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.Map.Entry; 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); @@ -582,4 +582,11 @@ public class ShardedJedis extends BinaryShardedJedis implements JedisCommands { Jedis j = getShard(key); return j.pfcount(key); } + + @Override + public long pfcount(String... keys) { + //The command will be sent to the first shard. + Jedis j = getShard(keys[0]); + return j.pfcount(keys); + } } diff --git a/src/test/java/redis/clients/jedis/tests/commands/HyperLogLogCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/HyperLogLogCommandsTest.java index 07a5021..0b25366 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/HyperLogLogCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/HyperLogLogCommandsTest.java @@ -43,6 +43,31 @@ public class HyperLogLogCommandsTest extends JedisCommandTestBase { assertEquals(3, status); } + @Test + public void pfcounts() { + long status = jedis.pfadd("hll_1", "foo", "bar", "zap"); + assertEquals(1, status); + status = jedis.pfadd("hll_2", "foo", "bar", "zap"); + assertEquals(1, status); + + status = jedis.pfadd("hll_3", "foo", "bar", "baz"); + assertEquals(1, status); + status = jedis.pfcount("hll_1"); + assertEquals(3, status); + status = jedis.pfcount("hll_2"); + assertEquals(3, status); + status = jedis.pfcount("hll_3"); + assertEquals(3, status); + + status = jedis.pfcount("hll_1", "hll_2"); + assertEquals(3, status); + + status = jedis.pfcount("hll_1", "hll_2", "hll_3"); + assertEquals(4, status); + + + } + @Test public void pfcountBinary() { byte[] bHll = SafeEncoder.encode("hll"); From b633024c112accec48c0fb485e2fa3124ff8db48 Mon Sep 17 00:00:00 2001 From: Alok Singh Date: Mon, 28 Apr 2014 16:41:09 -0700 Subject: [PATCH 2/3] Move pfcount(keys) method to multikey interfaces --- src/main/java/redis/clients/jedis/JedisCluster.java | 12 ------------ src/main/java/redis/clients/jedis/JedisCommands.java | 1 - .../java/redis/clients/jedis/MultiKeyCommands.java | 2 ++ .../clients/jedis/MultiKeyCommandsPipeline.java | 2 ++ .../redis/clients/jedis/MultiKeyPipelineBase.java | 6 ++++++ src/main/java/redis/clients/jedis/ShardedJedis.java | 7 ------- 6 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/main/java/redis/clients/jedis/JedisCluster.java b/src/main/java/redis/clients/jedis/JedisCluster.java index 163f033..5440e56 100644 --- a/src/main/java/redis/clients/jedis/JedisCluster.java +++ b/src/main/java/redis/clients/jedis/JedisCluster.java @@ -1503,16 +1503,4 @@ public class JedisCluster implements JedisCommands, BasicCommands { } }.run(key); } - - @Override - public long pfcount(final String... keys) { - return new JedisClusterCommand(connectionHandler, - timeout, maxRedirections) { - @Override - public Long execute(Jedis connection) { - return connection.pfcount(keys); - } - }.run(keys[0]); - } - } diff --git a/src/main/java/redis/clients/jedis/JedisCommands.java b/src/main/java/redis/clients/jedis/JedisCommands.java index 52c1798..dd6d89c 100644 --- a/src/main/java/redis/clients/jedis/JedisCommands.java +++ b/src/main/java/redis/clients/jedis/JedisCommands.java @@ -245,5 +245,4 @@ public interface JedisCommands { long pfcount(final String key); - long pfcount(final String...keys); } diff --git a/src/main/java/redis/clients/jedis/MultiKeyCommands.java b/src/main/java/redis/clients/jedis/MultiKeyCommands.java index b829fca..3f91ea9 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyCommands.java +++ b/src/main/java/redis/clients/jedis/MultiKeyCommands.java @@ -81,4 +81,6 @@ public interface MultiKeyCommands { ScanResult scan(final String cursor); String pfmerge(final String destkey, final String... sourcekeys); + + long pfcount(final String...keys); } diff --git a/src/main/java/redis/clients/jedis/MultiKeyCommandsPipeline.java b/src/main/java/redis/clients/jedis/MultiKeyCommandsPipeline.java index 71f00d1..e2de238 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyCommandsPipeline.java +++ b/src/main/java/redis/clients/jedis/MultiKeyCommandsPipeline.java @@ -66,4 +66,6 @@ public interface MultiKeyCommandsPipeline { Response bitop(BitOP op, final String destKey, String... srcKeys); Response pfmerge(final String destkey, final String... sourcekeys); + + Response pfcount(final String...keys); } diff --git a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java index f5a953f..7bffd38 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java +++ b/src/main/java/redis/clients/jedis/MultiKeyPipelineBase.java @@ -458,4 +458,10 @@ abstract class MultiKeyPipelineBase extends PipelineBase implements client.pfmerge(destkey, sourcekeys); return getResponse(BuilderFactory.STRING); } + + @Override + public Response pfcount(String...keys) { + client.pfcount(keys); + return getResponse(BuilderFactory.LONG); + } } diff --git a/src/main/java/redis/clients/jedis/ShardedJedis.java b/src/main/java/redis/clients/jedis/ShardedJedis.java index fc78ddc..62a22da 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedis.java +++ b/src/main/java/redis/clients/jedis/ShardedJedis.java @@ -582,11 +582,4 @@ public class ShardedJedis extends BinaryShardedJedis implements JedisCommands { Jedis j = getShard(key); return j.pfcount(key); } - - @Override - public long pfcount(String... keys) { - //The command will be sent to the first shard. - Jedis j = getShard(keys[0]); - return j.pfcount(keys); - } } From d9d039d06087c19c68aa8c0e64bc902d150260d2 Mon Sep 17 00:00:00 2001 From: Alok Singh Date: Tue, 29 Apr 2014 08:58:15 -0700 Subject: [PATCH 3/3] Added pfcount(keys) to BinaryJedis interfaces --- src/main/java/redis/clients/jedis/BinaryJedis.java | 7 +++++++ .../java/redis/clients/jedis/MultiKeyBinaryCommands.java | 2 ++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index bed597f..9066f53 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -3438,4 +3438,11 @@ public class BinaryJedis implements BasicCommands, BinaryJedisCommands, return client.getStatusCodeReply(); } + @Override + public Long pfcount(byte[]... keys) { + checkIsInMulti(); + client.pfcount(keys); + return client.getIntegerReply(); + } + } diff --git a/src/main/java/redis/clients/jedis/MultiKeyBinaryCommands.java b/src/main/java/redis/clients/jedis/MultiKeyBinaryCommands.java index 8b54d90..186d822 100644 --- a/src/main/java/redis/clients/jedis/MultiKeyBinaryCommands.java +++ b/src/main/java/redis/clients/jedis/MultiKeyBinaryCommands.java @@ -71,4 +71,6 @@ public interface MultiKeyBinaryCommands { Long bitop(BitOP op, final byte[] destKey, byte[]... srcKeys); String pfmerge(final byte[] destkey, final byte[]... sourcekeys); + + Long pfcount(byte[]... keys); }