diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index 554062172..7bd3272a5 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -118,6 +118,32 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc return get(addAsync(score, object)); } + @Override + public Integer addAndGetRank(double score, V object) { + return get(addAndGetRankAsync(score, object)); + } + + @Override + public RFuture addAndGetRankAsync(double score, V object) { + return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, + "redis.call('zadd', KEYS[1], ARGV[1], ARGV[2]);" + + "return redis.call('zrank', KEYS[1], ARGV[2]); ", + Collections.singletonList(getName()), new BigDecimal(score).toPlainString(), encode(object)); + } + + @Override + public Integer addAndGetRevRank(double score, V object) { + return get(addAndGetRevRankAsync(score, object)); + } + + @Override + public RFuture addAndGetRevRankAsync(double score, V object) { + return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, + "redis.call('zadd', KEYS[1], ARGV[1], ARGV[2]);" + + "return redis.call('zrevrank', KEYS[1], ARGV[2]); ", + Collections.singletonList(getName()), new BigDecimal(score).toPlainString(), encode(object)); + } + @Override public boolean tryAdd(double score, V object) { return get(tryAddAsync(score, object)); diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index 93dff79a7..339c046b2 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java @@ -90,6 +90,24 @@ public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable< */ boolean add(double score, V object); + /** + * Adds element to this set, overrides previous score if it has been already added. + * Finally return the rank of the item + * @param score - object score + * @param object - object itself + * @return rank + */ + Integer addAndGetRank(double score, V object); + + /** + * Adds element to this set, overrides previous score if it has been already added. + * Finally return the reverse rank of the item + * @param score - object score + * @param object - object itself + * @return reverse rank + */ + Integer addAndGetRevRank(double score, V object); + /** * Adds element to this set only if has not been added before. *

diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java index e0ded4068..481ae8159 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -63,6 +63,24 @@ public interface RScoredSortedSetAsync extends RExpirableAsync, RSortableAsyn */ RFuture addAsync(double score, V object); + /** + * Adds element to this set, overrides previous score if it has been already added. + * Finally return the rank of the item + * @param score - object score + * @param object - object itself + * @return rank + */ + RFuture addAndGetRankAsync(double score, V object); + + /** + * Adds element to this set, overrides previous score if it has been already added. + * Finally return the reverse rank of the item + * @param score - object score + * @param object - object itself + * @return reverse rank + */ + RFuture addAndGetRevRankAsync(double score, V object); + /** * Adds element to this set only if has not been added before. *

diff --git a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java index f6432f7d2..fbc23b52d 100644 --- a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java @@ -389,6 +389,32 @@ public class RedissonScoredSortedSetTest extends BaseTest { Assert.assertTrue(set.contains(2)); } + @Test + public void testAddAndGetRankAsync() throws InterruptedException, ExecutionException { + RScoredSortedSet set = redisson.getScoredSortedSet("simple"); + RFuture future = set.addAndGetRankAsync(0.3, 1); + Assert.assertEquals(new Integer(0), future.get()); + RFuture future2 = set.addAndGetRankAsync(0.4, 2); + Assert.assertEquals(new Integer(1), future2.get()); + RFuture future3 = set.addAndGetRankAsync(0.2, 3); + Assert.assertEquals(new Integer(0), future3.get()); + + Assert.assertTrue(set.contains(3)); + } + + @Test + public void testAddAndGetRevRankAsync() throws InterruptedException, ExecutionException { + RScoredSortedSet set = redisson.getScoredSortedSet("simple"); + RFuture future = set.addAndGetRevRankAsync(0.3, 1); + Assert.assertEquals(new Integer(0), future.get()); + RFuture future2 = set.addAndGetRevRankAsync(0.4, 2); + Assert.assertEquals(new Integer(0), future2.get()); + RFuture future3 = set.addAndGetRevRankAsync(0.2, 3); + Assert.assertEquals(new Integer(2), future3.get()); + + Assert.assertTrue(set.contains(3)); + } + @Test public void testRemoveAsync() throws InterruptedException, ExecutionException { RScoredSortedSet set = redisson.getScoredSortedSet("simple");