diff --git a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java index 7987ce831..e92d695d3 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java @@ -645,8 +645,8 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return result; } - public Long rPush(byte[] key, byte[] value) { - Long result = delegate.rPush(key, value); + public Long rPush(byte[] key, byte[]... values) { + Long result = delegate.rPush(key, values); if(isFutureConversion()) { addResultConverter(identityConverter); } @@ -1658,8 +1658,8 @@ public class DefaultStringRedisConnection implements StringRedisConnection { } - public Long rPush(String key, String value) { - Long result = delegate.rPush(serialize(key), serialize(value)); + public Long rPush(String key, String... values) { + Long result = delegate.rPush(serialize(key), serializeMulti(values)); if(isFutureConversion()) { addResultConverter(identityConverter); } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisListCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisListCommands.java index 0a36acee2..d300f988d 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisListCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisListCommands.java @@ -32,7 +32,7 @@ public interface RedisListCommands { BEFORE, AFTER } - Long rPush(byte[] key, byte[] value); + Long rPush(byte[] key, byte[]... values); Long lPush(byte[] key, byte[]... value); diff --git a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java index 895a45e64..e441250a2 100644 --- a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java @@ -125,7 +125,7 @@ public interface StringRedisConnection extends RedisConnection { Long strLen(String key); - Long rPush(String key, String value); + Long rPush(String key, String... values); Long lPush(String key, String... values); diff --git a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java index 792049286..c6c7c72cf 100644 --- a/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jedis/JedisConnection.java @@ -1343,17 +1343,21 @@ public class JedisConnection implements RedisConnection { } - public Long rPush(byte[] key, byte[] value) { + public Long rPush(byte[] key, byte[]... values) { + if((isPipelined() || isQueueing()) && values.length > 1) { + throw new UnsupportedOperationException("rPush of multiple fields not supported " + + "in pipeline or transaction"); + } try { if (isPipelined()) { - pipeline(new JedisResult(pipeline.rpush(key, value))); + pipeline(new JedisResult(pipeline.rpush(key, values[0]))); return null; } if (isQueueing()) { - transaction(new JedisResult(transaction.rpush(key, value))); + transaction(new JedisResult(transaction.rpush(key, values[0]))); return null; } - return jedis.rpush(key, value); + return jedis.rpush(key, values); } catch (Exception ex) { throw convertJedisAccessException(ex); } diff --git a/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java b/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java index 76d518eaa..9e0a76ac3 100644 --- a/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/jredis/JredisConnection.java @@ -747,9 +747,12 @@ public class JredisConnection implements RedisConnection { } - public Long rPush(byte[] key, byte[] value) { + public Long rPush(byte[] key, byte[]... values) { + if(values.length > 1) { + throw new UnsupportedOperationException("rPush of multiple fields not supported"); + } try { - jredis.rpush(key, value); + jredis.rpush(key, values[0]); return null; } catch (Exception ex) { throw convertJredisAccessException(ex); diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index d3a722193..de6152dbf 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -1437,17 +1437,17 @@ public class LettuceConnection implements RedisConnection { } } - public Long rPush(byte[] key, byte[] value) { + public Long rPush(byte[] key, byte[]... values) { try { if (isPipelined()) { - pipeline(new LettuceResult(getAsyncConnection().rpush(key, value))); + pipeline(new LettuceResult(getAsyncConnection().rpush(key, values))); return null; } if (isQueueing()) { - transaction(new LettuceTxResult(getConnection().rpush(key, value))); + transaction(new LettuceTxResult(getConnection().rpush(key, values))); return null; } - return getConnection().rpush(key, value); + return getConnection().rpush(key, values); } catch (Exception ex) { throw convertLettuceAccessException(ex); } diff --git a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java index 51ff10ad3..4b050e7f0 100644 --- a/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/srp/SrpConnection.java @@ -1119,13 +1119,13 @@ public class SrpConnection implements RedisConnection { } - public Long rPush(byte[] key, byte[] value) { + public Long rPush(byte[] key, byte[]... values) { try { if (isPipelined()) { - pipeline(new SrpResult(pipeline.rpush(key, new Object[] { value }))); + pipeline(new SrpResult(pipeline.rpush(key, (Object[]) values))); return null; } - return client.rpush(key, new Object[] { value }).data(); + return client.rpush(key, (Object[]) values).data(); } catch (Exception ex) { throw convertSrpAccessException(ex); } diff --git a/src/main/java/org/springframework/data/redis/core/BoundListOperations.java b/src/main/java/org/springframework/data/redis/core/BoundListOperations.java index f35520a21..afc890019 100644 --- a/src/main/java/org/springframework/data/redis/core/BoundListOperations.java +++ b/src/main/java/org/springframework/data/redis/core/BoundListOperations.java @@ -43,6 +43,8 @@ public interface BoundListOperations extends BoundKeyOperations { Long rightPush(V value); + Long rightPushAll(V... values); + Long rightPushIfPresent(V value); Long rightPush(V pivot, V value); diff --git a/src/main/java/org/springframework/data/redis/core/DefaultBoundListOperations.java b/src/main/java/org/springframework/data/redis/core/DefaultBoundListOperations.java index ca26c6622..5ddfcd8f5 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultBoundListOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultBoundListOperations.java @@ -115,7 +115,10 @@ class DefaultBoundListOperations extends DefaultBoundKeyOperations impl return ops.rightPush(getKey(), value); } - + public Long rightPushAll(V... values) { + return ops.rightPushAll(getKey(), values); + } + public Long rightPush(V pivot, V value) { return ops.rightPush(getKey(), pivot, value); } diff --git a/src/main/java/org/springframework/data/redis/core/DefaultListOperations.java b/src/main/java/org/springframework/data/redis/core/DefaultListOperations.java index 181e0a58a..a2e963dd9 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultListOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultListOperations.java @@ -178,7 +178,16 @@ class DefaultListOperations extends AbstractOperations implements Li }, true); } - + public Long rightPushAll(K key, V... values) { + final byte[] rawKey = rawKey(key); + final byte[][] rawValues = rawValues(values); + return execute(new RedisCallback() { + public Long doInRedis(RedisConnection connection) { + return connection.rPush(rawKey, rawValues); + } + }, true); + } + public Long rightPushIfPresent(K key, V value) { final byte[] rawKey = rawKey(key); final byte[] rawValue = rawValue(value); diff --git a/src/main/java/org/springframework/data/redis/core/ListOperations.java b/src/main/java/org/springframework/data/redis/core/ListOperations.java index 8048b4c40..692c9090f 100644 --- a/src/main/java/org/springframework/data/redis/core/ListOperations.java +++ b/src/main/java/org/springframework/data/redis/core/ListOperations.java @@ -41,6 +41,8 @@ public interface ListOperations { Long rightPush(K key, V value); + Long rightPushAll(K key, V... values); + Long rightPushIfPresent(K key, V value); Long rightPush(K key, V pivot, V value); diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index ff741e006..71d8ce1ba 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -1235,6 +1235,13 @@ public abstract class AbstractConnectionIntegrationTests { verifyResults(Arrays.asList(new Object[] { 1l, 2l, Arrays.asList(new String[] { "foo", "hi" }) })); } + @Test + public void testRPushMultiple() { + actual.add(connection.rPush("mylist", "hi", "foo")); + actual.add(connection.lRange("mylist", 0, -1)); + verifyResults(Arrays.asList(new Object[] { 2l, Arrays.asList(new String[] { "hi", "foo" }) })); + } + @Test public void testRPushX() { actual.add(connection.rPush("mylist", "hi")); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java index ee31653ef..42245233a 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java @@ -436,4 +436,9 @@ public class JedisConnectionPipelineIntegrationTests extends public void testLPushMultiple() { super.testLPushMultiple(); } + + @Test(expected=UnsupportedOperationException.class) + public void testRPushMultiple() { + super.testRPushMultiple(); + } } diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java index 08615fa4c..578fe1d1c 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java @@ -372,4 +372,9 @@ public class JedisConnectionTransactionIntegrationTests extends public void testLPushMultiple() { super.testLPushMultiple(); } + + @Test(expected=UnsupportedOperationException.class) + public void testRPushMultiple() { + super.testRPushMultiple(); + } } diff --git a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java index e53b2e02a..1699de23f 100644 --- a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java @@ -570,6 +570,11 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat super.testLPushMultiple(); } + @Test(expected=UnsupportedOperationException.class) + public void testRPushMultiple() { + super.testRPushMultiple(); + } + // Jredis returns null for rPush and lPush @Test public void testLLen() { diff --git a/src/test/java/org/springframework/data/redis/core/DefaultListOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultListOperationsTests.java index 85ef6ce94..0d55da8c5 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultListOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultListOperationsTests.java @@ -164,4 +164,17 @@ public class DefaultListOperationsTests { assertThat(listOps.range(key, 0, -1), isEqual(Arrays.asList(new Object[] {v1, v2}))); } + + @SuppressWarnings("unchecked") + @Test + public void testRightPushAll() { + K key = keyFactory.instance(); + V v1 = valueFactory.instance(); + V v2 = valueFactory.instance(); + V v3 = valueFactory.instance(); + assertEquals(Long.valueOf(2),listOps.rightPushAll(key, v1, v2)); + assertEquals(Long.valueOf(3),listOps.rightPush(key, v3)); + assertThat(listOps.range(key, 0, -1), + isEqual(Arrays.asList(new Object[] {v1, v2, v3}))); + } } \ No newline at end of file