From 72d929f80fcfe3c49076c9fd07e179b91f972be8 Mon Sep 17 00:00:00 2001 From: Zun Date: Wed, 6 Sep 2017 15:03:00 +0300 Subject: [PATCH 1/2] add methods to add item and get rank --- .../org/redisson/RedissonScoredSortedSet.java | 26 +++++++++++++++++++ .../org/redisson/api/RScoredSortedSet.java | 18 +++++++++++++ .../redisson/api/RScoredSortedSetAsync.java | 18 +++++++++++++ .../redisson/RedissonScoredSortedSetTest.java | 26 +++++++++++++++++++ 4 files changed, 88 insertions(+) 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..9d11544e3 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 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..a7c8dcfdf 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 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"); From d451c4ecb4ae18353212d9a89bd23884c481ad2a Mon Sep 17 00:00:00 2001 From: Zun Date: Wed, 6 Sep 2017 15:11:47 +0300 Subject: [PATCH 2/2] fix java doc --- redisson/src/main/java/org/redisson/api/RScoredSortedSet.java | 2 +- .../src/main/java/org/redisson/api/RScoredSortedSetAsync.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index 9d11544e3..339c046b2 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java @@ -104,7 +104,7 @@ public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable< * Finally return the reverse rank of the item * @param score - object score * @param object - object itself - * @return rank + * @return reverse rank */ Integer addAndGetRevRank(double score, V object); diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java index a7c8dcfdf..481ae8159 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -77,7 +77,7 @@ public interface RScoredSortedSetAsync extends RExpirableAsync, RSortableAsyn * Finally return the reverse rank of the item * @param score - object score * @param object - object itself - * @return rank + * @return reverse rank */ RFuture addAndGetRevRankAsync(double score, V object);