diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterKeyCommands.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterKeyCommands.java index ab83a7f31..49c8fe02c 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterKeyCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisClusterKeyCommands.java @@ -48,7 +48,6 @@ import org.springframework.data.redis.core.ScanIteration; import org.springframework.data.redis.core.ScanOptions; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; /** @@ -431,23 +430,19 @@ class JedisClusterKeyCommands implements RedisKeyCommands { Assert.notNull(key, "Key must not be null"); - List sorted = sort(key, params); - if (!CollectionUtils.isEmpty(sorted)) { - - byte[][] arr = new byte[sorted.size()][]; - switch (type(key)) { - - case SET: - connection.setCommands().sAdd(storeKey, sorted.toArray(arr)); - return 1L; - case LIST: - connection.listCommands().lPush(storeKey, sorted.toArray(arr)); - return 1L; - default: - throw new IllegalArgumentException("sort and store is only supported for SET and LIST"); + if (ClusterSlotHashUtil.isSameSlotForAllKeys(key, storeKey)) { + try { + return connection.getCluster().sort(key, JedisConverters.toSortingParams(params), storeKey); + } catch (Exception ex) { + throw convertJedisAccessException(ex); } } - return 0L; + + List sorted = sort(key, params); + byte[][] arr = new byte[sorted.size()][]; + connection.keyCommands().unlink(storeKey); + connection.listCommands().lPush(storeKey, sorted.toArray(arr)); + return (long) sorted.size(); } @Nullable diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyCommands.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyCommands.java index 899b04ce2..cdd493d2d 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyCommands.java @@ -34,7 +34,6 @@ import org.springframework.data.redis.core.ScanCursor; import org.springframework.data.redis.core.ScanOptions; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; /** * @author Christoph Strobl @@ -198,21 +197,9 @@ class LettuceClusterKeyCommands extends LettuceKeyCommands { } List sorted = sort(key, params); - if (!CollectionUtils.isEmpty(sorted)) { - - byte[][] arr = new byte[sorted.size()][]; - switch (type(key)) { - - case SET: - connection.setCommands().sAdd(storeKey, sorted.toArray(arr)); - return 1L; - case LIST: - connection.listCommands().lPush(storeKey, sorted.toArray(arr)); - return 1L; - default: - throw new IllegalArgumentException("sort and store is only supported for SET and LIST"); - } - } - return 0L; + byte[][] arr = new byte[sorted.size()][]; + connection.keyCommands().unlink(storeKey); + connection.listCommands().lPush(storeKey, sorted.toArray(arr)); + return (long) sorted.size(); } } diff --git a/src/test/java/org/springframework/data/redis/connection/ClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/ClusterConnectionTests.java index 5d9dcae34..d7abc39ab 100644 --- a/src/test/java/org/springframework/data/redis/connection/ClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/ClusterConnectionTests.java @@ -599,8 +599,8 @@ public interface ClusterConnectionTests { // DATAREDIS-315 void sortAndStoreShouldAddSortedValuesValuesCorrectly(); - // DATAREDIS-315 - void sortAndStoreShouldReturnZeroWhenListDoesNotExist(); + // DATAREDIS-315, GH-2341 + void sortAndStoreShouldReplaceDestinationList(); // DATAREDIS-315 void sortShouldReturnValuesCorrectly(); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java index bc4d80b49..bb12f72a9 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisClusterConnectionTests.java @@ -2031,13 +2031,18 @@ public class JedisClusterConnectionTests implements ClusterConnectionTests { nativeConnection.lpush(KEY_1, VALUE_2, VALUE_1); - assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha(), KEY_2_BYTES)).isEqualTo(1L); + assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha(), KEY_2_BYTES)).isEqualTo(2L); assertThat(nativeConnection.exists(KEY_2_BYTES)).isTrue(); } - @Test // DATAREDIS-315 - public void sortAndStoreShouldReturnZeroWhenListDoesNotExist() { - assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha(), KEY_2_BYTES)).isEqualTo(0L); + @Test // DATAREDIS-315, GH-2341 + public void sortAndStoreShouldReplaceDestinationList() { + + nativeConnection.lpush(KEY_1, VALUE_2, VALUE_1); + nativeConnection.lpush(KEY_2_BYTES, VALUE_3_BYTES); + + assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha(), KEY_2_BYTES)).isEqualTo(2L); + assertThat(nativeConnection.llen(KEY_2_BYTES)).isEqualTo(2); } @Test // DATAREDIS-315 diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java index da2621a71..dce5b42fa 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionTests.java @@ -2064,13 +2064,18 @@ public class LettuceClusterConnectionTests implements ClusterConnectionTests { nativeConnection.lpush(KEY_1, VALUE_2, VALUE_1); - assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha(), KEY_2_BYTES)).isEqualTo(1L); + assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha(), KEY_2_BYTES)).isEqualTo(2L); assertThat(nativeConnection.exists(KEY_2)).isEqualTo(1L); } - @Test // DATAREDIS-315 - public void sortAndStoreShouldReturnZeroWhenListDoesNotExist() { - assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha(), KEY_2_BYTES)).isEqualTo(0L); + @Test // DATAREDIS-315, GH-2341 + public void sortAndStoreShouldReplaceDestinationList() { + + nativeConnection.lpush(KEY_1, VALUE_2, VALUE_1); + nativeConnection.lpush(KEY_2, VALUE_3); + + assertThat(clusterConnection.sort(KEY_1_BYTES, new DefaultSortParameters().alpha(), KEY_2_BYTES)).isEqualTo(2L); + assertThat(nativeConnection.llen(KEY_2)).isEqualTo(2); } @Test // DATAREDIS-315