From 08726b1e0baeb137485bf25922269a8e0d1f534d Mon Sep 17 00:00:00 2001 From: Nikita Date: Sat, 3 Dec 2016 12:03:07 +0300 Subject: [PATCH] RSet.removeRandom with elements amount added. #720 --- .../src/main/java/org/redisson/RedissonSet.java | 10 ++++++++++ .../src/main/java/org/redisson/api/RSet.java | 8 ++++++++ .../main/java/org/redisson/api/RSetAsync.java | 9 +++++++++ .../redisson/client/protocol/RedisCommands.java | 1 + .../test/java/org/redisson/RedissonSetTest.java | 17 +++++++++++++++++ 5 files changed, 45 insertions(+) diff --git a/redisson/src/main/java/org/redisson/RedissonSet.java b/redisson/src/main/java/org/redisson/RedissonSet.java index 6bda92d72..d84db3b7f 100644 --- a/redisson/src/main/java/org/redisson/RedissonSet.java +++ b/redisson/src/main/java/org/redisson/RedissonSet.java @@ -143,6 +143,16 @@ public class RedissonSet extends RedissonExpirable implements RSet { return commandExecutor.writeAsync(getName(), codec, RedisCommands.SPOP_SINGLE, getName()); } + @Override + public Set removeRandom(int amount) { + return get(removeRandomAsync(amount)); + } + + @Override + public RFuture> removeRandomAsync(int amount) { + return commandExecutor.writeAsync(getName(), codec, RedisCommands.SPOP, getName(), amount); + } + @Override public V random() { return get(randomAsync()); diff --git a/redisson/src/main/java/org/redisson/api/RSet.java b/redisson/src/main/java/org/redisson/api/RSet.java index f8e42c01b..3c5d3ab71 100644 --- a/redisson/src/main/java/org/redisson/api/RSet.java +++ b/redisson/src/main/java/org/redisson/api/RSet.java @@ -26,6 +26,14 @@ import java.util.Set; */ public interface RSet extends Set, RExpirable, RSetAsync { + /** + * Removes and returns random elements from set + * + * @param amount of random values + * @return random values + */ + Set removeRandom(int amount); + /** * Removes and returns random element from set * diff --git a/redisson/src/main/java/org/redisson/api/RSetAsync.java b/redisson/src/main/java/org/redisson/api/RSetAsync.java index 9e8c0fd56..cf7876000 100644 --- a/redisson/src/main/java/org/redisson/api/RSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RSetAsync.java @@ -26,6 +26,15 @@ import java.util.Set; */ public interface RSetAsync extends RCollectionAsync { + /** + * Removes and returns random elements from set + * in async mode + * + * @param amount of random values + * @return random values + */ + RFuture> removeRandomAsync(int amount); + /** * Removes and returns random element from set * in async mode diff --git a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java index 2a4fbd99e..7135acd1e 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -136,6 +136,7 @@ public interface RedisCommands { RedisCommand SADD_BOOL = new RedisCommand("SADD", new BooleanAmountReplayConvertor(), 2, ValueType.OBJECTS); RedisStrictCommand SADD = new RedisStrictCommand("SADD", 2, ValueType.OBJECTS); + RedisCommand> SPOP = new RedisCommand>("SPOP", new ObjectSetReplayDecoder()); RedisCommand SPOP_SINGLE = new RedisCommand("SPOP"); RedisCommand SADD_SINGLE = new RedisCommand("SADD", new BooleanReplayConvertor(), 2); RedisCommand SREM_SINGLE = new RedisCommand("SREM", new BooleanAmountReplayConvertor(), 2, ValueType.OBJECTS); diff --git a/redisson/src/test/java/org/redisson/RedissonSetTest.java b/redisson/src/test/java/org/redisson/RedissonSetTest.java index 5a26005cd..0d7794368 100644 --- a/redisson/src/test/java/org/redisson/RedissonSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonSetTest.java @@ -43,6 +43,23 @@ public class RedissonSetTest extends BaseTest { assertThat(set.removeRandom()).isIn(1, 2, 3); assertThat(set.removeRandom()).isNull(); } + + @Test + public void testRemoveRandomAmount() { + RSet set = redisson.getSet("simple"); + set.add(1); + set.add(2); + set.add(3); + set.add(4); + set.add(5); + set.add(6); + + assertThat(set.removeRandom(3)).isSubsetOf(1, 2, 3, 4, 5, 6).hasSize(3); + assertThat(set.removeRandom(2)).isSubsetOf(1, 2, 3, 4, 5, 6).hasSize(2); + assertThat(set.removeRandom(1)).isSubsetOf(1, 2, 3, 4, 5, 6).hasSize(1); + assertThat(set.removeRandom(4)).isEmpty(); + } + @Test public void testRandom() {