add methods to add item and get rank

pull/1032/head
Zun 8 years ago
parent 3d40e2bc0c
commit 72d929f80f

@ -118,6 +118,32 @@ public class RedissonScoredSortedSet<V> extends RedissonExpirable implements RSc
return get(addAsync(score, object)); return get(addAsync(score, object));
} }
@Override
public Integer addAndGetRank(double score, V object) {
return get(addAndGetRankAsync(score, object));
}
@Override
public RFuture<Integer> 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.<Object>singletonList(getName()), new BigDecimal(score).toPlainString(), encode(object));
}
@Override
public Integer addAndGetRevRank(double score, V object) {
return get(addAndGetRevRankAsync(score, object));
}
@Override
public RFuture<Integer> 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.<Object>singletonList(getName()), new BigDecimal(score).toPlainString(), encode(object));
}
@Override @Override
public boolean tryAdd(double score, V object) { public boolean tryAdd(double score, V object) {
return get(tryAddAsync(score, object)); return get(tryAddAsync(score, object));

@ -90,6 +90,24 @@ public interface RScoredSortedSet<V> extends RScoredSortedSetAsync<V>, Iterable<
*/ */
boolean add(double score, V object); 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. * Adds element to this set only if has not been added before.
* <p> * <p>

@ -63,6 +63,24 @@ public interface RScoredSortedSetAsync<V> extends RExpirableAsync, RSortableAsyn
*/ */
RFuture<Boolean> addAsync(double score, V object); RFuture<Boolean> 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<Integer> 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<Integer> addAndGetRevRankAsync(double score, V object);
/** /**
* Adds element to this set only if has not been added before. * Adds element to this set only if has not been added before.
* <p> * <p>

@ -389,6 +389,32 @@ public class RedissonScoredSortedSetTest extends BaseTest {
Assert.assertTrue(set.contains(2)); Assert.assertTrue(set.contains(2));
} }
@Test
public void testAddAndGetRankAsync() throws InterruptedException, ExecutionException {
RScoredSortedSet<Integer> set = redisson.getScoredSortedSet("simple");
RFuture<Integer> future = set.addAndGetRankAsync(0.3, 1);
Assert.assertEquals(new Integer(0), future.get());
RFuture<Integer> future2 = set.addAndGetRankAsync(0.4, 2);
Assert.assertEquals(new Integer(1), future2.get());
RFuture<Integer> 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<Integer> set = redisson.getScoredSortedSet("simple");
RFuture<Integer> future = set.addAndGetRevRankAsync(0.3, 1);
Assert.assertEquals(new Integer(0), future.get());
RFuture<Integer> future2 = set.addAndGetRevRankAsync(0.4, 2);
Assert.assertEquals(new Integer(0), future2.get());
RFuture<Integer> future3 = set.addAndGetRevRankAsync(0.2, 3);
Assert.assertEquals(new Integer(2), future3.get());
Assert.assertTrue(set.contains(3));
}
@Test @Test
public void testRemoveAsync() throws InterruptedException, ExecutionException { public void testRemoveAsync() throws InterruptedException, ExecutionException {
RScoredSortedSet<Integer> set = redisson.getScoredSortedSet("simple"); RScoredSortedSet<Integer> set = redisson.getScoredSortedSet("simple");

Loading…
Cancel
Save