From db338f176ce4a952577796089e23930592e2878f Mon Sep 17 00:00:00 2001 From: kommrad homer Date: Wed, 16 Oct 2019 09:34:51 +0300 Subject: [PATCH] Impl zpopmin command (#1988) implemented zpopmin command. written a test method --- .../redis/clients/jedis/BinaryClient.java | 8 ++++ .../java/redis/clients/jedis/BinaryJedis.java | 14 ++++++ .../clients/jedis/BinaryJedisCluster.java | 20 ++++++++ .../clients/jedis/BinaryShardedJedis.java | 12 +++++ src/main/java/redis/clients/jedis/Client.java | 10 ++++ src/main/java/redis/clients/jedis/Jedis.java | 14 ++++++ .../redis/clients/jedis/PipelineBase.java | 12 +++++ .../java/redis/clients/jedis/Protocol.java | 4 +- .../redis/clients/jedis/ShardedJedis.java | 12 +++++ .../commands/BinaryJedisClusterCommands.java | 4 ++ .../jedis/commands/BinaryJedisCommands.java | 4 ++ .../clients/jedis/commands/Commands.java | 4 ++ .../clients/jedis/commands/JedisCommands.java | 4 ++ .../clients/jedis/commands/RedisPipeline.java | 4 ++ .../tests/commands/SortedSetCommandsTest.java | 46 +++++++++++++++++++ 15 files changed, 170 insertions(+), 2 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 39be157f08..84abee8e1e 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -503,6 +503,14 @@ public void zscore(final byte[] key, final byte[] member) { sendCommand(ZSCORE, key, member); } + public void zpopmin(final byte[] key) { + sendCommand(ZPOPMIN, key); + } + + public void zpopmin(final byte[] key, final long count) { + sendCommand(ZPOPMIN, key, toByteArray(count)); + } + public void multi() { sendCommand(MULTI); isInMulti = true; diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index 3a3ee572a1..c247f76a1d 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -1845,6 +1845,20 @@ public Double zscore(final byte[] key, final byte[] member) { return (score != null ? new Double(score) : null); } + @Override + public Set zpopmin(final byte[] key) { + checkIsInMultiOrPipeline(); + client.zpopmin(key); + return getTupledSet(); + } + + @Override + public Set zpopmin(final byte[] key, final long count) { + checkIsInMultiOrPipeline(); + client.zpopmin(key, count); + return getTupledSet(); + } + public Transaction multi() { client.multi(); client.getOne(); // expected OK diff --git a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java index 68d4ac7786..2bb5a7658a 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedisCluster.java +++ b/src/main/java/redis/clients/jedis/BinaryJedisCluster.java @@ -907,6 +907,26 @@ public Double execute(Jedis connection) { }.runBinary(key); } + @Override + public Set zpopmin(final byte[] key, final long count) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public Set execute(Jedis connection) { + return connection.zpopmin(key, count); + } + }.runBinary(key); + } + + @Override + public Set zpopmin(final byte[] key) { + return new JedisClusterCommand>(connectionHandler, maxAttempts) { + @Override + public Set execute(Jedis connection) { + return connection.zpopmin(key); + } + }.runBinary(key); + } + @Override public List sort(final byte[] key) { return new JedisClusterCommand>(connectionHandler, maxAttempts) { diff --git a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java index 9cd5c61829..381591a125 100644 --- a/src/main/java/redis/clients/jedis/BinaryShardedJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryShardedJedis.java @@ -538,6 +538,18 @@ public Double zscore(final byte[] key, final byte[] member) { return j.zscore(key, member); } + @Override + public Set zpopmin(final byte[] key) { + Jedis j = getShard(key); + return j.zpopmin(key); + } + + @Override + public Set zpopmin(final byte[] key, final long count) { + Jedis j = getShard(key); + return j.zpopmin(key, count); + } + @Override public List sort(final byte[] key) { Jedis j = getShard(key); diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index 20193fb911..6928d00ef2 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -465,6 +465,16 @@ public void zscore(final String key, final String member) { zscore(SafeEncoder.encode(key), SafeEncoder.encode(member)); } + @Override + public void zpopmin(final String key) { + zpopmin(SafeEncoder.encode(key)); + } + + @Override + public void zpopmin(final String key, final long count) { + zpopmin(SafeEncoder.encode(key), count); + } + @Override public void watch(final String... keys) { watch(SafeEncoder.encodeMany(keys)); diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 2353c690db..cee871abca 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -1676,6 +1676,20 @@ public Double zscore(final String key, final String member) { return BuilderFactory.DOUBLE.build(client.getOne()); } + @Override + public Set zpopmin(final String key) { + checkIsInMultiOrPipeline(); + client.zpopmin(key); + return getTupledSet(); + } + + @Override + public Set zpopmin(final String key, final long count) { + checkIsInMultiOrPipeline(); + client.zpopmin(key, count); + return getTupledSet(); + } + @Override public String watch(final String... keys) { checkIsInMultiOrPipeline(); diff --git a/src/main/java/redis/clients/jedis/PipelineBase.java b/src/main/java/redis/clients/jedis/PipelineBase.java index b2033a98b0..05502f6763 100644 --- a/src/main/java/redis/clients/jedis/PipelineBase.java +++ b/src/main/java/redis/clients/jedis/PipelineBase.java @@ -1300,6 +1300,18 @@ public Response zscore(final byte[] key, final byte[] member) { return getResponse(BuilderFactory.DOUBLE); } + @Override + public Response> zpopmin(final String key) { + getClient(key).zpopmin(key); + return getResponse(BuilderFactory.TUPLE_ZSET); + } + + @Override + public Response> zpopmin(final String key, final long count) { + getClient(key).zpopmin(key, count); + return getResponse(BuilderFactory.TUPLE_ZSET); + } + @Override public Response zlexcount(final byte[] key, final byte[] min, final byte[] max) { getClient(key).zlexcount(key, min, max); diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index 130eb3f5c3..ffea7a2a6d 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -249,8 +249,8 @@ public static enum Command implements ProtocolCommand { HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, - ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, - BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBSUB, ZCOUNT, + ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, ZPOPMIN, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, + BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBSUB, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, ZLEXCOUNT, ZRANGEBYLEX, ZREVRANGEBYLEX, ZREMRANGEBYLEX, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, diff --git a/src/main/java/redis/clients/jedis/ShardedJedis.java b/src/main/java/redis/clients/jedis/ShardedJedis.java index 21e240f576..d1424d69fc 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedis.java +++ b/src/main/java/redis/clients/jedis/ShardedJedis.java @@ -573,6 +573,18 @@ public Double zscore(final String key, final String member) { return j.zscore(key, member); } + @Override + public Set zpopmin(final String key) { + Jedis j = getShard(key); + return j.zpopmin(key); + } + + @Override + public Set zpopmin(final String key, final long count) { + Jedis j = getShard(key); + return j.zpopmin(key, count); + } + @Override public List sort(final String key) { Jedis j = getShard(key); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java b/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java index 0a54592525..49ce60308b 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryJedisClusterCommands.java @@ -179,6 +179,10 @@ public interface BinaryJedisClusterCommands { Double zscore(byte[] key, byte[] member); + Set zpopmin(byte[] key); + + Set zpopmin(byte[] key, long count); + List sort(byte[] key); List sort(byte[] key, SortingParams sortingParameters); diff --git a/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java b/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java index cff42790c4..a71f164819 100644 --- a/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java +++ b/src/main/java/redis/clients/jedis/commands/BinaryJedisCommands.java @@ -184,6 +184,10 @@ public interface BinaryJedisCommands { Double zscore(byte[] key, byte[] member); + Set zpopmin(byte[] key); + + Set zpopmin(byte[] key, long count); + List sort(byte[] key); List sort(byte[] key, SortingParams sortingParameters); diff --git a/src/main/java/redis/clients/jedis/commands/Commands.java b/src/main/java/redis/clients/jedis/commands/Commands.java index 1ca788908a..36af87239c 100644 --- a/src/main/java/redis/clients/jedis/commands/Commands.java +++ b/src/main/java/redis/clients/jedis/commands/Commands.java @@ -197,6 +197,10 @@ public interface Commands { void zscore(String key, String member); + void zpopmin(String key); + + void zpopmin(String key, long count); + void watch(String... keys); void sort(String key); diff --git a/src/main/java/redis/clients/jedis/commands/JedisCommands.java b/src/main/java/redis/clients/jedis/commands/JedisCommands.java index 52a656818d..d07bb7da35 100644 --- a/src/main/java/redis/clients/jedis/commands/JedisCommands.java +++ b/src/main/java/redis/clients/jedis/commands/JedisCommands.java @@ -187,6 +187,10 @@ public interface JedisCommands { Double zscore(String key, String member); + Set zpopmin(String key); + + Set zpopmin(String key, long count); + List sort(String key); List sort(String key, SortingParams sortingParameters); diff --git a/src/main/java/redis/clients/jedis/commands/RedisPipeline.java b/src/main/java/redis/clients/jedis/commands/RedisPipeline.java index 2155f4db09..f190d833d2 100644 --- a/src/main/java/redis/clients/jedis/commands/RedisPipeline.java +++ b/src/main/java/redis/clients/jedis/commands/RedisPipeline.java @@ -228,6 +228,10 @@ Response> zrevrangeByScoreWithScores(String key, String max, String m Response zscore(String key, String member); + Response> zpopmin(String key); + + Response> zpopmin(String key, long count); + Response zlexcount(String key, String min, String max); Response> zrangeByLex(String key, String min, String max); diff --git a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java index 98bb4221f1..624af6d87d 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/SortedSetCommandsTest.java @@ -544,6 +544,52 @@ public void zscore() { } @Test + public void zpopmin() { + + jedis.zadd("foo", 1d, "a",ZAddParams.zAddParams().nx()); + jedis.zadd("foo", 10d, "b",ZAddParams.zAddParams().nx()); + jedis.zadd("foo", 0.1d, "c",ZAddParams.zAddParams().nx()); + jedis.zadd("foo", 2d, "a",ZAddParams.zAddParams().nx()); + + Set range = jedis.zpopmin("foo", 2); + + Set expected = new LinkedHashSet(); + expected.add(new Tuple("c", 0.1d)); + expected.add(new Tuple("a", 1d)); + + assertEquals(expected, range); + + range = jedis.zpopmin("foo"); + + expected = new LinkedHashSet(); + expected.add(new Tuple("b", 10d)); + + assertEquals(expected, range); + + // Binary + + jedis.zadd(bfoo, 1d, ba); + jedis.zadd(bfoo, 10d, bb); + jedis.zadd(bfoo, 0.1d, bc); + jedis.zadd(bfoo, 2d, ba); + + Set brange = jedis.zpopmin(bfoo, 2); + + Set bexpected = new LinkedHashSet(); + bexpected.add(new Tuple(bc, 0.1d)); + bexpected.add(new Tuple(ba, 2d)); + + assertEquals(bexpected, brange); + + brange = jedis.zpopmin(bfoo); + + bexpected = new LinkedHashSet(); + bexpected.add(new Tuple(bb, 10d)); + + assertEquals(bexpected, brange); + } + + @Test public void zcount() { jedis.zadd("foo", 1d, "a"); jedis.zadd("foo", 10d, "b");