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 f71fe0daa..f4715c5f2 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java @@ -49,6 +49,7 @@ public class DefaultStringRedisConnection implements StringRedisConnection { private final RedisSerializer serializer; private Converter bytesToString = new DeserializingConverter(); private SetConverter tupleToStringTuple = new SetConverter(new TupleConverter()); + private SetConverter stringTupleToTuple = new SetConverter(new StringTupleConverter()); private ListConverter byteListToStringList = new ListConverter(bytesToString); private MapConverter byteMapToStringMap = new MapConverter(bytesToString); private SetConverter byteSetToStringSet = new SetConverter(bytesToString); @@ -71,6 +72,12 @@ public class DefaultStringRedisConnection implements StringRedisConnection { } } + private class StringTupleConverter implements Converter { + public Tuple convert(StringTuple source) { + return new DefaultTuple(source.getValue(), source.getScore()); + } + } + private class IdentityConverter implements Converter { public Object convert(Object source) { return source; @@ -905,6 +912,14 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return result; } + public Long zAdd(byte[] key, Set tuples) { + Long result = delegate.zAdd(key, tuples); + if(isFutureConversion()) { + addResultConverter(identityConverter); + } + return result; + } + public Long zCard(byte[] key) { Long result = delegate.zCard(key); if(isFutureConversion()) { @@ -1918,6 +1933,14 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return result; } + + public Long zAdd(String key, Set tuples) { + Long result = delegate.zAdd(serialize(key), stringTupleToTuple.convert(tuples)); + if(isFutureConversion()) { + addResultConverter(identityConverter); + } + return result; + } public Long zCard(String key) { Long result = delegate.zCard(serialize(key)); 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 223b662b7..632720f6c 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisZSetCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisZSetCommands.java @@ -44,6 +44,8 @@ public interface RedisZSetCommands { Boolean zAdd(byte[] key, double score, byte[] value); + Long zAdd(byte[] key, Set tuples); + Boolean zRem(byte[] key, byte[] value); 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 d27993bec..eb4722753 100644 --- a/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/StringRedisConnection.java @@ -191,6 +191,8 @@ public interface StringRedisConnection extends RedisConnection { Boolean zAdd(String key, double score, String value); + Long zAdd(String key, Set tuples); + Boolean zRem(String key, String value); Double zIncrBy(String key, double increment, String value); diff --git a/src/main/java/org/springframework/data/redis/connection/convert/Converters.java b/src/main/java/org/springframework/data/redis/connection/convert/Converters.java index 147241af0..c3315945e 100644 --- a/src/main/java/org/springframework/data/redis/connection/convert/Converters.java +++ b/src/main/java/org/springframework/data/redis/connection/convert/Converters.java @@ -15,10 +15,14 @@ */ package org.springframework.data.redis.connection.convert; +import java.util.ArrayList; +import java.util.List; import java.util.Properties; +import java.util.Set; import org.springframework.core.convert.converter.Converter; import org.springframework.data.redis.connection.DataType; +import org.springframework.data.redis.connection.RedisZSetCommands.Tuple; /** * Common type converters @@ -61,4 +65,13 @@ abstract public class Converters { public static byte[] toBit(Boolean source) { return (source ? ONE : ZERO); } + + public static List toObjects(Set tuples) { + List tupleArgs = new ArrayList(tuples.size() * 2); + for(Tuple tuple: tuples) { + tupleArgs.add(tuple.getScore()); + tupleArgs.add(tuple.getValue()); + } + return tupleArgs; + } } 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 def0e1c08..b5b5e5ea5 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 @@ -19,6 +19,7 @@ import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -1901,6 +1902,18 @@ public class JedisConnection implements RedisConnection { } } + public Long zAdd(byte[] key, Set tuples) { + if(isPipelined() || isQueueing()) { + throw new UnsupportedOperationException("zAdd of multiple fields not supported " + + "in pipeline or transaction"); + } + Map args = zAddArgs(tuples); + try { + return jedis.zadd(key, args); + } catch (Exception ex) { + throw convertJedisAccessException(ex); + } + } public Long zCard(byte[] key) { try { @@ -2747,4 +2760,16 @@ public class JedisConnection implements RedisConnection { args.add(Protocol.toByteArray(timeout)); return args.toArray(new byte[args.size()][]); } + + private Map zAddArgs(Set tuples) { + Map args = new HashMap(); + for(Tuple tuple: tuples) { + if(args.containsKey(tuple.getScore())) { + throw new UnsupportedOperationException("Bulk add of multiple elements with the same score is not supported. " + + "Add the elements individually."); + } + args.put(tuple.getScore(), tuple.getValue()); + } + return args; + } } 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 83af1dce4..a2fb9a463 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 @@ -949,6 +949,9 @@ public class JredisConnection implements RedisConnection { } } + public Long zAdd(byte[] key, Set tuples) { + throw new UnsupportedOperationException(); + } public Long zCard(byte[] key) { try { 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 a54366394..f0579a2e5 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 @@ -1977,6 +1977,25 @@ public class LettuceConnection implements RedisConnection { } } + + public Long zAdd(byte[] key, Set tuples) { + try { + if (isPipelined()) { + pipeline(new LettuceResult(getAsyncConnection().zadd(key, + LettuceConverters.toObjects(tuples).toArray()))); + return null; + } + if (isQueueing()) { + transaction(new LettuceTxResult(getConnection().zadd(key, + LettuceConverters.toObjects(tuples).toArray()))); + return null; + } + return getConnection().zadd(key, LettuceConverters.toObjects(tuples).toArray()); + } catch (Exception ex) { + throw convertLettuceAccessException(ex); + } + } + public Long zCard(byte[] key) { try { if (isPipelined()) { 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 cebc11d4b..5ef88bd10 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 @@ -1544,6 +1544,20 @@ public class SrpConnection implements RedisConnection { } } + public Long zAdd(byte[] key, Set tuples) { + try { + List args = new ArrayList(); + args.add(key); + args.addAll(SrpConverters.toObjects(tuples)); + if (isPipelined()) { + pipeline(new SrpResult(pipeline.zadd(args.toArray()))); + return null; + } + return client.zadd(args.toArray()).data(); + } catch (Exception ex) { + throw convertSrpAccessException(ex); + } + } public Long zCard(byte[] key) { try { diff --git a/src/main/java/org/springframework/data/redis/core/AbstractOperations.java b/src/main/java/org/springframework/data/redis/core/AbstractOperations.java index 1824dad11..62fc03bd5 100644 --- a/src/main/java/org/springframework/data/redis/core/AbstractOperations.java +++ b/src/main/java/org/springframework/data/redis/core/AbstractOperations.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.springframework.data.redis.connection.DefaultTuple; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisZSetCommands.Tuple; import org.springframework.data.redis.core.ZSetOperations.TypedTuple; @@ -199,6 +200,24 @@ abstract class AbstractOperations { return set; } + @SuppressWarnings("unchecked") + Set rawTupleValues(Set> values) { + if(values == null) { + return null; + } + Set rawTuples = new LinkedHashSet(values.size()); + for(TypedTuple value: values) { + byte[] rawValue; + if(valueSerializer() == null && value.getValue() instanceof byte[]) { + rawValue = (byte[]) value.getValue(); + }else { + rawValue = valueSerializer().serialize(value.getValue()); + } + rawTuples.add(new DefaultTuple(rawValue, value.getScore())); + } + return rawTuples; + } + @SuppressWarnings("unchecked") List deserializeValues(List rawValues) { if(valueSerializer() == null) { 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 4fade6538..cfd1c8b24 100644 --- a/src/main/java/org/springframework/data/redis/core/BoundZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/BoundZSetOperations.java @@ -61,6 +61,8 @@ public interface BoundZSetOperations extends BoundKeyOperations { Boolean add(V value, double score); + Long add(Set> tuples); + Double incrementScore(V value, double delta); Long rank(Object o); 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 aa970d481..f1793829f 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultBoundZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultBoundZSetOperations.java @@ -47,7 +47,10 @@ class DefaultBoundZSetOperations extends DefaultBoundKeyOperations impl return ops.add(getKey(), value, score); } - + public Long add(Set> tuples) { + return ops.add(getKey(), tuples); + } + public Double incrementScore(V value, double delta) { return ops.incrementScore(getKey(), value, delta); } diff --git a/src/main/java/org/springframework/data/redis/core/DefaultTypedTuple.java b/src/main/java/org/springframework/data/redis/core/DefaultTypedTuple.java index a5acead55..88659a2fa 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultTypedTuple.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultTypedTuple.java @@ -24,7 +24,7 @@ import org.springframework.data.redis.core.ZSetOperations.TypedTuple; * * @author Costin Leau */ -class DefaultTypedTuple implements TypedTuple { +public class DefaultTypedTuple implements TypedTuple { private final Double score; private final V value; 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 5ea17ce52..706eedc81 100644 --- a/src/main/java/org/springframework/data/redis/core/DefaultZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/DefaultZSetOperations.java @@ -46,6 +46,17 @@ class DefaultZSetOperations extends AbstractOperations implements ZS }, true); } + public Long add(K key, Set> tuples) { + final byte[] rawKey = rawKey(key); + final Set rawValues = rawTupleValues(tuples); + + return execute(new RedisCallback() { + + public Long doInRedis(RedisConnection connection) { + return connection.zAdd(rawKey, rawValues); + } + }, true); + } public Double incrementScore(K key, V value, final double delta) { final byte[] rawKey = rawKey(key); 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 876b2769c..dcb1374c2 100644 --- a/src/main/java/org/springframework/data/redis/core/ZSetOperations.java +++ b/src/main/java/org/springframework/data/redis/core/ZSetOperations.java @@ -69,6 +69,8 @@ public interface ZSetOperations { Boolean add(K key, V value, double score); + Long add(K key, Set> tuples); + Double incrementScore(K key, V value, double delta); Long rank(K key, Object o); 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 05ce13bd2..dd458090a 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -34,6 +34,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; import java.util.UUID; import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; @@ -52,6 +53,7 @@ import org.springframework.data.redis.TestCondition; import org.springframework.data.redis.connection.RedisListCommands.Position; import org.springframework.data.redis.connection.RedisStringCommands.BitOperation; import org.springframework.data.redis.connection.RedisZSetCommands.Aggregate; +import org.springframework.data.redis.connection.RedisZSetCommands.Tuple; import org.springframework.data.redis.connection.SortParameters.Order; import org.springframework.data.redis.connection.StringRedisConnection.StringTuple; import org.springframework.data.redis.core.StringRedisTemplate; @@ -1472,7 +1474,22 @@ public abstract class AbstractConnectionIntegrationTests { actual.add(connection.zAdd("myset", 2, "Bob")); actual.add(connection.zAdd("myset", 1, "James")); actual.add(connection.zRange("myset", 0, -1)); - verifyResults(Arrays.asList(new Object[] { true, true, new LinkedHashSet(Arrays.asList(new String[] { "James", "Bob" })) })); + verifyResults(Arrays.asList(new Object[] { true, true, + new LinkedHashSet(Arrays.asList(new String[] { "James", "Bob" })) })); + } + + @Test + public void testZAddMultiple() { + Set strTuples = new HashSet(); + strTuples.add(new DefaultStringTuple("Bob".getBytes(), "Bob", 2.0)); + strTuples.add(new DefaultStringTuple("James".getBytes(), "James", 1.0)); + Set tuples = new HashSet(); + tuples.add(new DefaultTuple("Joe".getBytes(), 2.5)); + actual.add(connection.zAdd("myset",strTuples)); + actual.add(connection.zAdd("myset".getBytes(), tuples)); + actual.add(connection.zRange("myset", 0, -1)); + verifyResults(Arrays.asList(new Object[] { 2l, 1l, + new LinkedHashSet(Arrays.asList(new String[] { "James", "Bob", "Joe" })) })); } @Test 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 9ed382822..b89911d03 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTests.java @@ -997,6 +997,18 @@ public class DefaultStringRedisConnectionPipelineTests extends DefaultStringRedi super.testZAdd(); } + @Test + public void testZAddMultipleBytes() { + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).closePipeline(); + super.testZAddMultipleBytes(); + } + + @Test + public void testZAddMultiple() { + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).closePipeline(); + super.testZAddMultiple(); + } + @Test public void testZCardBytes() { doReturn(Arrays.asList(new Object[] { 5l })).when(nativeConnection).closePipeline(); 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 7264ceef2..1ba2d44bc 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTxTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionPipelineTxTests.java @@ -965,6 +965,18 @@ public class DefaultStringRedisConnectionPipelineTxTests extends super.testZAdd(); } + @Test + public void testZAddMultipleBytes() { + doReturn(Arrays.asList(new Object[] { Arrays.asList(new Object[] { 1l })})).when(nativeConnection).closePipeline(); + super.testZAddMultipleBytes(); + } + + @Test + public void testZAddMultiple() { + doReturn(Arrays.asList(new Object[] { Arrays.asList(new Object[] { 1l })})).when(nativeConnection).closePipeline(); + super.testZAddMultiple(); + } + @Test public void testZCardBytes() { doReturn(Arrays.asList(new Object[] {Arrays.asList(new Object[] { 5l })})).when(nativeConnection).closePipeline(); 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 d6f3a7230..c165d8d58 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTests.java @@ -1190,6 +1190,26 @@ public class DefaultStringRedisConnectionTests { verifyResults(Arrays.asList(new Object[] { true })); } + @Test + public void testZAddMultipleBytes() { + Set tuples = new HashSet(); + tuples.add(new DefaultTuple(barBytes, 3.0)); + doReturn(1l).when(nativeConnection).zAdd(fooBytes, tuples); + actual.add(connection.zAdd(fooBytes, tuples)); + verifyResults(Arrays.asList(new Object[] { 1l })); + } + + @Test + public void testZAddMultiple() { + Set tuples = new HashSet(); + tuples.add(new DefaultTuple(barBytes, 3.0)); + Set strTuples = new HashSet(); + strTuples.add(new DefaultStringTuple(barBytes, bar, 3.0)); + doReturn(1l).when(nativeConnection).zAdd(fooBytes, tuples); + actual.add(connection.zAdd(foo, strTuples)); + verifyResults(Arrays.asList(new Object[] { 1l })); + } + @Test public void testZCardBytes() { doReturn(5l).when(nativeConnection).zCard(fooBytes); 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 2e2b29dd6..226ae218d 100644 --- a/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTxTests.java +++ b/src/test/java/org/springframework/data/redis/connection/DefaultStringRedisConnectionTxTests.java @@ -964,6 +964,18 @@ public class DefaultStringRedisConnectionTxTests extends DefaultStringRedisConne super.testZAdd(); } + @Test + public void testZAddMultipleBytes() { + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).exec(); + super.testZAddMultipleBytes(); + } + + @Test + public void testZAddMultiple() { + doReturn(Arrays.asList(new Object[] { 1l })).when(nativeConnection).exec(); + super.testZAddMultiple(); + } + @Test public void testZCardBytes() { doReturn(Arrays.asList(new Object[] { 5l })).when(nativeConnection).exec(); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java index 556480057..b6617fc5c 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java @@ -16,14 +16,19 @@ package org.springframework.data.redis.connection.jedis; +import java.util.HashSet; +import java.util.Set; + import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.redis.SettingsUtils; import org.springframework.data.redis.connection.AbstractConnectionIntegrationTests; +import org.springframework.data.redis.connection.DefaultStringTuple; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.ReturnType; +import org.springframework.data.redis.connection.StringRedisConnection.StringTuple; import org.springframework.test.annotation.IfProfileValue; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @@ -218,6 +223,14 @@ public class JedisConnectionIntegrationTests extends AbstractConnectionIntegrati factory2.destroy(); } + @Test(expected=UnsupportedOperationException.class) + public void testZAddSameScores() { + Set strTuples = new HashSet(); + strTuples.add(new DefaultStringTuple("Bob".getBytes(), "Bob", 2.0)); + strTuples.add(new DefaultStringTuple("James".getBytes(), "James", 2.0)); + connection.zAdd("myset", strTuples); + } + @Test(expected=InvalidDataAccessApiUsageException.class) @IfProfileValue(name = "redisVersion", value = "2.6") public void testEvalReturnSingleError() { 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 5148374f2..807796002 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 @@ -451,4 +451,9 @@ public class JedisConnectionPipelineIntegrationTests extends public void testSRemMultiple() { super.testSRemMultiple(); } + + @Test(expected=UnsupportedOperationException.class) + public void testZAddMultiple() { + super.testZAddMultiple(); + } } 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 4bab49774..4f6c4cf10 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 @@ -387,4 +387,9 @@ public class JedisConnectionTransactionIntegrationTests extends public void testSRemMultiple() { super.testSRemMultiple(); } + + @Test(expected=UnsupportedOperationException.class) + public void testZAddMultiple() { + super.testZAddMultiple(); + } } 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 03bc3a309..62501cfc8 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 @@ -585,6 +585,11 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat super.testSRemMultiple(); } + @Test(expected=UnsupportedOperationException.class) + public void testZAddMultiple() { + super.testZAddMultiple(); + } + // 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 6ff5b0ef3..7f9f062a0 100644 --- a/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsTests.java +++ b/src/test/java/org/springframework/data/redis/core/DefaultZSetOperationsTests.java @@ -21,6 +21,8 @@ import static org.springframework.data.redis.matcher.RedisTestMatchers.isEqual; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; import org.junit.After; @@ -156,4 +158,22 @@ public class DefaultZSetOperationsTests { TypedTuple tuple = tuples.iterator().next(); assertThat(tuple, isEqual(new DefaultTypedTuple(value2, 3.7))); } + + @Test + public void testAddMultiple() { + 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)); + Set expected = new LinkedHashSet(); + expected.add(value3); + expected.add(value1); + expected.add(value2); + assertThat(zSetOps.range(key, 0, -1), isEqual(expected)); + } }