Feature - add rangeTo() method to RScoredSortedSet object #3361

pull/3384/head
Nikita Koksharov 4 years ago
parent 416a8650e2
commit c5a6d07913

@ -1304,6 +1304,40 @@ public class RedissonScoredSortedSet<V> extends RedissonExpirable implements RSc
return commandExecutor.writeAsync(getName(), codec, RedisCommands.ZDIFFSTORE_INT, args.toArray());
}
@Override
public int rangeTo(String destName, int startIndex, int endIndex) {
return get(rangeToAsync(destName, startIndex, endIndex));
}
@Override
public int rangeTo(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive) {
return get(rangeToAsync(destName, startScore, startScoreInclusive, endScore, endScoreInclusive));
}
@Override
public int rangeTo(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive, int offset, int count) {
return get(rangeToAsync(destName, startScore, startScoreInclusive, endScore, endScoreInclusive, offset, count));
}
@Override
public RFuture<Integer> rangeToAsync(String destName, int startIndex, int endIndex) {
return commandExecutor.writeAsync(getName(), codec, RedisCommands.ZRANGESTORE, destName, getName(), startIndex, endIndex);
}
@Override
public RFuture<Integer> rangeToAsync(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive) {
String startValue = value(startScore, startScoreInclusive);
String endValue = value(endScore, endScoreInclusive);
return commandExecutor.writeAsync(getName(), codec, RedisCommands.ZRANGESTORE, destName, getName(), startValue, endValue, "BYSCORE");
}
@Override
public RFuture<Integer> rangeToAsync(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive, int offset, int count) {
String startValue = value(startScore, startScoreInclusive);
String endValue = value(endScore, endScoreInclusive);
return commandExecutor.writeAsync(getName(), codec, RedisCommands.ZRANGESTORE, destName, getName(), startValue, endValue, "BYSCORE", "LIMIT", offset, count);
}
@Override
public RFuture<V> takeFirstAsync() {
return pollFirstAsync(0, TimeUnit.SECONDS);

@ -532,7 +532,57 @@ public interface RScoredSortedSet<V> extends RScoredSortedSetAsync<V>, Iterable<
* @return reverse rank
*/
Integer addScoreAndGetRevRank(V object, Number value);
/**
* Stores to defined ScoredSortedSet values by rank range. Indexes are zero based.
* <code>-1</code> means the highest score, <code>-2</code> means the second highest score.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startIndex - start index
* @param endIndex - end index
* @return elements
*/
int rangeTo(String destName, int startIndex, int endIndex);
/**
* Stores to defined ScoredSortedSet values between <code>startScore</code> and <code>endScore</code>.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startScore - start score.
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
* @param startScoreInclusive - start score inclusive
* @param endScore - end score
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
*
* @param endScoreInclusive - end score inclusive
* @return values
*/
int rangeTo(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive);
/**
* Stores to defined ScoredSortedSet values between <code>startScore</code> and <code>endScore</code>.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startScore - start score.
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
* @param startScoreInclusive - start score inclusive
* @param endScore - end score
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
*
* @param endScoreInclusive - end score inclusive
* @param offset - offset of sorted data
* @param count - amount of sorted data
* @return values
*/
int rangeTo(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive, int offset, int count);
/**
* Returns values by rank range. Indexes are zero based.
* <code>-1</code> means the highest score, <code>-2</code> means the second highest score.

@ -399,17 +399,67 @@ public interface RScoredSortedSetAsync<V> extends RExpirableAsync, RSortableAsyn
* @return rank
*/
RFuture<Integer> addScoreAndGetRankAsync(V object, Number value);
/**
* Stores to defined ScoredSortedSet values by rank range. Indexes are zero based.
* <code>-1</code> means the highest score, <code>-2</code> means the second highest score.
*
* @param startIndex - start index
* @param endIndex - end index
* @return elements
*/
RFuture<Integer> rangeToAsync(String destName, int startIndex, int endIndex);
/**
* Stores to defined ScoredSortedSet values between <code>startScore</code> and <code>endScore</code>.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startScore - start score.
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
* @param startScoreInclusive - start score inclusive
* @param endScore - end score
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
*
* @param endScoreInclusive - end score inclusive
* @return values
*/
RFuture<Integer> rangeToAsync(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive);
/**
* Stores to defined ScoredSortedSet values between <code>startScore</code> and <code>endScore</code>.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startScore - start score.
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
* @param startScoreInclusive - start score inclusive
* @param endScore - end score
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
*
* @param endScoreInclusive - end score inclusive
* @param offset - offset of sorted data
* @param count - amount of sorted data
* @return values
*/
RFuture<Integer> rangeToAsync(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive, int offset, int count);
/**
* Returns values by rank range. Indexes are zero based.
* <code>-1</code> means the highest score, <code>-2</code> means the second highest score.
*
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startIndex - start index
* @param endIndex - end index
* @return elements
*/
RFuture<Collection<V>> valueRangeAsync(int startIndex, int endIndex);
/**
* Returns values by rank range in reverse order. Indexes are zero based.
* <code>-1</code> means the highest score, <code>-2</code> means the second highest score.

@ -21,6 +21,7 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Single;
import org.redisson.api.RScoredSortedSet.Aggregate;
import org.redisson.client.protocol.ScoredEntry;
@ -617,6 +618,56 @@ public interface RScoredSortedSetReactive<V> extends RExpirableReactive, RSortab
*/
Mono<Collection<V>> readAll();
/**
* Stores to defined ScoredSortedSet values by rank range. Indexes are zero based.
* <code>-1</code> means the highest score, <code>-2</code> means the second highest score.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startIndex - start index
* @param endIndex - end index
* @return elements
*/
Mono<Integer> rangeTo(String destName, int startIndex, int endIndex);
/**
* Stores to defined ScoredSortedSet values between <code>startScore</code> and <code>endScore</code>.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startScore - start score.
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
* @param startScoreInclusive - start score inclusive
* @param endScore - end score
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
*
* @param endScoreInclusive - end score inclusive
* @return values
*/
Mono<Integer> rangeTo(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive);
/**
* Stores to defined ScoredSortedSet values between <code>startScore</code> and <code>endScore</code>.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startScore - start score.
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
* @param startScoreInclusive - start score inclusive
* @param endScore - end score
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
*
* @param endScoreInclusive - end score inclusive
* @param offset - offset of sorted data
* @param count - amount of sorted data
* @return values
*/
Mono<Integer> rangeTo(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive, int offset, int count);
/**
* Intersect provided ScoredSortedSets
* and store result to current ScoredSortedSet

@ -423,7 +423,57 @@ public interface RScoredSortedSetRx<V> extends RExpirableRx, RSortableRx<Set<V>>
* @return rank
*/
Single<Integer> addScoreAndGetRank(V object, Number value);
/**
* Stores to defined ScoredSortedSet values by rank range. Indexes are zero based.
* <code>-1</code> means the highest score, <code>-2</code> means the second highest score.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startIndex - start index
* @param endIndex - end index
* @return elements
*/
Single<Integer> rangeTo(String destName, int startIndex, int endIndex);
/**
* Stores to defined ScoredSortedSet values between <code>startScore</code> and <code>endScore</code>.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startScore - start score.
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
* @param startScoreInclusive - start score inclusive
* @param endScore - end score
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
*
* @param endScoreInclusive - end score inclusive
* @return values
*/
Single<Integer> rangeTo(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive);
/**
* Stores to defined ScoredSortedSet values between <code>startScore</code> and <code>endScore</code>.
* <p>
* Requires <b>Redis 6.2.0 and higher.</b>
*
* @param startScore - start score.
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
* @param startScoreInclusive - start score inclusive
* @param endScore - end score
* Use <code>Double.POSITIVE_INFINITY</code> or <code>Double.NEGATIVE_INFINITY</code>
* to define infinity numbers
*
* @param endScoreInclusive - end score inclusive
* @param offset - offset of sorted data
* @param count - amount of sorted data
* @return values
*/
Single<Integer> rangeTo(String destName, double startScore, boolean startScoreInclusive, double endScore, boolean endScoreInclusive, int offset, int count);
/**
* Returns values by rank range. Indexes are zero based.
* <code>-1</code> means the highest score, <code>-2</code> means the second highest score.

@ -121,6 +121,7 @@ public interface RedisCommands {
RedisCommand<Object> ZRANGE_SINGLE = new RedisCommand<Object>("ZRANGE", new ListFirstObjectDecoder());
RedisStrictCommand<Double> ZRANGE_SINGLE_SCORE = new RedisStrictCommand<Double>("ZRANGE", new ObjectFirstScoreReplayDecoder());
RedisCommand<List<Object>> ZRANGE = new RedisCommand<List<Object>>("ZRANGE", new ObjectListReplayDecoder<Object>());
RedisCommand<Integer> ZRANGESTORE = new RedisCommand<>("ZRANGESTORE", new IntegerReplayConvertor());
RedisCommand<List<Object>> ZPOPMIN = new RedisCommand<List<Object>>("ZPOPMIN", new ObjectListReplayDecoder<Object>());
RedisCommand<List<Object>> ZPOPMAX = new RedisCommand<List<Object>>("ZPOPMAX", new ObjectListReplayDecoder<Object>());
RedisStrictCommand<Integer> ZREMRANGEBYRANK = new RedisStrictCommand<Integer>("ZREMRANGEBYRANK", new IntegerReplayConvertor());

@ -1380,6 +1380,32 @@ public class RedissonScoredSortedSetTest extends BaseTest {
assertThat(out.getScore("two")).isEqualTo(10);
}
@Test
public void testRangeTo() {
RScoredSortedSet<Integer> set1 = redisson.getScoredSortedSet("simple1");
for (int i = 0; i < 10; i++) {
set1.add(i, i);
}
set1.rangeTo("simple2", 0, 3);
RScoredSortedSet<Integer> set2 = redisson.getScoredSortedSet("simple2");
assertThat(set2.readAll()).containsOnly(0, 1, 2, 3, 4);
}
@Test
public void testRangeToScored() {
RScoredSortedSet<Integer> set1 = redisson.getScoredSortedSet("simple1");
for (int i = 0; i < 10; i++) {
set1.add(i, i);
}
set1.rangeTo("simple2", 0, false, 3, true);
RScoredSortedSet<Integer> set2 = redisson.getScoredSortedSet("simple2");
assertThat(set2.readAll()).containsOnly(1, 2, 3);
}
@Test
public void testReadUnion() {
RScoredSortedSet<String> set1 = redisson.getScoredSortedSet("simple1");

Loading…
Cancel
Save