Eval and Evalsha is now supported
Conflicts: src/main/java/redis/clients/jedis/Client.java src/main/java/redis/clients/jedis/Jedis.java
This commit is contained in:
@@ -718,4 +718,30 @@ public class BinaryClient extends Connection {
|
|||||||
db = 0;
|
db = 0;
|
||||||
super.disconnect();
|
super.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void sendEvalCommand(Command command, byte[] script, List<byte[]> keys, List<byte[]> args){
|
||||||
|
int keysSize = keys.size();
|
||||||
|
int argsSize = args.size();
|
||||||
|
|
||||||
|
final byte[][] allArgs = new byte[keysSize + argsSize + 2][];
|
||||||
|
|
||||||
|
allArgs[0] = script;
|
||||||
|
allArgs[1] =toByteArray(keysSize);
|
||||||
|
|
||||||
|
for(int i=0;i<keysSize; i++)
|
||||||
|
allArgs[i+2] = keys.get(i);
|
||||||
|
|
||||||
|
for(int i=0;i<argsSize; i++)
|
||||||
|
allArgs[i+2+keysSize] = args.get(i);
|
||||||
|
|
||||||
|
sendCommand(command, allArgs );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void eval(byte[] script, List<byte[]> keys, List<byte[]> args){
|
||||||
|
sendEvalCommand(EVAL, script, keys, args );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void evalsha(byte[] sha1, List<byte[]> keys, List<byte[]> args){
|
||||||
|
sendEvalCommand(EVALSHA, sha1, keys, args);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3006,4 +3006,26 @@ public class BinaryJedis implements BinaryJedisCommands {
|
|||||||
public Long getDB() {
|
public Long getDB() {
|
||||||
return client.getDB();
|
return client.getDB();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluates scripts using the Lua interpreter built into Redis starting from version 2.6.0.
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* @return Script result
|
||||||
|
*/
|
||||||
|
public Object eval(byte[] script, List<byte[]> keys, List<byte[]> args) {
|
||||||
|
client.setTimeoutInfinite();
|
||||||
|
client.eval(script, keys, args);
|
||||||
|
return client.getOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Evaluates scripts using the Lua interpreter built into Redis starting from version 2.6.0.
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* @return Script result
|
||||||
|
*/
|
||||||
|
public Object eval(byte[] script, List<byte[]> keys) {
|
||||||
|
return eval(script,keys, new ArrayList<byte[]>());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -154,4 +154,5 @@ public interface BinaryJedisCommands {
|
|||||||
Long zremrangeByScore(byte[] key, double start, double end);
|
Long zremrangeByScore(byte[] key, double start, double end);
|
||||||
|
|
||||||
Long linsert(byte[] key, LIST_POSITION where, byte[] pivot, byte[] value);
|
Long linsert(byte[] key, LIST_POSITION where, byte[] pivot, byte[] value);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import redis.clients.util.Hashing;
|
|||||||
import redis.clients.util.Sharded;
|
import redis.clients.util.Sharded;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|||||||
@@ -2,7 +2,9 @@ package redis.clients.jedis;
|
|||||||
|
|
||||||
import redis.clients.util.SafeEncoder;
|
import redis.clients.util.SafeEncoder;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
@@ -595,4 +597,28 @@ public class Client extends BinaryClient implements Commands {
|
|||||||
public void configGet(String pattern) {
|
public void configGet(String pattern) {
|
||||||
configGet(SafeEncoder.encode(pattern));
|
configGet(SafeEncoder.encode(pattern));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void eval(String script, List<String> keys, String... args) {
|
||||||
|
List<byte[]> k = new ArrayList<byte[]>();
|
||||||
|
for(String key:keys){
|
||||||
|
k.add(SafeEncoder.encode(key));
|
||||||
|
}
|
||||||
|
List<byte[]> a = new ArrayList<byte[]>();
|
||||||
|
for(String arg:args){
|
||||||
|
a.add(SafeEncoder.encode(arg));
|
||||||
|
}
|
||||||
|
eval(SafeEncoder.encode(script),k,a);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void evalsha(String sha1, List<String> keys, String... args) {
|
||||||
|
List<byte[]> k = new ArrayList<byte[]>();
|
||||||
|
for(String key:keys){
|
||||||
|
k.add(SafeEncoder.encode(key));
|
||||||
|
}
|
||||||
|
List<byte[]> a = new ArrayList<byte[]>();
|
||||||
|
for(String arg:args){
|
||||||
|
a.add(SafeEncoder.encode(arg));
|
||||||
|
}
|
||||||
|
evalsha(SafeEncoder.encode(sha1),k,a);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ public class Connection {
|
|||||||
pipelinedCommands++;
|
pipelinedCommands++;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Connection sendCommand(final Command cmd) {
|
protected Connection sendCommand(final Command cmd) {
|
||||||
connect();
|
connect();
|
||||||
protocol.sendCommand(outputStream, cmd, new byte[0][]);
|
protocol.sendCommand(outputStream, cmd, new byte[0][]);
|
||||||
|
|||||||
@@ -8,7 +8,10 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.hamcrest.core.IsInstanceOf;
|
||||||
|
|
||||||
import redis.clients.jedis.BinaryClient.LIST_POSITION;
|
import redis.clients.jedis.BinaryClient.LIST_POSITION;
|
||||||
|
import redis.clients.util.SafeEncoder;
|
||||||
|
|
||||||
public class Jedis extends BinaryJedis implements JedisCommands {
|
public class Jedis extends BinaryJedis implements JedisCommands {
|
||||||
public Jedis(final String host) {
|
public Jedis(final String host) {
|
||||||
@@ -2688,5 +2691,53 @@ public class Jedis extends BinaryJedis implements JedisCommands {
|
|||||||
public String configSet(final String parameter, final String value) {
|
public String configSet(final String parameter, final String value) {
|
||||||
client.configSet(parameter, value);
|
client.configSet(parameter, value);
|
||||||
return client.getStatusCodeReply();
|
return client.getStatusCodeReply();
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public Object eval(String script, String... keys) {
|
||||||
|
List<String> s = new ArrayList<String>(keys.length);
|
||||||
|
for(String key : keys)
|
||||||
|
s.add(key);
|
||||||
|
|
||||||
|
return eval(script, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object eval(String script, List<String> keys, String... args) {
|
||||||
|
client.setTimeoutInfinite();
|
||||||
|
client.eval(script, keys, args);
|
||||||
|
|
||||||
|
return getEvalResult();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Object getEvalResult(){
|
||||||
|
Object result = client.getOne();
|
||||||
|
|
||||||
|
if(result instanceof byte[])
|
||||||
|
return SafeEncoder.encode((byte[])result);
|
||||||
|
|
||||||
|
if(result instanceof List<?>) {
|
||||||
|
List<?> list = (List<?>)result;
|
||||||
|
List<String> listResult = new ArrayList<String>(list.size());
|
||||||
|
for(Object bin: list)
|
||||||
|
listResult.add(SafeEncoder.encode((byte[])bin));
|
||||||
|
|
||||||
|
return listResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object evalsha(String sha1, String... keys) {
|
||||||
|
List<String> s = new ArrayList<String>(keys.length);
|
||||||
|
for(String key : keys)
|
||||||
|
s.add(key);
|
||||||
|
|
||||||
|
return evalsha(sha1, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object evalsha(String sha1, List<String> keys, String... args) {
|
||||||
|
checkIsInMulti();
|
||||||
|
client.evalsha(sha1, keys, args);
|
||||||
|
|
||||||
|
return getEvalResult();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -140,7 +140,7 @@ public final class Protocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static enum Command {
|
public static enum Command {
|
||||||
PING, SET, GET, QUIT, EXISTS, DEL, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT, SETRANGE, GETRANGE;
|
PING, SET, GET, QUIT, EXISTS, DEL, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, ZCOUNT, ZRANGEBYSCORE, ZREVRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT, SETRANGE, GETRANGE, EVAL, EVALSHA;
|
||||||
|
|
||||||
public final byte[] raw;
|
public final byte[] raw;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package redis.clients.jedis.tests.commands;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import redis.clients.jedis.exceptions.JedisDataException;
|
||||||
|
import redis.clients.jedis.exceptions.JedisException;
|
||||||
|
|
||||||
|
public class EvalCommandsTest extends JedisCommandTestBase {
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test
|
||||||
|
public void evalMultiBulk() {
|
||||||
|
String script = "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}";
|
||||||
|
List<String> keys = new ArrayList<String>();
|
||||||
|
keys.add("key1");
|
||||||
|
keys.add("key2");
|
||||||
|
|
||||||
|
List<String> response = (List<String>)jedis.eval(script, keys, "first", "second" );
|
||||||
|
|
||||||
|
assertEquals(4, response.size());
|
||||||
|
assertEquals("key1", response.get(0));
|
||||||
|
assertEquals("key2", response.get(1));
|
||||||
|
assertEquals("first", response.get(2));
|
||||||
|
assertEquals("second", response.get(3));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void evalBulk() {
|
||||||
|
String script = "return KEYS[1]";
|
||||||
|
List<String> keys = new ArrayList<String>();
|
||||||
|
keys.add("key1");
|
||||||
|
|
||||||
|
String response = (String)jedis.eval(script, keys);
|
||||||
|
|
||||||
|
assertEquals("key1", response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void evalInt() {
|
||||||
|
String script = "return 2";
|
||||||
|
List<String> keys = new ArrayList<String>();
|
||||||
|
keys.add("key1");
|
||||||
|
|
||||||
|
Long response = (Long)jedis.eval(script, keys);
|
||||||
|
|
||||||
|
assertEquals(new Long(2), response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void evalNoArgs() {
|
||||||
|
String script = "return KEYS[1]";
|
||||||
|
|
||||||
|
String response = (String)jedis.eval(script, "key1");
|
||||||
|
|
||||||
|
assertEquals("key1", response);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test
|
||||||
|
public void evalsha() {
|
||||||
|
jedis.set("foo", "bar");
|
||||||
|
jedis.eval("return redis.call('get','foo')");
|
||||||
|
String result = (String)jedis.evalsha("6b1bf486c81ceb7edf3c093f4c48582e38c0e791");
|
||||||
|
|
||||||
|
assertEquals("bar", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Test(expected=JedisDataException.class)
|
||||||
|
public void evalshaShaNotFound() {
|
||||||
|
Exception result = (Exception)jedis.evalsha("ffffffffffffffffffffffffffffffffffffffff");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user