Merge pull request #627 from aloksingh/hll-pfcount-with-multiple-keys

Add support for pfcount with multiple keys
This commit is contained in:
Jungtaek Lim
2014-04-30 06:54:22 +09:00
12 changed files with 82 additions and 34 deletions

View File

@@ -1,26 +1,22 @@
package redis.clients.jedis; package redis.clients.jedis;
import static redis.clients.jedis.Protocol.toByteArray; import redis.clients.jedis.Protocol.Command;
import static redis.clients.jedis.Protocol.Command.*; import redis.clients.jedis.Protocol.Keyword;
import static redis.clients.jedis.Protocol.Keyword.ENCODING; import redis.clients.util.SafeEncoder;
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 java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import redis.clients.jedis.Protocol.Command; import static redis.clients.jedis.Protocol.Command.*;
import redis.clients.jedis.Protocol.Keyword; import static redis.clients.jedis.Protocol.Command.EXISTS;
import redis.clients.util.SafeEncoder; 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 class BinaryClient extends Connection {
public enum LIST_POSITION { public enum LIST_POSITION {
@@ -1262,6 +1258,10 @@ public class BinaryClient extends Connection {
sendCommand(PFCOUNT, key); sendCommand(PFCOUNT, key);
} }
public void pfcount(final byte[]...keys) {
sendCommand(PFCOUNT, keys);
}
public void pfmerge(final byte[] destkey, final byte[]... sourcekeys) { public void pfmerge(final byte[] destkey, final byte[]... sourcekeys) {
sendCommand(PFMERGE, joinParameters(destkey, sourcekeys)); sendCommand(PFMERGE, joinParameters(destkey, sourcekeys));
} }

View File

@@ -3438,4 +3438,11 @@ public class BinaryJedis implements BasicCommands, BinaryJedisCommands,
return client.getStatusCodeReply(); return client.getStatusCodeReply();
} }
@Override
public Long pfcount(byte[]... keys) {
checkIsInMulti();
client.pfcount(keys);
return client.getIntegerReply();
}
} }

View File

@@ -1,6 +1,6 @@
package redis.clients.jedis; package redis.clients.jedis;
import static redis.clients.jedis.Protocol.toByteArray; import redis.clients.util.SafeEncoder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@@ -8,7 +8,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; 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 class Client extends BinaryClient implements Commands {
public Client(final String host) { public Client(final String host) {
@@ -960,6 +960,10 @@ public class Client extends BinaryClient implements Commands {
pfcount(SafeEncoder.encode(key)); pfcount(SafeEncoder.encode(key));
} }
public void pfcount(final String...keys) {
pfcount(SafeEncoder.encodeMany(keys));
}
public void pfmerge(final String destkey, final String... sourcekeys) { public void pfmerge(final String destkey, final String... sourcekeys) {
pfmerge(SafeEncoder.encode(destkey), SafeEncoder.encodeMany(sourcekeys)); pfmerge(SafeEncoder.encode(destkey), SafeEncoder.encodeMany(sourcekeys));
} }

View File

@@ -1,20 +1,13 @@
package redis.clients.jedis; 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.jedis.BinaryClient.LIST_POSITION;
import redis.clients.util.SafeEncoder; import redis.clients.util.SafeEncoder;
import redis.clients.util.Slowlog; import redis.clients.util.Slowlog;
import java.net.URI;
import java.util.*;
import java.util.Map.Entry;
public class Jedis extends BinaryJedis implements JedisCommands, public class Jedis extends BinaryJedis implements JedisCommands,
MultiKeyCommands, AdvancedJedisCommands, ScriptingCommands, MultiKeyCommands, AdvancedJedisCommands, ScriptingCommands,
BasicCommands, ClusterCommands { BasicCommands, ClusterCommands {
@@ -3425,6 +3418,13 @@ public class Jedis extends BinaryJedis implements JedisCommands,
return client.getIntegerReply(); 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) { public String pfmerge(final String destkey, final String... sourcekeys) {
checkIsInMulti(); checkIsInMulti();
client.pfmerge(destkey, sourcekeys); client.pfmerge(destkey, sourcekeys);

View File

@@ -1,12 +1,12 @@
package redis.clients.jedis; package redis.clients.jedis;
import redis.clients.jedis.BinaryClient.LIST_POSITION;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import redis.clients.jedis.BinaryClient.LIST_POSITION;
public class JedisCluster implements JedisCommands, BasicCommands { public class JedisCluster implements JedisCommands, BasicCommands {
public static final short HASHSLOTS = 16384; public static final short HASHSLOTS = 16384;
private static final int DEFAULT_TIMEOUT = 1; private static final int DEFAULT_TIMEOUT = 1;
@@ -1503,5 +1503,4 @@ public class JedisCluster implements JedisCommands, BasicCommands {
} }
}.run(key); }.run(key);
} }
} }

View File

@@ -244,4 +244,5 @@ public interface JedisCommands {
Long pfadd(final String key, final String... elements); Long pfadd(final String key, final String... elements);
long pfcount(final String key); long pfcount(final String key);
} }

View File

@@ -71,4 +71,6 @@ public interface MultiKeyBinaryCommands {
Long bitop(BitOP op, final byte[] destKey, byte[]... srcKeys); Long bitop(BitOP op, final byte[] destKey, byte[]... srcKeys);
String pfmerge(final byte[] destkey, final byte[]... sourcekeys); String pfmerge(final byte[] destkey, final byte[]... sourcekeys);
Long pfcount(byte[]... keys);
} }

View File

@@ -81,4 +81,6 @@ public interface MultiKeyCommands {
ScanResult<String> scan(final String cursor); ScanResult<String> scan(final String cursor);
String pfmerge(final String destkey, final String... sourcekeys); String pfmerge(final String destkey, final String... sourcekeys);
long pfcount(final String...keys);
} }

View File

@@ -66,4 +66,6 @@ public interface MultiKeyCommandsPipeline {
Response<Long> bitop(BitOP op, final String destKey, String... srcKeys); Response<Long> bitop(BitOP op, final String destKey, String... srcKeys);
Response<String> pfmerge(final String destkey, final String... sourcekeys); Response<String> pfmerge(final String destkey, final String... sourcekeys);
Response<Long> pfcount(final String...keys);
} }

View File

@@ -458,4 +458,10 @@ abstract class MultiKeyPipelineBase extends PipelineBase implements
client.pfmerge(destkey, sourcekeys); client.pfmerge(destkey, sourcekeys);
return getResponse(BuilderFactory.STRING); return getResponse(BuilderFactory.STRING);
} }
@Override
public Response<Long> pfcount(String...keys) {
client.pfcount(keys);
return getResponse(BuilderFactory.LONG);
}
} }

View File

@@ -1,14 +1,14 @@
package redis.clients.jedis; package redis.clients.jedis;
import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.util.Hashing;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import java.util.regex.Pattern; 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 class ShardedJedis extends BinaryShardedJedis implements JedisCommands {
public ShardedJedis(List<JedisShardInfo> shards) { public ShardedJedis(List<JedisShardInfo> shards) {
super(shards); super(shards);

View File

@@ -43,6 +43,31 @@ public class HyperLogLogCommandsTest extends JedisCommandTestBase {
assertEquals(3, status); 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 @Test
public void pfcountBinary() { public void pfcountBinary() {
byte[] bHll = SafeEncoder.encode("hll"); byte[] bHll = SafeEncoder.encode("hll");