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 cdbdcf611..957a5c928 100644 --- a/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/DefaultStringRedisConnection.java @@ -1230,6 +1230,14 @@ public class DefaultStringRedisConnection implements StringRedisConnection { return result; } + public T evalSha(byte[] scriptSha1, ReturnType returnType, int numKeys, byte[]... keysAndArgs) { + T result = delegate.evalSha(scriptSha1, returnType, numKeys, keysAndArgs); + if (isFutureConversion()) { + addResultConverter(identityConverter); + } + return result; + } + // // String methods // diff --git a/src/main/java/org/springframework/data/redis/connection/RedisScriptingCommands.java b/src/main/java/org/springframework/data/redis/connection/RedisScriptingCommands.java index 29a61da45..62d736ae4 100644 --- a/src/main/java/org/springframework/data/redis/connection/RedisScriptingCommands.java +++ b/src/main/java/org/springframework/data/redis/connection/RedisScriptingCommands.java @@ -22,6 +22,7 @@ import java.util.List; * * @author Costin Leau * @author Christoph Strobl + * @author David Liu */ public interface RedisScriptingCommands { @@ -81,4 +82,17 @@ public interface RedisScriptingCommands { * @return */ T evalSha(String scriptSha, ReturnType returnType, int numKeys, byte[]... keysAndArgs); + + /** + * Evaluate given {@code scriptSha}. + * + * @see http://redis.io/commands/evalsha + * @param script + * @param returnType + * @param numKeys + * @param keysAndArgs + * @return + * @since 1.5 + */ + T evalSha(byte[] scriptSha, ReturnType returnType, int numKeys, byte[]... keysAndArgs); } 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 f10437cb5..453481ba9 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 @@ -87,6 +87,7 @@ import redis.clients.util.Pool; * @author Thomas Darimont * @author Jungtaek Lim * @author Konstantin Shchepanovskyi + * @author David Liu */ public class JedisConnection extends AbstractRedisConnection { @@ -2799,8 +2800,13 @@ public class JedisConnection extends AbstractRedisConnection { } } - @SuppressWarnings("unchecked") public T evalSha(String scriptSha1, ReturnType returnType, int numKeys, byte[]... keysAndArgs) { + return evalSha(JedisConverters.toBytes(scriptSha1), returnType, numKeys, keysAndArgs); + } + + @SuppressWarnings("unchecked") + public T evalSha(byte[] scriptSha1, ReturnType returnType, int numKeys, byte[]... keysAndArgs) { + if (isQueueing()) { throw new UnsupportedOperationException(); } @@ -2808,8 +2814,7 @@ public class JedisConnection extends AbstractRedisConnection { throw new UnsupportedOperationException(); } try { - return (T) new JedisScriptReturnConverter(returnType).convert(jedis.evalsha(JedisConverters.toBytes(scriptSha1), - numKeys, keysAndArgs)); + return (T) new JedisScriptReturnConverter(returnType).convert(jedis.evalsha(scriptSha1, numKeys, keysAndArgs)); } 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 8d1e0ab15..b375cbd22 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 @@ -58,6 +58,7 @@ import org.springframework.util.ReflectionUtils; * @author Jennifer Hickey * @author Christoph Strobl * @author Thomas Darimont + * @author David Liu */ public class JredisConnection extends AbstractRedisConnection { @@ -1183,6 +1184,10 @@ public class JredisConnection extends AbstractRedisConnection { throw new UnsupportedOperationException(); } + public T evalSha(byte[] scriptSha1, ReturnType returnType, int numKeys, byte[]... keysAndArgs) { + throw new UnsupportedOperationException(); + } + /* * (non-Javadoc) * @see org.springframework.data.redis.connection.RedisServerCommands#time() 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 598cdc8ff..d4abc4ddc 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 @@ -99,6 +99,7 @@ import com.lambdaworks.redis.pubsub.RedisPubSubConnection; * @author Jennifer Hickey * @author Christoph Strobl * @author Thomas Darimont + * @author David Liu */ public class LettuceConnection extends AbstractRedisConnection { @@ -2849,6 +2850,10 @@ public class LettuceConnection extends AbstractRedisConnection { } } + public T evalSha(byte[] scriptSha1, ReturnType returnType, int numKeys, byte[]... keysAndArgs) { + return evalSha(LettuceConverters.toString(scriptSha1), returnType, numKeys, keysAndArgs); + } + // // Pub/Sub functionality // 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 c64ed90f1..e10b0dea4 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 @@ -68,6 +68,7 @@ import com.google.common.util.concurrent.ListenableFuture; * @author Jennifer Hickey * @author Christoph Strobl * @author Thomas Darimont + * @author David Liu */ public class SrpConnection extends AbstractRedisConnection { @@ -2100,6 +2101,10 @@ public class SrpConnection extends AbstractRedisConnection { } } + public T evalSha(byte[] scriptSha1, ReturnType returnType, int numKeys, byte[]... keysAndArgs) { + return evalSha(SrpConverters.toString(scriptSha1), returnType, numKeys, keysAndArgs); + } + // // Pub/Sub functionality // 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 b54beca9c..5fc2000fd 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -188,6 +188,20 @@ public abstract class AbstractConnectionIntegrationTests { Arrays.asList(new Object[] { new String(scriptResults.get(0)), new String(scriptResults.get(1)) })); } + @SuppressWarnings("unchecked") + @Test + @IfProfileValue(name = "redisVersion", value = "2.6+") + public void testEvalShaArrayBytes() { + getResults(); + byte[] sha1 = connection.scriptLoad("return {KEYS[1],ARGV[1]}").getBytes(); + initConnection(); + actual.add(byteConnection.evalSha(sha1, ReturnType.MULTI, 1, "key1".getBytes(), "arg1".getBytes())); + List results = getResults(); + List scriptResults = (List) results.get(0); + assertEquals(Arrays.asList(new Object[] { "key1", "arg1" }), + Arrays.asList(new Object[] { new String(scriptResults.get(0)), new String(scriptResults.get(1)) })); + } + @Test(expected = RedisSystemException.class) @IfProfileValue(name = "redisVersion", value = "2.6+") public void testEvalShaArrayError() { diff --git a/src/test/java/org/springframework/data/redis/connection/RedisConnectionUnitTests.java b/src/test/java/org/springframework/data/redis/connection/RedisConnectionUnitTests.java index 87ee308de..ea5df3bc7 100644 --- a/src/test/java/org/springframework/data/redis/connection/RedisConnectionUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/RedisConnectionUnitTests.java @@ -35,6 +35,7 @@ import org.springframework.util.ObjectUtils; /** * @author Christoph Strobl + * @author David Liu */ public class RedisConnectionUnitTests { @@ -784,5 +785,10 @@ public class RedisConnectionUnitTests { } return null; } + + @Override + public T evalSha(byte[] scriptSha, ReturnType returnType, int numKeys, byte[]... keysAndArgs) { + return delegate.evalSha(scriptSha, returnType, numKeys, keysAndArgs); + } } } 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 1fb5d5d65..17718fa31 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 @@ -19,6 +19,7 @@ package org.springframework.data.redis.connection.jedis; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; +import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -87,6 +88,20 @@ public class JedisConnectionIntegrationTests extends AbstractConnectionIntegrati connection = null; } + @SuppressWarnings("unchecked") + @Test + @IfProfileValue(name = "redisVersion", value = "2.6+") + public void testEvalShaArrayBytes() { + getResults(); + byte[] sha1 = connection.scriptLoad("return {KEYS[1],ARGV[1]}").getBytes(); + initConnection(); + actual.add(byteConnection.evalSha(sha1, ReturnType.MULTI, 1, "key1".getBytes(), "arg1".getBytes())); + List results = getResults(); + List scriptResults = (List) results.get(0); + assertEquals(Arrays.asList(new Object[] { "key1", "arg1" }), + Arrays.asList(new Object[] { new String(scriptResults.get(0)), new String(scriptResults.get(1)) })); + } + @Test public void testCreateConnectionWithDb() { JedisConnectionFactory factory2 = new JedisConnectionFactory(); 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 2fbf354e2..e81eee9ff 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 @@ -135,6 +135,12 @@ public class JedisConnectionPipelineIntegrationTests extends AbstractConnectionP public void testEvalShaArrayStrings() { super.testEvalShaArrayStrings(); } + + @Test(expected = UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6+") + public void testEvalShaArrayBytes() { + super.testEvalShaArrayBytes(); + } @Test(expected = UnsupportedOperationException.class) @IfProfileValue(name = "redisVersion", value = "2.6+") 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 7a92af62d..32f3e14eb 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 @@ -19,6 +19,7 @@ import org.junit.After; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.redis.connection.AbstractConnectionTransactionIntegrationTests; import org.springframework.data.redis.test.util.RelaxedJUnit4ClassRunner; @@ -66,6 +67,12 @@ public class JedisConnectionTransactionIntegrationTests extends AbstractConnecti public void testEvalShaArrayStrings() { super.testEvalShaArrayStrings(); } + + @Test(expected = UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6+") + public void testEvalShaArrayBytes() { + super.testEvalShaArrayBytes(); + } @Test(expected = UnsupportedOperationException.class) @IfProfileValue(name = "redisVersion", value = "2.6+") 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 c43cc472f..91c328407 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 @@ -435,6 +435,12 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat public void testEvalShaArrayStrings() { super.testEvalShaArrayStrings(); } + + @Test(expected = UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6+") + public void testEvalShaArrayBytes() { + super.testEvalShaArrayBytes(); + } @Test(expected = UnsupportedOperationException.class) @IfProfileValue(name = "redisVersion", value = "2.6+") diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests.java index a7cdc98cc..12b6240ab 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionIntegrationTests.java @@ -297,4 +297,19 @@ public class LettuceConnectionIntegrationTests extends AbstractConnectionIntegra AllOf.allOf(IsInstanceOf.instanceOf(List.class), IsCollectionContaining.hasItems("awesome".getBytes(), "cool".getBytes(), "supercalifragilisticexpialidocious".getBytes()))); } + + @SuppressWarnings("unchecked") + @Test + @IfProfileValue(name = "redisVersion", value = "2.6+") + public void testEvalShaArrayBytes() { + getResults(); + byte[] sha1 = connection.scriptLoad("return {KEYS[1],ARGV[1]}").getBytes(); + initConnection(); + actual.add(byteConnection.evalSha(sha1, ReturnType.MULTI, 1, "key1".getBytes(), "arg1".getBytes())); + List results = getResults(); + List scriptResults = (List) results.get(0); + assertEquals(Arrays.asList(new Object[] { "key1", "arg1" }), + Arrays.asList(new Object[] { new String(scriptResults.get(0)), new String(scriptResults.get(1)) })); + } + } diff --git a/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionIntegrationTests.java index 18f462981..2d1911dbc 100644 --- a/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionIntegrationTests.java @@ -16,7 +16,10 @@ package org.springframework.data.redis.connection.srp; +import static org.junit.Assert.*; + import java.util.Arrays; +import java.util.List; import org.hamcrest.core.Is; import org.hamcrest.core.IsInstanceOf; @@ -99,4 +102,19 @@ public class SrpConnectionIntegrationTests extends AbstractConnectionIntegration Assert.assertThat(replies[1].data(), Is. is("cool".getBytes())); Assert.assertThat(replies[2].data(), Is. is("supercalifragilisticexpialidocious".getBytes())); } + + @SuppressWarnings("unchecked") + @Test + @IfProfileValue(name = "redisVersion", value = "2.6+") + public void testEvalShaArrayBytes() { + getResults(); + byte[] sha1 = connection.scriptLoad("return {KEYS[1],ARGV[1]}").getBytes(); + initConnection(); + actual.add(connection.evalSha(sha1, ReturnType.MULTI, 1, "key1".getBytes(), "arg1".getBytes())); + List results = getResults(); + List scriptResults = (List) results.get(0); + assertEquals(Arrays.asList(new Object[] { "key1", "arg1" }), + Arrays.asList(new Object[] { new String(scriptResults.get(0)), new String(scriptResults.get(1)) })); + } + } diff --git a/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineIntegrationTests.java index 040d4ca22..c70fd570e 100644 --- a/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineIntegrationTests.java @@ -15,7 +15,10 @@ */ package org.springframework.data.redis.connection.srp; +import static org.junit.Assert.*; + import java.util.Arrays; +import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; @@ -68,4 +71,19 @@ public class SrpConnectionPipelineIntegrationTests extends AbstractConnectionPip public void testZUnionStoreAggWeights() { super.testZUnionStoreAggWeights(); } + + @SuppressWarnings("unchecked") + @Test + @IfProfileValue(name = "redisVersion", value = "2.6+") + public void testEvalShaArrayBytes() { + getResults(); + byte[] sha1 = connection.scriptLoad("return {KEYS[1],ARGV[1]}").getBytes(); + initConnection(); + actual.add(byteConnection.evalSha(sha1, ReturnType.MULTI, 1, "key1".getBytes(), "arg1".getBytes())); + List results = getResults(); + List scriptResults = (List) results.get(0); + assertEquals(Arrays.asList(new Object[] { "key1", "arg1" }), + Arrays.asList(new Object[] { new String(scriptResults.get(0)), new String(scriptResults.get(1)) })); + } + }