diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index 21d39c465..771483f56 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -25,10 +25,12 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Map.Entry; import org.redisson.api.RFuture; import org.redisson.api.RScoredSortedSet; +import org.redisson.api.SortOrder; import org.redisson.client.codec.Codec; import org.redisson.client.codec.DoubleCodec; import org.redisson.client.codec.LongCodec; @@ -41,6 +43,12 @@ import org.redisson.client.protocol.convertor.BooleanReplayConvertor; import org.redisson.client.protocol.decoder.ListScanResult; import org.redisson.command.CommandAsyncExecutor; +/** + * + * @author Nikita Koksharov + * + * @param value type + */ public class RedissonScoredSortedSet extends RedissonExpirable implements RScoredSortedSet { public RedissonScoredSortedSet(CommandAsyncExecutor commandExecutor, String name) { @@ -627,5 +635,168 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc return commandExecutor.writeAsync(getName(), LongCodec.INSTANCE, RedisCommands.ZUNIONSTORE_INT, args.toArray()); } + @Override + public Set readSort(SortOrder order) { + return get(readSortAsync(order)); + } + + @Override + public RFuture> readSortAsync(SortOrder order) { + return commandExecutor.readAsync(getName(), codec, RedisCommands.SORT_SET, getName(), order); + } + + @Override + public Set readSort(SortOrder order, int offset, int count) { + return get(readSortAsync(order, offset, count)); + } + + @Override + public RFuture> readSortAsync(SortOrder order, int offset, int count) { + return commandExecutor.readAsync(getName(), codec, RedisCommands.SORT_SET, getName(), "LIMIT", offset, count, order); + } + + @Override + public Set readSort(String byPattern, SortOrder order) { + return get(readSortAsync(byPattern, order)); + } + + @Override + public RFuture> readSortAsync(String byPattern, SortOrder order) { + return commandExecutor.readAsync(getName(), codec, RedisCommands.SORT_SET, getName(), "BY", byPattern, order); + } + + @Override + public Set readSort(String byPattern, SortOrder order, int offset, int count) { + return get(readSortAsync(byPattern, order, offset, count)); + } + + @Override + public RFuture> readSortAsync(String byPattern, SortOrder order, int offset, int count) { + return commandExecutor.readAsync(getName(), codec, RedisCommands.SORT_SET, getName(), "BY", byPattern, "LIMIT", offset, count, order); + } + + @Override + public Collection readSort(String byPattern, List getPatterns, SortOrder order) { + return (Collection)get(readSortAsync(byPattern, getPatterns, order)); + } + + @Override + public RFuture> readSortAsync(String byPattern, List getPatterns, SortOrder order) { + return readSortAsync(byPattern, getPatterns, order, -1, -1); + } + + @Override + public Collection readSort(String byPattern, List getPatterns, SortOrder order, int offset, int count) { + return (Collection)get(readSortAsync(byPattern, getPatterns, order, offset, count)); + } + + @Override + public RFuture> readSortAsync(String byPattern, List getPatterns, SortOrder order, int offset, int count) { + List params = new ArrayList(); + params.add(getName()); + if (byPattern != null) { + params.add("BY"); + params.add(byPattern); + } + if (offset != -1 && count != -1) { + params.add("LIMIT"); + } + if (offset != -1) { + params.add(offset); + } + if (count != -1) { + params.add(count); + } + for (String pattern : getPatterns) { + params.add("GET"); + params.add(pattern); + } + params.add(order); + + return commandExecutor.readAsync(getName(), codec, RedisCommands.SORT_SET, params.toArray()); + } + + @Override + public int sortTo(String destName, SortOrder order) { + return get(sortToAsync(destName, order)); + } + + @Override + public RFuture sortToAsync(String destName, SortOrder order) { + return sortToAsync(destName, null, Collections.emptyList(), order, -1, -1); + } + + @Override + public int sortTo(String destName, SortOrder order, int offset, int count) { + return get(sortToAsync(destName, order, offset, count)); + } + + @Override + public RFuture sortToAsync(String destName, SortOrder order, int offset, int count) { + return sortToAsync(destName, null, Collections.emptyList(), order, offset, count); + } + + @Override + public int sortTo(String destName, String byPattern, SortOrder order, int offset, int count) { + return get(sortToAsync(destName, byPattern, order, offset, count)); + } + + @Override + public int sortTo(String destName, String byPattern, SortOrder order) { + return get(sortToAsync(destName, byPattern, order)); + } + + @Override + public RFuture sortToAsync(String destName, String byPattern, SortOrder order) { + return sortToAsync(destName, byPattern, Collections.emptyList(), order, -1, -1); + } + + @Override + public RFuture sortToAsync(String destName, String byPattern, SortOrder order, int offset, int count) { + return sortToAsync(destName, byPattern, Collections.emptyList(), order, offset, count); + } + + @Override + public int sortTo(String destName, String byPattern, List getPatterns, SortOrder order) { + return get(sortToAsync(destName, byPattern, getPatterns, order)); + } + + @Override + public RFuture sortToAsync(String destName, String byPattern, List getPatterns, SortOrder order) { + return sortToAsync(destName, byPattern, getPatterns, order, -1, -1); + } + + @Override + public int sortTo(String destName, String byPattern, List getPatterns, SortOrder order, int offset, int count) { + return get(sortToAsync(destName, byPattern, getPatterns, order, offset, count)); + } + + @Override + public RFuture sortToAsync(String destName, String byPattern, List getPatterns, SortOrder order, int offset, int count) { + List params = new ArrayList(); + params.add(getName()); + if (byPattern != null) { + params.add("BY"); + params.add(byPattern); + } + if (offset != -1 && count != -1) { + params.add("LIMIT"); + } + if (offset != -1) { + params.add(offset); + } + if (count != -1) { + params.add(count); + } + for (String pattern : getPatterns) { + params.add("GET"); + params.add(pattern); + } + params.add(order); + params.add("STORE"); + params.add(destName); + + return commandExecutor.writeAsync(getName(), codec, RedisCommands.SORT_TO, params.toArray()); + } } diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index 978ea14df..c6a2884a4 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java @@ -17,6 +17,7 @@ package org.redisson.api; import java.util.Collection; import java.util.Map; +import java.util.Set; import org.redisson.client.protocol.ScoredEntry; @@ -26,7 +27,7 @@ import org.redisson.client.protocol.ScoredEntry; * * @param value */ -public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable, RExpirable { +public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable, RExpirable, RSortable> { public enum Aggregate { diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java index 6288b9cc4..1f2d761b8 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -17,6 +17,7 @@ package org.redisson.api; import java.util.Collection; import java.util.Map; +import java.util.Set; import org.redisson.api.RScoredSortedSet.Aggregate; import org.redisson.client.protocol.ScoredEntry; @@ -27,7 +28,7 @@ import org.redisson.client.protocol.ScoredEntry; * * @param value */ -public interface RScoredSortedSetAsync extends RExpirableAsync { +public interface RScoredSortedSetAsync extends RExpirableAsync, RSortableAsync> { RFuture pollLastAsync(); diff --git a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java index 181f431da..0d9317848 100644 --- a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java @@ -18,12 +18,178 @@ import org.junit.Assume; import org.junit.Test; import org.redisson.api.RFuture; import org.redisson.api.RLexSortedSet; +import org.redisson.api.RList; import org.redisson.api.RScoredSortedSet; import org.redisson.api.RSortedSet; +import org.redisson.api.SortOrder; +import org.redisson.client.codec.IntegerCodec; +import org.redisson.client.codec.StringCodec; import org.redisson.client.protocol.ScoredEntry; public class RedissonScoredSortedSetTest extends BaseTest { + @Test + public void testSortOrder() { + RScoredSortedSet set = redisson.getScoredSortedSet("list", IntegerCodec.INSTANCE); + set.add(10, 1); + set.add(9, 2); + set.add(8, 3); + + Set descSort = set.readSort(SortOrder.DESC); + assertThat(descSort).containsExactly(3, 2, 1); + + Set ascSort = set.readSort(SortOrder.ASC); + assertThat(ascSort).containsExactly(1, 2, 3); + } + + @Test + public void testSortOrderLimit() { + RScoredSortedSet set = redisson.getScoredSortedSet("list", IntegerCodec.INSTANCE); + set.add(10, 1); + set.add(9, 2); + set.add(8, 3); + + Set descSort = set.readSort(SortOrder.DESC, 1, 2); + assertThat(descSort).containsExactly(2, 1); + + Set ascSort = set.readSort(SortOrder.ASC, 1, 2); + assertThat(ascSort).containsExactly(2, 3); + } + + @Test + public void testSortOrderByPattern() { + RScoredSortedSet set = redisson.getScoredSortedSet("list", IntegerCodec.INSTANCE); + set.add(10, 1); + set.add(9, 2); + set.add(8, 3); + + redisson.getBucket("test1", IntegerCodec.INSTANCE).set(3); + redisson.getBucket("test2", IntegerCodec.INSTANCE).set(2); + redisson.getBucket("test3", IntegerCodec.INSTANCE).set(1); + + Set descSort = set.readSort("test*", SortOrder.DESC); + assertThat(descSort).containsExactly(1, 2, 3); + + Set ascSort = set.readSort("test*", SortOrder.ASC); + assertThat(ascSort).containsExactly(3, 2, 1); + } + + @Test + public void testSortOrderByPatternLimit() { + RScoredSortedSet set = redisson.getScoredSortedSet("list", IntegerCodec.INSTANCE); + set.add(10, 1); + set.add(9, 2); + set.add(8, 3); + + redisson.getBucket("test1", IntegerCodec.INSTANCE).set(3); + redisson.getBucket("test2", IntegerCodec.INSTANCE).set(2); + redisson.getBucket("test3", IntegerCodec.INSTANCE).set(1); + + Set descSort = set.readSort("test*", SortOrder.DESC, 1, 2); + assertThat(descSort).containsExactly(2, 3); + + Set ascSort = set.readSort("test*", SortOrder.ASC, 1, 2); + assertThat(ascSort).containsExactly(2, 1); + } + + @Test + public void testSortOrderByPatternGet() { + RScoredSortedSet set = redisson.getScoredSortedSet("list", StringCodec.INSTANCE); + set.add(10, 1); + set.add(9, 2); + set.add(8, 3); + + redisson.getBucket("test1", IntegerCodec.INSTANCE).set(1); + redisson.getBucket("test2", IntegerCodec.INSTANCE).set(2); + redisson.getBucket("test3", IntegerCodec.INSTANCE).set(3); + + redisson.getBucket("tester1", StringCodec.INSTANCE).set("obj1"); + redisson.getBucket("tester2", StringCodec.INSTANCE).set("obj2"); + redisson.getBucket("tester3", StringCodec.INSTANCE).set("obj3"); + + Collection descSort = set.readSort("test*", Arrays.asList("tester*"), SortOrder.DESC); + assertThat(descSort).containsExactly("obj3", "obj2", "obj1"); + + Collection ascSort = set.readSort("test*", Arrays.asList("tester*"), SortOrder.ASC); + assertThat(ascSort).containsExactly("obj1", "obj2", "obj3"); + } + + @Test + public void testSortOrderByPatternGetLimit() { + RScoredSortedSet set = redisson.getScoredSortedSet("list", StringCodec.INSTANCE); + set.add(10, 1); + set.add(9, 2); + set.add(8, 3); + + redisson.getBucket("test1", IntegerCodec.INSTANCE).set(1); + redisson.getBucket("test2", IntegerCodec.INSTANCE).set(2); + redisson.getBucket("test3", IntegerCodec.INSTANCE).set(3); + + redisson.getBucket("tester1", StringCodec.INSTANCE).set("obj1"); + redisson.getBucket("tester2", StringCodec.INSTANCE).set("obj2"); + redisson.getBucket("tester3", StringCodec.INSTANCE).set("obj3"); + + Collection descSort = set.readSort("test*", Arrays.asList("tester*"), SortOrder.DESC, 1, 2); + assertThat(descSort).containsExactly("obj2", "obj1"); + + Collection ascSort = set.readSort("test*", Arrays.asList("tester*"), SortOrder.ASC, 1, 2); + assertThat(ascSort).containsExactly("obj2", "obj3"); + } + + @Test + public void testSortTo() { + RScoredSortedSet set = redisson.getScoredSortedSet("list", IntegerCodec.INSTANCE); + set.add(10, 1); + set.add(9, 2); + set.add(8, 3); + + assertThat(set.sortTo("test3", SortOrder.DESC)).isEqualTo(3); + RList list2 = redisson.getList("test3", StringCodec.INSTANCE); + assertThat(list2).containsExactly("3", "2", "1"); + + assertThat(set.sortTo("test4", SortOrder.ASC)).isEqualTo(3); + RList list3 = redisson.getList("test4", StringCodec.INSTANCE); + assertThat(list3).containsExactly("1", "2", "3"); + + } + + @Test + public void testSortToLimit() { + RScoredSortedSet set = redisson.getScoredSortedSet("list", IntegerCodec.INSTANCE); + set.add(10, 1); + set.add(9, 2); + set.add(8, 3); + + assertThat(set.sortTo("test3", SortOrder.DESC, 1, 2)).isEqualTo(2); + RList list2 = redisson.getList("test3", StringCodec.INSTANCE); + assertThat(list2).containsExactly("2", "1"); + + assertThat(set.sortTo("test4", SortOrder.ASC, 1, 2)).isEqualTo(2); + RList list3 = redisson.getList("test4", StringCodec.INSTANCE); + assertThat(list3).containsExactly("2", "3"); + } + + @Test + public void testSortToByPattern() { + RScoredSortedSet set = redisson.getScoredSortedSet("list", IntegerCodec.INSTANCE); + set.add(10, 1); + set.add(9, 2); + set.add(8, 3); + + redisson.getBucket("test1", IntegerCodec.INSTANCE).set(3); + redisson.getBucket("test2", IntegerCodec.INSTANCE).set(2); + redisson.getBucket("test3", IntegerCodec.INSTANCE).set(1); + + assertThat(set.sortTo("tester3", "test*", SortOrder.DESC, 1, 2)).isEqualTo(2); + RList list2 = redisson.getList("tester3", StringCodec.INSTANCE); + assertThat(list2).containsExactly("2", "3"); + + assertThat(set.sortTo("tester4", "test*", SortOrder.ASC, 1, 2)).isEqualTo(2); + RList list3 = redisson.getList("tester4", StringCodec.INSTANCE); + assertThat(list3).containsExactly("2", "1"); + } + + @Test public void testCount() { RScoredSortedSet set = redisson.getScoredSortedSet("simple");