diff --git a/README.md b/README.md index ae89c9f..02cc666 100644 --- a/README.md +++ b/README.md @@ -37,9 +37,10 @@ All of the following redis features are supported: - Persistence control commands - Remote server control commands - Connection pooling -- Sharding (MD5, MurmureHash) +- Sharding (MD5, MurmurHash) - Key-tags for sharding - Sharding with pipelining +- Scripting with pipelining ## How do I use it? diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 39de4cb..6d0c986 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -2755,7 +2755,7 @@ public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommand client.rollbackTimeout(); } - private String[] getParams(List keys, List args) { + protected static String[] getParams(List keys, List args) { int keyCount = keys.size(); int argCount = args.size(); diff --git a/src/main/java/redis/clients/jedis/PipelineBase.java b/src/main/java/redis/clients/jedis/PipelineBase.java index 315716c..b89ea07 100644 --- a/src/main/java/redis/clients/jedis/PipelineBase.java +++ b/src/main/java/redis/clients/jedis/PipelineBase.java @@ -1159,4 +1159,33 @@ abstract class PipelineBase extends Queable implements return getResponse(BuilderFactory.DOUBLE); } + public Response eval(String script) { + return this.eval(script, 0, new String[0]); + } + + public Response eval(String script, List keys, List args) { + String[] argv = Jedis.getParams(keys, args); + return this.eval(script, keys.size(), argv); + } + + public Response eval(String script, int numKeys, String[] argv) { + getClient(script).eval(script, numKeys, argv); + return getResponse(BuilderFactory.STRING); + } + + public Response evalsha(String script) { + return this.evalsha(script, 0, new String[0]); + } + + public Response evalsha(String sha1, List keys, List args) { + String[] argv = Jedis.getParams(keys, args); + return this.evalsha(sha1, keys.size(), argv); + } + + public Response evalsha(String sha1, int numKeys, String[] argv) { + getClient(sha1).evalsha(sha1, numKeys, argv); + return getResponse(BuilderFactory.STRING); + } + + } diff --git a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java index ffe2c9b..ee9e365 100755 --- a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java +++ b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java @@ -242,4 +242,70 @@ public class PipeliningTest extends Assert { assertEquals(new Long(-3), r3.get().get(1)); } + + @Test + public void testEval() { + String script = "return 'success!'"; + + Pipeline p = jedis.pipelined(); + Response result = p.eval(script); + p.sync(); + + assertEquals("success!", result.get()); + } + + @Test + public void testEvalKeyAndArg() { + String key = "test"; + String arg = "3"; + String script = "redis.call('INCRBY', KEYS[1], ARGV[1]) redis.call('INCRBY', KEYS[1], ARGV[1])"; + + Pipeline p = jedis.pipelined(); + p.set(key, "0"); + Response result0 = p.eval(script, Arrays.asList(key), Arrays.asList(arg)); + p.incr(key); + Response result1 = p.eval(script, Arrays.asList(key), Arrays.asList(arg)); + Response result2 = p.get(key); + p.sync(); + + assertNull(result0.get()); + assertNull(result1.get()); + assertEquals("13", result2.get()); + } + + @Test + public void testEvalsha() { + String script = "return 'success!'"; + String sha1 = jedis.scriptLoad(script); + + assertTrue(jedis.scriptExists(sha1)); + + Pipeline p = jedis.pipelined(); + Response result = p.evalsha(sha1); + p.sync(); + + assertEquals("success!", result.get()); + } + + @Test + public void testEvalshaKeyAndArg() { + String key = "test"; + String arg = "3"; + String script = "redis.call('INCRBY', KEYS[1], ARGV[1]) redis.call('INCRBY', KEYS[1], ARGV[1])"; + String sha1 = jedis.scriptLoad(script); + + assertTrue(jedis.scriptExists(sha1)); + + Pipeline p = jedis.pipelined(); + p.set(key, "0"); + Response result0 = p.evalsha(sha1, Arrays.asList(key), Arrays.asList(arg)); + p.incr(key); + Response result1 = p.evalsha(sha1, Arrays.asList(key), Arrays.asList(arg)); + Response result2 = p.get(key); + p.sync(); + + assertNull(result0.get()); + assertNull(result1.get()); + assertEquals("13", result2.get()); + } }