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 e9704e834..f71fe0daa 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java @@ -813,8 +813,8 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return results; } - public Boolean sRem(byte[] key, byte[] value) { - Boolean result = delegate.sRem(key, value); + public Long sRem(byte[] key, byte[]... values) { + Long result = delegate.sRem(key, values); if(isFutureConversion()) { addResultConverter(identityConverter); } @@ -1829,8 +1829,8 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return byteListToStringList.convert(results); } - public Boolean sRem(String key, String value) { - Boolean result = delegate.sRem(serialize(key), serialize(value)); + public Long sRem(String key, String... values) { + Long result = delegate.sRem(serialize(key), serializeMulti(values)); if(isFutureConversion()) { addResultConverter(identityConverter); } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisSetCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisSetCommands.java index 33f31b0b5..d10ca959a 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisSetCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisSetCommands.java @@ -28,7 +28,7 @@ public interface RedisSetCommands { Long sAdd(byte[] key, byte[]... values); - Boolean sRem(byte[] key, byte[] value); + Long sRem(byte[] key, byte[]... values); byte[] sPop(byte[] key); 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 8abda3734..d27993bec 100644 --- a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java @@ -161,7 +161,7 @@ public interface StringRedisConnection extends RedisConnection { Long sAdd(String key, String... values); - Boolean sRem(String key, String value); + Long sRem(String key, String... values); String sPop(String key); 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 355ca5b80..def0e1c08 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 @@ -1826,18 +1826,21 @@ public class JedisConnection implements RedisConnection { throw new UnsupportedOperationException(); } - public Boolean sRem(byte[] key, byte[] value) { + public Long sRem(byte[] key, byte[]... values) { + if((isPipelined() || isQueueing()) && values.length > 1) { + throw new UnsupportedOperationException("sRem of multiple fields not supported " + + "in pipeline or transaction"); + } try { if (isPipelined()) { - pipeline(new JedisResult(pipeline.srem(key, value), JedisConverters.longToBoolean())); + pipeline(new JedisResult(pipeline.srem(key, values[0]))); return null; } if (isQueueing()) { - transaction(new JedisResult(transaction.srem(key, value), - JedisConverters.longToBoolean())); + transaction(new JedisResult(transaction.srem(key, values[0]))); return null; } - return JedisConverters.toBoolean(jedis.srem(key, value)); + return jedis.srem(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 77913da6d..83af1dce4 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 @@ -902,9 +902,12 @@ public class JredisConnection implements RedisConnection { } - public Boolean sRem(byte[] key, byte[] value) { + public Long sRem(byte[] key, byte[]... values) { + if(values.length > 1) { + throw new UnsupportedOperationException("sRem of multiple fields not supported"); + } try { - return jredis.srem(key, value); + return JredisUtils.toLong(jredis.srem(key, values[0])); } 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 9df531eed..a54366394 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 @@ -1907,17 +1907,17 @@ public class LettuceConnection implements RedisConnection { } } - public Boolean sRem(byte[] key, byte[] value) { + public Long sRem(byte[] key, byte[]... values) { try { if (isPipelined()) { - pipeline(new LettuceResult(getAsyncConnection().srem(key, value), LettuceConverters.longToBoolean())); + pipeline(new LettuceResult(getAsyncConnection().srem(key, values))); return null; } if (isQueueing()) { - transaction(new LettuceTxResult(getConnection().srem(key, value), LettuceConverters.longToBoolean())); + transaction(new LettuceTxResult(getConnection().srem(key, values))); return null; } - return LettuceConverters.toBoolean(getConnection().srem(key, value)); + return getConnection().srem(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 a25ca54bb..cebc11d4b 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 @@ -1489,13 +1489,13 @@ public class SrpConnection implements RedisConnection { } } - public Boolean sRem(byte[] key, byte[] value) { + public Long sRem(byte[] key, byte[]... values) { try { if (isPipelined()) { - pipeline(new SrpResult(pipeline.srem(key, new Object[] { value }), SrpConverters.longToBoolean())); + pipeline(new SrpResult(pipeline.srem(key, (Object[]) values))); return null; } - return SrpConverters.toBoolean(client.srem(key, new Object[] { value }).data()); + return client.srem(key, (Object[]) values).data(); } catch (Exception ex) { throw convertSrpAccessException(ex); } diff --git a/src/main/java/org/springframework/data/redis/core/BoundSetOperations.java b/src/main/java/org/springframework/data/redis/core/BoundSetOperations.java index fc2093d9b..29ad8611b 100644 --- a/src/main/java/org/springframework/data/redis/core/BoundSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/BoundSetOperations.java @@ -67,7 +67,7 @@ public interface BoundSetOperations extends BoundKeyOperations { List randomMembers(long count); - Boolean remove(Object o); + Long remove(Object... values); V pop(); diff --git a/src/main/java/org/springframework/data/redis/core/DefaultBoundSetOperations.java b/src/main/java/org/springframework/data/redis/core/DefaultBoundSetOperations.java index efae6da97..6d522f521 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultBoundSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultBoundSetOperations.java @@ -125,8 +125,8 @@ class DefaultBoundSetOperations extends DefaultBoundKeyOperations imple } - public Boolean remove(Object o) { - return ops.remove(getKey(), o); + public Long remove(Object... values) { + return ops.remove(getKey(), values); } diff --git a/src/main/java/org/springframework/data/redis/core/DefaultSetOperations.java b/src/main/java/org/springframework/data/redis/core/DefaultSetOperations.java index 84d0095b3..26d3fc74e 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultSetOperations.java @@ -197,13 +197,13 @@ class DefaultSetOperations extends AbstractOperations implements Set } - public Boolean remove(K key, Object o) { + public Long remove(K key, Object... values) { final byte[] rawKey = rawKey(key); - final byte[] rawValue = rawValue(o); - return execute(new RedisCallback() { + final byte[][] rawValues = rawValues(values); + return execute(new RedisCallback() { - public Boolean doInRedis(RedisConnection connection) { - return connection.sRem(rawKey, rawValue); + public Long doInRedis(RedisConnection connection) { + return connection.sRem(rawKey, rawValues); } }, true); } diff --git a/src/main/java/org/springframework/data/redis/core/SetOperations.java b/src/main/java/org/springframework/data/redis/core/SetOperations.java index 7f0342aee..214440605 100644 --- a/src/main/java/org/springframework/data/redis/core/SetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/SetOperations.java @@ -65,7 +65,7 @@ public interface SetOperations { List randomMembers(K key, long count); - Boolean remove(K key, Object o); + Long remove(K key, Object... values); V pop(K key); diff --git a/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisSet.java b/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisSet.java index 75469e547..12670ad86 100644 --- a/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisSet.java +++ b/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisSet.java @@ -170,9 +170,9 @@ public class DefaultRedisSet extends AbstractRedisCollection implements Re public boolean remove(Object o) { - Boolean result = boundSetOps.remove(o); + Long result = boundSetOps.remove(o); checkResult(result); - return result; + return result == 1; } 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 a84e32a2c..05ce13bd2 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -1426,7 +1426,19 @@ public abstract class AbstractConnectionIntegrationTests { actual.add(connection.sRem("myset", "baz")); actual.add(connection.sMembers("myset")); verifyResults( - Arrays.asList(new Object[] { 1l, 1l, true, false, + Arrays.asList(new Object[] { 1l, 1l, 1l, 0l, + new HashSet(Collections.singletonList("bar")) })); + } + + @Test + public void testSRemMultiple() { + actual.add(connection.sAdd("myset", "foo")); + actual.add(connection.sAdd("myset", "bar")); + actual.add(connection.sAdd("myset", "baz")); + actual.add(connection.sRem("myset", "foo", "nope", "baz")); + actual.add(connection.sMembers("myset")); + verifyResults( + Arrays.asList(new Object[] { 1l, 1l, 1l, 2l, new HashSet(Collections.singletonList("bar")) })); } diff --git a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTests.java b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTests.java index 5d88bd4c4..9ed382822 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTests.java @@ -877,13 +877,13 @@ public class DefaultStringRedisConnectionPipelineTests extends DefaultStringRedi @Test public void testSRemBytes() { - doReturn(Arrays.asList(new Object[] { true })).when(nativeConnection).closePipeline(); + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).closePipeline(); super.testSRemBytes(); } @Test public void testSRem() { - doReturn(Arrays.asList(new Object[] { true })).when(nativeConnection).closePipeline(); + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).closePipeline(); super.testSRem(); } diff --git a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTxTests.java b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTxTests.java index 2b708c3a8..7264ceef2 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTxTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTxTests.java @@ -845,13 +845,13 @@ public class DefaultStringRedisConnectionPipelineTxTests extends @Test public void testSRemBytes() { - doReturn(Arrays.asList(new Object[] {Arrays.asList(new Object[] { true })})).when(nativeConnection).closePipeline(); + doReturn(Arrays.asList(new Object[] {Arrays.asList(new Object[] { 1l })})).when(nativeConnection).closePipeline(); super.testSRemBytes(); } @Test public void testSRem() { - doReturn(Arrays.asList(new Object[] {Arrays.asList(new Object[] { true })})).when(nativeConnection).closePipeline(); + doReturn(Arrays.asList(new Object[] {Arrays.asList(new Object[] { 1l })})).when(nativeConnection).closePipeline(); super.testSRem(); } diff --git a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java index 49c5b7f13..d6f3a7230 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java @@ -1052,16 +1052,16 @@ public class DefaultStringRedisConnectionTests { @Test public void testSRemBytes() { - doReturn(true).when(nativeConnection).sRem(fooBytes, barBytes); + doReturn(1l).when(nativeConnection).sRem(fooBytes, barBytes); actual.add(connection.sRem(fooBytes, barBytes)); - verifyResults(Arrays.asList(new Object[] { true })); + verifyResults(Arrays.asList(new Object[] { 1l })); } @Test public void testSRem() { - doReturn(true).when(nativeConnection).sRem(fooBytes, barBytes); + doReturn(1l).when(nativeConnection).sRem(fooBytes, barBytes); actual.add(connection.sRem(foo, bar)); - verifyResults(Arrays.asList(new Object[] { true })); + verifyResults(Arrays.asList(new Object[] { 1l })); } @Test diff --git a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTxTests.java b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTxTests.java index 46aab28ea..2e2b29dd6 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTxTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTxTests.java @@ -844,13 +844,13 @@ public class DefaultStringRedisConnectionTxTests extends DefaultStringRedisConne @Test public void testSRemBytes() { - doReturn(Arrays.asList(new Object[] { true })).when(nativeConnection).exec(); + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).exec(); super.testSRemBytes(); } @Test public void testSRem() { - doReturn(Arrays.asList(new Object[] { true })).when(nativeConnection).exec(); + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).exec(); super.testSRem(); } 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 43524737d..5148374f2 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 @@ -446,4 +446,9 @@ public class JedisConnectionPipelineIntegrationTests extends public void testSAddMultiple() { super.testSAddMultiple(); } + + @Test(expected=UnsupportedOperationException.class) + public void testSRemMultiple() { + super.testSRemMultiple(); + } } 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 8a2840978..4bab49774 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 @@ -382,4 +382,9 @@ public class JedisConnectionTransactionIntegrationTests extends public void testSAddMultiple() { super.testSAddMultiple(); } + + @Test(expected=UnsupportedOperationException.class) + public void testSRemMultiple() { + super.testSRemMultiple(); + } } 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 0775022d4..03bc3a309 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 @@ -580,6 +580,11 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat super.testSAddMultiple(); } + @Test(expected=UnsupportedOperationException.class) + public void testSRemMultiple() { + super.testSRemMultiple(); + } + // Jredis returns null for rPush and lPush @Test public void testLLen() { diff --git a/src/test/java/org/springframework/data/redis/core/DefaultSetOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultSetOperationsTests.java index 3a0c96fe7..56a2c2218 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultSetOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultSetOperationsTests.java @@ -186,4 +186,17 @@ public class DefaultSetOperationsTests { expected.add(v2); assertThat(setOps.members(key), isEqual(expected)); } + + @SuppressWarnings("unchecked") + @Test + public void testRemove() { + K key = keyFactory.instance(); + V v1 = valueFactory.instance(); + V v2 = valueFactory.instance(); + V v3 = valueFactory.instance(); + V v4 = valueFactory.instance(); + setOps.add(key,v1, v2, v3); + assertEquals(Long.valueOf(2), setOps.remove(key, v1, v2, v4)); + assertThat(setOps.members(key), isEqual(Collections.singleton(v3))); + } }