From 46113235607b7559b85536abf8c2737a56fa7d26 Mon Sep 17 00:00:00 2001 From: Johno Crawford Date: Mon, 17 Aug 2020 12:52:06 +0200 Subject: [PATCH 1/6] Add multi member / batch methods to scored sorted set. Signed-off-by: Johno Crawford --- .../org/redisson/RedissonScoredSortedSet.java | 75 +++++++++++++++---- .../org/redisson/api/RScoredSortedSet.java | 17 +++++ .../redisson/api/RScoredSortedSetAsync.java | 16 ++++ .../api/RScoredSortedSetReactive.java | 18 ++++- .../org/redisson/api/RScoredSortedSetRx.java | 16 ++++ .../redisson/RedissonScoredSortedSetTest.java | 27 +++++++ 6 files changed, 154 insertions(+), 15 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index baa1ece95..a5afb2045 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -15,20 +15,6 @@ */ package org.redisson; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; -import java.util.stream.Stream; - import org.redisson.api.RFuture; import org.redisson.api.RScoredSortedSet; import org.redisson.api.RedissonClient; @@ -48,6 +34,20 @@ import org.redisson.iterator.RedissonBaseIterator; import org.redisson.mapreduce.RedissonCollectionMapReduce; import org.redisson.misc.RedissonPromise; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; +import java.util.stream.Stream; + /** * * @author Nikita Koksharov @@ -204,6 +204,11 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc return get(addAndGetRevRankAsync(score, object)); } + @Override + public Collection addAndGetAllRevRank(Map map) { + return get(addAndGetAllRevRankAsync(map)); + } + @Override public RFuture addAndGetRevRankAsync(double score, V object) { return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_INTEGER, @@ -212,6 +217,32 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc Collections.singletonList(getName()), new BigDecimal(score).toPlainString(), encode(object)); } + @Override + public RFuture> addAndGetAllRevRankAsync(Map map) { + final List params = new ArrayList(map.size() * 2); + for (java.util.Map.Entry t : map.entrySet()) { + if (t.getKey() == null) { + throw new NullPointerException("map key can't be null"); + } + if (t.getValue() == null) { + throw new NullPointerException("map value can't be null"); + } + params.add(encode(t.getKey())); + params.add(BigDecimal.valueOf(t.getValue()).toPlainString()); + } + + return commandExecutor.evalReadAsync((String) null, LongCodec.INSTANCE, RedisCommands.EVAL_LIST, + "local r = {} " + + "for i, v in ipairs(ARGV) do " + + "if i % 2 == 0 then " + + "redis.call('zadd', KEYS[1], ARGV[i], ARGV[i-1]); " + + "r[#r+1] = redis.call('zrevrank', KEYS[1], ARGV[i-1]); " + + "end; " + + "end;" + + "return r;", + Collections.singletonList(getName()), params.toArray()); + } + @Override public boolean tryAdd(double score, V object) { return get(tryAddAsync(score, object)); @@ -372,11 +403,27 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc return get(getScoreAsync(o)); } + @Override + public Collection getAllScore(List keys) { + return get(getAllScoreAsync(keys)); + } + @Override public RFuture getScoreAsync(V o) { return commandExecutor.readAsync(getName(), StringCodec.INSTANCE, RedisCommands.ZSCORE, getName(), encode(o)); } + @Override + public RFuture> getAllScoreAsync(Collection elements) { + return commandExecutor.evalReadAsync((String) null, DoubleCodec.INSTANCE, RedisCommands.EVAL_LIST, + "local r = {} " + + "for i, v in ipairs(ARGV) do " + + "r[#r+1] = redis.call('ZSCORE', KEYS[1], ARGV[i]); " + + "end;" + + "return r;", + Collections.singletonList(getName()), encode(elements).toArray()); + } + @Override public Integer rank(V o) { return get(rankAsync(o)); diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index d1179f01d..a61032923 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.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -263,6 +264,14 @@ public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable< */ Double getScore(V o); + /** + * Returns scores of elements. + * + * @param elements - elements + * @return element scores + */ + Collection getAllScore(List elements); + /** * Adds element to this set, overrides previous score if it has been already added. * @@ -290,6 +299,14 @@ public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable< */ Integer addAndGetRevRank(double score, V object); + /** + * Adds elements to this set, overrides previous score if it has been already added. + * Finally returns reverse rank collection of the items + * @param map - map of object and scores, make sure to use an ordered map + * @return collection of reverse ranks + */ + Collection addAndGetAllRevRank(Map map); + /** * 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 db312dc4e..8313da0d3 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -223,6 +223,14 @@ public interface RScoredSortedSetAsync extends RExpirableAsync, RSortableAsyn */ RFuture getScoreAsync(V o); + /** + * Returns scores of elements. + * + * @param elements - elements + * @return element scores + */ + RFuture> getAllScoreAsync(Collection elements); + /** * Adds element to this set, overrides previous score if it has been already added. * @@ -250,6 +258,14 @@ public interface RScoredSortedSetAsync extends RExpirableAsync, RSortableAsyn */ RFuture addAndGetRevRankAsync(double score, V object); + /** + * Adds elements to this set, overrides previous score if it has been already added. + * Finally returns reverse rank collection of the items + * @param map - map of object and scores, make sure to use an ordered map + * @return collection of reverse ranks + */ + RFuture> addAndGetAllRevRankAsync(Map map); + /** * Adds element to this set only if has not been added before. *

diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java index 1257914c2..c6626174c 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java @@ -235,6 +235,14 @@ public interface RScoredSortedSetReactive extends RExpirableReactive, RSortab */ Mono getScore(V o); + /** + * Returns scores of elements. + * + * @param elements - elements + * @return element scores + */ + Mono> getAllScore(Collection elements); + /** * Adds element to this set, overrides previous score if it has been already added. * @@ -272,7 +280,15 @@ public interface RScoredSortedSetReactive extends RExpirableReactive, RSortab * @return reverse rank */ Mono addAndGetRevRank(double score, V object); - + + /** + * Adds elements to this set, overrides previous score if it has been already added. + * Finally returns reverse rank collection of the items + * @param map - map of object and scores, make sure to use an ordered map + * @return collection of reverse ranks + */ + Mono> addAndGetAllRevRank(Map map); + /** * Adds element to this set only if has not been added before. *

diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java index 53c8479f1..7f0903c1c 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java @@ -236,6 +236,14 @@ public interface RScoredSortedSetRx extends RExpirableRx, RSortableRx> */ Maybe getScore(V o); + /** + * Returns scores of elements. + * + * @param elements - elements + * @return element scores + */ + Maybe> getAllScore(Collection elements); + /** * Adds element to this set, overrides previous score if it has been already added. * @@ -273,6 +281,14 @@ public interface RScoredSortedSetRx extends RExpirableRx, RSortableRx> * @return reverse rank */ Single addAndGetRevRank(double score, V object); + + /** + * Adds elements to this set, overrides previous score if it has been already added. + * Finally returns reverse rank collection of the items + * @param map - map of object and scores, make sure to use an ordered map + * @return collection of reverse ranks + */ + Single> addAndGetAllRevRank(Map map); /** * 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 3c1056cd5..40073763d 100644 --- a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java @@ -7,6 +7,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.SortedSet; @@ -1226,6 +1227,21 @@ public class RedissonScoredSortedSetTest extends BaseTest { res2 = set2.getScore("1"); Assert.assertTrue(new Double(112.3).compareTo(res2) == 0); } + + @Test + public void testAddAndGetAll() throws InterruptedException { + RScoredSortedSet set = redisson.getScoredSortedSet("simple"); + set.add(100.2, "1"); + + Double res2 = set.addScore("1", new Double(12.1)); + Assert.assertTrue(new Double(112.3).compareTo(res2) == 0); + res2 = set.getScore("1"); + Assert.assertTrue(new Double(112.3).compareTo(res2) == 0); + + Collection res = set.getAllScore(Arrays.asList("1", "42", "100")); + Assert.assertArrayEquals(new Double[] {112.3d, null, null}, + res.toArray()); + } @Test public void testAddScoreAndGetRank() throws InterruptedException { @@ -1265,7 +1281,18 @@ public class RedissonScoredSortedSetTest extends BaseTest { assertThat(score).isEqualTo(14); } + @Test + public void testAddAndGetAllRevRank() throws InterruptedException { + RScoredSortedSet set = redisson.getScoredSortedSet("simple"); + Map map = new LinkedHashMap<>(); + map.put("alice", 10d); + map.put("bob", 1d); + Collection res = set.addAndGetAllRevRank(map); + Assert.assertArrayEquals(new Long[]{0L, 1L}, res.toArray()); + assertThat(set.revRank("alice")).isEqualTo(0); + assertThat(set.revRank("bob")).isEqualTo(1); + } @Test public void testIntersection() { From f8c4200f10347a25c28a569877284452412a5582 Mon Sep 17 00:00:00 2001 From: Johno Crawford Date: Tue, 18 Aug 2020 02:59:53 +0200 Subject: [PATCH 2/6] Force integer for results of collection. Signed-off-by: Johno Crawford --- .../org/redisson/RedissonScoredSortedSet.java | 7 +++-- .../org/redisson/api/RScoredSortedSet.java | 2 +- .../redisson/api/RScoredSortedSetAsync.java | 2 +- .../api/RScoredSortedSetReactive.java | 2 +- .../org/redisson/api/RScoredSortedSetRx.java | 2 +- .../client/protocol/RedisCommands.java | 28 +++++++++++++------ .../redisson/RedissonScoredSortedSetTest.java | 6 ++-- 7 files changed, 31 insertions(+), 18 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index a5afb2045..04149f0f8 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -23,6 +23,7 @@ import org.redisson.api.mapreduce.RCollectionMapReduce; import org.redisson.client.RedisClient; import org.redisson.client.codec.Codec; import org.redisson.client.codec.DoubleCodec; +import org.redisson.client.codec.IntegerCodec; import org.redisson.client.codec.LongCodec; import org.redisson.client.codec.StringCodec; import org.redisson.client.protocol.RedisCommand; @@ -205,7 +206,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc } @Override - public Collection addAndGetAllRevRank(Map map) { + public Collection addAndGetAllRevRank(Map map) { return get(addAndGetAllRevRankAsync(map)); } @@ -218,7 +219,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc } @Override - public RFuture> addAndGetAllRevRankAsync(Map map) { + public RFuture> addAndGetAllRevRankAsync(Map map) { final List params = new ArrayList(map.size() * 2); for (java.util.Map.Entry t : map.entrySet()) { if (t.getKey() == null) { @@ -231,7 +232,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc params.add(BigDecimal.valueOf(t.getValue()).toPlainString()); } - return commandExecutor.evalReadAsync((String) null, LongCodec.INSTANCE, RedisCommands.EVAL_LIST, + return commandExecutor.evalReadAsync((String) null, IntegerCodec.INSTANCE, RedisCommands.EVAL_INT_LIST, "local r = {} " + "for i, v in ipairs(ARGV) do " + "if i % 2 == 0 then " + diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index a61032923..60fdcbb6a 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java @@ -305,7 +305,7 @@ public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable< * @param map - map of object and scores, make sure to use an ordered map * @return collection of reverse ranks */ - Collection addAndGetAllRevRank(Map map); + Collection addAndGetAllRevRank(Map map); /** * 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 8313da0d3..6060ae2ec 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -264,7 +264,7 @@ public interface RScoredSortedSetAsync extends RExpirableAsync, RSortableAsyn * @param map - map of object and scores, make sure to use an ordered map * @return collection of reverse ranks */ - RFuture> addAndGetAllRevRankAsync(Map map); + RFuture> addAndGetAllRevRankAsync(Map map); /** * Adds element to this set only if has not been added before. diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java index c6626174c..ad795010c 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java @@ -287,7 +287,7 @@ public interface RScoredSortedSetReactive extends RExpirableReactive, RSortab * @param map - map of object and scores, make sure to use an ordered map * @return collection of reverse ranks */ - Mono> addAndGetAllRevRank(Map map); + Mono> addAndGetAllRevRank(Map map); /** * Adds element to this set only if has not been added before. diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java index 7f0903c1c..c890e5d7d 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java @@ -288,7 +288,7 @@ public interface RScoredSortedSetRx extends RExpirableRx, RSortableRx> * @param map - map of object and scores, make sure to use an ordered map * @return collection of reverse ranks */ - Single> addAndGetAllRevRank(Map map); + Single> addAndGetAllRevRank(Map map); /** * Adds element to this set only if has not been added before. diff --git a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java index 44825b3c1..cefccbff4 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -15,14 +15,6 @@ */ package org.redisson.client.protocol; -import java.net.InetSocketAddress; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - import org.redisson.api.RType; import org.redisson.api.StreamInfo; import org.redisson.api.StreamMessageId; @@ -35,6 +27,7 @@ import org.redisson.client.protocol.convertor.BooleanNullReplayConvertor; import org.redisson.client.protocol.convertor.BooleanNullSafeReplayConvertor; import org.redisson.client.protocol.convertor.BooleanNumberReplayConvertor; import org.redisson.client.protocol.convertor.BooleanReplayConvertor; +import org.redisson.client.protocol.convertor.Convertor; import org.redisson.client.protocol.convertor.DoubleNullSafeReplayConvertor; import org.redisson.client.protocol.convertor.DoubleReplayConvertor; import org.redisson.client.protocol.convertor.IntegerReplayConvertor; @@ -49,6 +42,14 @@ import org.redisson.client.protocol.decoder.*; import org.redisson.client.protocol.pubsub.PubSubStatusDecoder; import org.redisson.cluster.ClusterNodeInfo; +import java.net.InetSocketAddress; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + /** * * @author Nikita Koksharov @@ -225,6 +226,17 @@ public interface RedisCommands { RedisStrictCommand EVAL_VOID = new RedisStrictCommand("EVAL", new VoidReplayConvertor()); RedisCommand EVAL_FIRST_LIST = new RedisCommand("EVAL", new ListFirstObjectDecoder()); RedisCommand> EVAL_LIST = new RedisCommand>("EVAL", new ObjectListReplayDecoder()); + RedisCommand> EVAL_INT_LIST = new RedisCommand("EVAL", new ObjectListReplayDecoder(), new Convertor() { + private final Integer nullValue = null; + + @Override + public Integer convert(Object obj) { + if (obj == null) { + return nullValue; + } + return ((Long) obj).intValue(); + } + }); RedisCommand> EVAL_SET = new RedisCommand>("EVAL", new ObjectSetReplayDecoder()); RedisCommand EVAL_OBJECT = new RedisCommand("EVAL"); RedisCommand EVAL_MAP_VALUE = new RedisCommand("EVAL", ValueType.MAP_VALUE); diff --git a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java index 40073763d..a9d8fa79c 100644 --- a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java @@ -1283,12 +1283,12 @@ public class RedissonScoredSortedSetTest extends BaseTest { @Test public void testAddAndGetAllRevRank() throws InterruptedException { - RScoredSortedSet set = redisson.getScoredSortedSet("simple"); + RScoredSortedSet set = redisson.getScoredSortedSet("simple", StringCodec.INSTANCE); Map map = new LinkedHashMap<>(); map.put("alice", 10d); map.put("bob", 1d); - Collection res = set.addAndGetAllRevRank(map); - Assert.assertArrayEquals(new Long[]{0L, 1L}, res.toArray()); + Collection res = set.addAndGetAllRevRank(map); + Assert.assertArrayEquals(new Integer[]{0, 1}, res.toArray()); assertThat(set.revRank("alice")).isEqualTo(0); assertThat(set.revRank("bob")).isEqualTo(1); From 72c0ef0e191b64375f2dc4f96eeb8b20423e7694 Mon Sep 17 00:00:00 2001 From: Johno Crawford Date: Wed, 19 Aug 2020 22:17:22 +0200 Subject: [PATCH 3/6] zadd all elements then collect revrank. Signed-off-by: Johno Crawford --- .../java/org/redisson/RedissonScoredSortedSet.java | 8 ++++++-- .../main/java/org/redisson/api/RScoredSortedSet.java | 4 ++-- .../java/org/redisson/api/RScoredSortedSetAsync.java | 5 +++-- .../org/redisson/api/RScoredSortedSetReactive.java | 5 +++-- .../java/org/redisson/api/RScoredSortedSetRx.java | 5 +++-- .../org/redisson/RedissonScoredSortedSetTest.java | 12 +++++++----- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index 04149f0f8..27517fb70 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -206,7 +206,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc } @Override - public Collection addAndGetAllRevRank(Map map) { + public List addAndGetAllRevRank(Map map) { return get(addAndGetAllRevRankAsync(map)); } @@ -219,7 +219,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc } @Override - public RFuture> addAndGetAllRevRankAsync(Map map) { + public RFuture> addAndGetAllRevRankAsync(Map map) { final List params = new ArrayList(map.size() * 2); for (java.util.Map.Entry t : map.entrySet()) { if (t.getKey() == null) { @@ -237,6 +237,10 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc "for i, v in ipairs(ARGV) do " + "if i % 2 == 0 then " + "redis.call('zadd', KEYS[1], ARGV[i], ARGV[i-1]); " + + "end; " + + "end;" + + "for i, v in ipairs(ARGV) do " + + "if i % 2 == 0 then " + "r[#r+1] = redis.call('zrevrank', KEYS[1], ARGV[i-1]); " + "end; " + "end;" + diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index a463b8764..021e4d98e 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java @@ -300,11 +300,11 @@ public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable< /** * Adds elements to this set, overrides previous score if it has been already added. - * Finally returns reverse rank collection of the items + * Finally returns reverse rank list of the items * @param map - map of object and scores, make sure to use an ordered map * @return collection of reverse ranks */ - Collection addAndGetAllRevRank(Map map); + List addAndGetAllRevRank(Map map); /** * 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 60cae5091..a82ba5c6b 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -16,6 +16,7 @@ package org.redisson.api; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -260,11 +261,11 @@ public interface RScoredSortedSetAsync extends RExpirableAsync, RSortableAsyn /** * Adds elements to this set, overrides previous score if it has been already added. - * Finally returns reverse rank collection of the items + * Finally returns reverse rank list of the items * @param map - map of object and scores, make sure to use an ordered map * @return collection of reverse ranks */ - RFuture> addAndGetAllRevRankAsync(Map map); + RFuture> addAndGetAllRevRankAsync(Map map); /** * Adds element to this set only if has not been added before. diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java index 98561b45b..e2122a904 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java @@ -16,6 +16,7 @@ package org.redisson.api; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -283,11 +284,11 @@ public interface RScoredSortedSetReactive extends RExpirableReactive, RSortab /** * Adds elements to this set, overrides previous score if it has been already added. - * Finally returns reverse rank collection of the items + * Finally returns reverse rank list of the items * @param map - map of object and scores, make sure to use an ordered map * @return collection of reverse ranks */ - Mono> addAndGetAllRevRank(Map map); + Mono> addAndGetAllRevRank(Map map); /** * Adds element to this set only if has not been added before. diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java index 66a4f5089..54d723bdd 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java @@ -16,6 +16,7 @@ package org.redisson.api; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -284,11 +285,11 @@ public interface RScoredSortedSetRx extends RExpirableRx, RSortableRx> /** * Adds elements to this set, overrides previous score if it has been already added. - * Finally returns reverse rank collection of the items + * Finally returns reverse rank list of the items * @param map - map of object and scores, make sure to use an ordered map * @return collection of reverse ranks */ - Single> addAndGetAllRevRank(Map map); + Single> addAndGetAllRevRank(Map map); /** * 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 a9d8fa79c..00ab7b4ac 100644 --- a/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java +++ b/redisson/src/test/java/org/redisson/RedissonScoredSortedSetTest.java @@ -1285,13 +1285,15 @@ public class RedissonScoredSortedSetTest extends BaseTest { public void testAddAndGetAllRevRank() throws InterruptedException { RScoredSortedSet set = redisson.getScoredSortedSet("simple", StringCodec.INSTANCE); Map map = new LinkedHashMap<>(); - map.put("alice", 10d); - map.put("bob", 1d); + map.put("one", 1d); + map.put("three", 3d); + map.put("two", 2d); Collection res = set.addAndGetAllRevRank(map); - Assert.assertArrayEquals(new Integer[]{0, 1}, res.toArray()); + Assert.assertArrayEquals(new Integer[]{2, 0, 1}, res.toArray()); - assertThat(set.revRank("alice")).isEqualTo(0); - assertThat(set.revRank("bob")).isEqualTo(1); + assertThat(set.revRank("one")).isEqualTo(2); + assertThat(set.revRank("two")).isEqualTo(1); + assertThat(set.revRank("three")).isEqualTo(0); } @Test From c1ff36399093795c9024cfb08724ea3c499330ab Mon Sep 17 00:00:00 2001 From: Johno Crawford Date: Wed, 19 Aug 2020 22:20:20 +0200 Subject: [PATCH 4/6] return list type to allow accessing array by index. Signed-off-by: Johno Crawford --- .../src/main/java/org/redisson/RedissonScoredSortedSet.java | 4 ++-- redisson/src/main/java/org/redisson/api/RScoredSortedSet.java | 2 +- .../src/main/java/org/redisson/api/RScoredSortedSetAsync.java | 2 +- .../main/java/org/redisson/api/RScoredSortedSetReactive.java | 2 +- .../src/main/java/org/redisson/api/RScoredSortedSetRx.java | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java index 27517fb70..2b2608e42 100644 --- a/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/RedissonScoredSortedSet.java @@ -409,7 +409,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc } @Override - public Collection getAllScore(List keys) { + public List getAllScore(List keys) { return get(getAllScoreAsync(keys)); } @@ -419,7 +419,7 @@ public class RedissonScoredSortedSet extends RedissonExpirable implements RSc } @Override - public RFuture> getAllScoreAsync(Collection elements) { + public RFuture> getAllScoreAsync(Collection elements) { return commandExecutor.evalReadAsync((String) null, DoubleCodec.INSTANCE, RedisCommands.EVAL_LIST, "local r = {} " + "for i, v in ipairs(ARGV) do " + diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java index 021e4d98e..cec190009 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSet.java @@ -269,7 +269,7 @@ public interface RScoredSortedSet extends RScoredSortedSetAsync, Iterable< * @param elements - elements * @return element scores */ - Collection getAllScore(List elements); + List getAllScore(List elements); /** * Adds element to this set, overrides previous score if it has been already added. diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java index a82ba5c6b..2ae10eb1a 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetAsync.java @@ -230,7 +230,7 @@ public interface RScoredSortedSetAsync extends RExpirableAsync, RSortableAsyn * @param elements - elements * @return element scores */ - RFuture> getAllScoreAsync(Collection elements); + RFuture> getAllScoreAsync(Collection elements); /** * Adds element to this set, overrides previous score if it has been already added. diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java index e2122a904..4bea58935 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetReactive.java @@ -242,7 +242,7 @@ public interface RScoredSortedSetReactive extends RExpirableReactive, RSortab * @param elements - elements * @return element scores */ - Mono> getAllScore(Collection elements); + Mono> getAllScore(Collection elements); /** * Adds element to this set, overrides previous score if it has been already added. diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java index 54d723bdd..d045db9b9 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java @@ -243,7 +243,7 @@ public interface RScoredSortedSetRx extends RExpirableRx, RSortableRx> * @param elements - elements * @return element scores */ - Maybe> getAllScore(Collection elements); + Maybe> getAllScore(Collection elements); /** * Adds element to this set, overrides previous score if it has been already added. From 69887976e027ed1f54773cc295ccbeb10790ae74 Mon Sep 17 00:00:00 2001 From: Johno Crawford Date: Thu, 20 Aug 2020 16:49:52 +0200 Subject: [PATCH 5/6] Use IntegerReplayConvertor. Signed-off-by: Johno Crawford --- .../org/redisson/client/protocol/RedisCommands.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java index d6e3e1c93..f091a8bf6 100644 --- a/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java +++ b/redisson/src/main/java/org/redisson/client/protocol/RedisCommands.java @@ -28,7 +28,6 @@ import org.redisson.client.protocol.convertor.BooleanNullSafeReplayConvertor; import org.redisson.client.protocol.convertor.BooleanNumberReplayConvertor; import org.redisson.client.protocol.convertor.BooleanReplayConvertor; import org.redisson.client.protocol.convertor.ByteReplayConvertor; -import org.redisson.client.protocol.convertor.Convertor; import org.redisson.client.protocol.convertor.DoubleNullSafeReplayConvertor; import org.redisson.client.protocol.convertor.DoubleReplayConvertor; import org.redisson.client.protocol.convertor.IntegerReplayConvertor; @@ -273,17 +272,7 @@ public interface RedisCommands { RedisCommand EVAL_FIRST_LIST = new RedisCommand("EVAL", new ListFirstObjectDecoder()); RedisCommand> EVAL_LIST = new RedisCommand>("EVAL", new ObjectListReplayDecoder()); RedisCommand> EVAL_LIST_REVERSE = new RedisCommand>("EVAL", new ObjectListReplayDecoder<>(true)); - RedisCommand> EVAL_INT_LIST = new RedisCommand("EVAL", new ObjectListReplayDecoder(), new Convertor() { - private final Integer nullValue = null; - - @Override - public Integer convert(Object obj) { - if (obj == null) { - return nullValue; - } - return ((Long) obj).intValue(); - } - }); + RedisCommand> EVAL_INT_LIST = new RedisCommand("EVAL", new ObjectListReplayDecoder(), new IntegerReplayConvertor()); RedisCommand> EVAL_SET = new RedisCommand>("EVAL", new ObjectSetReplayDecoder()); RedisCommand EVAL_OBJECT = new RedisCommand("EVAL"); RedisCommand EVAL_MAP_VALUE = new RedisCommand("EVAL", ValueType.MAP_VALUE); From 9228b393f283976e86863917f23aa2a88ff35d3e Mon Sep 17 00:00:00 2001 From: Johno Crawford Date: Thu, 20 Aug 2020 17:09:41 +0200 Subject: [PATCH 6/6] Use single. Signed-off-by: Johno Crawford --- redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java index d045db9b9..a4d999cdb 100644 --- a/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java +++ b/redisson/src/main/java/org/redisson/api/RScoredSortedSetRx.java @@ -243,7 +243,7 @@ public interface RScoredSortedSetRx extends RExpirableRx, RSortableRx> * @param elements - elements * @return element scores */ - Maybe> getAllScore(Collection elements); + Single> getAllScore(Collection elements); /** * Adds element to this set, overrides previous score if it has been already added.