diff --git a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java index 2dfaecd82..46276a37c 100644 --- a/redisson/src/main/java/org/redisson/command/CommandAsyncService.java +++ b/redisson/src/main/java/org/redisson/command/CommandAsyncService.java @@ -60,13 +60,15 @@ import io.netty.util.Timeout; import io.netty.util.TimerTask; import io.netty.util.concurrent.Future; import io.netty.util.concurrent.FutureListener; -import io.netty.util.concurrent.Promise; -import org.redisson.Redisson; -import org.redisson.RedissonReactive; +import java.util.HashMap; +import java.util.Map; import org.redisson.RedissonReference; -import org.redisson.api.RObject; import org.redisson.api.RedissonClient; import org.redisson.api.RedissonReactiveClient; +import org.redisson.client.protocol.ScoredEntry; +import org.redisson.client.protocol.decoder.ListScanResult; +import org.redisson.client.protocol.decoder.MapScanResult; +import org.redisson.client.protocol.decoder.ScanObjectEntry; import org.redisson.misc.RedissonObjectFactory; /** @@ -766,8 +768,8 @@ public class CommandAsyncService implements CommandAsyncExecutor { ((RedisClientResult)res).setRedisClient(addr); } - if (isRedissonReferenceSupportEnabled() && res instanceof List) { - List r = (List) res; + if (isRedissonReferenceSupportEnabled() && (res instanceof List || res instanceof ListScanResult)) { + List r = res instanceof ListScanResult ? ((ListScanResult)res).getValues() : (List) res; for (int i = 0; i < r.size(); i++) { if (r.get(i) instanceof RedissonReference) { try { @@ -776,9 +778,48 @@ public class CommandAsyncService implements CommandAsyncExecutor { : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) r.get(i)))); } catch (Exception exception) {//skip and carry on to next one. } + } else if (r.get(i) instanceof ScoredEntry && ((ScoredEntry) r.get(i)).getValue() instanceof RedissonReference) { + try { + ScoredEntry se = ((ScoredEntry) r.get(i)); + r.set(i ,new ScoredEntry(se.getScore(), redisson != null + ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) se.getValue()) + : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) se.getValue()))); + } catch (Exception exception) {//skip and carry on to next one. + } + } + } + details.getMainPromise().trySuccess(res); + } else if (isRedissonReferenceSupportEnabled() && (res instanceof MapScanResult)) { + Map map = ((MapScanResult)res).getMap(); + HashMap toAdd = null; + for (Map.Entry e : (Set>) map.entrySet()) { + if (e.getValue().getObj() instanceof RedissonReference) { + try { + e.setValue(new ScanObjectEntry(e.getValue().getBuf(), redisson != null + ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) e.getValue().getObj()) + : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) e.getValue().getObj()))); + } catch (Exception exception) {//skip and carry on to next one. + } + } + if (e.getKey().getObj() instanceof RedissonReference) { + if (toAdd == null) { + toAdd = new HashMap(); + } + toAdd.put(e.getKey(), e.getValue()); + } + } + if (toAdd != null) { + for (Map.Entry e : (Set>) toAdd.entrySet()) { + try { + map.put(new ScanObjectEntry(e.getValue().getBuf(), (redisson != null + ? RedissonObjectFactory.fromReference(redisson, (RedissonReference) e.getKey().getObj()) + : RedissonObjectFactory.fromReference(redissonReactive, (RedissonReference) e.getKey().getObj()))), map.remove(e.getKey())); + } catch (Exception exception) {//skip and carry on to next one. + } } } details.getMainPromise().trySuccess(res); + } else if (isRedissonReferenceSupportEnabled() && (res instanceof MapScanResult)) { } else if (isRedissonReferenceSupportEnabled() && res instanceof RedissonReference) { try { details.getMainPromise().trySuccess(redisson != null diff --git a/redisson/src/test/java/org/redisson/RedissonReferenceTest.java b/redisson/src/test/java/org/redisson/RedissonReferenceTest.java index 622db2ab1..b486f63b5 100644 --- a/redisson/src/test/java/org/redisson/RedissonReferenceTest.java +++ b/redisson/src/test/java/org/redisson/RedissonReferenceTest.java @@ -1,5 +1,6 @@ package org.redisson; +import java.util.Collection; import java.util.List; import java.util.concurrent.TimeUnit; import static org.junit.Assert.*; @@ -10,6 +11,10 @@ import org.redisson.api.RBucket; import org.redisson.api.RBucketAsync; import org.redisson.api.RBucketReactive; import org.redisson.api.RLiveObject; +import org.redisson.api.RMap; +import org.redisson.api.RScoredSortedSet; +import org.redisson.api.RSet; +import org.redisson.client.protocol.ScoredEntry; /** * @@ -84,4 +89,43 @@ public class RedissonReferenceTest extends BaseTest { assertEquals("b1", result.get(2).getName()); } + @Test + public void testWithList() { + RSet> b1 = redisson.getSet("set"); + RBucket b2 = redisson.getBucket("bucket"); + + b1.add(b2); + b2.set("test1"); + assertEquals(b2.get(), b1.iterator().next().get()); + assertEquals(2, redisson.getKeys().count()); + } + + @Test + public void testWithZSet() { + RScoredSortedSet> b1 = redisson.getScoredSortedSet("set"); + RBucket b2 = redisson.getBucket("bucket"); + b1.add(0.0, b2); + b2.set("test1"); + assertEquals(b2.get(), b1.iterator().next().get()); + assertEquals(2, redisson.getKeys().count()); + Collection>> entryRange = b1.entryRange(0, 1); + assertEquals(b2.get(), entryRange.iterator().next().getValue().get()); + } + + @Test + public void testWithMap() { + RMap, RBucket> map = redisson.getMap("set"); + RBucket b1 = redisson.getBucket("bucket1"); + RBucket b2 = redisson.getBucket("bucket2"); + + map.put(b1, b2); + assertEquals(b2.get(), map.values().iterator().next().get()); + assertEquals(b1.get(), map.keySet().iterator().next().get()); + assertNotEquals(3, redisson.getKeys().count()); + assertEquals(1, redisson.getKeys().count()); + b1.set(map); + b2.set(map); + assertNotEquals(1, redisson.getKeys().count()); + assertEquals(3, redisson.getKeys().count()); + } }