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 f4715c5f2..0a493e170 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java @@ -1048,8 +1048,8 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return result; } - public Boolean zRem(byte[] key, byte[] value) { - Boolean result = delegate.zRem(key, value); + public Long zRem(byte[] key, byte[]... values) { + Long result = delegate.zRem(key, values); if(isFutureConversion()) { addResultConverter(identityConverter); } @@ -2050,8 +2050,8 @@ public class DefaultStringRedisConnection implements StringRedisConnection { } - public Boolean zRem(String key, String value) { - Boolean result = delegate.zRem(serialize(key), serialize(value)); + public Long zRem(String key, String... values) { + Long result = delegate.zRem(serialize(key), serializeMulti(values)); if(isFutureConversion()) { addResultConverter(identityConverter); } diff --git a/src/main/java/org/springframework/data/redis/connection/RedisZSetCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisZSetCommands.java index 632720f6c..8652d596a 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisZSetCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisZSetCommands.java @@ -46,7 +46,7 @@ public interface RedisZSetCommands { Long zAdd(byte[] key, Set tuples); - Boolean zRem(byte[] key, byte[] value); + Long zRem(byte[] key, byte[]... values); Double zIncrBy(byte[] key, double increment, 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 eb4722753..2db7cc660 100644 --- a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java @@ -193,7 +193,7 @@ public interface StringRedisConnection extends RedisConnection { Long zAdd(String key, Set tuples); - Boolean zRem(String key, String value); + Long zRem(String key, String... values); Double zIncrBy(String key, double increment, String value); 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 b5b5e5ea5..e51c7bcaf 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 @@ -2209,17 +2209,21 @@ public class JedisConnection implements RedisConnection { } - public Boolean zRem(byte[] key, byte[] value) { + public Long zRem(byte[] key, byte[]... values) { + if((isPipelined() || isQueueing()) && values.length > 1) { + throw new UnsupportedOperationException("zRem of multiple fields not supported " + + "in pipeline or transaction"); + } try { if (isPipelined()) { - pipeline(new JedisResult(pipeline.zrem(key, value), JedisConverters.longToBoolean())); + pipeline(new JedisResult(pipeline.zrem(key, values[0]))); return null; } if (isQueueing()) { - transaction(new JedisResult(transaction.zrem(key, value), JedisConverters.longToBoolean())); + transaction(new JedisResult(transaction.zrem(key, values[0]))); return null; } - return JedisConverters.toBoolean(jedis.zrem(key, value)); + return jedis.zrem(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 a2fb9a463..046a4d020 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 @@ -1057,9 +1057,12 @@ public class JredisConnection implements RedisConnection { } - public Boolean zRem(byte[] key, byte[] value) { + public Long zRem(byte[] key, byte[]... values) { + if(values.length > 1) { + throw new UnsupportedOperationException("zRem of multiple fields not supported"); + } try { - return jredis.zrem(key, value); + return JredisUtils.toLong(jredis.zrem(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 f0579a2e5..4f8488667 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 @@ -2304,17 +2304,17 @@ public class LettuceConnection implements RedisConnection { } } - public Boolean zRem(byte[] key, byte[] value) { + public Long zRem(byte[] key, byte[]... values) { try { if (isPipelined()) { - pipeline(new LettuceResult(getAsyncConnection().zrem(key, value), LettuceConverters.longToBoolean())); + pipeline(new LettuceResult(getAsyncConnection().zrem(key, values))); return null; } if (isQueueing()) { - transaction(new LettuceTxResult(getConnection().zrem(key, value), LettuceConverters.longToBoolean())); + transaction(new LettuceTxResult(getConnection().zrem(key, values))); return null; } - return LettuceConverters.toBoolean(getConnection().zrem(key, value)); + return getConnection().zrem(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 5ef88bd10..736ed7209 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 @@ -1775,13 +1775,13 @@ public class SrpConnection implements RedisConnection { } - public Boolean zRem(byte[] key, byte[] value) { + public Long zRem(byte[] key, byte[]... values) { try { if (isPipelined()) { - pipeline(new SrpResult(pipeline.zrem(key, new Object[] { value }), SrpConverters.longToBoolean())); + pipeline(new SrpResult(pipeline.zrem(key, (Object[]) values))); return null; } - return SrpConverters.toBoolean(client.zrem(key, new Object[] { value }).data()); + return client.zrem(key, (Object[]) values).data(); } catch (Exception ex) { throw convertSrpAccessException(ex); } diff --git a/src/main/java/org/springframework/data/redis/core/BoundZSetOperations.java b/src/main/java/org/springframework/data/redis/core/BoundZSetOperations.java index cfd1c8b24..b7a4cff0d 100644 --- a/src/main/java/org/springframework/data/redis/core/BoundZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/BoundZSetOperations.java @@ -69,7 +69,7 @@ public interface BoundZSetOperations extends BoundKeyOperations { Long reverseRank(Object o); - Boolean remove(Object o); + Long remove(Object... values); Long count(double min, double max); diff --git a/src/main/java/org/springframework/data/redis/core/DefaultBoundZSetOperations.java b/src/main/java/org/springframework/data/redis/core/DefaultBoundZSetOperations.java index f1793829f..001545122 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultBoundZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultBoundZSetOperations.java @@ -121,8 +121,8 @@ class DefaultBoundZSetOperations extends DefaultBoundKeyOperations impl } - 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/DefaultZSetOperations.java b/src/main/java/org/springframework/data/redis/core/DefaultZSetOperations.java index 706eedc81..980077002 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultZSetOperations.java @@ -281,14 +281,14 @@ class DefaultZSetOperations extends AbstractOperations implements ZS } - public Boolean remove(K key, Object o) { + public Long remove(K key, Object... values) { final byte[] rawKey = rawKey(key); - final byte[] rawValue = rawValue(o); + final byte[][] rawValues = rawValues(values); - return execute(new RedisCallback() { + return execute(new RedisCallback() { - public Boolean doInRedis(RedisConnection connection) { - return connection.zRem(rawKey, rawValue); + public Long doInRedis(RedisConnection connection) { + return connection.zRem(rawKey, rawValues); } }, true); } diff --git a/src/main/java/org/springframework/data/redis/core/ZSetOperations.java b/src/main/java/org/springframework/data/redis/core/ZSetOperations.java index dcb1374c2..a00dee7b9 100644 --- a/src/main/java/org/springframework/data/redis/core/ZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/ZSetOperations.java @@ -79,7 +79,7 @@ public interface ZSetOperations { Double score(K key, Object o); - Boolean remove(K key, Object o); + Long remove(K key, Object... values); Long removeRange(K key, long start, long end); diff --git a/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisZSet.java b/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisZSet.java index c023b2be6..42cb51a68 100644 --- a/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisZSet.java +++ b/src/main/java/org/springframework/data/redis/support/collections/DefaultRedisZSet.java @@ -202,9 +202,9 @@ public class DefaultRedisZSet extends AbstractRedisCollection implements R public boolean remove(Object o) { - Boolean result = boundZSetOps.remove(o); + Long result = boundZSetOps.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 dd458090a..7df921a15 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -1696,10 +1696,23 @@ public abstract class AbstractConnectionIntegrationTests { actual.add(connection.zRem("myset", "James")); actual.add(connection.zRange("myset", 0l, -1l)); verifyResults( - Arrays.asList(new Object[] { true, true, true, + Arrays.asList(new Object[] { true, true, 1l, new LinkedHashSet(Arrays.asList(new String[] { "Bob" })) })); } + @Test + public void testZRemMultiple() { + actual.add(connection.zAdd("myset", 2, "Bob")); + actual.add(connection.zAdd("myset", 1, "James")); + actual.add(connection.zAdd("myset", 0.5, "Joe")); + actual.add(connection.zAdd("myset", 2.5, "Jen")); + actual.add(connection.zRem("myset", "James", "Jen")); + actual.add(connection.zRange("myset", 0l, -1l)); + verifyResults( + Arrays.asList(new Object[] { true, true, true, true, 2l, + new LinkedHashSet(Arrays.asList(new String[] { "Joe", "Bob" })) })); + } + @Test public void testZRemRangeByRank() { actual.add(connection.zAdd("myset", 2, "Bob")); 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 b89911d03..02db76704 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTests.java @@ -1203,13 +1203,13 @@ public class DefaultStringRedisConnectionPipelineTests extends DefaultStringRedi @Test public void testZRemBytes() { - doReturn(Arrays.asList(new Object[] { true })).when(nativeConnection).closePipeline(); + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).closePipeline(); super.testZRemBytes(); } @Test public void testZRem() { - doReturn(Arrays.asList(new Object[] { true })).when(nativeConnection).closePipeline(); + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).closePipeline(); super.testZRem(); } 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 1ba2d44bc..fecb514f9 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTxTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTxTests.java @@ -1171,13 +1171,13 @@ public class DefaultStringRedisConnectionPipelineTxTests extends @Test public void testZRemBytes() { - 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.testZRemBytes(); } @Test public void testZRem() { - 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.testZRem(); } 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 c165d8d58..6a06131d7 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java @@ -1440,16 +1440,16 @@ public class DefaultStringRedisConnectionTests { @Test public void testZRemBytes() { - doReturn(true).when(nativeConnection).zRem(fooBytes, barBytes); + doReturn(1l).when(nativeConnection).zRem(fooBytes, barBytes); actual.add(connection.zRem(fooBytes, barBytes)); - verifyResults(Arrays.asList(new Object[] { true })); + verifyResults(Arrays.asList(new Object[] { 1l })); } @Test public void testZRem() { - doReturn(true).when(nativeConnection).zRem(fooBytes, barBytes); + doReturn(1l).when(nativeConnection).zRem(fooBytes, barBytes); actual.add(connection.zRem(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 226ae218d..84f1cb6dc 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTxTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTxTests.java @@ -1170,13 +1170,13 @@ public class DefaultStringRedisConnectionTxTests extends DefaultStringRedisConne @Test public void testZRemBytes() { - doReturn(Arrays.asList(new Object[] { true })).when(nativeConnection).exec(); + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).exec(); super.testZRemBytes(); } @Test public void testZRem() { - doReturn(Arrays.asList(new Object[] { true })).when(nativeConnection).exec(); + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).exec(); super.testZRem(); } 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 807796002..7a098ac46 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 @@ -456,4 +456,9 @@ public class JedisConnectionPipelineIntegrationTests extends public void testZAddMultiple() { super.testZAddMultiple(); } + + @Test(expected=UnsupportedOperationException.class) + public void testZRemMultiple() { + super.testZRemMultiple(); + } } 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 4f6c4cf10..b27f1f370 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 @@ -392,4 +392,9 @@ public class JedisConnectionTransactionIntegrationTests extends public void testZAddMultiple() { super.testZAddMultiple(); } + + @Test(expected=UnsupportedOperationException.class) + public void testZRemMultiple() { + super.testZRemMultiple(); + } } 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 62501cfc8..6652932c9 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 @@ -590,6 +590,11 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat super.testZAddMultiple(); } + @Test(expected=UnsupportedOperationException.class) + public void testZRemMultiple() { + super.testZRemMultiple(); + } + // Jredis returns null for rPush and lPush @Test public void testLLen() { diff --git a/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsTests.java b/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsTests.java index 7f9f062a0..aa0e16c51 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsTests.java @@ -176,4 +176,21 @@ public class DefaultZSetOperationsTests { expected.add(value2); assertThat(zSetOps.range(key, 0, -1), isEqual(expected)); } + + @Test + public void testRemove() { + K key = keyFactory.instance(); + V value1 = valueFactory.instance(); + V value2 = valueFactory.instance(); + V value3 = valueFactory.instance(); + Set> values = new HashSet>(); + values.add(new DefaultTypedTuple(value1, 1.7)); + values.add(new DefaultTypedTuple(value2, 3.2)); + values.add(new DefaultTypedTuple(value3, 0.8)); + assertEquals(Long.valueOf(3), zSetOps.add(key, values)); + assertEquals(Long.valueOf(2), zSetOps.remove(key, value1, value3)); + Set expected = new LinkedHashSet(); + expected.add(value2); + assertThat(zSetOps.range(key, 0, -1), isEqual(expected)); + } }