diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index 8d7b0a1a8..554062172 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -399,6 +399,32 @@ public class RedissonScoredSortedSet<V> extends RedissonExpirable implements RSc return commandExecutor.writeAsync(getName(), DoubleCodec.INSTANCE, RedisCommands.ZINCRBY, getName(), new BigDecimal(value.toString()).toPlainString(), encode(object)); } + + @Override + public Integer addScoreAndGetRank(V object, Number value) { + return get(addScoreAndGetRankAsync(object, value)); + } + + @Override + public RFuture<Integer> addScoreAndGetRankAsync(V object, Number value) { + return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, + "redis.call('zincrby', KEYS[1], ARGV[1], ARGV[2]); " + +"return redis.call('zrank', KEYS[1], ARGV[2]); ", + Collections.<Object>singletonList(getName()), new BigDecimal(value.toString()).toPlainString(), encode(object)); + } + + @Override + public Integer addScoreAndGetRevRank(V object, Number value) { + return get(addScoreAndGetRevRankAsync(object, value)); + } + + @Override + public RFuture<Integer> addScoreAndGetRevRankAsync(V object, Number value) { + return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, + "redis.call('zincrby', KEYS[1], ARGV[1], ARGV[2]); " + +"return redis.call('zrevrank', KEYS[1], ARGV[2]); ", + Collections.<Object>singletonList(getName()), new BigDecimal(value.toString()).toPlainString(), encode(object)); + } @Override public Collection<V> valueRange(int startIndex, int endIndex) { diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index 633836f3a..93dff79a7 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java @@ -123,6 +123,24 @@ public interface RScoredSortedSet<V> extends RScoredSortedSetAsync<V>, Iterable< Double addScore(V object, Number value); + /** + * Adds score to element and returns its rank + * + * @param object - object itself + * @param value - object score + * @return rank + */ + Integer addScoreAndGetRank(V object, Number value); + + /** + * Adds score to element and returns its reverse rank + * + * @param object - object itself + * @param value - object score + * @return reverse rank + */ + Integer addScoreAndGetRevRank(V object, Number value); + Collection<V> valueRange(int startIndex, int endIndex); Collection<V> valueRangeReversed(int startIndex, int endIndex); diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java index c5cfbb692..e0ded4068 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -88,6 +88,24 @@ public interface RScoredSortedSetAsync<V> extends RExpirableAsync, RSortableAsyn RFuture<Double> addScoreAsync(V object, Number value); + /** + * Adds score to element and returns its reverse rank + * + * @param object - object itself + * @param value - object score + * @return reverse rank + */ + RFuture<Integer> addScoreAndGetRevRankAsync(V object, Number value); + + /** + * Adds score to element and returns its rank + * + * @param object - object itself + * @param value - object score + * @return rank + */ + RFuture<Integer> addScoreAndGetRankAsync(V object, Number value); + RFuture<Collection<V>> valueRangeAsync(int startIndex, int endIndex); RFuture<Collection<V>> valueRangeReversedAsync(int startIndex, int endIndex); diff --git a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java index e90447e83..f6432f7d2 100644 --- a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java @@ -965,6 +965,46 @@ public class RedissonScoredSortedSetTest extends BaseTest { res2 = set2.getScore("1"); Assert.assertTrue(new Double(112.3).compareTo(res2) == 0); } + + @Test + public void testAddScoreAndGetRank() throws InterruptedException { + RScoredSortedSet<String> set = redisson.getScoredSortedSet("simple"); + + Integer res1 = set.addScoreAndGetRank("12", 12); + assertThat(res1).isEqualTo(0); + Integer res2 = set.addScoreAndGetRank("15", 10); + assertThat(res2).isEqualTo(0); + + assertThat(set.rank("12")).isEqualTo(1); + assertThat(set.rank("15")).isEqualTo(0); + + Integer res3 = set.addScoreAndGetRank("12", 2); + assertThat(res3).isEqualTo(1); + Double score = set.getScore("12"); + assertThat(score).isEqualTo(14); + } + + @Test + public void testAddScoreAndGetRevRank() throws InterruptedException { + RScoredSortedSet<String> set = redisson.getScoredSortedSet("simple"); + + Integer res1 = set.addScoreAndGetRevRank("12", 12); + assertThat(res1).isEqualTo(0); + Integer res2 = set.addScoreAndGetRevRank("15", 10); + assertThat(res2).isEqualTo(1); + + assertThat(set.revRank("12")).isEqualTo(0); + assertThat(set.revRank("15")).isEqualTo(1); + + Integer res3 = set.addScoreAndGetRevRank("12", 2); + assertThat(res3).isEqualTo(0); + Integer res4 = set.addScoreAndGetRevRank("15", -1); + assertThat(res4).isEqualTo(1); + Double score = set.getScore("12"); + assertThat(score).isEqualTo(14); + } + + @Test public void testIntersection() {